2013-08-12 2 views
1

Я пытаюсь выполнить этот проект, но у него есть серьезная проблема. Я создал таблицу test2 с атрибутом cid. Я добавил пользователя в ИДС, используя эти командной строки в SQL командной строки:Соединение JDBC подключено, но нет результата запроса к набору результатов

create table test2(cid varchar(20)); 
insert into test2 values('hello'); 

select cid from test2; 

Тогда я получаю результат, как

CID 
----------------------- 
HELLO 

Мой вопрос заключается в том, что, когда я пытался использовать JDBC с eclipe на сервер, я получаю rs.next() как false (rs is resultset). ясно, что у меня есть «привет» внутри таблицы test2. Вот мой код, если кто-нибудь может помочь мне с этим, я был бы признателен:

public boolean connect(String username, String password) 
{ 
    String connectURL = "jdbc:oracle:thin:@dbhost.xxx.xx.xxx.ca:1522:ug"; 

    try 
    { 
     con = DriverManager.getConnection(connectURL,username,password); 
     System.out.println("\nConnected to Oracle!"); 
     ResultSet rs; 
     try 
     { 
      Statement stmt = con.createStatement(); 

      rs = stmt.executeQuery("SELECT cid FROM test2"); 
      System.out.println("here"); 
      while(rs.next()) 
      { 
       System.out.println("there"); 
       System.out.println("cid isssssssssss: " + rs.getString("cid")); 

      } 
      System.out.println("after here"); 
      stmt.close(); 
     } 
     catch (SQLException ex) 
     { 
      System.out.print("Message: " + ex.getMessage()); 
     } 
     try { 
      con.close(); 
     } catch (SQLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     return true; 
    } 
    catch (SQLException ex) 
    { 
     System.out.println("Message: " + ex.getMessage()); 
     return false; 
    } 
} 

Подключение есть, потому что, когда я меняю ИДС в чем-то иначе SQLException дал мне сообщение об ошибке. Таким образом, он подключается, но не получает никакого запроса с сервера.

rs = stmt.executeQuery("SELECT something FROM test2"); 

Connected to Oracle! 
Message: ORA-00904: "SOMETHING": invalid identifier 

озадачивает меня. Еще раз спасибо.

+2

Обязательно спросите: Вы сделали свою вставку? – rgettman

+0

Я добавил вставку через командную строку sql, и когда я делаю выбор * из командной строки, все данные вернулись в порядке. Но если я делаю выбор cid из test2 внутри eclipse, он ничего мне не дает (rs.next() == false) – user2185801

+2

Как предполагает rgettman, наиболее вероятным объяснением является то, что 'COMMIT' не был выпущен в транзакции, которая сделал ИНСЕРТ. (Мы не видим, чтобы какой-либо COMMIT выполнялся.) Oracle предотвращает просмотр этой строки любыми другими сеансами до тех пор, пока изменение не будет выполнено, но сеанс, который сделал INSERT, «увидит» свои собственные незафиксированные изменения. – spencer7593

ответ

1

Вы спрашиваете:

У меня уже есть данные в базе данных. Я не вставлял данные из eclipse, но вместо этого использовал файл .sql для загрузки его в базу данных. Нужно ли это совершить?

Я полагаю, что вы используете SQL * Plus для загрузки данных в базу данных.

Если да, то COMMIT не требуется , за исключением случаев, когда SQL * Plus находится в режиме «autocommit».

sql*plus: SQL> show autocommit; 
      autocommit OFF 
      SQL> set autocommit ON; 

(Без либо «AUTOCOMMIT» или явного COMMIT заявления, сделка будет откат при завершении SQL * Plus сессии. И это, скорее всего, объяснение того, что вы наблюдаете.)

+0

Спасибо! Не исправлялись мои вставки. Спасибо еще раз! – user2185801

0

Это очень странный вопрос. Только отсутствующая часть, которую я мог видеть, -

Class.forName ("oracle.jdbc.driver.OracleDriver"); в приведенном выше фрагменте кода. Не могли бы вы попытаться поместить его и посмотреть, нет ли каких-либо изменений в выходе.

Также, пожалуйста, перекрестная проверка базы данных, в которой вы создали записи, точно такая же, как указанная в коде выше.

Приветствия

1

Наиболее вероятным объяснением такого поведения является то, что вы не выдавать «COMMIT;» заявление на сессии, что сделал в INSERT. (Не показано.)

Запрос SELECT того же сеанса, который INSERT вернет строку. Сеанс «видит» все незавершенные изменения, которые он сделал. Но Oracle не позволяет другим сессиям видеть эти незафиксированные изменения, пока они не будут совершены.

То, что мы хотим, чтобы увидеть это:

SQL> insert into test2 values('hello'); 

1 row created. 

SQL> commit; 

Commit complete. 

Введенная строка не будет видна другим сеансов, пока после фиксации.


Другой (гораздо реже) объяснение состоит в том, что два сеанса подключения к базе данных в виде различных пользователей Oracle, или связаны с различными экземплярами базы данных.

+0

У меня уже есть данные в базе данных. Я не вставлял данные из eclipse, но вместо этого использовал файл .sql для загрузки его в базу данных. Нужно ли это совершить? – user2185801

+1

Был ли оператор 'COMMIT' после вставки в файле .sql? Был ли оператор 'COMMIT' выдан из сеанса, который сделал« INSERT »? (Оператор SELECT, выпущенный из того же сеанса, в котором INSERT вернет строку, но это не означает, что строка «находится в базе данных». Ничто не является «в базе данных» до «COMMIT». (Выпуск ' ROLLBACK' вместо COMMIT и посмотреть, что возвращает инструкция SELECT.) – spencer7593

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