因为要取得的是rs2新插入行的id,这个id是自动编号,在没有更新前可能得到吗?

解决方案 »

  1.   

    当我把
    int id = rs1.getInt("id");
    注释掉后,我的程序能够正常运行,我想代码是没有问题的。
      

  2.   

    能把建立conn, stmt, rs的代码给出来吗
      

  3.   

    conn = DriverManager.getConnection("jdbc:odbc:Logistics", "sa","sa");statement1 = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);tab1 = statement1.executeQuery("SELECT * FROM tab4");
      

  4.   

    完整的代码如下:
    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());
    }
      

  5.   

    首先,con.setAutoCommit(false);自动提交设为false,那么下面
    rs1.moveToInsertRow();
    rs1.updateString("value","administrator");
    rs1.insertRow();
    新增的数据并没有被提交到数据库里,要等到操作完第二张表成功才被提交,
    所以int id = rs1.getInt("id");
    取不到值,你可以println一下id看看。
      

  6.   

    确实得不到rs1.getInt("id");
    这里牵涉到一个数据的完整性问题:
    1、第一个表更新后会产生一个ID
    2、第二个表更新时需要第一个表的ID
    3、这两个表要么全更新,要么全不更新
    现在看来用事务好像是不行的。请问有什么其它方法吗?
      

  7.   

    她奶奶的气死我了!Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                                      ResultSet.CONCUR_UPDATABLE);
    ResultSet rs = stmt.executeQuery("select * from roles");
    rs.moveToInsertRow();居然说rs.moveToInsertRow()对于只读结果集无效。
    我真的不知道怎么回事情
      

  8.   

    stmt.executeQuery("select * from roles");做的是查询操作,
    即使设置ResultSet.CONCUR_UPDATABLE,用rs.moveToInsertRow()也会报错,
    因为你并没有插入一条记录,叫rs的指针怎么移动到插入行呢?
      

  9.   

    至于5413tianyu (天下) 的问题,可以不把两张表的操作放到一个事务中,
    try {
    第一张表的操作;
    }catch(SQLException e) {
    error.log("第一张表操作失败。");
    return;
    }
    try {
    第二张表的操作;
    }catch(SQLException e) {
    error.log("第一张表操作失败。");
    delete(id);//删除第一张表的数据
    return;
    }
      

  10.   

    他的也是:
    ResultSet rs1 = stmt1.executeQuery("SELECT * FROM ArchiveBody WHERE id=0");
    ResultSet rs2 = stmt2.executeQuery("SELECT * FROM Archive WHERE id=0");
      

  11.   

    我使用的数据库是SQL server 2000。
      我是刚开始学java,完全出于学习的目的出这样一个问题,希望大家积极讨论,为以后工作上有可能出现的困难做些准备。
      仁兄nickcle007(sea)的方法很好,再加上同步,基本上可以代替数据库的事务。对于不支持事务的数据库或小型项目很有益处。大家可以参考。
      希望大家提出更多更好的建议,我会在今天晚些时候结贴。
      先谢过大家了。
      

  12.   

    不知道 icystone(石冰)用的什么数据库?
      

  13.   

    我的是oracle9i,我就是想试一下你说的,可是不行,难道是驱动不行