none
Modificar a la base SQL RRS feed

  • Pregunta

  • Hola, cuando trato de modificar un campo me sale el msgbox de error.

    Les dejo el comando y la tabla donde se va a modificar.

    Los campos faltantes no se alcanzan a ver en la primera imagen.

    Puede ser un campo mal escrito?



    jueves, 8 de diciembre de 2016 21:39

Respuestas

  • Hola EstebanQuito125478,

    En la parte del Catch tienes que visualizar la excepción que se produce para saber que es lo que lo está provocando.

    Catch exc As Exception
       MessageBox.Show(exc.Message)
    End Try

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 8 de diciembre de 2016 21:52
  • EstebanQuito125478,

    No, no es la manera como debes ejecutar una consulta que requiere parámetros. Quizá te funcione cuando todos los tipos de dato son cadena o cuando por coincidencia el formato de número o fecha sea el mismo entre la aplicación cliente y el servidor de base de datos, pero en otro contexto obtendrás una excepción.

    Fíjate que a la columna 'PrecioUnitario' le pasas una cadena conteniendo un caracter de coma (',') como separador decimal (al menos eso deduzco), sin embargo el separador decimal de un tipo numeric o decimal es el caracter de punto ('.'), es ahí donde el proveedor que accede a un origen de datos determina la manera correcta de enviar un valor, razón por la cuál se te viene recomendando parametrizar la consulta y dejar la mala practica de enviar cadenas indiscriminadamente sin considerar los tipos de dato.

    Entiendo el objetivo de tener un procedimiento que reciba una cadena y que se la misma que se ejecute contra la base de datos, yo te propongo implementar un procedimiento con dos parámetros: uno conteniendo la consulta sql y otra conteniendo la colección de parámetros:

    - Procedimiento

    Public Sub Actualizar(ByVal ConsultaSQL As String,
    					  ByVal Parametros() As SqlParameter)
    	Try
    
    		Using con As New SqlConnection("MiCadenaConexion")
    			con.Open()
    
    			Dim cmd As New SqlCommand(ConsultaSQL, con)
    			cmd.Parameters.AddRange(Parametros)
    
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MsgBox(ex.Message)
    	End Try
    End Sub

    - Invocar procedimiento:

    Dim Parametros As New List(Of SqlParameter)
    
    Parametros.Add(New SqlParameter("@Nombre", txtNombre.Text))
    Parametros.Add(New SqlParameter("@PrecioUnitario", SqlDbType.Decimal) With
    	   { .Value = CDec(txtPrecioUnitario.Text)})
    Parametros.Add(New SqlParameter("@CantidadStock", SqlDbType.Int) With
    	   { .Value = CInt(txtCantidad.Text)})
    'Otros parámetros....
    
    
    Actualizar("UPDATE Productos SET Nombre = @Nombre, PrecioUnitario = @PrecioUnitario, 
    			CantidadStock = @CantidadStock", Parametros.ToArray())

    Nota que cada valor se agrega a la colección de parámetros según el tipo de dato origen.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 8 de diciembre de 2016 22:37
  • bueno en todo aso deberías tratar  de capturar la excepción y así tienes una idea mejor de cual es el error

      Catch Exc As Exception
                'MsgBox("No fue posible modificar los datos.")
                 MessageBox.Show(Exc.Message)
            End Try


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    • Marcado como respuesta Federico32113 martes, 13 de diciembre de 2016 17:56
    martes, 13 de diciembre de 2016 17:46
  • Me sirvió capturar la excepción, trataba de almacenar en la base un valor en un campo con un tipo de dato incorrecto.
    • Marcado como respuesta Federico32113 jueves, 22 de diciembre de 2016 22:18
    martes, 13 de diciembre de 2016 17:56

Todas las respuestas

  • ¿Cómo estructuras la línea de comando SQL para Actualizar?

    Puede que ahí esté el error, a demás, sería conveniente que coloques el bloque de código en un Try Catch y devolver el mensaje con el error más específico. Haciendo eso te ayudaría a ti y al resto del foro.


    Antonio Mata

    jueves, 8 de diciembre de 2016 21:51
  • Hola EstebanQuito125478,

    En la parte del Catch tienes que visualizar la excepción que se produce para saber que es lo que lo está provocando.

    Catch exc As Exception
       MessageBox.Show(exc.Message)
    End Try

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 8 de diciembre de 2016 21:52
  • Parece que te estás equivocando en el UPDATE, podrías subir la consulta SQL del Update?

    Javier

    jueves, 8 de diciembre de 2016 21:54
  • Esta dentro de un ClaseProducto este código al igual que el otro que esta en una ClaseConector.
    jueves, 8 de diciembre de 2016 21:56
  • Está mal el ingreso de parámetros en la consultas por ejemplo: el parámetro PrecioUnitario = " & Me.PrecioUnitario & "

    sin comillas simples podrías revisar el tipo de datos o utilizar los params


    Javier


    jueves, 8 de diciembre de 2016 21:58
  • Esta dentro de un ClaseProducto este código al igual que el otro que esta en una ClaseConector.

    Los parámetros nunca se pasan de esa forma. Tienes que hacer uso de algo como esto:

    Sql = "UPDATE tabla SET camp1= @n, campo2 = @m"
    sqlCmd.Parameters.AddWithValue("@n", txtCampo1.Text)
    sqlCmd.Parameters.AddWithValue("@m", txtCampo2.Text);


    Antonio Mata

    jueves, 8 de diciembre de 2016 22:03
  • A las otras clases también las tengo así con comillas simples y  el mismo formato, funcionan bien. 
    jueves, 8 de diciembre de 2016 22:06
  • no batalles, usa una función así, y ejecutala cuando quieras

     private void Actualizar()
            {
                string sql = ("update Productos set Nombre='cafe', Preciounitario='123.00', cantidadstock='4',   observación=' ', proveedor=' ', código='0',  where id=1");
               

             SqlDataAdapter da = new SqlDataAdapter(sql, ConectionBDD());
                DataTable dt = new DataTable();
                da.Fill(dt);
            }


    jueves, 8 de diciembre de 2016 22:13
  • A las otras clases también las tengo así con comillas simples y  el mismo formato, funcionan bien. 
    Pero no es lo recomendado.

    Antonio Mata

    jueves, 8 de diciembre de 2016 22:14
  • Hola EstebanQuito125478,

    De poder si se puede, pero es una mala práctica concatenar una consulta, se debe usar parametrización tal y como lo indica A.Mata.

    La consulta que muestras la has ejecutado en tu Management SQL Server ?

    Cambia el mensaje que visualizas en el Catch por uno que muestra la verdadera información de lo que está ocurriendo. Puedes cambiarlo momentáneamente y mostrar el resultado.

    Catch exc As Exception
        MessageBox.Show(exc.Message & vbCrLf & exc.StackTrace)
    End Try

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 8 de diciembre de 2016 22:16
  • EstebanQuito125478,

    No, no es la manera como debes ejecutar una consulta que requiere parámetros. Quizá te funcione cuando todos los tipos de dato son cadena o cuando por coincidencia el formato de número o fecha sea el mismo entre la aplicación cliente y el servidor de base de datos, pero en otro contexto obtendrás una excepción.

    Fíjate que a la columna 'PrecioUnitario' le pasas una cadena conteniendo un caracter de coma (',') como separador decimal (al menos eso deduzco), sin embargo el separador decimal de un tipo numeric o decimal es el caracter de punto ('.'), es ahí donde el proveedor que accede a un origen de datos determina la manera correcta de enviar un valor, razón por la cuál se te viene recomendando parametrizar la consulta y dejar la mala practica de enviar cadenas indiscriminadamente sin considerar los tipos de dato.

    Entiendo el objetivo de tener un procedimiento que reciba una cadena y que se la misma que se ejecute contra la base de datos, yo te propongo implementar un procedimiento con dos parámetros: uno conteniendo la consulta sql y otra conteniendo la colección de parámetros:

    - Procedimiento

    Public Sub Actualizar(ByVal ConsultaSQL As String,
    					  ByVal Parametros() As SqlParameter)
    	Try
    
    		Using con As New SqlConnection("MiCadenaConexion")
    			con.Open()
    
    			Dim cmd As New SqlCommand(ConsultaSQL, con)
    			cmd.Parameters.AddRange(Parametros)
    
    			cmd.ExecuteNonQuery()
    		End Using
    	Catch ex As Exception
    		MsgBox(ex.Message)
    	End Try
    End Sub

    - Invocar procedimiento:

    Dim Parametros As New List(Of SqlParameter)
    
    Parametros.Add(New SqlParameter("@Nombre", txtNombre.Text))
    Parametros.Add(New SqlParameter("@PrecioUnitario", SqlDbType.Decimal) With
    	   { .Value = CDec(txtPrecioUnitario.Text)})
    Parametros.Add(New SqlParameter("@CantidadStock", SqlDbType.Int) With
    	   { .Value = CInt(txtCantidad.Text)})
    'Otros parámetros....
    
    
    Actualizar("UPDATE Productos SET Nombre = @Nombre, PrecioUnitario = @PrecioUnitario, 
    			CantidadStock = @CantidadStock", Parametros.ToArray())

    Nota que cada valor se agrega a la colección de parámetros según el tipo de dato origen.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 8 de diciembre de 2016 22:37
  • Hola, tengo donde cargo los datos de un producto para posteriormente modificarlos, pero al modificarlos me sale al msgbox de error.

    Donde puede haber un error?

    Esta es la instrucción encargada de modificar:

    Y esta son los datos de la tabla donde se va a modificar:

    Si necesitan algo mas del código solo comentenme

    Saludos.

    martes, 13 de diciembre de 2016 17:04
  • Hola , creo que  si va a ser necesario que postees el codigo con el que tratas de modificarlo,asi como que dice el mensaje de error que te sale.

    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    martes, 13 de diciembre de 2016 17:11
  • Ok, aquí esta

        Public Sub ProcedimientoActualizar()
            Try
                Dim DatosCorrectos As Boolean = False
                If Me.TxtId.Text <> "" Then
                    DatosCorrectos = True
                Else
                    If Me.txtNombre.Text <> "" Then
                        DatosCorrectos = True
                    Else
                        If Me.txtpunitario.Text <> "" Then
                            DatosCorrectos = True
                        Else
                            If Me.txtcantst.Text <> "" Then
                                DatosCorrectos = True
                            Else
                                If Me.txtobs.Text <> "" Then
                                    DatosCorrectos = True
                                Else
                                    If Me.txtpro.Text <> "" Then
                                        DatosCorrectos = True
                                    Else
                                        If Me.txtcodigobar.Text <> "" Then
                                            DatosCorrectos = True
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
    
                If DatosCorrectos = True Then
                    'ACTUALIZO DATOS 
                    With Me.Productos
                        .IdProducto = Me.TxtId.Text
                        .Nombre = Me.txtNombre.Text
                        .PrecioUnitario = Me.txtpunitario.Text
                        .CantidadStock = Me.txtcantst.Text
                        .Observacion = Me.txtobs.Text
                        .Proveedor = Me.txtpro.Text
                        .Codigo = txtcodigobar.Text
                        .Actualizar()
                    End With
    
                    Me.Close()
    
                End If
                '     Me.Close()
                Me.Close()
            Catch ex As Exception
                MsgBox("Ocurrió un error. El producto no se pudo actualizar.", MsgBoxStyle.OkOnly, "ERROR")
            End Try
        End Sub

    La función actualizar que esta en una clase.

      Public Sub Actualizar()
            Try
                Me.Conector.Actualizar("UPDATE Productos SET Nombre='" & Me.Nombre & "',  PrecioUnitario= '" & Me.PrecioUnitario & "' , CantidadStock= '" & Me.CantidadStock & "' , Observacion='" & Me.Observacion & "' , Proveedor='" & Me.Proveedor & "' , Codigo='" & Me.Codigo & "' WHERE Id_producto=" & Me.IdProducto)
    
            Catch Exc As Exception
                MsgBox("Ocurrió un error. El Producto no se ha actualizado.", MsgBoxStyle.OkOnly, "ERROR")
            End Try
        End Sub

    Otra ClaseConector es msgbox de error que me muestra es el de este código.

     Public Sub Actualizar(ByVal strSQL As String)
            Try
                Conexion = New System.Data.SqlClient.SqlConnection(strCadenaConexion)
                Comando = New SqlCommand(strSQL, Conexion)
                Conexion.Open()
                Comando.ExecuteNonQuery()
                MsgBox("Los datos fueron modificados.")
            Catch Exc As Exception
                MsgBox("No fue posible modificar los datos.")
            End Try
        End Sub


    martes, 13 de diciembre de 2016 17:36
  • Hola, no deberia ser algo asi

    Me.Conector.Actualizar("UPDATE Productos SET Nombre='" & Me.Productos.Nombre &


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    martes, 13 de diciembre de 2016 17:40
  • En el sistema utilizo la misma estructura para actualizar y me lo hace de forma correcta.
    martes, 13 de diciembre de 2016 17:42
  • bueno en todo aso deberías tratar  de capturar la excepción y así tienes una idea mejor de cual es el error

      Catch Exc As Exception
                'MsgBox("No fue posible modificar los datos.")
                 MessageBox.Show(Exc.Message)
            End Try


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    • Marcado como respuesta Federico32113 martes, 13 de diciembre de 2016 17:56
    martes, 13 de diciembre de 2016 17:46
  • Me sirvió capturar la excepción, trataba de almacenar en la base un valor en un campo con un tipo de dato incorrecto.
    • Marcado como respuesta Federico32113 jueves, 22 de diciembre de 2016 22:18
    martes, 13 de diciembre de 2016 17:56