繁体   English   中英

在存储过程中添加多个参数的ArgumentException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM