none
UPDATE no funciona con parámetros RRS feed

  • Pregunta

  • Quiero hace una actualización a una tabla usando parámetros a la instrucción SQL asi:

    SQL="UPDATE TABLA SET CAMPO1 = @Val1, CAMPO2 = @Val2 WHERE CODIGO = @Cod"
    Dim Cmd as New OledbCommand(SQL, Cnn)
    Cmd.AddParameterWithValue("@Val1", txtValor1.Text)
    Cmd.AddParameterWithValue("@Val2", txtValor2.Text)
    Cmd.AddParameterWithValue("@Cod", txtCodigo.Text)
    Cmd.Connection.Open
    Cmd.ExecuteNonQuery
    Cmd.Connection.Close

    Pero no funciona, esto lo paso por Try y no me devuelve ningun error, solo no actualiza nada.

    En la Instruccion INSERT no tengo ningun problema, solo con UPDATE no funciona.

    Alguien tiene idea de qué anda mal?

    Saludos,

    viernes, 10 de agosto de 2012 17:02

Todas las respuestas

  • que pasa si usas

    Dim afectados As Integer = Cmd.ExecuteNonQuery

    evalua afectados, si devuelve cero es porque pasas un Cod que no existe como registro para actualizar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 10 de agosto de 2012 18:31
  • Si hago:

    Dim r as Integer = Cmd.ExecuteNonReader()

    me devuelve 0, ya consideré el codigo en la ecuación pero no me afectó.

    Hice la instruccion sin usar parámetros concatenando valore a la instrucción SQL asi:

    SQL="UPDATE TABLA SET CAMPO1 = '" & txtValor1.Text & _
    "', CAMPO2 = '" & txtValor2.Text & _
    "' WHERE CODIGO = " & txtCodigo.Text
    Dim Cmd as New OledbCommand(SQL, Cnn)
    Cmd.Connection.Open
    Dim r as integer = Cmd.ExecuteNonQuery
    Cmd.Connection.Close
    Messagebox.Show("Registros actualizados: " & r )

    En este caso r devuelve 1 y el registro es actualizado. El problema es cuando le intento meter parámetros, es ahí cuando no funciona.

    viernes, 10 de agosto de 2012 19:34
  • y si usas

    Cmd.AddParameterWithValue("@Cod", Convert.ToInt32(txtCodigo.Text))

    o sea si el campo codigo es numerico debes respetar el tipo de dato


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 12 de agosto de 2012 4:06
  • Hola,

    Aque tip de base de datos te estas conectando????

    Recuerda que es mucho mejor trabajar un provider especifico, en teoria el rendimiento y la forma de integracion puede ser hasta nativa.

    Si estas utilizando Sql Server utiliza el siguiente ejemplo.

    Codigo VB
    
    Private Sub UpdateData()
    	Dim ConnectionString As String = "Data Source=.;Initial Catalog=Prueba;Integrated Security=True"
    	Dim StrCommand As String = "UPDATE [dbo].[demo]    SET  [a2] = @valor01  WHERE [a1]=@valor02"
    	Using cn As New System.Data.SqlClient.SqlConnection(ConnectionString)
    		Using cmd As New System.Data.SqlClient.SqlCommand()
    			'Declarar parametros.
    			Dim pr01 As New System.Data.SqlClient.SqlParameter()
    			Dim pr02 As New System.Data.SqlClient.SqlParameter()
    			'configurar parametros
    			pr01.DbType = System.Data.DbType.[String]
    			pr01.Value = "hola mundo"
    			pr01.ParameterName = "@valor01"
    			'
    			pr02.DbType = System.Data.DbType.Int32
    			pr02.Value = 1
    			pr02.ParameterName = "@valor02"
    
    			If cn.State = System.Data.ConnectionState.Closed Then
    				cn.Open()
    			End If
    			cmd.Connection = cn
    			cmd.CommandText = StrCommand
    			cmd.Parameters.Add(pr01)
    			cmd.Parameters.Add(pr02)
    
    			Dim a As Integer = cmd.ExecuteNonQuery()
    		End Using
    	End Using
    End Sub
    
    
    Codigo C#
    private void UpdateData()
            {
                string ConnectionString = "Data Source=.;Initial Catalog=Prueba;Integrated Security=True";
                string StrCommand = "UPDATE [dbo].[demo]    SET  [a2] = @valor01  WHERE [a1]=@valor02";
                using (System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(ConnectionString))
                {
                    using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                    {
                        //Declarar parametros.
                        System.Data.SqlClient.SqlParameter pr01 = new System.Data.SqlClient.SqlParameter();
                        System.Data.SqlClient.SqlParameter pr02 = new System.Data.SqlClient.SqlParameter();
                        //configurar parametros
                        pr01.DbType = System.Data.DbType.String;
                        pr01.Value = "hola mundo";
                        pr01.ParameterName = "@valor01";
                        //
                        pr02.DbType = System.Data.DbType.Int32;
                        pr02.Value = 1;
                        pr02.ParameterName = "@valor02";
    
                        if (cn.State == System.Data.ConnectionState.Closed)
                        {
                            cn.Open();
                        }
                        cmd.Connection = cn;
                        cmd.CommandText = StrCommand;
                        cmd.Parameters.Add(pr01);
                        cmd.Parameters.Add(pr02);
                        int a=cmd.ExecuteNonQuery();
              
                    }
                }
            }


    Utilizando proveedor oledb

    --codigo VB (generado a partir de C#)
    Private Sub UpdateData()
    	Dim ConnectionString As String = "Provider=SQLNCLI11;Data Source=(local);Integrated Security=SSPI;Initial Catalog=Prueba"
    	Dim StrCommand As String = "UPDATE [dbo].[demo]    SET  [a2] = ?  WHERE [a1]=?"
    	Using cn As New System.Data.OleDb.OleDbConnection(ConnectionString)
    		Using cmd As New System.Data.OleDb.OleDbCommand()
    			'Declarar parametros.
    			Dim pr01 As New System.Data.OleDb.OleDbParameter()
    			Dim pr02 As New System.Data.OleDb.OleDbParameter()
    			'configurar parametros
    			pr01.DbType = System.Data.DbType.[String]
    			pr01.Value = "hola mundo"
    			pr01.ParameterName = "@valor01"
    			'
    			pr02.DbType = System.Data.DbType.Int32
    			pr02.Value = 1
    			pr02.ParameterName = "@valor02"
    
    			If cn.State = System.Data.ConnectionState.Closed Then
    				cn.Open()
    			End If
    			cmd.Connection = cn
    			cmd.CommandText = StrCommand
    			cmd.Parameters.Add(pr01)
    			cmd.Parameters.Add(pr02)
    
    			Dim a As Integer = cmd.ExecuteNonQuery()
    		End Using
    	End Using
    End Sub
    
    --Codigo C# original
    private void UpdateData()
            {
                string ConnectionString = "Provider=SQLNCLI11;Data Source=(local);Integrated Security=SSPI;Initial Catalog=Prueba";
                string StrCommand = "UPDATE [dbo].[demo]    SET  [a2] = ?  WHERE [a1]=?";
                using (System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection(ConnectionString))
                {
                    using (System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand())
                    {
                        //Declarar parametros.
                        System.Data.OleDb.OleDbParameter pr01 = new System.Data.OleDb.OleDbParameter();
                        System.Data.OleDb.OleDbParameter pr02 = new System.Data.OleDb.OleDbParameter();
                        //configurar parametros
                        pr01.DbType = System.Data.DbType.String;
                        pr01.Value = "hola mundo";
                        pr01.ParameterName = "@valor01";
                        //
                        pr02.DbType = System.Data.DbType.Int32;
                        pr02.Value = 1;
                        pr02.ParameterName = "@valor02";
    
                        if (cn.State == System.Data.ConnectionState.Closed)
                        {
                            cn.Open();
                        }
                        cmd.Connection = cn;
                        cmd.CommandText = StrCommand;
                        cmd.Parameters.Add(pr01);
                        cmd.Parameters.Add(pr02);
                        int a = cmd.ExecuteNonQuery();
    
                    }
                }
            }

    Despues de analizar los codigos, veras que en el oledb, los parametros en el query se defin por "?".

    Como ultima recomendacion, procurar reutilizar codigo, trabaja con capas, capa de conexion, capa de negocios, etc. mucho del codigo que utilizas se puede reutilizar.


    Ahias Portillo

    sábado, 1 de septiembre de 2012 22:09
  • Hola,

    usa:

    cmd.add.parameters("@cod",sqldbtype.(tiposeguntabla)).value = txtCodigo.Text

    y así con todos

    saludos

    martes, 11 de septiembre de 2012 15:11