PreparedStatement 未填充
Posted
技术标签:
【中文标题】PreparedStatement 未填充【英文标题】:PreparedStatement not populating 【发布时间】:2017-08-17 16:10:19 【问题描述】:我在下面有 PreparedStatement(ps),如图所示填充它,执行 MSSQL 时出现如下错误。当然,在任何可以看到的数据中都没有“TRADEIN”的价值。想法?
String update = "UPDATE IM_ITEM SET "
+ "LST_COST=?, PRC_1=?, IS_TXBL=?, TAX_CATEG_COD=?,CATEG_COD=?"
+ " WHERE ITEM_NO="+itemNo;
populate:
ps.setString(++i, q.get("LST_COST"));
ps.setString(++i, q.get("PRC_1"));
ps.setString(++i, q.get("IS_TXBL"));
ps.setString(++i, q.get("TAX_CATEG_COD"));
ps.setString(++i, q.get("CATEG_COD"));
debugged: "sqlCommand" and "userSQL" are still parameterized only
UPDATE IM_ITEM SET LST_COST=?, PRC_1=?, IS_TXBL=?, TAX_CATEG_COD=?, CATEG_COD=? WHERE ITEM_NO=101316
error:
Severe: com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting the varchar value 'TRADEIN' to data type int.
【问题讨论】:
似乎q.get
返回的值之一或itemNo值包含字符串“TRADEIN”。
@DanGuzman 相信它不是在两个层面。一个我将它分解为五个字符串的分配,并使用这些字符串在 ps 上设置参数,并在 executeUpdate 之前确认所有五个字符串都没有“TRADEIN”作为值。两个所有五个参数都只是数据库中的 varchar,所以它为什么要进行类型转换是难以理解的。
尝试对整数列使用 setInt 而不是 setString。这应该在客户端而不是服务器上引发错误,以更好地识别错误值的设置位置。
为什么您在查询中使用参数来处理除 itemNo 之外的所有内容?这完全破坏了对 sql 注入的保护。
@SeanLange 仅用于测试 b/c,这是唯一可以解释为 int 的字段。
【参考方案1】:
Seanlange 在聊天中友好地回答了。
【讨论】:
以上是关于PreparedStatement 未填充的主要内容,如果未能解决你的问题,请参考以下文章
PreparedStatement 中的 Java 资源泄漏
JDBC - PreparedStatement executeUpdate() 返回 0
使用 PreparedStatement 插入并为插入的行返回一列的值