【问题标题】:How to insert a row into a that table has an increment id with CachedRowSet?如何在具有 CachedRowSet 的增量 id 的表中插入一行?
【发布时间】:2013-04-04 09:38:58
【问题描述】:

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

这是我的代码 sn-p:

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.");

【问题讨论】:

    标签: java javadb cachedrowset


    【解决方案1】:

    这是Failed on insert row using CachedRowSet 的副本。

    不幸的是,这是因为API definition:

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

    使用JdbcRowSetImpl 可能会更好。
    如果您删除 id 列的 NOT NULL 约束,您只能坚持使用 CachedRowSet。不幸的是,这也意味着删除 PK 约束。我认为这是一个太大的牺牲,但要么是这样,要么不是CachedRowSet

    【讨论】:

    • 我在发帖前已经检查过这个问题,似乎它确实没有“完美”的解决方案。
    • 嗯,有时你不可能拥有“完美”。 ;) 我有另一个想法,但我想它更不完美。 :(
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2010-11-25
      • 2012-09-11
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多