none
Actualizacion de una Tabla mediante un comando UPDATE del DataAdapter RRS feed

  • Pregunta

  • Hola Quisiera saber si me pueden ayudar, dejenme me explico:

           Tengo una aplicacion en Visual C# 2005 la cual se conecta al SQL Server 2005 en el evento Load y me trae la informacion de varias Tablas mediante un Store Procedure el cual lleno un DataSet con un DataAdapter.  Y esto DataSet lo asocio como DataSource a un DataGridView para me muestre la informacion de la consulta.

    Cuando deseo modificar en ejecucion sobre el DataGridView el DataSet me guarda los cambios y utilizo un parametro del Dataset.Update(Dataset.Tables[0]) donde se localiza la tabla q utlizo.

    Pero si modifico 2 o mas filas solo me guarda la ultima fila que modifique en la Tabla que deseo.

    No hay alguna forma hacer q todos las filas modificadas se guarden en la Tabla que quiero???

    De antemano agradezco la ayuda q' me puedan brindar.

    Gracias !!!
    miércoles, 9 de septiembre de 2009 23:16

Respuestas

  • Te agradezco Leandro Tuttini, pero encontre la solucion a mi problema.

    El detalle del problema estaba en el Store Procedure dbo.[sp_InsertReqDet] el cual no estaba haciendo referencia todo el segmento de datos q el Dataset tenia en ese momento.

    Este es el codigo del Store Procedure:

    CREATE PROCEDURE [sp_insertDet]
        
        @reqid as int, --Id para REQ_DET
        @detid as int=0,
        @descripcion as varchar(30),
        @cantidad as int,
        @costo as int,
        @cant_prod as int=0,
        @valordetid as int=0
      
    AS
    BEGIN
    	
    	SET NOCOUNT ON;
       
             SET @cant_prod=(SELECT COUNT(*) AS [TOTAL DE PRODUCTOS] FROM PRODUCTO)
              
              IF (SELECT COUNT(*) AS [TOTAL DE ELEMENTOS] FROM REQ_DET WHERE REQ_ID=@reqid)=0
                 BEGIN
                     SET @detid = 1
                 
                     INSERT INTO REQ_DET(REQ_ID,DET_ID) VALUES(@reqid,@detid)
    
                     UPDATE REQ_DET 
                     SET
                         [DESCRIPCION DE PRODUCTO]=@descripcion,
                         CANTIDAD=@cantidad,
                         COSTO=@costo
                     WHERE REQ_ID=@reqid AND DET_ID=@detid
                 END
              ELSE
                   BEGIN
           
                       SET @valordetid = (SELECT MAX(DET_ID + 1)as ID FROM REQ_DET WHERE REQ_ID=@reqid)
                       SET @detid  = (SELECT MAX(DET_ID)as ID FROM REQ_DET WHERE REQ_ID=@reqid)
    
                       IF(@valordetid > @cant_prod)
                           SET @detid=1
                       ELSE 
                           SET @detid= @detid + 1
    
                       INSERT INTO REQ_DET(REQ_ID,DET_ID) VALUES(@reqid,@detid)
                                       
                       UPDATE REQ_DET 
                       SET 
                         [DESCRIPCION DE PRODUCTO]=@descripcion,
                         CANTIDAD=@cantidad,
                         COSTO=@costo
                       WHERE REQ_ID=@reqid AND DET_ID=@detid
    			
                   END
    
    END
    GO
    
    Gracias de todas formas !!!
    • Marcado como respuesta blackrockmain viernes, 11 de septiembre de 2009 16:43
    viernes, 11 de septiembre de 2009 16:40

Todas las respuestas

  • hola

    Ese dataset que envias a actualizar de donde lo estas obteniendo

    o sea cuando bindeas el dataset al control datagridview el primer dataset queda desconectado

    cre que deberias usar algo como:

    DataSet dt = DataGridView1.DataSource as DataSet;

    para obtener el dataset que la grilla modifico

    lo estas haciando de estado forma?

    y luego si enviar ese dataset a actualizar


    Si no es asi como lo haces podrias postear algo de codigo de como estas operando con el dataset.



    - has validado las opciones de EndEdit() y AceptChange()

    DataSet.AcceptChanges

    igual esto es raro ya que dices que un registro si lo actualiza.
    el EndEdit() en realidad es para tu BindingSource si es que utilizas uno


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 10 de septiembre de 2009 3:44

  • De hecho mira primero alimento un DataSet (dss) y despues igualo la propiedad DataSource del DataGridView a este DataSet, mas o menos como dices, a continuacion te explico mas:


    Primeramente utilizo un DataSet q declaro como publico dentro de la clase de la siguiente forma:

    public DataSet dss = new DataSet("REQ_DET");


    Bueno el DataSet q cargo muestro en el DataGridView lo cargo en el Evento Load el codigo seria el siguiente:

    gridControl1.DataSource = dataset_gridview().Tables["REQ_DET"].DefaultView;



    El codigo de la funcion que mando llamar dataset_gridview() es el siguiente:

      public DataSet dataset_gridview()
           {     
            
             SqlConnection conexion2=new SqlConnection (cadena);
             SqlDataAdapter das = new SqlDataAdapter("sp_loadgrid_2", conexion2);
             das.Fill(dss, "REQ_DET");
             return dss;                  
           
           }


    Cuando trato de insertar los datos modificados sobre el DataGridView en la tabla deseada utilizo un Store procedure llamado "sp_insertDet" q me realiza algunos procedimientos en el SQL SERVER. En teoria el DataSet q carga el DataGridView siempre esta activo, por lo menos hasta que no lo borres o lo desactives. De tal forma q cuando realiza algun cambio en el DataGridView puesto q el DataSet lo alimento este mismo, crea una copia de todos los datos cuando se modifico el DataGridView dentro de si mismo, dando la posibilidad de hacer varias operaciones como Insertar, Borrar y tambien Actualizar.

    Hasta donde se, si actualizo mediante el comando DataAdapter.update(DataSet); se ejecuta automaticamente tantas veces, dependiendo cuantas filas yo tenga en mi DataSet actualizando, la Tabla que yo desee, siempre y cuando tenga el mismo tipo, longitud (para q coincidas los datos).  Pero a mi solo me funciona cuando un cliente elige solo un producto!!!



    El codigo para insertar los datos modificados utilizando el Store Procedure es:

    SqlDataAdapter dap = new SqlDataAdapter();
                SqlCommand cmdupdate = new SqlCommand("sp_insertDet", conec);
                cmdupdate.CommandType = CommandType.StoredProcedure;
    
                cmdupdate.Parameters.AddWithValue("@reqid", textBox1.Text);
                cmdupdate.Parameters.Add("@descripcion", SqlDbType.VarChar, 30, "DESCRIPCION DE PRODUCTO");
                cmdupdate.Parameters["@descripcion"].SourceColumn = dss.Tables[0].Columns["DESCRIPCION DE PRODUCTO"].ColumnName;           
                cmdupdate.Parameters.Add("@cantidad", SqlDbType.Int, 32, "CANTIDAD");
                cmdupdate.Parameters["@cantidad"].SourceColumn = dss.Tables[0].Columns["CANTIDAD"].ColumnName;
                cmdupdate.Parameters.Add("@costo", SqlDbType.Int, 32, "COSTO");
                cmdupdate.Parameters["@costo"].SourceColumn = dss.Tables[0].Columns["COSTO"].ColumnName;
                
                 try
                   {
                        conec.Open();
                        cmd.ExecuteNonQuery();
                        dap.UpdateCommand = cmdupdate;
                        dap.Update(dss.Tables[0]);         
                        dap.Dispose();
                        dss.Dispose(); 
                    }
     
                 catch (Exception ex)
                    { MessageBox.Show(ex.Message, "Error al conectar a la BD REQ_HDR en el modulo Insertar");   }
                 
                 finally
                    {
                        dss.Clear();
                        dataset_gridview();
                        dataset_gridview().Tables["REQ_DET"].DefaultView;
                        gridControl1.Update();
                        gridControl1.Refresh();
                        gridView1.RefreshData();          
                        conec.Close();
                        Console.WriteLine("Conexion Cerrada!!!");
                        conec.Dispose();
                    }  


    Has de cuenta que la Tabla a la q hago referencia aqui es REQ_DET  y se compone de los siguientes campos:


    REQ_DET

    Req_Id

    int

    Det_Id

    int

    Producto

    varchar(30)

    Cantidad

    int

    Costo

    int




    • El como puedes ver en el codigo el campo ReqId se lo paso como parametro mediante el store procedure al SQL Server.
    • El campo Det_Id es calculado dentro del Store Procedure q solo se va ha estar incrementando. Y estos dos campos (Req_Id y Det_Id) a su vez son la llave primaria e indice de la Tabla REQ_DET
    • Los campos Producto y Cantidad se encuentran en el Dataset q utilizo para llenar el DatagridView o sea "dss"
    • El campo Cantidad es el campo en el DataGridView q puede ser editado, de tal forma para q cuando un cliente sea capturado pueda ser posible q eliga de entre el catalogo de todos los productos existentes, la cantidad de productos q el desee.



    El codigo del Store Procedure es el siguiente:

    CREATE PROCEDURE [sp_insertDet]
        
        @reqid as int, --Id para REQ_DET
        @detid as int=1,
        @descripcion as varchar(30),
        @cantidad as int,
        @costo as int,
        
        @cant_fila_grid_modify as int,
        @cant_maxid_reqdet as int=0
    AS
    BEGIN
    	
    	SET NOCOUNT ON;
             
              IF (SELECT COUNT(*) AS [TOTAL DE ELEMENTOS] FROM REQ_DET WHERE REQ_ID=@reqid)=1
                 BEGIN
                     SET @cant_maxid_reqdet = (SELECT MAX(1 + DET_ID)as ID FROM REQ_DET )
                 
                     UPDATE REQ_DET 
                     SET
                         DET_ID=@cant_maxid_reqdet,
                         [DESCRIPCION DE PRODUCTO]=@descripcion,
                         CANTIDAD=@cantidad,
                         COSTO=@costo
                     WHERE REQ_ID=@reqid
                 END
              ELSE
                 BEGIN
                    SET @cant_maxid_reqdet=1
                                  
                     UPDATE REQ_DET 
                     SET 
                       DET_ID=@cant_maxid_reqdet,
                       [DESCRIPCION DE PRODUCTO]=@descripcion,
                       CANTIDAD=@cantidad,
                       COSTO=@costo
                     WHERE REQ_ID=(@reqid)
    	     END               
    END
    GO



    Puesto la llave primaria Req_Id la inserte desde otro modulo de la aplicacion en la Tabla REQ_DET, solo requiero hacer un UPDATE con toda la informacion tanto el campo q calculo (Det_Id ) y la demas datos q tiene el DataSet en la aplicacion.

    Fijate q primero reviso si ya existe una celda en el campo Req_Id q tenga el valor q tenga para actualizar exactamente sobre la fila del Req_Id solamente.

    Disculpa este comentario, q' mas q comentario parece una carta de 500 paginas, pero queria ser lo mas claro posible, asi de esta manera te puedes dar una idea mas global de toda la aplicacion en si.



    Agradezco q te hayas tomado el tiempo para responderme y apoyarme.

    Gracias !!!!

    • Marcado como respuesta blackrockmain viernes, 11 de septiembre de 2009 16:43
    • Desmarcado como respuesta blackrockmain viernes, 11 de septiembre de 2009 16:43
    jueves, 10 de septiembre de 2009 15:26
  • Te agradezco Leandro Tuttini, pero encontre la solucion a mi problema.

    El detalle del problema estaba en el Store Procedure dbo.[sp_InsertReqDet] el cual no estaba haciendo referencia todo el segmento de datos q el Dataset tenia en ese momento.

    Este es el codigo del Store Procedure:

    CREATE PROCEDURE [sp_insertDet]
        
        @reqid as int, --Id para REQ_DET
        @detid as int=0,
        @descripcion as varchar(30),
        @cantidad as int,
        @costo as int,
        @cant_prod as int=0,
        @valordetid as int=0
      
    AS
    BEGIN
    	
    	SET NOCOUNT ON;
       
             SET @cant_prod=(SELECT COUNT(*) AS [TOTAL DE PRODUCTOS] FROM PRODUCTO)
              
              IF (SELECT COUNT(*) AS [TOTAL DE ELEMENTOS] FROM REQ_DET WHERE REQ_ID=@reqid)=0
                 BEGIN
                     SET @detid = 1
                 
                     INSERT INTO REQ_DET(REQ_ID,DET_ID) VALUES(@reqid,@detid)
    
                     UPDATE REQ_DET 
                     SET
                         [DESCRIPCION DE PRODUCTO]=@descripcion,
                         CANTIDAD=@cantidad,
                         COSTO=@costo
                     WHERE REQ_ID=@reqid AND DET_ID=@detid
                 END
              ELSE
                   BEGIN
           
                       SET @valordetid = (SELECT MAX(DET_ID + 1)as ID FROM REQ_DET WHERE REQ_ID=@reqid)
                       SET @detid  = (SELECT MAX(DET_ID)as ID FROM REQ_DET WHERE REQ_ID=@reqid)
    
                       IF(@valordetid > @cant_prod)
                           SET @detid=1
                       ELSE 
                           SET @detid= @detid + 1
    
                       INSERT INTO REQ_DET(REQ_ID,DET_ID) VALUES(@reqid,@detid)
                                       
                       UPDATE REQ_DET 
                       SET 
                         [DESCRIPCION DE PRODUCTO]=@descripcion,
                         CANTIDAD=@cantidad,
                         COSTO=@costo
                       WHERE REQ_ID=@reqid AND DET_ID=@detid
    			
                   END
    
    END
    GO
    
    Gracias de todas formas !!!
    • Marcado como respuesta blackrockmain viernes, 11 de septiembre de 2009 16:43
    viernes, 11 de septiembre de 2009 16:40