【发布时间】: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 的字段。
标签: sql-server jdbc prepared-statement