Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP,SqlParameter已包含在另一个SqlParameterCollection中_C#_Asp.net_Sql Server - Fatal编程技术网

C# ASP,SqlParameter已包含在另一个SqlParameterCollection中

C# ASP,SqlParameter已包含在另一个SqlParameterCollection中,c#,asp.net,sql-server,C#,Asp.net,Sql Server,在应用程序中执行SQL Server存储过程时出现问题。我以前从未遇到过这个问题 我的数据类是: public static string conStr { get { return ConfigurationManager.ConnectionStrings["conn"].ConnectionString; } } public static string Provider { get { return ConfigurationManager.ConnectionStri

在应用程序中执行SQL Server存储过程时出现问题。我以前从未遇到过这个问题

我的数据类是:

public static string conStr
{
    get { return ConfigurationManager.ConnectionStrings["conn"].ConnectionString; }
}

public static string Provider
{
    get { return ConfigurationManager.ConnectionStrings["conn"].ProviderName; } //Proveedor de DB
}

//DB PROVIDER FACTORY: Objetos de Conexion
public static System.Data.Common.DbProviderFactory dpf
{
    get { return DbProviderFactories.GetFactory(Provider); }
}

private static int ejecutaNonQuery(string StoredProcedure, List<DbParameter> parametros)
{//execute nonquery retorna el numero de columnas afectadas en una dB 
    int Id = 0; //variable para saber cuantos elementos se modificaron despues del ejecutenonquery

    try
    {
        using (DbConnection con = dpf.CreateConnection()) //al usar using la conexion se cerrara automaticamente
        {
            con.ConnectionString = conStr;
            using (DbCommand cmd = dpf.CreateCommand())
            {
                cmd.Connection = con;
                cmd.CommandText = StoredProcedure;
                cmd.CommandType = CommandType.StoredProcedure;

                foreach (DbParameter param in parametros)
                    cmd.Parameters.Add(param);

                con.Open();
                Id = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear(); 
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    { }

    return Id;
}
我必须将数据从gridview插入到数据库中,所以我在每一行上运行存储过程来插入数据

我得到的错误是:

SqlParameter已包含在另一个SqlParameterCollection中

代码:

我使用
cmd.parameters.clear()
清除命令参数

在SQL Server中,我在SQL参数中为其他存储过程使用相同的名称。 我不知道是什么问题

请,如果有人能帮助我,我将不胜感激


致以最诚挚的问候

您只能使用SqlParameter一次。因为您要将SqlParameters传递到方法中,所以我假设它们也在其他地方使用

如果您希望保留通话签名并希望快速修复,请尝试此项。而不是

foreach (DbParameter param in parametros)
    cmd.Parameters.Add(param);
试一试

谢谢你们的帮助。 这是我的错误,我处理了将近30个参数,其中一个是重复的。 对不起

有人知道我怎么删除这个帖子吗


再次感谢

如果我没记错,你需要编辑帖子才能删除它。为了避免此类问题,我建议创建一个帮助器函数,如下所示:

private void AddParameter(DbProviderFactory dpf, List<DbParameter> params, DbType type, object value, string name)
{
    DbParameter param = dpf.CreateParameter();
    param.DbType = type;
    param.Value = value;
    param.ParameterName = name;
    params.Add(param);
}
 AddParameter(dpf, paramLotesConsol, DbType.String, cliCodigo, "CLIENTE_CODIGO");
 AddParameter(dpf, paramLotesConsol, DbType.String, cajCodigo, "CAJA_CODIGO");
// etc.

异常发生在哪一行?我的第一个想法是,对于所有名为
paramXX
的变量,您要添加一个变量两次。
Parameters.Clear()在哪里?我通常会在执行命令后立即执行,然后处理命令本身。旁注:1)如果您不处理异常(您所做的只是重新调用),并且finally是empy,那么将try/catch/finally一起删除,这只会给代码添加噪音和潜在的bug。2) 以上一点为例,并在此基础上通过传入异常永不重新抛出异常,即:
throw ex应读取
抛出。前者重置调用堆栈,使以后的故障排除变得更加困难,后者保留调用堆栈。另一方面注意:1)当本身返回
字符串时,为什么需要调用
Convert.ToString
?2) 我强烈建议创建一个元数据类,它将保存目标类型、db类型,可能还有一个名称(仅用于调试目的)。然后,实例化并填写这些类的
列表。最后,您可以使用该列表构建一系列DB参数实例,您可以依次将这些实例添加到存储过程中;它不能同时是多个参数集合的成员。
foreach (DbParameter param in parametros)
    cmd.Parameters.Add(param);
foreach (ICloneable param in parametros)
    cmd.Parameters.Add(param.Clone() as SqlParameter);
private void AddParameter(DbProviderFactory dpf, List<DbParameter> params, DbType type, object value, string name)
{
    DbParameter param = dpf.CreateParameter();
    param.DbType = type;
    param.Value = value;
    param.ParameterName = name;
    params.Add(param);
}
 AddParameter(dpf, paramLotesConsol, DbType.String, cliCodigo, "CLIENTE_CODIGO");
 AddParameter(dpf, paramLotesConsol, DbType.String, cajCodigo, "CAJA_CODIGO");
// etc.