如何插入到SQL Server decimal列?(How to insert into SQL S

2019-09-16 10:48发布

我使用的是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();

在调用执行(),我得到这个错误:

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

司机似乎是幸福与双打,因此我可以这样做:

ps.setObject(1, 3.14);

我该怎么办插入,如果我需要额外的精度BigDecimal的给我?

更新:当然,我并不担心这一点,如果我要插入3.14。 如果我想插入实际需要小数精度值? 一些与30位小数,例如?

Answer 1:

事实证明,这不是一个DB问题都没有。 大约从varchar转换误差基本上是说该值不适合数据库领域。 它必须从在命令送入十进制值的字符串被转换。

这个问题实际上是一个新的BigDecimal(3.14)创建一个BigDecimal与像3.140000000003457234987的值。 这是因为双重不能存储3.14准确。 然后,当该值发送到数据库,它不会把它因为该列只有小数点后五位。 解决方法是使用BigDecimal的其它构造新的BigDecimal(“3.14”)。 这将持有3.14准确。



Answer 2:

只要列列的数据类型是小数,你不应该担心在代码转换它。 尝试铸造回一个对象,并以这种方式发送。



Answer 3:

从代码到服务器的命令去为一个字符串。 所以,当MSSQL解析命令文本,它成功地转换你的3.14(从第二例),十进制值。 可能是“新的BigDecimal(3.14)”被转换成字符串为“3,14”或一些其它的非有效的值。 尝试设置值后,以检查你的命令语句。



文章来源: How to insert into SQL Server decimal column?