在存储过程中添加多个参数的参数异常
本文关键字:参数 异常 添加 存储 存储过程 过程中 | 更新日期: 2023-09-27 18:33:51
我正在尝试通过添加三个参数来调用存储过程,但是在添加第二个参数时出现以下参数异常
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);
}
}