我正在尝试将一行插入到具有CachedRowSet的增量ID的表中(我使用Java和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();
从crs.inertRow()
抛出SQLException
如果表没有自动增量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.");
答案 0 :(得分:1)
这是Failed on insert row using CachedRowSet的副本。
不幸的是,这是因为API definition:
抛出: SQLException - 如果发生数据库访问错误;结果集并发性为CONCUR_READ_ONLY,如果在光标不在插入行上时调用此方法,则在闭合结果集上调用此方法;如果不是插入行中的所有非可空列,则调用 行已被赋予非空值
使用JdbcRowSetImpl
可能会更好
如果您删除CachedRowSet
列的NOT NULL
约束,则只能使用id
。不幸的是,这也意味着要删除PK约束。我认为这是一个太大的牺牲,但它或者不是CachedRowSet
。
答案 1 :(得分:1)
试试这个
crs.updateNull(1);
crs.insertRow();
其中1是你的PK。在MySQL中为我而烦恼