2012-01-06 64 views
9

上午在C#中使用Prepared Statement。在准备好的语句中使用SqlDBType.Decimal C#

SqlCommand inscommand = new SqlCommand(supInsert, connection); 
inscommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 
inscommand.Prepare(); 
u = inscommand.ExecuteNonQuery(); 

上面的代码抛出异常如下:

SqlCommand.Prepare方法需要类型“十进制”有一个明确设置Precision和Scale参数。

编辑:如何避免这种异常

+0

你有问题要问?你对这个错误有什么不清楚的地方? – Oded 2012-01-06 13:06:39

+0

嗨Oded,是的我得到了上述例外设置精度和规模。 – 2012-01-06 13:09:23

+0

而且?什么是不明确的错误?您需要设置精度和比例。 – Oded 2012-01-06 13:10:48

回答

28

下将设置一个小数,提供高精度和18 8级(十进制(18,8))

SqlCommand insertCommand= new SqlCommand(supInsert, connection); 
insertCommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 

insertCommand.Parameters["@ordQty"].Precision = 18; 
insertCommand.Parameters["@ordQty"].Scale = 8; 

insertCommand.Prepare(); 
u = insertCommand.ExecuteNonQuery(); 
3

您将有明确定义精度并为此参数缩放。

SqlParameter ordQty = cmd.Parameters.Add("@ordQty", SqlDbType.Decimal); 
ordQty.Precision = x; //Replace x with what you expect in Sql Sp 
ordQty.Scale = y; //Replace y with what you expect in Sql Sp 
ordQty.Value = 18; //Set value here 
inscommand.Parameters.Add(ordQty); 
4

试试这个:

SqlParameter parameter = new SqlParameter("@ordQty", SqlDbType.Decimal); 
parameter.Precision = 18; 
parameter.Scale = 0; 
parameter.Value = YOURVALUEHERE; 
inscommand.Parameters.Add(parameter); 
6

作为例外指出的那样,你必须为了使用decimal类型作为参数明确设置SqlParameter.PrecisionSqlParameter.Scale性能。

假设您的SQL字段的类型为decimal(18,8)。要做到这一点内嵌的方式是使用大括号初始化为您的SqlParameter,同时将它添加到SqlParameterCollection,如下所示:

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8 }); 

你也可以做

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8}).Value = 0.4m; // or whatever 

添加值,如果你需要一个。你甚至可以做

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8, Value = 0.4m /* or whatever */}); 

如果你愿意。 Brace initialization真的很强大。注意:我意识到这是一个老问题,但我认为这种形式比创建对象时更具可读性,同时将其添加到列表中,然后设置比例和精度。为了后人! (因为这是一个高的谷歌搜索结果)