我有以下Java 7代码来创建CachedRowSet
。
CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
有没有办法从
CachedRowSet
对象获取Connection对象?我想在调用autoCommit
上的acceptChanges()
之前在Connection对象上将CachedRowSet
设置为false,因为调用acceptChanges()
时出现以下异常。javax.sql.rowset.spi.SyncProviderException: Can't call commit when autocommit=true
COMMIT_ON_ACCEPT_CHANGES
上有一个CachedRowSet
字段,但已弃用。 最佳答案
好吧,我花了一些时间才重现此问题。通过autoCommit
将Connection
的conn.setAutoCommit(false);
值设置为false解决了此问题。
以下是示例工作程序:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetProvider;
public class CRSetChecker {
public static void main(String[] args) {
String connectString = "jdbc:oracle:thin:scott/tiger" +
"@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" +
"(HOST=myorahost)(PORT=5521))" +
"(CONNECT_DATA=(SID=myorasid)))";
//Get DB connection
Connection conn = (new CRSet()).getConnection(connectString);
if (conn == null) {
System.out.println("Connection failed");
System.exit(0);
} else {
System.out.println("Connection established successfully!");
try {
CachedRowSet crs =
RowSetProvider.newFactory().createCachedRowSet();
String query="select ename from emp";
crs.setCommand(query);
crs.execute(conn);
//Set auto commit false
conn.setAutoCommit(false);
int count = 0;
while(crs.next()){
String name = crs.getString(1);
count++;
System.out.println(name);
if(count==1){
crs.updateString(1, "COOPER");
crs.updateRow();
crs.acceptChanges(conn);
System.out.println("After update:"+crs.getString(1));
}
}
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
public Connection getConnection(String connectString)
{
Connection con = null;
try {
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
con = DriverManager.getConnection(connectString);
} catch (SQLException ex) {
ex.printStackTrace();
}
return con;
}
}