none
Ayuda con sentencia SQL

    Pregunta

  • Hola buenas noches, tengo esta sentencia en sql que lo quiero ejecutar desde VB pero me envia error:

        Private Sub btn_Activar_Click(sender As Object, e As EventArgs) Handles btn_Activar.Click
            Try
                cn.Open()
                Dim cmd = New SqlCommand("Update Usuario Set estadoUsuario = 1, nroIntenFallidos = 0, activaciònUsuario = 1 where id_cli='", cn)
                cmd.ExecuteNonQuery()
                cn.Close()

            Catch ex As SqlException
                MsgBox("Error en SQL: " & ex.ToString)
            Catch evb As Exception
                MsgBox("Error en SQL: " & evb.ToString)
            End Try
        End Sub

    Quisiera por favor que me ayuden, muchas gracias...


    Juan Fernando

    domingo, 25 de septiembre de 2016 3:14

Respuestas

  • JuanfernandoDj,

    Noto que la excepción se produce en el formulario 'FrmUsuarios', ¿tienes una grilla de datos donde contienes a los usuarios o algún otro contenedor?, pregunto porque la consulta sql de tipo UPDATE no tiene forma de actualizar una sola fila al azar (no bajo la forma como has escrito la consulta), necesariamente debes de indicar la condición necesaria para afectar a una, varias o todas las filas de la tabla.

    En el supuesto que tengas un objeto de tipo DataGridView conteniendo la lista de usuarios entonces puedes tomar el valor de la celda que contiene el identificador de usuario de la fila seleccionada para actualizar sus datos (creo que intentas activar un usuario inactivo):

    Dim id As String = String.Empty
    
    'Tomas la referencia de la fila seleccionada actualmente
    Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
    If row IsNot Nothing Then
    	id = row.Cells("id_cli").Value.ToString() 'Tomas el valor de la celda que contiene el id del usuario
    
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSQL As String = "UPDATE Usuario SET estadoUsuario = 1, nroIntenFallidos = 0, " _
    							& "[activaciònUsuario] = 1 WHERE id_cli = @ID"
    
    		Dim cmd As New SqlCommand(ConsultaSQL, cn)
    		cmd.Parameters.AddWithValue("@ID", id)
    		cn.Open()
    		cmd.ExecuteNonQuery()
    	End Using
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Todas las respuestas son Excelentes!!!! me sirvieron de mucho, pero en realidad me quedo con la de Willams Morales, muchas gracias a todos, doy como cerrada la consulta. 

    Juan Fernando


    • Marcado como respuesta Juan_fernando domingo, 25 de septiembre de 2016 19:35
    • Editado Juan_fernando domingo, 25 de septiembre de 2016 19:36
    domingo, 25 de septiembre de 2016 19:35

Todas las respuestas

  • Hola JuanfernandoDj,

    Tu error está en la última parte de tu consulta.

    where id_cli ='"

    Como puedes ver no le estableces el valor, solo le agregas un apóstrofe ('). Además recomendaría que envíes los parámetros usando AddWithValue.

        Private Sub btn_Activar_Click(sender As Object, e As EventArgs) Handles btn_Activar.Click
    
            Dim query As String = String.Empty
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
                    query = "Update Usuario Set estadoUsuario = @estado, nroIntenFallidos = @fallidos, 
                                            activaciònUsuario = @activacion where id_cli = @id"
                    Dim cmd = New SqlCommand(query, con)
                    cmd.Parameters.AddWithValue("@estado", 1)
                    cmd.Parameters.AddWithValue("@fallidos", 0)
                    cmd.Parameters.AddWithValue("@activacion", 1)
                    cmd.Parameters.AddWithValue("@id", algunID)
    
                    cmd.ExecuteNonQuery()
    
                    MessageBox.Show("Usuario actualizado!!!")
    
                End Using
            Catch ex As SqlException
                MsgBox("Error en SQL: " & ex.ToString)
            Catch evb As Exception
                MsgBox("Error: " & evb.ToString)
            End Try
        End Sub

    Por otro lado, no deberías crear campo como tílde. 

    activaciònUsuario

    Recomendaría usar esta estructura, además del using en el SQLConnection para liberar el objeto y cerrar la conexión automáticamente.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Propuesto como respuesta Pedro Ávila domingo, 25 de septiembre de 2016 4:30
    domingo, 25 de septiembre de 2016 3:35
  • Hola JuanfernandoDj,

    Tu error está en la última parte de tu consulta.

    where id_cli ='"

    Como puedes ver no le estableces el valor, solo le agregas un apóstrofe ('). Además recomendaría que envíes los parámetros usando AddWithValue.

        Private Sub btn_Activar_Click(sender As Object, e As EventArgs) Handles btn_Activar.Click
    
            Dim query As String = String.Empty
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
                    query = "Update Usuario Set estadoUsuario = @estado, nroIntenFallidos = @fallidos, 
                                            activaciònUsuario = @activacion where id_cli = @id"
                    Dim cmd = New SqlCommand(query, con)
                    cmd.Parameters.AddWithValue("@estado", 1)
                    cmd.Parameters.AddWithValue("@fallidos", 0)
                    cmd.Parameters.AddWithValue("@activacion", 1)
                    cmd.Parameters.AddWithValue("@id", algunID)
    
                    cmd.ExecuteNonQuery()
    
                    MessageBox.Show("Usuario actualizado!!!")
    
                End Using
            Catch ex As SqlException
                MsgBox("Error en SQL: " & ex.ToString)
            Catch evb As Exception
                MsgBox("Error: " & evb.ToString)
            End Try
        End Sub

    Por otro lado, no deberías crear campo como tílde. 

    activaciònUsuario

    Recomendaría usar esta estructura, además del using en el SQLConnection para liberar el objeto y cerrar la conexión automáticamente.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    Es necesario colocar un idusuario, y si quiero que sea cualquier id? como lo haria:

    cmd.Parameters.AddWithValue("@id", algunID)

    gracias


    Juan Fernando


    domingo, 25 de septiembre de 2016 4:16
  • "JuanfernandoDj" preguntó:

    > Es necesario colocar un idusuario, y si quiero
    > que sea cualquier id? como lo haria:
    >
    > cmd.Parameters.AddWithValue("@id", algunID)

    Hola, Juan Fernando:

    Entiendo que para actualizar "cualquier id" ("23", "898", "83", "673"), tendrás que especificar qué ID es el que quieres actualizar en la cláusula WHERE, tal y como bien te ha comentado Joel C. Naupa Crispín.

    Ten en cuenta que si en la consulta T-SQL de actualización que deseas ejecutar aparece una cláusula WHERE, a ésta le tienes que indicar el criterio que deseas que cumplan los registros de la tabla cuyo valor le has especificado al campo.

    Es decir, si ejecutas la siguiente consulta:

        UPDATE Usuario
        SET estadoUsuario = 1, nroIntenFallidos = 0, [activaciònUsuario] = 1
        WHERE id_cli=''   --> Finaliza con dos comillas simples si el campo id_cli es alfanumérico

    se actualizarán TODOS los registros de la tabla Usuario donde (WHERE) el campo id_cli sea igual a una cadena de longitud cero, que es distinto de un valor NULL.

    Pero si tu intención es actualizar los campos EstadoUsuario, NrtoIntenFallidos y [activaciònUsuario] (éste último deberías de encerrar su nombre entre corchetes porque la primera 'ò' se encuentra acentuada) de TODOS LOS REGISTROS de la tabla Usuario, con independencia del valor que actualmente tenga su campo id_cli, entonces no necesitas especificar ningún valor a la cláusula WHERE:

        UPDATE Usuario
        SET estadoUsuario = 1, nroIntenFallidos = 0, [activaciònUsuario] = 1

    Y si deseas actualizar "cualquier id", entonces necesitarás especificar el id_cli que deseas actualizar:

        Private Sub btn_Activar_Click(sender As Object, e As EventArgs) Handles btn_Activar.Click
    
            Dim id As String = escribe aquí el valor del campo id_cli que deseas actualizar
    
            Try
                Dim n As Integer
    
                Using cnn As New SqlConnection(ESCRIBE AQUÍ LA CADENA DE CONEXIÓN COMPLETA CON LA BASE DE SQL SERVER)
                    Dim cmd As SqlCommand = cnn.CreateCommand()
                    cmd.CommandText =
                        "UPATE Usuario SET estadoUsuario = 1, nroIntenFallidos = 0, [activaciònUsuario] = 1 WHERE id_cli=@id"
    
                    cmd.Parameters.AddWithValue("@id", id)
                    cnn.Open()
                    n = cmd.ExecuteNonQuery()
                End Using
    
                MessageBox.Show("Nº de registros actualizados: " & n.ToString())
    
            Catch ex As Exception
                MessageBox.Show("Error en SQL: " & ex.Message)
    
            End Try
    
        End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 25 de septiembre de 2016 7:30
    Moderador
  • JuanfernandoDj,

    Noto que la excepción se produce en el formulario 'FrmUsuarios', ¿tienes una grilla de datos donde contienes a los usuarios o algún otro contenedor?, pregunto porque la consulta sql de tipo UPDATE no tiene forma de actualizar una sola fila al azar (no bajo la forma como has escrito la consulta), necesariamente debes de indicar la condición necesaria para afectar a una, varias o todas las filas de la tabla.

    En el supuesto que tengas un objeto de tipo DataGridView conteniendo la lista de usuarios entonces puedes tomar el valor de la celda que contiene el identificador de usuario de la fila seleccionada para actualizar sus datos (creo que intentas activar un usuario inactivo):

    Dim id As String = String.Empty
    
    'Tomas la referencia de la fila seleccionada actualmente
    Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
    If row IsNot Nothing Then
    	id = row.Cells("id_cli").Value.ToString() 'Tomas el valor de la celda que contiene el id del usuario
    
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSQL As String = "UPDATE Usuario SET estadoUsuario = 1, nroIntenFallidos = 0, " _
    							& "[activaciònUsuario] = 1 WHERE id_cli = @ID"
    
    		Dim cmd As New SqlCommand(ConsultaSQL, cn)
    		cmd.Parameters.AddWithValue("@ID", id)
    		cn.Open()
    		cmd.ExecuteNonQuery()
    	End Using
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 25 de septiembre de 2016 17:47
  • JuanfernandoDj,

    Noto que la excepción se produce en el formulario 'FrmUsuarios', ¿tienes una grilla de datos donde contienes a los usuarios o algún otro contenedor?, pregunto porque la consulta sql de tipo UPDATE no tiene forma de actualizar una sola fila al azar (no bajo la forma como has escrito la consulta), necesariamente debes de indicar la condición necesaria para afectar a una, varias o todas las filas de la tabla.

    En el supuesto que tengas un objeto de tipo DataGridView conteniendo la lista de usuarios entonces puedes tomar el valor de la celda que contiene el identificador de usuario de la fila seleccionada para actualizar sus datos (creo que intentas activar un usuario inactivo):

    Dim id As String = String.Empty
    
    'Tomas la referencia de la fila seleccionada actualmente
    Dim row As DataGridViewRow = DataGridView1.CurrentRow
    
    If row IsNot Nothing Then
    	id = row.Cells("id_cli").Value.ToString() 'Tomas el valor de la celda que contiene el id del usuario
    
    	Using cn As New SqlConnection("Cadena de conexión")
    		Dim ConsultaSQL As String = "UPDATE Usuario SET estadoUsuario = 1, nroIntenFallidos = 0, " _
    							& "[activaciònUsuario] = 1 WHERE id_cli = @ID"
    
    		Dim cmd As New SqlCommand(ConsultaSQL, cn)
    		cmd.Parameters.AddWithValue("@ID", id)
    		cn.Open()
    		cmd.ExecuteNonQuery()
    	End Using
    End If



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Todas las respuestas son Excelentes!!!! me sirvieron de mucho, pero en realidad me quedo con la de Willams Morales, muchas gracias a todos, doy como cerrada la consulta. 

    Juan Fernando


    • Marcado como respuesta Juan_fernando domingo, 25 de septiembre de 2016 19:35
    • Editado Juan_fernando domingo, 25 de septiembre de 2016 19:36
    domingo, 25 de septiembre de 2016 19:35