首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CachedRowSet未能插入行

CachedRowSet未能插入行
EN

Stack Overflow用户
提问于 2014-09-13 03:20:55
回答 2查看 1.7K关注 0票数 1

我在用CachedRowSet。但是,当我调用insertRow()方法时,插入行的SQLException失败。

这是我的代码:

代码语言:javascript
复制
static final String DATABASE_URL = "jdbc:mysql://localhost:3306/javapos";
static final String USERNAME = "root";
static final String PASSWORD = "sbc";

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 uom order by itemid");
    rs.execute();

    while(rs.next()){
        System.out.println(rs.getString("itemid") + "  -  " + rs.getString("uom"));
    }

    rs.moveToInsertRow();
    rs.updateString(2,"Sample code");
    rs.insertRow();
    rs.moveToCurrentRow();

    rs.acceptChanges();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-13 11:32:57

调用insertRow()时,CachedRowSet的引用实现将执行一次检查,检查是否已填充了所有必需的列,否则会引发异常(来自CachedRowSet.insertRow()的源,行号不完全匹配):

代码语言:javascript
复制
if (onInsertRow == false ||
        insertRow.isCompleteRow(RowSetMD) == false) {
    throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.failedins").toString());
}

检查是在InsertRow.isCompleteRow(RowSetMetaData)中执行的

代码语言:javascript
复制
public boolean isCompleteRow(RowSetMetaData RowSetMD) throws SQLException {
    for (int i = 0; i < cols; i++) {
        if (colsInserted.get(i) == false &&
                RowSetMD.isNullable(i + 1) == ResultSetMetaData.columnNoNulls) {
            return false;
        }
    }
    return true;
}

换句话说,当插入行时,必须为所有不可空的列提供一个值(这包括主键)。解决这一问题的方法似乎有两种:

  • 设置(随机)值。这确实要求始终生成主键(即使提供了值)。
  • 使用null显式地将列设置为updateNull。使用setNull不起作用:它提供了相同的错误,使用setObject(idx, null)会导致NullPointerException

在使用这些更改的代码时,当调用SQLException时,我会得到一个acceptChanges,因为实现没有禁用autoCommit (似乎是评论掉),但是它确实显式地调用了commit (在autoCommit中是无效的)。这似乎并不容易解决,除非可能显式地在execute上提供连接,或者创建自己的实现。

我认为这类问题实际上证明了RowSet实现实际使用的很少(否则它们早就被排除在外了)。

但是请注意,如果这是您需要的实际代码,并且不需要CachedRowSet的断开连接特性,那么您可以简单地使用一个可更新的结果集。

票数 3
EN

Stack Overflow用户

发布于 2022-08-24 09:09:02

示例:

代码语言:javascript
复制
        beginAddRow(crs);
        crs.updateString("TABLE_TYPE", "TABLE");
        
        continueAddRow();
        crs.updateString("TABLE_TYPE", "INDEX");
        endAddRow();
代码语言:javascript
复制
    static public CachedRowSet beginAddRow(CachedRowSet crs) throws SQLException {
        crs.moveToInsertRow(); // onInsertRow = true
        return crs;
    }

    static public CachedRowSet continueAddRow(CachedRowSet crs) throws SQLException {
        crs.insertRow();
        crs.moveToCurrentRow();
        crs.moveToInsertRow();
        return crs;
    }

    static public CachedRowSet endAddRow(CachedRowSet crs) throws SQLException {
        crs.insertRow();
        crs.moveToCurrentRow(); // onInsertRow = false;
        crs.beforeFirst();
        return crs;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25819496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档