[英]ArgumentException on Adding multiple Parameters in Stored Procedure
我试图通过添加三个参数来调用存储过程,但是在添加第二个参数时出现以下ArgumentException
SqlParameter已被另一个SqlParameterCollection包含
这是代码片段:
using (IDbCommand cmd =Idbconnection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "usp_Get_Products";
IDataParameter param = cmd.CreateParameter();
param.ParameterName = "@rvcName";
param.Value = productName;
cmd.Parameters.Add(param);
param.ParameterName = "@rvcCode";
param.Value = productCode;
cmd.Parameters.Add(param);
param.ParameterName = "@riProductTypeID";
param.Value = productTypeID;
cmd.Parameters.Add(param);
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Product product = new Product(reader["Name"].ToString(), reader["Code"].ToString(), reader["Description"].ToString(), (DateTime)reader["DateCreated"], Convert.ToInt32(reader["pkProductID"]), Convert.ToInt32(reader["ProductTypeID"]), reader["ProductTypeName"].ToString());
products.Add(product);
}
}
}
由于出现了错误,因为param
已添加到参数集合中。 在您的代码中,您只是在更改现有对象的值,然后尝试重新添加它。
您需要为集合中的每个参数创建一个新的参数对象实例 :
IDataParameter param = cmd.CreateParameter();
param.ParameterName = "@rvcName";
param.Value = productName;
cmd.Parameters.Add(param);
param = cmd.CreateParameter(); //create a new instance for the next parameter
param.ParameterName = "@rvcCode";
param.Value = productCode;
cmd.Parameters.Add(param);
param = cmd.CreateParameter(); //create a new instance for the next parameter
param.ParameterName = "@riProductTypeID";
param.Value = productTypeID;
cmd.Parameters.Add(param);
根据您的评论,同意这不是非常干燥。 但是,除非您已有某个元数据,否则创建一个废弃的元组列表只是为了遍历它们并创建不同的对象,可能不值得花费精力。
您可以使用现有的AddWithValue
方法(但是您必须小心使用null
作为值,否则该参数将毫无用处!):
cmd.Parameters.AddWithValue("@rvcName", (object)productName ?? DBNull.Value);
cmd.Parameters.AddWithValue("@rvcCode", (object)productCode ?? DBNull.Value);
cmd.Parameters.AddWithValue("@riProductTypeID", (object)productTypeID ?? DBNull.Value);
同样,还没有完全干燥,因此您可以将其包装在自己的方法中:
static void AddParameterWithValue(this IDbCommand cmd, string paramName, object value)
{
if(paramName == null)
throw new ArgumentNullException(nameof(paramName));
if(string.IsNullOrWhiteSpace(paramName))
{
throw new ArgumentOutOfRangeException(
nameof(paramName),
paramName,
"Parameter name cannot be empty");
}
cmd.Parameters.AddWithValue(paramName, value ?? DBNull.Value);
}
您可以使用foreach
循环
using (IDbCommand cmd =Idbconnection.CreateCommand())
{
foreach(var item in your data)
{
IDataParameter param = cmd.CreateParameter();
param.ParameterName = item.(your data here for ParameterName)
param.Value = item.productCode;
cmd.Parameters.Add(param);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.