2009-02-05 56 views
4

在c#中, 我使用一个十进制DbParameter作为Sql Server存储过程。 创建参数一样,十进制精度问题DbParameter


DbParameter prm = comm.CreateParameter(); 

prm.ParameterName = "@Price"; 

prm.DbType = DbType.Decimal; 

prm.Direction = ParameterDirection.Output; 

comm.Parameters.Add(prm); 

//and set the value of comm.Parameters["@Price"] to a variable, 

decimal.TryParse(comm.Parameters["@Price"].Value.ToString(), 
    out this.ProdPrice); 

但是out参数的值取整百达。

如果我叫从SQL Server Management Studio中的同一个存储过程,我能得到这个出 参数正确与它的精度

没有上的DbParameter精度或缩放属性。 ,我必须使用的DbParameter上System.Data.Common命名空间获取数据

哪有我能够提前retieve十进制值与其全精度

谢谢...

回答

4

添加到马克的建议,你可以更改代码以代码的

IDbDataParameter prm = comm.CreateParameter();

休息应该能正常运行。 精度和比例属性是DbParameter中的“显式接口实现”。

+1

IDbDataParameter DecimalOut = comm.CreateParameter(); DecimalOut.Direction = ParameterDirection.Output; DecimalOut.ParameterName =“@Price”; DecimalOut.DbType = DbType.Decimal; DecimalOut.Scale = 4; comm.Parameters.Add(DecimalOut); 正常工作.. 谢谢所有.. – 2009-02-05 01:32:52

1

第一,你不需要解析字符串得到小数,你应该能够直接投给它:

this.ProdPrice = (Decimal) comm.Parameters["@Price"].Value; 

话虽这么说,什么是@price参数的精度?我相信SQL Server允许精确到35个位置,而Decimal类只能提供高达28个位置的精度,所以如果你的参数超过28个位置,你将无法阻止舍入。

2

您是否尝试过设置PrecisionScale?请注意,您需要先施放。