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 插入并为插入的行返回一列的值

PreparedStatement 最大查询,参数未在 Java 中执行

PreparedStatement

JDBC PreparedStatement 似乎忽略占位符