C# ASP,SqlParameter已包含在另一个SqlParameterCollection中
在应用程序中执行SQL Server存储过程时出现问题。我以前从未遇到过这个问题 我的数据类是: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
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.