C# SQL查询的NHibernate十进制精度

C# SQL查询的NHibernate十进制精度,c#,sql-server,stored-procedures,nhibernate,C#,Sql Server,Stored Procedures,Nhibernate,我试图调用一个存储过程,将一个名为rate的十进制数作为其参数之一发送,但在执行查询时,它会丢失十进制精度 这是服务器端的代码: IQuery query = Session.CreateSQLQuery("exec SaveExchangeRate @Rate = :rate, @OtherParameter = :otherParameter"); query.SetDecimal("rate", exchangeRate.Rate); query.SetInt32("otherParamt

我试图调用一个存储过程,将一个名为
rate
的十进制数作为其参数之一发送,但在执行查询时,它会丢失十进制精度

这是服务器端的代码:

IQuery query = Session.CreateSQLQuery("exec SaveExchangeRate @Rate = :rate, @OtherParameter = :otherParameter");
query.SetDecimal("rate", exchangeRate.Rate);
query.SetInt32("otherParamter", otherParamter);
query.ExecuteUpdate();
此时,
汇率
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.000060000
,丢失了大量小数


如何解决此问题?

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

这似乎向数据库发送了正确的号码。

你看过这篇文章吗?是的,但是,正如你所看到的,这个值不是来自一个属性,所以它不是mapped@lante:好的,没问题