1

我正在尝试将一行插入到具有 CachedRowSet 增量 id 的表中(我正在使用 Java wit Java DB),但是我得到了以下 SQLException:
java.sql.SQLException:在插入行时失败
...
SQLState:null
错误代码:0
消息:插入行失败

这是我的代码片段:

private static String urlString = "jdbc:derby:testdb;create=true";
private static String userName = "testUser";
private static String password = "testPassword";
...

CachedRowSet crs = new CachedRowSetImpl();
            crs.setUrl(urlString);
            crs.setUsername(userName);
            crs.setPassword(password);
            crs.setCommand("SELECT * FROM test_table");
            crs.execute();

            crs.moveToInsertRow();
            crs.updateString("str_value", "testValue");
            crs.insertRow();
            crs.moveToCurrentRow();
            crs.acceptChanges();

SQLException 是从crs.inertRow().
如果表没有自动增量 ID,则 CachedRowSet 可以正常工作。
我怎样才能成功地做到这一点?

其他细节:
我使用以下代码来创建我的表:

conn = DriverManager.getConnection(urlString, userName, password);
            Statement stmt = conn.createStatement();
            stmt.execute("CREATE TABLE test_table("
                    + "id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),"
                    + "str_value VARCHAR(20) NOT NULL,"
                    + "CONSTRAINT primary_key PRIMARY KEY (id))");
            System.out.println("Talbe test_table created.");
4

2 回答 2

1

尝试这个 crs.updateNull(1); crs.insertRow();

其中 1 是您的 PK。在 MySQL 中为我工作

于 2013-09-01T15:34:56.980 回答
1

这是使用 CachedRowSet 插入行失败的副本。

不幸的是,这是由于API 定义而发生的:

抛出: SQLException - 如果发生数据库访问错误;结果集并发为 CONCUR_READ_ONLY,在关闭的结果集上调用此方法,如果在光标不在插入行上时调用此方法,或者如果插入行中的所有不可为空的列都没有被赋予非-空值

您最好使用JdbcRowSetImpl. 如果您删除列的约束,
您只能坚持使用。不幸的是,这也意味着删除 PK 约束。我认为这是一个太大的牺牲,但要么就是这样,要么不是。CachedRowSetNOT NULLidCachedRowSet

于 2013-04-04T11:25:11.587 回答