public boolean insertCab(List list,int num){
boolean bRet=false;
Connection conn =new DBConnection().getConnection();
try{
Statement stmt =conn.createStatement();
for(int i=0;i<num;i++){
Keycab cab=(Keycab)list.get(i);
String sql="insert into kms_cabinfo values("+cab.getCabid()+","+cab.getMaxofkey()+",'"
+cab.getCabstate()+"','"+cab.getBstate()+"','"+cab.getSstate()+"',"+cab.getRows()+","
+cab.getCols()+")";
stmt.addBatch(sql);
stmt.executeBatch();
conn.commit();
}  
            bRet = true;
}catch(Exception ex){
 try {
conn.rollback();
            } catch (Exception ex2) {
                System.err.println("rollback failed:" + ex2.getMessage());
            }
}finally {
        }
        return bRet;
}问题是,如果list只有一个对象,此时num=1.这样可以正确写入数据库,而当list含有多个对象的时候,方法只能写入最后一条,而且返回bRet为false,不知道为什么,弄了两天了,还是没有搞定啊,急!!

解决方案 »

  1.   

    num取的是什么值,为什么不直接用list.size()?
      

  2.   

    既然bRet为false 那么肯定就是出异常,直接跑catch块儿里了,但为什么还可以插入一条呢,并且是最后一条,不清楚。  另外看看你的Statement 有没有问题。
      

  3.   

    一楼说的对 为什么不用list.size()?
      

  4.   

    把下面这两行放到for循环外面试试:
    stmt.executeBatch();
    conn.commit();
      

  5.   

    把下面这两行放到for循环外面:
    stmt.executeBatch();
    conn.commit();
    先试试,有没有用
      

  6.   

    把下面这两行放到for循环外面:
    stmt.executeBatch();
    conn.commit();
    先试试,有没有用肯定要放到for循环外面的...
      

  7.   

    真是怪事情,如果写一句,那么可以添加的,如果list.size.的值大于1,就不行了,只能添加最后一句
      

  8.   

    在for循环里面把i打印出来,还是怀疑你的循环条件有问题。另外stmt.executeBatch();也的确应该写在循环外面。
      

  9.   

    java.sql.BatchUpdateException: 批处理中出现错误: ORA-00001: 违反唯一约束条件 (KMSYSTEM.PK_CABINFO) at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:571)
    at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:626)
    at oracle.jdbc.driver.OracleStatement.executeBatch(OracleStatement.java:6841)
    at com.yjj.kms.dboperate.DBbaseoperate.insertCab(DBbaseoperate.java:29)
    at com.yjj.kms.servlet.AdddataServlet.doAddcab(AdddataServlet.java:54)
    at com.yjj.kms.servlet.AdddataServlet.doBusiness(AdddataServlet.java:38)
    at com.yjj.kms.tool.BaseServlet.doPost(BaseServlet.java:39)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Thread.java:595)
      

  10.   

    Statement stmt =conn.createStatement();
    你把这句放在sql语句的下面试试,因为可能是每做一次循环要声明一个新的statement对象,要是同一个的话commit()了多少次都是一条对象的吧?
      

  11.   

    是啊,如果不把stmt.executeBatch();写在循环外面,
    就插入重复记录了,是要违反唯一约束的啊.如果改了以后还是出现这种错误的话,
    就是list里有重复了,把sql字符串打印出来看看一样不一样.
      

  12.   

    打印了两句SQL,结果发现是一样的
    insert into kms_cabinfo values(3,3,'Enabled','Closed','Closed',3,3)
    insert into kms_cabinfo values(3,3,'Enabled','Closed','Closed',3,3)
      

  13.   

    没有呢,我答应了两句SQL,没有按照我想的那样,把list里的内容分别赋值,而是一样的两句,这样不错才怪
      

  14.   

    问题解决了,哈哈,结贴了,问题出在我的list上。我的放入list的语句写错了,导致写入list的对象不是重新写,而是被覆盖,所以输出的SQL是一样的,如果SQL语句一样,那么我的数据库,肯定不会同意的,因为主键约束条件嘛,现在终于好了,结帖子了。
      

  15.   

    public void insertCardsList(List cards) throws DAOException {
    Connection conn = null;
    PreparedStatement psmt = null;
    OrgmemberCard card = null;
    try{
    db = getDB();
    conn = db.getConnection();
    conn.setAutoCommit(false);
    String sql = "insert into tb_saveorgcard (orgcardid, groupid, issale, kind)values (?, ?, 0, ?)";
    psmt = conn.prepareStatement(sql);
    for(Iterator e = cards.iterator();e.hasNext();){
    card = (OrgmemberCard)e.next();
    psmt.setString(1,card.getCardNo());
    psmt.setInt(2,card.getSystemGroup().getGroupId());
    psmt.setString(3,card.getKind());
    psmt.addBatch();
    }
    psmt.executeBatch();
    conn.commit();
    }catch(Exception e){
    rollback(conn);
    throw new DAOException("录入会员卡号时异常:" + e.toString());
    }finally{
    close(psmt);
    conn.setAutoCommit(true);
    close(conn);
    db.close();
    }
    }