为什么这个SqlParameterCollection调用会抛出错误?

时间:2015-08-06 18:57:16

标签: c# .net stored-procedures sqlparameter

这是调用存储过程的代码示例。第二个进程在运行时抛出InvalidCastException。我正在尝试向SqlParameter添加新的SqlParametersCollection。我见过很多使用相同语法的例子。

using (SqlCommand db = new SqlCommand("[StoredProcedureName]"))
{
    db.CommandType = CommandType.StoredProcedure;
    db.Connection = new SqlConnection(WebConfigurationAccess.ConnectionString);

    //1) works but this is long so wanted to try shortcut
    db.Parameters.Add(new SqlParameter("@pID", SqlDbType.Int));
    db.Parameters["@pID"].Value = 12345;
    //2) <<>>throws InvalidCastExpception. Id is set up as Int32
    db.Parameters.Add(new SqlParameter("@pID", SqlDbType.Int).Value = 12345);
    //3)but following codes does the job
    db.Parameters.Add("@pID", SqlDbType.Int).Value = 12345;
    db.Connection.Open();
    var dr = db.ExecuteReader();
}

1 个答案:

答案 0 :(得分:3)

我怀疑你没有看到那种确切的语法。看看你得到了什么:

db.Parameters.Add(new SqlParameter("@pID", SqlDbType.Int).Value = 12345);

那是用db.Parameters.Add参数调用int。我怀疑你实际看到的是:

db.Parameters.Add(new SqlParameter("@pID", SqlDbType.Int)).Value = 12345;

或更简单:

db.Parameters.Add("@pID", SqlDbType.Int).Value = 12345;

在这两种情况下,int 用于在参数创建并添加到集合后设置Value属性。

你的代码只是编译,因为有一个SqlParameterCollection.Add(object)重载 - 基本上我不应该使用它,就我所见。