为什么stmt.executeUpdate返回1却没有插入数据库
我把同样的sql语句拿到sql server的查询分析器里运行却能正常插入数据,
更奇怪的是如果我运行一遍程序,然后再把同样的sql语句在查询分析器里运行,这样所插入的纪录的自动编号比它前面那条大2,即如果前面有一条记录的自动编号是27,此时插入的这条的编号就是29,可是程序中的那一条就是没有插入!也没有返回任何错误信息,这是咋回事啊???
请问大家有没有碰到过这样的情况?
我是从datasource中取连接,然后用statement来插入的

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/5276/5276852.xml?temp=.2448847谢谢大家来,看看我的问题!~对不起LZ  我战了SF!!
      

  2.   

    slq  贴出来~!还有看看你的连接。有问题没!~
      

  3.   

    连接肯定没问题,因为前面都用到连接的
    User类中的insertUser方法:
    public int insertUser(DataSource ds){
    int result=0;
    Connection conn;
    try {
    conn = ds.getConnection();
    PreparedStatement pstmt=conn.prepareStatement("insert into tb_customer(username,password,cusTrueName,"+
    "cusAddress,cusPostcode,cusProvince,cusCity,cusTel,cusEmail,cusCardType,cusCardNo) "+
    "values(?,?,?,?,?,?,?,?,?,?,?)");
    pstmt.setString(1,username);
    pstmt.setString(2,password);
    pstmt.setString(3,cusTrueName);
    pstmt.setString(4,cusAddress);
    pstmt.setString(5,cusPostcode);
    pstmt.setString(6,cusProvince);
    pstmt.setString(7,cusCity);
    pstmt.setString(8,cusTel);
    pstmt.setString(9,cusEmail);
    pstmt.setString(10,cusCardType);
    pstmt.setString(11,cusCardNo);
    pstmt.close();
    conn.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return result;
    }
    }registerAction中的execute方法:
    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response){

    RegisterForm registerForm = (RegisterForm) form;

    String username=registerForm.getUsername();
    String password=registerForm.getPassword();
    String cusTrueName=registerForm.getCusTrueName();
    String cusAddress=registerForm.getCusAddress();
    String cusPostcode=registerForm.getCusPostcode();
    String cusProvince=registerForm.getCusProvince();
    String cusCity=registerForm.getCusCity();
    String cusTel=registerForm.getCusTel();
    String cusEmail=registerForm.getCusEmail();
    String cusCardType=registerForm.getCusCardType();
    String cusCardNo=registerForm.getCusCardNo();

    ActionMessages errors=new ActionMessages();
    DataSource ds=getDataSource(request);
    DBUtil dbu=new DBUtil(ds);
    if(UserDao.userExist(dbu,username)){
    errors.add(ActionMessages.GLOBAL_MESSAGE,
    new ActionMessage("errors.username.exist"));
    if(!errors.isEmpty()){
    saveErrors(request,errors);
    }
    dbu.close();
    return mapping.findForward("failure");
    }
    dbu.close();

    User user=new User(username,
    password,
    cusTrueName,
    cusAddress,
    cusPostcode,
    cusProvince,
    cusCity,
    cusTel,
    cusEmail,
    cusCardType,
    cusCardNo); int result=0;
    result=user.insertUser(ds);
    if(result!=1){
    errors.add(ActionMessages.GLOBAL_MESSAGE,
    new ActionMessage("errors.insert.failed"));
    if(!errors.isEmpty()){
    saveErrors(request,errors);
    }
    return mapping.findForward("failure");
    }
    HttpSession session=request.getSession();
    session.setAttribute("username",username);

    return mapping.findForward("success");
    }}
      

  4.   

    不好意思,刚才这两段是我改了以后的,不小心把pstmt的executeUpdate注释掉了,所以没粘贴上来,在pstmt之前加上executeUpdate还是一样的
      

  5.   

    又有新发现,如果我把insertUser里的Connection conn = ds.getConnection();改为:
    Class.forName("net.sourceforge.jtds.jdbc.Driver");
    String URL="jdbc:jtds:sqlserver://localhost:1433/db_webshop;user=sa;password=";
    Connection conn=DriverManager.getConnection(URL);
    其它都不变,这样就能插入数据,这样就说明Connection conn = ds.getConnection()这里得到的conn有问题,但是这个conn不是null,而且我在前面用过这样的conn,它能正常连接数据库的,这是怎么回事?
      

  6.   

    数据源配置文件是不是配置成自动提交为false,
      

  7.   

    我的配置文件是这样的:
    <data-source   type="org.apache.commons.dbcp.BasicDataSource">  
          <set-property   property="driverClassName"    value="net.sourceforge.jtds.jdbc.Driver"/>  
          <set-property   property="url"    value="jdbc:jtds:sqlserver://localhost:1433/db_webshop"/>  
          <set-property   property="username"      value="sa"/>  
          <set-property   property="password"      value=""/>  
          <set-property   property="maxActive"      value="10"/>  
          <set-property   property="maxWait"      value="5000"/>
           
          <set-property   property="minCount" value="4"/>
          <set-property   property="maxCount" value="10"/>
          
          <set-property   property="defaultAutoCommit"  value="false"/>  
          <set-property   property="defaultReadOnly"    value="false"/>  
        </data-source>
      

  8.   

    <set-property   property="defaultAutoCommit"  value="false"/>这样需要你在程序里把事物提交[conn.commit()]如果没有特别的,就设置为true好了