【问题标题】:How to insert into SQL Server decimal column?如何插入 SQL Server 十进制列?
【发布时间】:2012-04-10 13:39:04
【问题描述】:

我正在使用 SQL Server 的 MS JDBC 驱动程序,并尝试将值插入到十进制 (18,5) 列中。文档说十进制列映射到 BigDecimal,所以我正在尝试这样做:

PreparedStatement ps = conn.prepareStatement("INSERT INTO [dbo].[AllTypesTable] ([decimal18_0Col]) VALUES (?)");
ps.setObject(1, new BigDecimal(3.14));
ps.execute();

在调用 execute() 时,我收到此错误:

com.microsoft.sqlserver.jdbc.SQLServerException:将数据类型 nvarchar 转换为十进制时出错。

司机似乎对双打很满意,所以我可以这样做:

ps.setObject(1, 3.14);

如果我需要 BigDecimal 提供的额外精度,我该如何进行插入?

更新:如果我要插入 3.14,我当然不必担心这一点。如果我想插入一个实际需要小数精度的值怎么办?例如,小数点后 30 位?

【问题讨论】:

  • 如果你改用 setBigDecimal 会发生什么?顺便说一句:这显然是一个错误,JDBC 标准(JDBC 4.1,附录 B)明确规定 JDBC 驱动程序必须接受 BigDecimal 数字字段、位、布尔值、char、varchar 和 longvarchar。

标签: sql-server jdbc bigdecimal


【解决方案1】:

事实证明这根本不是数据库问题。从 varchar 转换的错误基本上是说该值不适合 DB 字段。它必须是从命令中发送的字符串转换为十进制值。

问题实际上是 new BigDecimal(3.14) 创建了一个 BigDecimal,其值类似于 3.140000000003457234987。这是因为双精度不能精确存储 3.14。然后当这个值被发送到数据库时,它不会接受它,因为该列只有五个小数位。解决方法是使用 BigDecimal 的另一个构造函数:new BigDecimal("3.14")。这将恰好保持 3.14。

【讨论】:

  • 实际上您也可以通过在 BigDecimal 上设置比例(小数位数)来解决此问题:BigDecimal amount = new BigDecimal(117.56d);amount = amount.setScale(8, BigDecimal.ROUND_HALF_UP);
【解决方案2】:

只要列列的数据类型是十进制,您就不必担心在代码中对其进行转换。尝试将其转换回一个对象并以这种方式发送。

【讨论】:

  • 我不确定您将其转换回对象是什么意思。
  • 我对 Java 不是很熟悉,但是在 C# 中,您可以将它转换回一个像这样的对象:(object)value
【解决方案3】:

从您的代码到服务器的命令以字符串形式发送。因此,当 MSSQL 解析命令文本时,它成功地将您的 3.14(来自第二个示例)转换为十进制值。 可能“new BigDecimal(3.14)”被转换为字符串为“3,14”或其他一些无效值。 设置值后尝试检查您的命令语句。

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多