我正在使用MySQL数据库,我有一个包含2列的表Employee
:Id
(Int;主键)和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();
}
}
}
答案 0 :(得分:1)
必须在crs.moveToCurrentRow()
之后和crs.insertRow()
之前添加声明crs.acceptChanges(c)
例如:
// 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 :(得分:0)
您会发现打印出有关异常的所有信息会很有帮助。如果您捕获SQLException而不是通用Exception(通常您应该捕获特定的Exceptions),您将可以访问更多信息,包括SQL state and error codes。
我相信在这种情况下,您会发现与连接设置为自动提交更改这一事实有关。我相信CachedRowSet在初始化和执行命令时会创建自己的Connection。它不知道Connection" c"您已创建,直到将其传递给acceptChanges。我认为,这意味着crs'在此期间,connection将autoCommit设置为true。
尝试添加?relaxAutoCommit = true到您的网址字符串,如下所示:
crs.setUrl("jdbc:mysql://localhost:3306/test?relaxAutoCommit=true");
您不需要传递Connection以接受更改,因为它将拥有自己的更改。实际上,您不需要创建另一个Connection,它将始终保持打开状态。 CachedRowSet的重点在于,在进行更改时不要保持连接处于打开状态。