none
¿ Donde debo poner el .parameters.clear() ?;: ¿ Qué estoy haciendo mal ? RRS feed

  • Pregunta

  • Hola, estoy siguiendo un pequeño curso sobre C# y como ejemplo, estoy creando una aplicación sencilla en este lenguaje, hasta ahora todo va bien, pero me he encontrado con el siguiente problema:

    Al insertar registros en dos tablas me aparece el error 'Otro SqlParameterCollection ya contiene SqlParameter'. y por lo que he estado viendo, hay que insertar un .parameters.clear();, lo he realizado pero me sigue dando el errror. Pongo el código para ver si alguien me puede ayudar, saludos.

         public string Insertar(DIngreso Ingreso,List<DDetalle_ingreso> Detalle)
            {
                string rpta = "";
                SqlConnection SqlCon = new SqlConnection();
                try
                {
                    // Código para 'insertar'
                    SqlCon.ConnectionString = Conexion.Cn;
                    SqlCon.Open();
                    // Antes de comenzar, establecemos una transacción.
                    SqlTransaction SqlTra = SqlCon.BeginTransaction();
                    // Instrucciones del comando para insertar
                    SqlCommand SqlCmd = new SqlCommand();
                    SqlCmd.Connection = SqlCon;
                    SqlCmd.Transaction = SqlTra;  // Vinculamos la transacción con el comando de la conexión actual.
                    SqlCmd.CommandText = "spinsertar_ingreso";
                    SqlCmd.CommandType = CommandType.StoredProcedure;
                    SqlCmd.Parameters.Clear();

                    SqlParameter ParamIdIngreso = new SqlParameter();
                    ParamIdIngreso.ParameterName = "@idingreso";
                    ParamIdIngreso.SqlDbType = SqlDbType.Int;
                    ParamIdIngreso.Direction = ParameterDirection.Output;
                    SqlCmd.Parameters.Add(ParamIdIngreso);

      .....


                    SqlParameter ParamEstado = new SqlParameter();
                    ParamEstado.ParameterName = "@estado";
                    ParamEstado.SqlDbType = SqlDbType.VarChar;
                    ParamEstado.Size = 7;
                    ParamEstado.Value = Ingreso.Estado;
                    SqlCmd.Parameters.Add(ParamEstado);
                    // Ejecución del comando.
                    rpta = SqlCmd.ExecuteNonQuery() == 1 ? "OK" : "NO se ha insertado el registro";
                    // A continuación ejecutamos la inserción de los registros de detalle.
                    if (rpta.Equals("OK"))
                    {
                        // Obtenemos el código del id autogenerado.
                        this.IdIngreso = Convert.ToInt32(SqlCmd.Parameters["@idingreso"].Value);
                         foreach (DDetalle_ingreso det in Detalle)
                        {
                           // Asignamos a la lista 'Detalle' alojada en la variable 'det'
                          // el número idIngreso obtenido de la base de datos
                           det.Idingreso = this.IdIngreso;
                            // Ahora llamamos al método 'Insertar' de la clase DDetalle_ingreso.
                            SqlCmd.Parameters.Clear();
                            rpta = det.Insertar(det,ref SqlCon,ref SqlTra);
                               if (!rpta.Equals("OK"))
                            {
                               break;  // En caso de que la inserción no fué correcta, salimos del bucle de inserción con 'break'
                            }
                        }
                    }
                    if (rpta.Equals("OK"))
                    {
                        SqlTra.Commit();    // Cerramos la transacción
                    }else
                    {
                        SqlTra.Rollback();  // Cancelamos la transacción
                    }

    En la clase det.Insertar, el código llama a esta clase:

         public string Insertar(DDetalle_ingreso Detalle_Ingreso,ref SqlConnection SqlCon,ref SqlTransaction SqlTran)
            {
                string rpta = "";
                try
                {
                    // Código para 'insertar'
                     // Instrucciones del comando para insertar
                    SqlCommand SecondSqlCmd = new SqlCommand();
                    SecondSqlCmd.Connection = SqlCon;
                    SecondSqlCmd.Transaction = SqlTran;
                    SecondSqlCmd.CommandText = "spinsertar_detalle_ingreso";
                    SecondSqlCmd.CommandType = CommandType.StoredProcedure;
                    SecondSqlCmd.Parameters.Clear();

                    SqlParameter ParamIdCategoria = new SqlParameter();
                    ParamIdCategoria.ParameterName = "@iddetalle_ingreso";
                    ParamIdCategoria.SqlDbType = SqlDbType.Int;
                    ParamIdCategoria.Direction = ParameterDirection.Output;
                    SecondSqlCmd.Parameters.Add(ParamIdCategoria);

    ....

                  SqlParameter ParamFechaVto = new SqlParameter();
                    ParamFechaVto.ParameterName = "@fecha_vencimiento";
                    ParamFechaVto.SqlDbType = SqlDbType.Date;
                    ParamFechaVto.Value = Detalle_Ingreso.Fecha_vencimiento;
                    SecondSqlCmd.Parameters.Add(ParamFechaVto);

                    // Ejecución del comando.
                    rpta = SecondSqlCmd.ExecuteNonQuery() == 1 ? "OK" : "NO se ha insertado el registro";
    /            }
                catch (Exception Ex)
                {
                    rpta = Ex.Message;
                }
                 return rpta;

    He obviado las líneas repetitivas donde se introduce el código de todos los parámetros pues es bastante tedioso, ha sido probado y funciona correctamente, el único problema que me da es el error mencionado al principio. He ido añadiendo en diferentes partes del código varios .parameters.clear(); pero me sigue saliendo. ¿ Alguien puede decirme donde debo poner el .Clear() ?;

    lunes, 19 de febrero de 2018 12:25

Todas las respuestas

  • No parece que haya ningún problema en tu código que pueda generar ese error.

    ¿En qué línea te da el error?

    El error lo que indica es que estás añadiendo a la colección Parameters un objeto SqlParameter que ya se ha añadido a otra colección Parameters.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 19 de febrero de 2018 20:34