VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1281|回复: 10

为什么stmt.executeUpdate返回1却没有插入数据库

[复制链接]

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

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

使用道具 举报

2

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-6-7 23:45:01 | 显示全部楼层
slq  贴出来~!还有看看你的连接。有问题没!~
回复

使用道具 举报

0

主题

63

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-6-8 07:45:01 | 显示全部楼层
你commit了没有,很正常嘛
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-6-12 23:45:01 | 显示全部楼层
连接肯定没问题,因为前面都用到连接的
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");
        }

}
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-6-13 22:30:01 | 显示全部楼层
不好意思,刚才这两段是我改了以后的,不小心把pstmt的executeUpdate注释掉了,所以没粘贴上来,在pstmt之前加上executeUpdate还是一样的
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-6-16 19:45:01 | 显示全部楼层
又有新发现,如果我把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,它能正常连接数据库的,这是怎么回事?
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-19 13:30:01 | 显示全部楼层
数据源配置文件

是不是配置成自动提交为false,
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-20 13:00:02 | 显示全部楼层
感觉也是没有提交.
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-6-25 15:00:01 | 显示全部楼层
我的配置文件是这样的:
<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>
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-25 21:30:01 | 显示全部楼层
<set-property   property="defaultAutoCommit"  value="false"/>

这样需要你在程序里把事物提交[conn.commit()]

如果没有特别的,就设置为true好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表