SQL 查询上的 NHibernate 十进制精度
本文关键字:十进制 精度 NHibernate 查询 SQL | 更新日期: 2023-09-27 18:34:53
我试图调用一个存储过程,将一个名为 rate
的小数作为其参数之一发送,但在执行查询时会丢失小数精度。
这是服务器端的代码:
IQuery query = Session.CreateSQLQuery("exec SaveExchangeRate @Rate = :rate, @OtherParameter = :otherParameter");
query.SetDecimal("rate", exchangeRate.Rate);
query.SetInt32("otherParamter", otherParamter);
query.ExecuteUpdate();
在这一点上,exchangeRate.Rate
0.0000631046
。
当我打开 SQL 探查器时,给我:
exec sp_executesql N'exec SaveExchangeRate @Rate = @p0, @OtherParamter = @p1',N'@p0 decimal(28,5),@p1 int',@p0=6,@p1=4
如您所见,精度是decimal(28,5)
,但在存储过程中,所需的精度是decimal(19,10)
,发送到SQL数据库的数字只是6
,失去了精度。之后,持续存在的数字是0.0000600000
,丢失了很多小数。
我该如何解决这个问题?
好吧,这根本不简单,可能有更好的方法,但是您可以使用TypeFactory
来检索具有所需比例和精度的decimal
类型,然后使用SetParameter
而不是SetDecimal
:
IType decimalType = TypeFactory.Basic("Decimal(19,10)");
IQuery query = Session.CreateSQLQuery("....");
query.SetParameter("rate", exchangeRate.Rate, decimalType);
query.SetInt32("otherParamter", otherParamter);
query.ExecuteUpdate();
这似乎将正确的数字发送到数据库。