首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CachedRowset acceptChanges在insert操作后不工作

CachedRowset acceptChanges在insert操作后不工作
EN

Stack Overflow用户
提问于 2014-09-07 06:18:23
回答 2查看 1.3K关注 0票数 3

我使用的是MySQL数据库,我有一个包含2列的表EmployeeId (整型;主键)和Name (字符串)。我已经编写了一些代码来向Employee表中插入一行,但是acceptChanges不起作用,代码仅限于acceptChanges。代码如下:

代码语言:javascript
复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

public class InsertSynchronizer {

    static CachedRowSet crs = null;

    public static void main(String[] args) {

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "");
            c.setAutoCommit(false);
            RowSetFactory myRowSetFactory = null;
            myRowSetFactory = RowSetProvider.newFactory();
            crs = myRowSetFactory.createCachedRowSet();
            crs.setUrl("jdbc:mysql://localhost:3306/test");
            crs.setUsername("root");
            crs.setPassword("");
            crs.setConcurrency(CachedRowSet.CONCUR_UPDATABLE);
            crs.setCommand("select * from employee");
            crs.execute();
            while (crs.next()) {
                System.out.println(crs.getString("Name"));
            }

            // Inserting rows
            crs.moveToInsertRow();
            crs.updateInt("Id", 5);
            crs.updateString("Name", "E");
            crs.insertRow();

            //Thread.sleep(60000);
            crs.acceptChanges(c); // Updating Data Sources

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-09-07 17:25:59

必须在crs.insertRow()之后和crs.acceptChanges(c)之前添加语句crs.moveToCurrentRow()

例如:

代码语言:javascript
复制
 // Inserting rows
crs.moveToInsertRow();
crs.updateInt("Id", 5);
crs.updateString("Name", "E");
crs.insertRow();
crs.moveToCurrentRow(); // NEW STATEMENT
crs.acceptChanges(c); // Updating Data Sources

欲了解更多信息,请访问:http://docs.oracle.com/javase/tutorial/jdbc/basics/cachedrowset.html#inserting-and-deleting-rows

票数 1
EN

Stack Overflow用户

发布于 2014-09-07 16:14:39

您会发现打印出有关该异常的所有信息很有帮助。如果您捕获的是SQLException而不是通用异常(通常您应该捕获特定的异常),则可以访问更多信息,包括SQL state and error codes

我相信在这种情况下,您会发现这是一个与连接设置为自动提交更改的事实相关的错误。我相信当你初始化并执行它的命令时,CachedRowSet正在建立它自己的连接。在您将其传递给acceptChanges之前,它不知道您创建的连接"c“。我认为,这意味着crs的连接同时将autoCommit设置为true。

尝试将?relaxAutoCommit=true添加到url字符串,如下所示:

代码语言:javascript
复制
crs.setUrl("jdbc:mysql://localhost:3306/test?relaxAutoCommit=true");

您不需要向它传递一个连接来接受更改,因为它会有自己的连接。实际上,您不需要创建另一个连接,它将始终保持打开状态。CachedRowSet的全部意义在于,您在进行更改时不会使连接保持打开状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25705278

复制
相关文章

相似问题

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