3

我正在使用 SQL Server 的 MS JDBC 驱动程序,并尝试将值插入到 decimal(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 位?

4

3 回答 3

6

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

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

于 2012-04-11T11:13:02.580 回答
0

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

于 2012-04-10T13:44:06.490 回答
0

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

于 2012-04-10T13:48:21.277 回答