2013-08-12 2 views
0

Я искал и пробовал разные вещи на некоторое время, но не нашел ответа. Я пытаюсь подключиться к sql, используя JDBC из eclipse. У меня возникают проблемы, когда мне нужно выбрать строку в базе данных. Если я использую:SQL-команда из eclipse с использованием JDBC

Select name from data where title = 'mr'; 

Это работает с терминальной командной строкой/но когда я пытаюсь использовать затмение, где я использую

statement sp = connection.createstatement(); 
resultset rs = sp.executequery("select name from data where title = '" + "mr" + "'"); 

Это не дает мне ничего, пока терминал ввод делает. Что я сделал неправильно в затмении? Thanks

Heres часть кода. Извините, его немного грязно, он пробовал разные вещи.

private boolean loginChecker(String cid, String password) throws SQLException{ 
     boolean check = false; 
     PreparedStatement pstatment = null;  

     Statement stmt = null; 
     //String query = "SELECT 'cat' FROM customer"; 
     String query = "select '"+cid+"' from customer where password = '"+password+"'"; 
     try { 
      System.out.println("in try......"); 

      //stmt = con.createStatement(); 
      //ResultSet rs = stmt.executeQuery(query); 
      PreparedStatement prepStmt = con.prepareStatement(query); 
      ResultSet rs = prepStmt.executeQuery(); 

      //System.out.print(rs.getString("cid")); 
      while(rs.next()){ 
       check = true; 
       System.out.print(rs.getString("cid")); 
      } 

     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      if (stmt != null) { 
       //stmt.close(); 
      } 
     } 

     return check; 
    } 

Второй попробовать на более простом запросе:

public List<Object> showTable() { 
     List<Object> result = new ArrayList<Object>(); 
     String name = "bob"; 
     try 
     { 
      PreparedStatement preStatement = con.prepareStatement("select total from test where name = ?"); 
      preStatement.setString(1, name); 

      ResultSet rs1 = preStatement.executeQuery(); 

      while(rs1.next()){ 
       System.out.println("there"); 
       System.out.println(rs1.getInt("total")); 
      } 


     } 
     catch (SQLException ex) 
     { 
      System.out.print("Message: " + ex.getMessage()); 
     } 
     return result; 
    } 
+1

Плохая практика использования жестко закодированных литералов для параметров, значение которых изменится. Перейдите в Google о параметризованных запросах JDBC. Проблема, вероятно, не имеет отношения к Eclipse. Это просто IDE для компиляции/отладки вашего приложения. – OldProgrammer

+0

Там может быть много проблем. Вы получаете какие-то исключения? – MadProgrammer

+0

«mr» в вопросе был, например. Фактически это вход от метода. Нет никакого исключения, он просто появляется как false, когда я вызываю rs.next(); – user2185801

ответ

0

Убедитесь, что вы не закрывая ResultSet, прежде чем вы пытаетесь использовать его. Это может произойти, когда вы вернете ResultSet и попытаетесь использовать его в другом месте. Если вы хотите, чтобы вернуть данные, как это, используйте CachedRowSet:

CachedRowSet crs = new CachedRowSetImpl(); 
    crs.populate(ResultSet); 

CachedRowSet является «особенным в том, что она может работать без подключения к источнику данных, то есть, это отключенный RowSet объект»

Редактировать: увидел, что вы опубликовали код, поэтому я подумал, что добавляю некоторые мысли. Если это ваш ФАКТИЧЕСКИЙ код, чем причина, по которой вы ничего не получаете, это потому, что запрос, вероятно, ничего не возвращает.

String query = "select '"+cid+"' from customer where password = '"+password+"'"; 

Это неверно, по двум причинам. 1) Если вы используете подготовленные заявления, вы должны заменить все входные данные на «?» поэтому он должен выглядеть следующим образом:

String query = "select name from customer where password = ?"; 

Тогда:

PreparedStatement prepStmt = con.prepareStatement(query); 
    prepStmt.setString(1, password); 
    ResultSet rs = prepStmt.executeQuery(); 

2)

System.out.print(rs.getString("cid")); 

Здесь пытаются получить столбец под названием "чид", когда оно должно быть имя, сохраненное в cid. На самом деле вы никогда не должны позволять пользователю решать, какие столбцы следует получить, это должно быть жестко запрограммировано.

+0

Хорошо, я вижу. Я изменил этот код. На самом деле мне не пришлось использовать подготовленный оператор, так как я ничего не обновляю. Вместо этого я выполняю запрос, и это все еще не работает. – user2185801

+0

Вы не можете использовать '?' Держатели мест с именами столбцов. Это не сработает. –

+0

Я сделал этот тест, но он все еще не работает, если у меня есть выбор из теста, где total =? ... он работает, но когда я переключаю имя с общим, это не так. У меня есть это в имени базы данных varchar (20) и total (int). См. Выше для редактирования. – user2185801

0

Удалить цитаты вокруг имени столбца.

String query = "select "+cid+" from customer where password = '"+password+"'"; 

Вы не упомянули, какую базу данных вы работаете с, но многие базы данных, как Oracle изменить регистр столбцов в верхний регистр, если они не указаны. Таким образом, вы указываете только столбцы таблицы, если именно так вы их создали.Например, если вы создали таблицу, как

CREATE TABLE some_table ('DoNotChangeToUpperCase' VARCHAR2); 

Затем вы должны выбрать столбец с кавычками, а

SELECT 'DoNotChangeToUpperCase' FROM some_table 

Но, если вы не создали таблицу, используя кавычки вы не должны Не используйте их с вашими SELECT.

Смежные вопросы