【问题标题】:Why is a string expected at this point?为什么此时需要一个字符串?
【发布时间】:2020-10-05 20:52:32
【问题描述】:

从对我的问题 here 的回答或评论中,我得到了 here 的指示。

所以我改变了我的代码:

double _imdbThreshold = 0.0;
(IMDBRating is a Decimal(2,1) data type in the SQL Server (Express) Database.)
...
cmd.Parameters.AddWithValue("@IMDBMinRating", _imdbThreshold);

...到这个:

cmd.Parameters.Add("@IMDBMinRating", SqlDbType.Decimal, 2, 1).Value = _imdbThreshold;

...基于上面链接的文章中的这个例子:

cmd.Parameters.Add("@Parameter", SqlDbType.Decimal, 11, 4).Value = MyDecimalVariable;

但我得到,“无法从 int 转换为字符串”:

?!?

为什么我的“1” int arg 在那里找错了?

【问题讨论】:

  • 没有过载(String, SqlDbType, Int32, Int32),根据documentation。您需要设置精度和比例separately
  • 是的,所以引用的文章是错误的。我想知道它在编写时是否有效,或者没有人测试过。
  • ^^ Dirks 的评论准确地提到了那个方法是不正确的。

标签: sql-server int32 commandparameter


【解决方案1】:

我再也找不到参考资料了,但是几年前在使用 SqlHelper 时,该指南附带了许多 extension methods,它们简化了 SqlCommandSqlParameter 的使用。

以下扩展方法将允许您的代码工作,我只能推测,但我怀疑您引用的代码使用了类似的扩展方法,他们不知道它不是标准运行时的一部分。 一个很容易犯的错误!

/// <summary>
/// Adds a System.Data.SqlClient.SqlParameter given the specified parameter name,
/// System.Data.SqlDbType, size <i>AND</i> precision.
/// </summary>
/// <param name="self">The SqlParameterCollection to add the parameter to.</param>
/// <param name="parameterName">The name of the parameter to map.</param>
/// <param name="dbType">One of the System.Data.SqlDbType values.</param>
/// <param name="size">The length of the parameter.</param>
/// <param name="precision">The precision of the parameter.</param>
/// <returns>The System.Data.SqlClient.SqlParameter object that was initialized and added to the collection.</returns>
public static SqlParameter Add(this SqlParameterCollection self, string parameterName, SqlDbType dbType, int size, byte precision)
{
    return self.Add(new SqlParameter(parameterName, dbType, size) { Precision = precision });
}

当您整天盯着其中的很多内容时,我发现这种语法更易于阅读,但它也与不支持精度的类型的标准 Add 方法一致:

decimal myDecimalVariable = 19.8M;
int myIntVariable = 2;
string myStringVariable = "Test";

cmd.Parameters.Add("@Parameter1", SqlDbType.Decimal, 11, 4).Value = myDecimalVariable;
cmd.Parameters.Add("@Parameter2", SqlDbType.Int).Value = myIntVariable;
cmd.Parameters.Add("@Parameter3", SqlDbType.Char, 4).Value = myStringVariable;

考虑到其他现有方法的数量,我只能想象最初的开发人员只是忘记将这个简单的方法包含在SqlParameterCollection 定义中。

【讨论】:

    【解决方案2】:

    AddWithValue() 的“邪恶”上的different article 将此示例用于 Decimal 类型参数:

    command.Parameters.Add( new SqlParameter("@InvoiceTotal", SqlDbType.Decimal) { Precision = 18, Scale = 4, Value = 1234.56m });
    

    所以我将代码更改为:

    cmd.Parameters.Add(new SqlParameter("@IMDBMinRating", SqlDbType.Decimal) { Precision = 2, Scale = 1, Value = _imdbThreshold });
    

    ...现在可以编译了。

    现在一切都好了,这样:

    cmd.Parameters.Add(new SqlParameter("@IMDBMinRating", SqlDbType.Decimal) { 
                           Precision = 2, Scale = 1, Value = _imdbThreshold });
    cmd.Parameters.Add("@EarliestYear", SqlDbType.Char, 4).Value = _yearBegin;
    cmd.Parameters.Add("@LatestYear", SqlDbType.Char, 4).Value = _yearEnd;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多