我正在使用CachedRowSetImpl,我可以从数据库中获取数据,但我无法插入。
这是代码:
public class NewClass {
static final String DATABASE_URL = "jdbc:derby://localhost:1527/TaskDB;create=true";
static final String USERNAME = "user";
static final String PASSWORD = "user";
public static void main (String [] agr) throws SQLException
{
CachedRowSetImpl rs = new CachedRowSetImpl();
rs.setUrl(DATABASE_URL);
rs.setUsername(USERNAME);
rs.setPassword(PASSWORD);
rs.setCommand("SELECT * FROM TASKTABLE");
rs.execute();
rs.moveToInsertRow();
rs.updateString("Column_Name","DataString");
rs.insertRow();
rs.moveToCurrentRow();
rs.updateRow();
}
}
它抛出异常:
线程“main”java.sql.SQLException中的异常:插入行失败 at com.sun.rowset.CachedRowSetImpl.insertRow(CachedRowSetImpl.java:5462) 在NewClass.main(NewClass.java:32)
我尝试过JdbcRowSetImpl而不是CachedRowSetImpl,而且工作正常
更新:我使用此代码来捕获有关例外的更多详细信息:
catch(SQLException e) {
do {
System.out.println("SQLState:" + e.getSQLState());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Message:" + e.getMessage());
Throwable t = e.getCause();
while(t != null) {
System.out.println("Cause:" + t);
t = t.getCause();
}
e = e.getNextException();
} while (e != null);
}
,输出为:
SQLSTATE:空
错误代码:0
消息:插入行
失败
答案 0 :(得分:2)
我遇到了和你一样的问题,但我把acceptChanges(cnnt)
放在异常抛出的末尾,如API所述。
...
cachedSet.moveToInsertRow();
cachedSet.updateInt(1,12);
cachedSet.updateString(2,"Joe");
cachedSet.updateString(3,"abcde");
cachedSet.insertRow();
cachedSet.moveToCurrentRow();
cachedSet.acceptChanges(cnnt);
.....
如果我在没有最后row(acceptChanges(cnnt))
的情况下运行它,则不会抛出任何异常,但DB不会更新。
如果我用最后一个运行它,会有一个与你得到的异常相同的异常。
我查了一下,从API获得了acceptChanges()
的文档:
SQLException - if the cursor is on the insert row
我查看了insertRow()
的文件:
SQLException - 如果发生数据库访问错误;结果集 并发性是CONCUR_READ_ONLY,此方法在关闭时调用 结果集,如果在光标不在时调用此方法 插入行,或者如果不是插入行中的所有非可空列 已被赋予非空值
也许你可以从中得到一些东西。
答案 1 :(得分:0)
你需要调用rs.acceptChanges();而不是rs.updateRow();
尝试替换rs.updateRow();以下内容:
try{
jrs.acceptChanges();
}catch(SyncProviderException spe){
//Conflict handling code.
}