none
Error "otro SqlparameterCollection ya contiene Sqlparameter" RRS feed

  • Pregunta

  • Hola amigos, estoy tratando de averiguar por donde debo buscar este error, esto me sale al momento de guardar un formulario, todo esta funcionando bien y no se si borre o coloque algo sin culpa, no se si hay que buscar en alguna de las capas o si el error es en la base de datos o en el formulario, agradezco a quien me pueda ayudar en la orientación de por donde empezar a mirar.

    Mi proyect es en 3 capas. Gracias. Datos, negocios, presentación. Error es Error "otro SqlparameterCollection ya contiene Sqlparameter"

    Quedo atentamente agradecido a quien me pueda dar una orientación. Gracias.

    • Cambiado webJose sábado, 19 de marzo de 2016 17:36
    viernes, 18 de marzo de 2016 21:48

Respuestas

  • Leandro listo era que estaba repetida la linea  : SqlCmd.Parameters.Add(ParDpto); dos veces en la capa datos. En todo caso muchas gracias por su colaboración y sus aportes.

    • Marcado como respuesta Jorge_Mora sábado, 19 de marzo de 2016 17:42
    sábado, 19 de marzo de 2016 17:42

Todas las respuestas

  • hola

    en que linea de error observas el problema ?

    podrias analizar el StackTrace del exception para tener algo mas de datos de donde se produce el problema

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 18 de marzo de 2016 21:50
  • Leandro solo ocurre cuando voy a ejecutar el botón guardar, me sale esto y no me muestra linea de erro o yo no se encontrarla si es el caso??
    viernes, 18 de marzo de 2016 22:28
  • hola

    el problema se presenta cuando ejecutas desde el VS ? cuando falla no se detiene en la linea que genera el problema ?

    en el evento del boton de guardar define un try..catch y registra el objeto Exception que capturas, lo importante es el StackTrace

    cual es el codigo que implementas al guardar ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 18 de marzo de 2016 23:33
  • Este es el código de botón guardar:

    private void btnGuardar_Click(object sender, EventArgs e)
            {
                try
                {
                    string rpta = "";
                    if (this.txtIdinformante.Text == string.Empty || this.txtIdcliente.Text == string.Empty)
                    {
                        MensajeError("Falta ingresar algunos datos, serán remarcados");
                        errorIcono.SetError(txtIdinformante, "Ingrese un Valor");
                        errorIcono.SetError(txtIdcliente, "Ingrese un Valor");
                        
                    }
                    else
                    {

                        if (this.IsNuevo)
                        {
                            rpta = NControl_Dctal.Insertar(Idtrabajador, Convert.ToInt32(this.txtIdinformante.Text), Convert.ToInt32(this.txtIdcliente.Text),
                                Convert.ToInt32(this.txtIdlocalidad.Text), dtFecha.Value,  "EMITIDO", dtDetalle);

                        }


                        if (rpta.Equals("OK"))
                        {
                            if (this.IsNuevo)
                            {
                                this.MensajeOk("Se Insertó de forma correcta el registro");
                            }


                        }
                        else
                        {
                            this.MensajeError(rpta);
                        }

                        this.IsNuevo = false;
                        this.Botones();
                        this.Limpiar();
                        this.limpiarDetalle();
                        this.Mostrar();



                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + ex.StackTrace);
                }
            }

    viernes, 18 de marzo de 2016 23:45
  • ok entonces el problema no esta en el boton sino en NControl_Dctal.Insertar()

    como ejecutas la query y asignas los parametros en Insertar() ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 19 de marzo de 2016 0:06
  • Gracias Leandro por tu disposición para ayudarme, este es el código del NControl_Dctal:

    public class NControl_Dctal
        {
            public static string Insertar(int idtrabajador, int idinformante, int idcliente, int idlocalidad, DateTime fecha,
                string estado, DataTable dtDetalles)
            {
                DControl_Dctal Obj = new DControl_Dctal();
                Obj.Idtrabajador = idtrabajador;
                Obj.Idinformante = idinformante;
                Obj.Idcliente = idcliente;
                Obj.Idlocalidad = idlocalidad;
                Obj.Fecha = fecha;        
                Obj.Estado = estado;
                List<DDetalle_Control_Dctall> detalles = new List<DDetalle_Control_Dctall>();
                foreach (DataRow row in dtDetalles.Rows)
                {
                    DDetalle_Control_Dctall detalle = new DDetalle_Control_Dctall();
                    detalle.Iddocumental = Convert.ToInt32(row["iddocumental"].ToString());                
                    detalle.Calif_Inicial = Convert.ToDecimal(row["calif_inicial"].ToString());
                    detalle.Calif_Actual = Convert.ToDecimal(row["calif_inicial"].ToString());
                    detalle.Max_Calif = Convert.ToDecimal(row["max_calif"].ToString());
                    detalle.Cant_Respuesta = Convert.ToInt32(row["cant_respuesta"].ToString());
                    detalle.Zona = Convert.ToString(row["zona"].ToString());
                    detalle.Municipio = Convert.ToString(row["municipio"].ToString());
                    detalle.Dpto = Convert.ToString(row["dpto"].ToString());
                    detalle.Cliente = Convert.ToString(row["cliente"].ToString());
                    detalles.Add(detalle);
                }
                return Obj.Insertar(Obj, detalles);
            }

            public static string Anular(int idcontrol_dctal)
            {
                DControl_Dctal Obj = new DControl_Dctal();
                Obj.Idcontrol_Dctal = idcontrol_dctal;
                return Obj.Anular(Obj);
            }

            //Método Mostrar que llama al método Mostrar de la clase DIngreso
            //de la CapaDatos
            public static DataTable Mostrar()
            {
                return new DControl_Dctal().Mostrar();
            }

            //Método BuscarFecha que llama al método BuscarNombre
            //de la clase DIngreso de la CapaDatos

            public static DataTable BuscarFechas(string textobuscar, string textobuscar2)
            {
                DControl_Dctal Obj = new DControl_Dctal();
                return Obj.BuscarFechas(textobuscar, textobuscar2);
            }

            public static DataTable MostrarDetalle(string textobuscar)
            {
                DControl_Dctal Obj = new DControl_Dctal();
                return Obj.MostrarDetalle(textobuscar);
            }
        }


    • Editado Jorge_Mora sábado, 19 de marzo de 2016 0:14
    sábado, 19 de marzo de 2016 0:14
  • hola

    algo no me cierra de ese codigo, porque pasa los valores de los textbox por parametro al NControl_Dctal.Insertar() pero el acceso al dtDetalles lo haces dentro ? eso no tiene sentido

    o lo conviertes accediando a los controles desde fuera del Insertar() o lo haces todo desde dentro, no mitad y mitad

    si armas un objeto lo realizas desde la pesentacion no desde una clase NControl_Dctal

    en la presentacion usas directo

    private void btnGuardar_Click(object sender, EventArgs e)
    {
    	try
    	{
    		string rpta = "";
    		if (this.txtIdinformante.Text == string.Empty || this.txtIdcliente.Text == string.Empty)
    		{
    			MensajeError("Falta ingresar algunos datos, serán remarcados");
    			errorIcono.SetError(txtIdinformante, "Ingrese un Valor");
    			errorIcono.SetError(txtIdcliente, "Ingrese un Valor");
    			
    		}
    		else
    		{
    
    			if (this.IsNuevo)
    			{
    				Create()
    			}
    			
    		//resto codigo
    			
    }
    
    private void Create()
    {
    
    	DControl_Dctal Obj = new DControl_Dctal();
    	Obj.Idtrabajador = Idtrabajador;
    	Obj.Idinformante = Convert.ToInt32(this.txtIdinformante.Text);
    	Obj.Idcliente = Convert.ToInt32(this.txtIdcliente.Text);
    	Obj.Idlocalidad = Convert.ToInt32(this.txtIdlocalidad.Text);
    	Obj.Fecha = dtFecha.Value;        
    	Obj.Estado = "EMITIDO";
    	List<DDetalle_Control_Dctall> detalles = new List<DDetalle_Control_Dctall>();
    	foreach (DataRow row in dtDetalles.Rows)
    	{
    		DDetalle_Control_Dctall detalle = new DDetalle_Control_Dctall();
    		detalle.Iddocumental = Convert.ToInt32(row["iddocumental"].ToString());                
    		detalle.Calif_Inicial = Convert.ToDecimal(row["calif_inicial"].ToString());
    		detalle.Calif_Actual = Convert.ToDecimal(row["calif_inicial"].ToString());
    		detalle.Max_Calif = Convert.ToDecimal(row["max_calif"].ToString());
    		detalle.Cant_Respuesta = Convert.ToInt32(row["cant_respuesta"].ToString());
    		detalle.Zona = Convert.ToString(row["zona"].ToString());
    		detalle.Municipio = Convert.ToString(row["municipio"].ToString());
    		detalle.Dpto = Convert.ToString(row["dpto"].ToString());
    		detalle.Cliente = Convert.ToString(row["cliente"].ToString());
    		detalles.Add(detalle);
    	}
    
    	Obj.Insertar(Obj, detalles);
    }

    no tienes una clase intermedia solo para mapear controles a objetos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 19 de marzo de 2016 1:55
  • por otro lado el problema sigue sin parecer ya que al tener otra capa intermedia

    deberia anlizarse el codigo de Obj.Insertar()


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 19 de marzo de 2016 1:56
  • Leandro creo que el error esta en que al guardar como yo borre la base de datos en sql para reiniciar de nuevo en unas pruebas que esta haciendo pero cuando hice ese borrado me paso algo raro porque me borro y luego me toco volver a borrar y he intentado para que me entiendas mejor borrar los incrementales a cero con:

    DBCC CHECKIDENT ('mi_tabla', RESEED,0)

    TRUNCATE TABLE mi_tabla

    y no he podido con ninguno de las dos opciones me sale error esto con el fin de inicializar de cero y ver que ese no es el error. 

    Te agradezco si sabes otra forma de inicializar de cero los incrementales para hacerlo a estas tablas a ver si me guarda.

    Te agradezco tu ayuda.

     
    sábado, 19 de marzo de 2016 15:49
  • El reseed luce bien pero el ejemplo que veo en MSDN también usa el nombre de esquema.  Podría intentar especificando el nombre de esquema también.

    Ahora bien, creo que truncar una tabla hace el reseed automáticamente.

    Pero bueno, eso no sé qué tiene que ver con su problema original.  Según infiero por el mensaje de error, el código que está utilizando usa ADO.net para invocar SQL, y su lógica parece estar reutilizando objetos tipo SqlParameter, que según el mensaje de error, no es posible hacer.  Según veo (y es noticia para mí), un SqlParameter, una vez agregado a una colección de parámetros, no puede usarse en ninguna otra colección de parámetros.  Entonces su solución es crear los SqlParameter's cada vez que  los necesita.


    Jose R. MCP
    Code Samples

    sábado, 19 de marzo de 2016 17:36
  • Leandro listo era que estaba repetida la linea  : SqlCmd.Parameters.Add(ParDpto); dos veces en la capa datos. En todo caso muchas gracias por su colaboración y sus aportes.

    • Marcado como respuesta Jorge_Mora sábado, 19 de marzo de 2016 17:42
    sábado, 19 de marzo de 2016 17:42