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,丢失了很多小数。

我该如何解决这个问题?

SQL 查询上的 NHibernate 十进制精度

好吧,这根本不简单,可能有更好的方法,但是您可以使用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();

这似乎将正确的数字发送到数据库。