这是调用存储过程的代码示例。第二个进程在运行时抛出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();
}
答案 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)
重载 - 基本上我不应该使用它,就我所见。