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:好的,没问题