奇葩!PreparedStatement.executeUpdate执行之后的问题

讨论了在数据库操作中未提交事务导致数据未保存的问题,包括代码实现、问题排查及解决方法。
帮助别人就是帮助自己! 如果这里解决了您的问题,请您点一下推荐

奇葩!PreparedStatement.executeUpdate执行之后的问题

 方法执行后返回一个整形,我接收到之后输出为1,证明已经有一行数据受影响,但是数据库里仍然没有数据。代码如下:
public void insert(Object obj) throws DBException {
PreparedStatement pstmt = null;
try {

FieldSurveyBean bean = (FieldSurveyBean) obj;
String areno = bean.getAreno();
String statement = "";
statement += "INSERT INTO [dbo].TB_FieldSurvey";
statement += "([FieldSurveyPK]";
statement += ",[Creator]";
statement += ",[Create_Time]";
statement += ",[Update_Time]";
statement += ",[ProjectTypeNo]";
statement += ",[CheckInNo]";
statement += ",[ProspectNo]";
statement += ",[Proc_id]";
statement += ",[Step_id]";
statement += ",[UnitOfUsers]";
statement += ",[Address]";
statement += ",[ProspectContent]";
statement += ",[AreNo]";
statement += ",[Linkman]";
statement += ",[Tel]";
statement += ",[ApplyAccount]";
statement += ",[DeliveryInfo]";
statement += ",[Installation]";
statement += ",[SurveyDate1]";
statement += ",[SurveyDate2]";
statement += ",[SurveyDate3]";
statement += ",[Prospector] ";
statement += ",[Map]";
statement += ",[MapSummary]";
statement += ",[DesignIdeas]";
statement += ",[ProspectorIdeas]";
statement += ",[DesignForIdeas]";
statement += ",[ApprovalIdeas]";
statement += ",[projectpk])";
statement += " VALUES(?,?,getdate(),getdate(),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
pstmt = getDBConnection().createPreparedStatement(statement);

System.out.println(statement);
System.out.println(bean.getFieldsurveypk());
System.out.println("-------------------"+bean.getCheckinno());
pstmt.setString(1, bean.getFieldsurveypk());
pstmt.setString(2, bean.getCreator());
pstmt.setString(3, bean.getProjecttypeno());
pstmt.setString(4, bean.getCheckinno());

pstmt.setString(5, bean.getProspectno());
pstmt.setString(6, bean.getProc_id());
pstmt.setString(7, bean.getStep_id());
pstmt.setString(8, bean.getUnitofusers());
pstmt.setString(9, bean.getAddress());
pstmt.setString(10, bean.getProspectcontent());
pstmt.setString(11, bean.getAreno());
pstmt.setString(12, bean.getLinkman());
pstmt.setString(13, bean.getTel());
pstmt.setInt(14, bean.getApplyaccount());
pstmt.setString(15, bean.getDeliveryinfo());
pstmt.setString(16, bean.getInstallation());
pstmt.setString(17, bean.getSurveydate1());
pstmt.setString(18, bean.getSurveydate2());
pstmt.setString(19, bean.getSurveydate3());
pstmt.setString(20, bean.getProspector());
pstmt.setString(21, bean.getMap());
pstmt.setString(22, bean.getMapsummary());
pstmt.setString(23, bean.getDesignideas());
pstmt.setString(24, bean.getProspectorideas());
pstmt.setString(25, bean.getDesignforideas());
pstmt.setString(26, bean.getApprovalideas());
pstmt.setString(27, bean.getProjectpk());
int i=pstmt.executeUpdate();
System.out.println("--------------------------------------------"+i);

} catch (SQLException e) {
throw new DBException(e);

} finally {
getDBConnection().closePreparedStatement(pstmt);
getDBConnection().closeConnection();

}
}
Java EE  258 次浏览  2011-11-23 00:34
10 个回答
执行之后不报错,i的值为1.1001是checkinno的值,Fieldsurveypk的值是在前面直接传过来的
e88ad68e-f776-473d-94f0-0e769837f0e6
-------------------1001
--------------------------------------------1

但数据库中的数据没变化,表名是没错的
这个实在是令人费解
2011-11-23 00:41  推荐: 0 次 
建议耐心调试,特别是查看数据那一块。不要使用第三方工具查看,尽量使用指令查看数据。
2011-11-23 00:55  推荐: 0 次 
调试之后不报错,数据也是正确的,第一次遇见这问题
2011-11-23 01:04  推荐: 0 次 
插入数据后,事务没有commit,数据回滚了,当然没有数据
2011-11-23 02:13  推荐: 0 次 
事务回滚了。。。事务提交下
2011-11-23 02:27  推荐: 0 次 
可能是你那个getDBConnection(),每次获取都不是同一个Connection。
你试试看这样做:
Connection con = getDBConnection();
在这里执行insert操作。
con.close();
不要用你的getDBConnection().closePreparedStatement(pstmt)和getDBConnection().closeConnection();用con对象关闭。
2011-11-23 03:13  推荐: 0 次 
事务提交一下再试试吧。
2011-11-23 03:33  推荐: 0 次 
我全部的Dao都是这么写的,其他都可以提交的,但是就这个不行,这与事务有关吗?
2011-11-23 17:07  推荐: 0 次 
单元测试下吧 或者专门把这个方法拿出来测试 有可能是事务 或者在别的方法调用失败 回滚
2011-11-23 17:20  推荐: 0 次 
我勒个去,昨天怎么试都不行,今天一来,就行了,真蛋疼,问题处在哪儿都不知道
2011-11-23 18:11  推荐: 0 次 
数据库已连接! 数据库已连接! 用户名:aa 密码:11 用户名:bb 密码:22 用户名:cc 密码:33 用户名:苏州托普 密码:0 数据库已连接! java.sql.SQLException: Column count doesn't match value count at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949) at data.BaseDao.executeSQL(BaseDao.java:71) at util.UserDaoImpl.insertNewUser(UserDaoImpl.java:68) at util.Test.main(Test.java:18) 添加用户失败! 数据库已连接! 修改用户密码成功数据库已连接! com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'aihao' in 'field list' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949) at data.BaseDao.executeSQL(BaseDao.java:71) at util.UserDaoImpl.updateUser(UserDaoImpl.java:90) at util.Test.main(Test.java:20) 修改用户信息失败! 数据库已连接! 删除用户成功
最新发布
06-24
### Java PreparedStatement executeUpdate 方法的作用及用法 `PreparedStatement.executeUpdate()` 是 Java JDBC API 提供的一个方法,用于执行 SQL 语句中的 `INSERT`, `UPDATE`, 或 `DELETE` 操作[^1]。该方法返回一个整数值,表示受影响的行数。如果返回值为零,则意味着没有任何行被修改。 #### 返回值的意义 当调用 `executeUpdate()` 执行一条更新语句时,其返回值具有特定含义: - 对于 `INSERT` 语句,通常返回值为 1,因为只有一条记录被插入数据库中。 - 对于 `UPDATE` 和 `DELETE` 语句,返回值代表实际受到影响的行数。如果没有符合条件的数据行,那么返回值将是 0[^2]。 需要注意的是,在某些情况下,即使数据未发生改变(例如尝试通过唯一键重复插入相同数据),也可能观察到固定返回值的现象,这取决于底层数据库实现以及具体SQL逻辑的设计[^3]。 下面是一个简单的例子展示如何使用此方法: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class Example { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/testdb"; String user = "root"; String password = ""; try (Connection conn = DriverManager.getConnection(url, user, password)) { String sql = "UPDATE users SET name = ? WHERE id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "John Doe"); pstmt.setInt(2, 1); int affectedRows = pstmt.executeUpdate(); System.out.println("Number of rows updated: " + affectedRows); // 输出影响的行数 } catch (Exception e) { e.printStackTrace(); } } catch (Exception ex) { ex.printStackTrace(); } } } ``` 上述代码片段展示了如何创建并设置参数化查询字符串来防止SQL注入攻击的同时完成一次用户表名字段的更改操作,并打印出了此次操作所影响的行数量[^4]。 #### 特殊情况分析 关于为什么有时会发现 `executeUpdate()` 总是返回 1 即使预期应该有其他结果的问题,可能的原因包括但不限于以下几个方面: - 数据库约束条件阻止了进一步的变化; - 查询本身设计存在缺陷,比如错误地应用了IF NOT EXISTS之类的子句从而导致无论真实状况怎样都会报告成功状态; - 驱动程序或者数据库管理系统本身的特性差异造成的行为不一致等问题都需要逐一排查确认原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值