我正在使用C#中的Prepared Statement。
SqlCommand inscommand = new SqlCommand(supInsert, connection);
inscommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18);
inscommand.Prepare();
u = inscommand.ExecuteNonQuery();
以上代码抛出异常:
SqlCommand.Prepare方法要求“Decimal”类型的参数具有显式设置的Precision和Scale。
编辑:如何避免此异常
答案 0 :(得分:31)
以下将设置精度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();
答案 1 :(得分:6)
正如异常指出的那样,您必须明确设置SqlParameter.Precision
和SqlParameter.Scale
属性才能使用decimal
类型作为参数。
假设您的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非常强大。
旁注:我意识到这是一个老问题,但我认为这个形式比将对象添加到列表然后设置比例和精度时创建对象更具可读性。对于后人! (因为这是一个高级列表谷歌搜索结果)
答案 2 :(得分:4)
试试这个:
SqlParameter parameter = new SqlParameter("@ordQty", SqlDbType.Decimal);
parameter.Precision = 18;
parameter.Scale = 0;
parameter.Value = YOURVALUEHERE;
inscommand.Parameters.Add(parameter);
答案 3 :(得分: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);