我使用的是MySQL数据库,我有一个包含2列的表Employee:Id (整型;主键)和Name (字符串)。我已经编写了一些代码来向Employee表中插入一行,但是acceptChanges不起作用,代码仅限于acceptChanges。代码如下:
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();
}
}
}发布于 2014-09-07 17:25:59
必须在crs.insertRow()之后和crs.acceptChanges(c)之前添加语句crs.moveToCurrentRow()
例如:
// 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。
发布于 2014-09-07 16:14:39
您会发现打印出有关该异常的所有信息很有帮助。如果您捕获的是SQLException而不是通用异常(通常您应该捕获特定的异常),则可以访问更多信息,包括SQL state and error codes。
我相信在这种情况下,您会发现这是一个与连接设置为自动提交更改的事实相关的错误。我相信当你初始化并执行它的命令时,CachedRowSet正在建立它自己的连接。在您将其传递给acceptChanges之前,它不知道您创建的连接"c“。我认为,这意味着crs的连接同时将autoCommit设置为true。
尝试将?relaxAutoCommit=true添加到url字符串,如下所示:
crs.setUrl("jdbc:mysql://localhost:3306/test?relaxAutoCommit=true");您不需要向它传递一个连接来接受更改,因为它会有自己的连接。实际上,您不需要创建另一个连接,它将始终保持打开状态。CachedRowSet的全部意义在于,您在进行更改时不会使连接保持打开状态。
https://stackoverflow.com/questions/25705278
复制相似问题