在准备语句C#中使用SqlDBType.Decimal

我在C#中使用准备好的声明。

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

上面的代码抛出exception:

SqlCommand.Prepare方法要求“Decimal”类型的参数具有显式设置的Precision和Scale。

编辑:如何避免此exception

以下将设置精度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(); 

正如exception所指出的,您必须显式设置SqlParameter.PrecisionSqlParameter.Scale属性才能使用decimal类型作为参数。

假设您的SQL字段是decimal(18,8)类型decimal(18,8) 。 内联方法是在将SqlParameter添加到SqlParameterCollection时对SqlParameter使用大括号初始化,如下所示:

 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初始化非常强大。

旁注:我意识到这是一个老问题,但我认为这个forms比创建对象更可读,同时将其添加到列表中,然后设置比例和精度。 为了后人! (因为这是一个高级列表谷歌搜索结果)

试试这个:

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

您必须明确定义此参数的精度和比例。

 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);