如何插入SQL Server十进制列?

时间:2012-04-10 13:39:04

标签: sql-server jdbc bigdecimal

我正在使用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位小数的东西吗?

3 个答案:

答案 0 :(得分:6)

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

问题实际上是新的BigDecimal(3.14)创建了一个类似3.140000000003457234987的BigDecimal。这是因为double不能精确存储3.14。然后,当该值发送到DB时,它将不会接受它,因为该列只有五个小数位。修复是使用BigDecimal的另一个构造函数:new BigDecimal(“3.14”)。这将完全保持3.14。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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