【问题标题】:PreparedStatement not populatingPreparedStatement 未填充
【发布时间】: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


【解决方案1】:

Seanlange 在聊天中友好地回答了。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2016-07-11
    • 2012-03-28
    • 2020-02-21
    • 2015-02-23
    • 2019-01-31
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多