none
Error en consulta RRS feed

  • Pregunta

  • Hola, buenas tardes.

    Tengo una consulta con error porque no me devuelve registros. La he hecho con muchas variantes pero no doy con la solución, no sé si estoy obcecado-

    Paso el código:

    Imports System.Data
    Imports System.Data.SqlClient
    
    
    Public Class Form3
    
        Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'TODO: esta línea de código carga datos en la tabla 'BGESTIONDataSet3.CODIGOS_POSTALES' Puede moverla o quitarla según sea necesario.
            Me.CODIGOS_POSTALESTableAdapter.Fill(Me.BGESTIONDataSet3.CODIGOS_POSTALES)
            'TODO: esta línea de código carga datos en la tabla 'BGESTIONDataSet3.ACREEDORES' Puede moverla o quitarla según sea necesario.
            Me.ACREEDORESTableAdapter.Fill(Me.BGESTIONDataSet3.ACREEDORES)
            'TODO: esta línea de código carga datos en la tabla 'BGESTIONDataSet.ACREEDORES' Puede moverla o quitarla según sea necesario.         Using conn As New SqlConnection("connstring")
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        End Sub
    
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.Close()
        End Sub
    
        Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            Dim vcodigo As String = Me.DataGridView1.Rows(e.RowIndex).Cells(1).Value
            Dim ADSQL As AccesoBd = New AccesoBd
            ADSQL.SeleccionarCp(vcodigo)
        End Sub
    
        Public Class AccesoBd
            Public Function CadenaConexion() As String
                Dim strconexion As String =
                    "Data Source=LAPTOP-56DRNQST\SQLEXPRESS;Initial Catalog=BGESTION;Integrated Security=True"
                Dim conexion As New SqlConnection
                conexion.ConnectionString = strconexion
                Return conexion.ConnectionString
            End Function
    
            Public Sub SeleccionarCp(vcod As String)
                Try
                    Using cnn As New SqlConnection(CadenaConexion)
                        Dim scon As String = "SELECT * From CODIGOS_POSTALES Where CODIGO = '& vcod &' Order By CIUDAD"
                        Try
                            cnn.Open()
                            MsgBox("Conexión efectuada correctamente")
                        Catch exc As Exception
                            MsgBox(exc.Message)
                        End Try
                        Dim da As New SqlDataAdapter(scon, cnn)
                        Dim dt As New DataTable()
                        Dim vc As Integer
                        da.Fill(dt)
                        vc = dt.Rows.Count
                        MsgBox(vc)
                        Form3.DataGridView2.DataSource = dt
                        cnn.Close()
                    End Using
                    SqlConnection.ClearAllPools()
                Catch exc As Exception
                    MsgBox(exc.Message)
                End Try
            End Sub
    end class
    end class

    Quizás esté mal estructurada toda la consulta....si me pudieseis orientar un poco.

    Gracias y Saludos.

    lunes, 12 de septiembre de 2016 19:19

Respuestas

  • Parece que le faltan los comillas en tu consulta;

    Dim scon As String = "SELECT * From CODIGOS_POSTALES Where CODIGO = '"& vcod &"' Order By CIUDAD"

    Pero deberías utilizar parámetros de sqlcommand, ejemplo:

    Dim cmd As System.Data.SqlClient.SqlCommand
    cmd = New System.Data.SqlClient.SqlCommand()
    cmd.Connection = cnn
    cmd.CommandText = _
        “Select * From CODIGOS_POSTALES Where CODIGO = @Codigo”
     
    Dim param As System.Data.SqlClient.SqlParameter
    param = New System.Data.SqlClient.SqlParameter()
    param.ParameterName = “@Codigo”
    param.SqlDbType = SqlDbType.VarChar
    param.Value = vcod
     
    cmd.Parameters.Add(param)
    cmd.ExecuteNonQuery()

    Saludos y suerte!


    Javier

    • Marcado como respuesta Ángelroso lunes, 12 de septiembre de 2016 20:10
    lunes, 12 de septiembre de 2016 19:55

Todas las respuestas

  • Hola Ángelroso

    CODIGO es de tipo String en tu tabla CODIGOS_POSTALES?

    Saludos

     

    Javier

    lunes, 12 de septiembre de 2016 19:49
  • Hola Javier.

    Sí es de tipo string.

    lunes, 12 de septiembre de 2016 19:51
  • Parece que le faltan los comillas en tu consulta;

    Dim scon As String = "SELECT * From CODIGOS_POSTALES Where CODIGO = '"& vcod &"' Order By CIUDAD"

    Pero deberías utilizar parámetros de sqlcommand, ejemplo:

    Dim cmd As System.Data.SqlClient.SqlCommand
    cmd = New System.Data.SqlClient.SqlCommand()
    cmd.Connection = cnn
    cmd.CommandText = _
        “Select * From CODIGOS_POSTALES Where CODIGO = @Codigo”
     
    Dim param As System.Data.SqlClient.SqlParameter
    param = New System.Data.SqlClient.SqlParameter()
    param.ParameterName = “@Codigo”
    param.SqlDbType = SqlDbType.VarChar
    param.Value = vcod
     
    cmd.Parameters.Add(param)
    cmd.ExecuteNonQuery()

    Saludos y suerte!


    Javier

    • Marcado como respuesta Ángelroso lunes, 12 de septiembre de 2016 20:10
    lunes, 12 de septiembre de 2016 19:55
  • Fíjate bien en la consulta que has puesto: estás buscando un código cuyo valor sea "& vcod &". Dudo que tu tabla contenga ningún código postal que empiece y termine por & y que en medio contenga las cuatro letras vcod. Por eso no devuelve ningún registro.

    Si lo que querías era concatenar la variable vcod, tienes que escribirla fuera de las comillas dobles:

    Dim scon As String = "SELECT * From CODIGOS_POSTALES Where CODIGO = '" & vcod & "' Order By CIUDAD"

    Pero en general es bastante mala práctica concatenar texto en las sentencias SQL de esa manera. En su lugar, se recomienda parametrizar la sentencia:

    Dim scon As String = "SELECT * From CODIGOS_POSTALES Where CODIGO = @Codigo Order By CIUDAD"

    [...]

    da.SelectCommand.Parameters.Add("@Codigo", SqlDbType.varchar, 20).Value= vcod

    lunes, 12 de septiembre de 2016 19:56
  • Gracias Javier.

    Efectivamente le faltaban las comillas.

    Voy a mirar a ver con parámetros... si es más correcto.

    Saludos.

    lunes, 12 de septiembre de 2016 20:13
  • Gracias, Alberto.

    Voy a intentar hacerlo con parámetros.

    Saludos.

    lunes, 12 de septiembre de 2016 20:14
  • Hola Ángelroso,

    Aunque el hilo ya está cerrado porque asumo que encontraste una solución, te doy unos puntos que debes tomar en consideración para mejorar tu código.

    - La clase AccesoBd la declaras dentro de la clase Form3 valga la redundancia ? En caso sea correcto, eso estaría mal ya que debe ser una clase externa.

    - La función CadenaConexion() retorna la cadena con la cuál tendrás acceso a la BD, pero no es necesario crear una nueva instancia de SQLConection, lo mejor que podrías hacer es usas el App.config.

      Public Class AccesoBd
            Public Shared cadenaConexion As String =
                ConfigurationManager.ConnectionStrings("cadena").ConnectionString
        End Class

    App.Config :

     <connectionStrings>
        <add name ="cadena" connectionString ="Data Source=LAPTOP-56DRNQST\SQLEXP;....."/>
      </connectionStrings>

    Usándola de la siguiente forma :

      Try
          Using cnn As New SqlConnection(AccesoBd.cadenaConexion)
                cnn.Open()
      ...

    - No veo necesario el uso de Try-Catch dentro de otro Try-Catch, ya que el primero captura el error en todo el bloque.

    - El método Seleccionar deberías implementarlo en el Form y no en la clase, evitando :

      Form3.DataGridView2.DataSource = dt

    Lo cuál no es recomendado.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 12 de septiembre de 2016 20:35
  • Gracias, Joel.

    Se agradecen los consejos. Lo importante es mejorar. La crítica constructiva es fundamental para evolucionar.

    Me pongo con ello.

    Saludos.

    lunes, 12 de septiembre de 2016 20:44
  • Hola, Joel.

    Lo he estado haciendo con el APP.Config y ayer me funcionaba bien, pero hoy me sale el error siguiente:

    "Se produjo una excepción en el inicializador de tipo de: ProyectoPrueba.AccesoBd.

    He estado aplicando diferentes ajustes que he encontrado por Internet, pero no consigo arreglarlo.

    Saludos.

    martes, 13 de septiembre de 2016 17:23