他的也是: ResultSet rs1 = stmt1.executeQuery("SELECT * FROM ArchiveBody WHERE id=0"); ResultSet rs2 = stmt2.executeQuery("SELECT * FROM Archive WHERE id=0");
我使用的数据库是SQL server 2000。 我是刚开始学java,完全出于学习的目的出这样一个问题,希望大家积极讨论,为以后工作上有可能出现的困难做些准备。 仁兄nickcle007(sea)的方法很好,再加上同步,基本上可以代替数据库的事务。对于不支持事务的数据库或小型项目很有益处。大家可以参考。 希望大家提出更多更好的建议,我会在今天晚些时候结贴。 先谢过大家了。
int id = rs1.getInt("id");
注释掉后,我的程序能够正常运行,我想代码是没有问题的。
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:Logistics","sa", "sa");
Statement stmt1 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM ArchiveBody WHERE id=0");
ResultSet rs2 = stmt2.executeQuery("SELECT * FROM Archive WHERE id=0");
con.setAutoCommit(false);
rs1.moveToInsertRow();
rs2.moveToInsertRow();
if (filePath == null || filePath.equals("")) {
rs1.updateNull("archiveBody");
} else {
InputStream in = new FileInputStream(filePath);
//rs1.updateNull("archiveBody");
rs1.updateBinaryStream("archiveBody", in, in.available());
}
rs1.insertRow();
int id = 0;
rs1.moveToInsertRow();
//id = rs1.getInt("id");
rs2.updateString("archiveName", archiveName);
rs2.updateInt("archiveBodyId",id);
rs2.insertRow();
con.commit();
rs1.close();
rs2.close();
con.close();
} catch (Exception ex) {
//
System.out.println(ex.toString());
}
rs1.moveToInsertRow();
rs1.updateString("value","administrator");
rs1.insertRow();
新增的数据并没有被提交到数据库里,要等到操作完第二张表成功才被提交,
所以int id = rs1.getInt("id");
取不到值,你可以println一下id看看。
这里牵涉到一个数据的完整性问题:
1、第一个表更新后会产生一个ID
2、第二个表更新时需要第一个表的ID
3、这两个表要么全更新,要么全不更新
现在看来用事务好像是不行的。请问有什么其它方法吗?
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("select * from roles");
rs.moveToInsertRow();居然说rs.moveToInsertRow()对于只读结果集无效。
我真的不知道怎么回事情
即使设置ResultSet.CONCUR_UPDATABLE,用rs.moveToInsertRow()也会报错,
因为你并没有插入一条记录,叫rs的指针怎么移动到插入行呢?
try {
第一张表的操作;
}catch(SQLException e) {
error.log("第一张表操作失败。");
return;
}
try {
第二张表的操作;
}catch(SQLException e) {
error.log("第一张表操作失败。");
delete(id);//删除第一张表的数据
return;
}
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM ArchiveBody WHERE id=0");
ResultSet rs2 = stmt2.executeQuery("SELECT * FROM Archive WHERE id=0");
我是刚开始学java,完全出于学习的目的出这样一个问题,希望大家积极讨论,为以后工作上有可能出现的困难做些准备。
仁兄nickcle007(sea)的方法很好,再加上同步,基本上可以代替数据库的事务。对于不支持事务的数据库或小型项目很有益处。大家可以参考。
希望大家提出更多更好的建议,我会在今天晚些时候结贴。
先谢过大家了。