2

我正在尝试做这个项目,但它有一个主要问题。我用属性 cid 创建了表 test2。我通过在 sql 命令行中使用这些命令行将用户添加到 cid 中:

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

select cid from test2;

然后我得到结果

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

我的问题是,当我尝试将 jdbc 与 eclipe 一起使用到服务器时,我得到 rs.next() 为假(rs 是结果集)。显然我在表 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;
    }
}

存在连接,因为当我将 cid 更改为其他内容时,sqlexception 给了我一条错误消息。所以它连接但没有从服务器获得任何查询。

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

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

让我很困惑。再次感谢。

4

3 回答 3

1

对此行为最可能的解释是您没有COMMIT;在执行INSERT. (未显示。)

来自执行 INSERT 的同一会话的SELECT查询将返回该行。会话确实“看到”了它所做的所有未提交的更改。但是 Oracle 会阻止任何其他会话看到这些未提交的更改,直到它们被提交。

我们想看到的是:

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

1 row created.

SQL> commit;

Commit complete.

在提交之前,插入的行对其他会话不可见。


另一种(不太可能)的解释是这两个会话作为不同的 Oracle 用户连接到数据库,或者连接到不同的数据库实例。

于 2013-08-12T23:49:05.067 回答
1

你问:

我已经在数据库中有数据。我没有从 Eclipse 中插入数据,而是使用 .sql 文件将其加载到数据库中。那也需要提交吗?

我认为您正在使用 SQL*Plus 将数据加载到数据库中。

如果是这样,除非SQL*Plus 处于“自动提交”模式,否则它COMMIT是必需的。

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

(如果没有“自动提交”或显式COMMIT语句,事务将在您结束 SQL*Plus 会话时回滚。这是您所观察到的最可能的解释。)

于 2013-08-13T01:14:25.233 回答
0

这是一个很奇怪的问题。我能看到的唯一缺失的部分是

Class.forName("oracle.jdbc.driver.OracleDriver"); 上面代码片段中的语句。你能试着把它放一下,看看输出是否有任何变化。

另外请交叉检查您创建条目的数据库与上面代码中指定的数据库完全相同。

干杯

于 2013-08-12T23:46:55.263 回答