我查了一下,问题是出在插入一条记录后,插入第2条记录时ano = rs.getLong(1);的值跟插入第一条记录的时候相同,也就意味着新出入的记录没有查询到,造成插入第2条记录的主关键字的值与第1条记录的主关键字的值相同。
请问为什么会出现这样的错误,应该怎样改呢》

解决方案 »

  1.   

    其实,说实话,你这样的处理不是很好,我觉得你这样做不能保证在多线程的情况下的Synchronized的问题,你也没法保证transaction。我建议你用一个table去维护所有表的max number。
      

  2.   

    to  leon50422(Renei) :
       这样的建议我只能接受,但我不能去做,因为…………,所以我想知道我上面的程序应怎样去修改才能做到插入多条记录呢?
      

  3.   

    to wangwenyou(王文友) :
       加同步?能具体一点 描述你的思想吗?
      

  4.   

    最好不要把数据更新这样的操作放到类的构造过程中,因为很容易导致异常,而创建一个类的实例时,我们是不希望有异常存在的。
    你可以把它改为静态方法(最好是final static),然后加上同步,但是同一时段更新请求过多时会有延迟
    public final static synchronized long update(....)
    {
    ......................
    }
      

  5.   

    你的主关键字生成算法有问题,其实最偷懒的办法就是利用系统时间,不过只能到毫秒级,使用同步了以后,你可以用new Date().getTime()来做唯一关键字
      

  6.   

    也可以用System.currentTimeMillis()
    再次强调,不建议在程序内部处理异常,尽量把异常传出去,由专门的异常处理模块或类处理。
      

  7.   

    to wangwenyou(王文友) :
    我是出学,这些都看不太懂,能根据我的代码举个例子吗?
      

  8.   

    addAnswer adda;
    String answernumber,answerdesction,answerweight;
    try
    {
    for(int i = 0; i<tabrownum; i++){ answernumber = (String)answer.getValueAt(i,0); answerdesction = (String)answer.getValueAt(i,1); answerweight = (String)answer.getValueAt(i,2);
    adda = AddAnswer.insert(qnotemp,answernumber,answerdesction,answerweight);
    }
    }
    catch(ClassNotFoundException cnfe){
    System.err.println(cnfe);
    }
    catch(SQLException sqle){
    System.err.println(sqle.getMessage());
    System.err.println(sqle.getSQLState());
    System.err.println(sqle.getErrorCode());
    }/////////向表中插入一条记录 class AddAnswer
    { public final static synchronized long insert(long qno,String anumber,String adesction,String aweight){
    String url = "jdbc:odbc:Question";
    String sql;
    long answerno,weight,ano;
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection connect = DriverManager.getConnection(url);
    Statement state = connect.createStatement();
    sql = "SELECT MAX(Index) FROM Answer";
    ResultSet rs = state.executeQuery(sql);
    rs.next();
    ano = rs.getLong(1);
    System.out.println(ano+"          "+ano);
    ano++;
    answerno = new Long(anumber).intValue();
    weight = new Long(aweight).intValue();
    sql = "INSERT INTO Answer VALUES("+ano+","+qno+","+answerno+",'"+adesction+"',"+weight+")";
    state.executeQuery(sql);
    state.close();
    connect.close();

    }
    }
      

  9.   

    而且,你For循环有多少次就连接多少次数据库,效率太低,其实打开一次就行了
      

  10.   


    to wangwenyou(王文友) :编译出错哦!
    Question.java:222:incompatible types
    found:long
    required:addAnswer adda = addAnswer.insert(qnotemp,answernumber,answerdesction,answerweight);
      

  11.   

    你没有return,我写那段代码的意思主要就是告诉你怎么进行,并没有编译!你把那个函数改为void的就没事的
      

  12.   

    try块里应该是
    for(int i = 0; i<tabrownum; i++){ answernumber = (String)answer.getValueAt(i,0); answerdesction = (String)answer.getValueAt(i,1); answerweight = (String)answer.getValueAt(i,2);
    AddAnswer.insert(qnotemp,answernumber,answerdesction,answerweight);
    }
      

  13.   

    to wangwenyou(王文友) :我知道了,我试了,运行的结果与情况跟我的那段代码运行的结果相同