none
problemas por un update RRS feed

  • Pregunta

  • Tengo un problema bastante raro 

    les explico, tengo un update en un formulario pero tengo un problema  

    hay un parámetro que no me quiere actualizar solo si lo cambio a el solo osea

    cuando actualizo mas de un campo no tengo problemas pero si actualizo ese campo solo no lo hace

    lo malo es que no me tirra error ni nada, me dice que los cambios fueron realizados  y no se que hacer la verdad 

    me estoy volviendo loco con esta tonteria les muestro el codigo para ver si el error es mio (espero que eso sea)


           
            If TxtCodigo.Text.Trim = "" Then
                    Response.Write("<script language='javascript'> alert('Debe ingresar código '); </script>")
    
                ElseIf TxtNombre.Text.Trim = "" Then
                    Response.Write("<script language='javascript'> alert('Debe ingresar Nombre'); </script>")
    
                Else
                If CBafecto.Checked = True Then
    
                    Dim afecto = 1
                    Dim cmd As New SqlCommand("update producto set  nombre='" & TxtNombre.Text & "', color='" & TxtColor.Text & "', descripcion2='" & TxtDescrip.Text & "', uni_med='" & ListaUniMedida.SelectedIndex & "', tipo_produ='" & ListaTipo.SelectedIndex & "',  marca='" & ListaMarca.SelectedIndex & "',  imputable='" & TxtImpEspe.Text & "',  peso='" & TxtPeso.Text & "', precultcpa='" & TxtUltCompra.Text & "', stockcritico='" & TxtStockCri.Text & "', id_tipodeimpuesto='" & ListaTipoImp.SelectedIndex & "', talla='" & TxtTalla.Text & "' , afecto= 1 where codigo='" & TxtCodigo.Text & "'", conexion)
                    Dim cmd2 As New SqlCommand("UPDATE PRODUCTO SET cod_barra='" & TxtCodigoBarra.Text.Trim & "' where codigo='" & TxtCodigo.Text & "'", conexion)
                    cmd.ExecuteNonQuery()
                    cmd2.ExecuteNonQuery()
                    Bloquear_Textbox()
                    Response.Write("<script language='javascript'> alert('Se ha actualizado correctamente 1'); </script>")
                  
    
                Else
    
                    Dim afecto = 0
    
                    Dim cmd As New SqlCommand("update producto set nombre='" & TxtNombre.Text & "', color='" & TxtColor.Text & "', descripcion2='" & TxtDescrip.Text & "', imputable='" & TxtImpEspe.Text & "',  peso='" & TxtPeso.Text & "', precultcpa='" & TxtUltCompra.Text & "', stockcritico='" & TxtStockCri.Text & "',  talla='" & TxtTalla.Text & "', id_tipodeimpuesto='" & ListaTipoImp.SelectedIndex & "', uni_med='" & ListaUniMedida.SelectedIndex & "', tipo_produ='" & ListaTipo.SelectedIndex & "',  marca='" & ListaMarca.SelectedIndex & "' , afecto= 0 where codigo='" & TxtCodigo.Text & "'", conexion)
                    Dim cmd2 As New SqlCommand("UPDATE PRODUCTO SET cod_barra='" & TxtCodigoBarra.Text.Trim & "' where codigo='" & TxtCodigo.Text & "'", conexion)
                    cmd.ExecuteNonQuery()
                    cmd2.ExecuteNonQuery()
                  
                End If
            End If

    de antemano muchas gracias y espero que alguien sepa que pasa 

    miércoles, 6 de julio de 2016 20:02

Respuestas

  • hola

    el problema que tienes es que debes usar parametros, no se concatena en el string los valores

    la estructura del codigo deberia ser de esta forma

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {  
        conn.Open();  
     
        string query = "INSERT INTO NombreTabla (campo1, campo2) VALUES (@param1, @param2)";  
        SqlCommand cmd = new SqlCommand(query, conn);  
        cmd.Parameters.AddWithValue("@param1", Convert.ToString(TextBox1.Text));  
        cmd.Parameters.AddWithValue("@param2", Convert.ToInt32(Textbox2.Text));  
     
        cmd.ExecuteNonQuery();  
     
    }

    el insert o update es lo mismo lo que debes validar es como se asignan los valores usando la coleccion Parameters


    ojo con lo combos porque deberias usar  ListaTipo.SelectedValue y no el SelectedIndex

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 6 de julio de 2016 20:36
  • login y conexión a diferentes bases de datos,

    Si realizas dos operaciones (UPDATE) debes cuidar en tratar ambas operaciones como una transacción, fíjate en el siguiente ejemplo:

    using (SqlConnection cn = new SqlConnection("<Coloque la cadena de conexión>"))
                {
                    cn.Open();
    
                    SqlCommand cmd = cn.CreateCommand();
    
                    SqlTransaction transaction;
    
                    transaction = cn.BeginTransaction("MiTransaccion");
    
                    cmd.Connection = cn;
                    cmd.Transaction = transaction;
    
                    try
                    {
                        cmd.CommandText = "UPDATE MiTabla1 SET Campo1 = 10 WHERE ID = @ID";
                        cmd.Parameters.AddWithValue("@ID", TextBox1.Text);
                        cmd.ExecuteNonQuery();
    
    
                        cmd.CommandText = "UPDATE MiTabla2 SET Campo2 = 20 WHERE ID = @ID";
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@ID", TextBox2.Text);
                        cmd.ExecuteNonQuery();
    
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                    }
                }

    Nota el uso del método BeginTransaction(), el método mapeara la instrucción BEGIN TRANSACTION en la consulta sql. Fíjate además el uso de parámetros y el uso de un sólo objeto de tipo Command.

    jueves, 7 de julio de 2016 0:02

Todas las respuestas

  • hola

    el problema que tienes es que debes usar parametros, no se concatena en el string los valores

    la estructura del codigo deberia ser de esta forma

    using (SqlConnection conn = new SqlConnection("<connection string>"))  
    {  
        conn.Open();  
     
        string query = "INSERT INTO NombreTabla (campo1, campo2) VALUES (@param1, @param2)";  
        SqlCommand cmd = new SqlCommand(query, conn);  
        cmd.Parameters.AddWithValue("@param1", Convert.ToString(TextBox1.Text));  
        cmd.Parameters.AddWithValue("@param2", Convert.ToInt32(Textbox2.Text));  
     
        cmd.ExecuteNonQuery();  
     
    }

    el insert o update es lo mismo lo que debes validar es como se asignan los valores usando la coleccion Parameters


    ojo con lo combos porque deberias usar  ListaTipo.SelectedValue y no el SelectedIndex

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 6 de julio de 2016 20:36
  • loveee voy a probar de inmediato y te digo como me fue
    miércoles, 6 de julio de 2016 22:12
  • Hola login y conexión a diferentes bases de datos,

    Ya que estás usando SQL, puedes usar StoredProcedure en vez de estar haciendo una query así. Además podrías usar un solo SQLCommand sin tener que crear 2.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 6 de julio de 2016 22:17
  • login y conexión a diferentes bases de datos,

    Si realizas dos operaciones (UPDATE) debes cuidar en tratar ambas operaciones como una transacción, fíjate en el siguiente ejemplo:

    using (SqlConnection cn = new SqlConnection("<Coloque la cadena de conexión>"))
                {
                    cn.Open();
    
                    SqlCommand cmd = cn.CreateCommand();
    
                    SqlTransaction transaction;
    
                    transaction = cn.BeginTransaction("MiTransaccion");
    
                    cmd.Connection = cn;
                    cmd.Transaction = transaction;
    
                    try
                    {
                        cmd.CommandText = "UPDATE MiTabla1 SET Campo1 = 10 WHERE ID = @ID";
                        cmd.Parameters.AddWithValue("@ID", TextBox1.Text);
                        cmd.ExecuteNonQuery();
    
    
                        cmd.CommandText = "UPDATE MiTabla2 SET Campo2 = 20 WHERE ID = @ID";
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@ID", TextBox2.Text);
                        cmd.ExecuteNonQuery();
    
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        transaction.Rollback();
                    }
                }

    Nota el uso del método BeginTransaction(), el método mapeara la instrucción BEGIN TRANSACTION en la consulta sql. Fíjate además el uso de parámetros y el uso de un sólo objeto de tipo Command.

    jueves, 7 de julio de 2016 0:02
  • me resulto gracias sorry por la demora  grax 
    viernes, 8 de julio de 2016 22:26