none
Llamar datos base de datos vb.net RRS feed

  • Pregunta

  • buenas

    Resulta que tengo que guardar varios codigos de un listview en una tabla llamada RUTA, hasta ahi todo bien.

    Una vez que guardo esos codigos en la tabla Ruta lo que quiero es mediante esos codigos guardados llamar de la tabla Sucursal a los campos nombres, direccion, zona, departamento y me lo muestre en otro listview.

    En otras palabras seria autocompletar campos llamando atravez de los codigos guardados.

    Espero que me halla expresado bien 

     

    Saludos

    lunes, 3 de octubre de 2011 13:19

Respuestas

  • "10Gox" escribió:

    > lo que quiero hacer es cuando valla a crear la ruta me valla leyendo
    > del listview el codigo de la primer columna y me verifique si existe
    > en la tabla ruta, si existe que me haga un update sino no existe in
    > insert.

    Si he entendido bien lo que deseas hacer, quizás lo puedas conseguir si utilizas procedimientos auxiliares en vez de ejecutar todo en el mismo procedimiento.

    Como observo que estás utilizando ODBC, inserta en tu proyecto los siguientes métodos:

    Imports System.Data.Odbc
    
      ''' <summary>
        ''' Ejecuta la consulta SQL de selección existente en el objeto Command
        ''' devolviendo un objeto DataTable.
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2010</author>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetDataReader(ByVal cmd As OdbcCommand) As OdbcDataReader
    
            If (cmd Is Nothing) Then _
                Throw New ArgumentNullException()
    
            Try
                ' Configuramos una conexión con el origen de datos.
                '
                Dim cnn As New OdbcConnection(cadenaConexionODBC)
                cmd.Connection = cnn
    
                cnn.Open()
    
                Dim dr As OdbcDataReader = _
                    cmd.ExecuteReader(CommandBehavior.CloseConnection)
    
                Return dr
    
            Catch ex As Exception
                Throw
    
            End Try
    
        End Function
    
        ''' <summary>
        ''' Ejecuta la consulta SQL de acción existente en el objeto Command
        ''' devolviendo el número de registros afectados.
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2010</author>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function ExecuteAction(ByVal cmd As OdbcCommand) As Integer
    
            If (cmd Is Nothing) Then _
                Throw New ArgumentNullException()
    
            Try
                Using cnn As New OdbcConnection(cadenaConexionODBC)
    
                    cmd.Connection = cnn
    
                    cnn.Open()
    
                    Return cmd.ExecuteNonQuery()
    
                End Using
    
            Catch ex As Exception
                Throw
    
            End Try
    
        End Function
    

    Con el método 'GetDataReader' obtienes un objeto OdbcDataReader, el cual deberás de cerrarlo explícitamente en el procedimiento llamador. Y con el método 'ExecuteAction' podrás ejecutar cualquier consulta SQL de acción (INSERT INTO, UPDATE o DELETE) que desees.

    Ambos procedimientos requieren de un campo llamado 'cadenaConexionODBC', que como su nombre indica, almacenará la cadena de conexión con el origen de datos ODBC:

      Private cadenaConexionODBC As String = "DSN=NombreDSN"
    


    No quiere decir que a la cadena de conexión necesariamente le tengas que indicar un DSN; se trata de un ejemplo. ;-)

    Cuando desees recorrer los elementos de tu control ListView para insertar o actualizar la tabla de datos, ejecutarías lo siguiente:

            Dim dr As OdbcDataReader = Nothing
    
            Try
                ' Obtenemos un lector de datos
                Dim cmd As New OdbcCommand()
                cmd.CommandText = "select cod_suc from ruta"
                dr = GetDataReader(cmd)
    
                Dim dato1, dato2 As Integer
                Dim existe As Integer
    
                For Each item As ListViewItem In listViewRutas.Items
                
                    While dr.Read()
                        existe = Convert.ToInt32(dr("cod_suc"))
                        dato1 = CInt(item.Text)
                        dato2 = CInt(item.SubItems(3).Text)
                        
                        Dim comando As New OdbcCommand()
    
                        If (dato1 <> existe) Then
                            ' Insertar nuevo registro
    
                            comando.CommandText = "INSERT into ruta (cod_suc, zona) VALUES (?, ?)"
                            cmd.Parameters.AddWithValue("", dato1)
                            cmd.Parameters.AddWithValue("", dato2)
    
                        Else
                            ' Actualizar registro
    
                            comando.CommandText = "update ruta set cod_suc= ?, zona= ? where cod_suc= ?"
    
                            comando.Parameters.AddWithValue("", dato1)
                            comando.Parameters.AddWithValue("", dato2)
                            comando.Parameters.AddWithValue("", dato1)
                            
                            
                        End If
    
                        ' Ejecutamos el comando
                        ExecuteAction(comando)
    
                    End While
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            Finally
                If (dr IsNot Nothing) Then
                    ' Cerramos el lector e implícitamente la conexión
                    dr.Close()
                End If
    
                dr = Nothing
    
            End Try
    

    Como verás, ejecutamos consultas de acción con parámetros, los cuales los tendrás que añadir a la colección Parameters del objeto Command, en el mismo orden en el que se declaran en la consulta SQL de acción:

    > Dim sql As String = "update ruta set cod_suc= '" & dato1 & "',
    >  zona='" & dato2 & "' where cod_suc= '" & dato1 & "'"

    ¿Realmente deseas ejecutar esa consulta de actualización? Fíjate que en la cláusula WHERE le estás indicando que te modifique el registro cuyo valor del campo 'cod_suc' sea el mismo que el valor del campo que deseas actualizar. La verdad es que no le encuentro ningún sentido.

    A lo mejor deseas ejecutar:

      comando.CommandText = "update ruta set zona= ? where cod_suc= ?"
    
      comando.Parameters.AddWithValue("", dato2)
      comando.Parameters.AddWithValue("", dato1)
    

    Es decir, actualizar únicamente el valor del campo 'zona' que se corresponda con el valor del campo 'cod_suc' especificado en la cláusula WHERE.

    Insisto que los valores de los parámetros los tienes que añadir en el mismo orden en el que aparecen en la consulta SQL de acción.

    En fin, mira a ver si lo explicado te sirve para lo que necesitas hacer.

     


    Enrique Martínez
      [MS MVP - VB]

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

    • Marcado como respuesta 10Gox lunes, 3 de octubre de 2011 21:12
    lunes, 3 de octubre de 2011 17:05
    Moderador

Todas las respuestas

  • buenos dias.

    Quisiera pasar los datos que contiene un listview a otro listview que se encuentra en otro formulario.

    Lo tendria que hacer por buscar en todos los items del lsitview para poder apsarlo al otro pero no se me ocurre como

     

    gracias

    lunes, 3 de octubre de 2011 14:11
  • "10Gox" escribió:

    > Una vez que guardo esos codigos en la tabla Ruta lo que quiero
    > es mediante esos codigos guardados llamar de la tabla Sucursal
    > a los campos nombres, direccion, zona, departamento y me lo
    > muestre en otro listview.
    >

    La verdad es que no me entero de lo que realmente deseas hacer, y más tras leer:

    > En otras palabras seria autocompletar campos llamando atravez
    > de los codigos guardados.

    ¿Por casualidad te refieres a rellenar automáticamente un control Listview como si se tratara de rellenar un control DataGridView, asignándole un objeto DataTable a su propiedad DataSource?

    Te advierto que el control ListView no dispone de una propiedad llamada DataSource para poder asignarle al control un origen de datos, aunque también te digo que se le puede implementar de una manera muy sencilla. :-)

    Si es esto lo que deseas hacer, me lo indicas y te comento cómo se configura.

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

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

    lunes, 3 de octubre de 2011 15:13
    Moderador
  • hola 

    lo que quiero hacer es cuando valla a crear la ruta me valla leyendo del listview el codigo de la primer columna y me verifique si existe en la tabla ruta, si existe que me haga un update sino no existe in insert.

    para eso hice un dataread sobre la tabla ruta y segun los codigos del lsitview si son iguales me tire un update sino un insert

         Dim dato1, dato2 As Integer
            Dim existe As Integer
            Dim consulta As String = "select cod_suc from ruta"
            Dim coman As New OdbcCommand(consulta, Globals.CONEXION)
            Dim dr As OdbcDataReader
            Globals.CONEXION.Open()
            dr = coman.ExecuteReader
            For Each item As ListViewItem In listViewRutas.Items
                While dr.Read
                    existe = Convert.ToInt32(dr("cod_suc"))
    
                    dato1 = CInt(item.Text)
                    dato2 = CInt(item.SubItems(3).Text)
                    If dato1 <> existe Then
                        'Dim sql As String = "INSERT into ruta (cod_suc, zona) VALUES ('" & dato1 & "','" & dato2 & "')"
                        'Dim cmd As New OdbcCommand(sql, Globals.CONEXION)
                        ''Globals.CONEXION.Open()
                        'cmd.ExecuteNonQuery()
                        ''Globals.CONEXION.Close()
                        MsgBox("no existe")
                    Else
                        'Dim sql As String = "update ruta set cod_suc= '" & dato1 & "', zona='" & dato2 & "' where cod_suc= '" & dato1 & "'"
                        'Dim cmd As New OdbcCommand(sql, Globals.CONEXION)
                        ''Globals.CONEXION.Open()
                        'cmd.ExecuteNonQuery()
                        ''Globals.CONEXION.Close()
                        MsgBox("existe")
                    End If
                End While
            Next
    

    esta des prolijo porque estaba probando xD

    lunes, 3 de octubre de 2011 15:49
  • "10Gox" escribió:

    > lo que quiero hacer es cuando valla a crear la ruta me valla leyendo
    > del listview el codigo de la primer columna y me verifique si existe
    > en la tabla ruta, si existe que me haga un update sino no existe in
    > insert.

    Si he entendido bien lo que deseas hacer, quizás lo puedas conseguir si utilizas procedimientos auxiliares en vez de ejecutar todo en el mismo procedimiento.

    Como observo que estás utilizando ODBC, inserta en tu proyecto los siguientes métodos:

    Imports System.Data.Odbc
    
      ''' <summary>
        ''' Ejecuta la consulta SQL de selección existente en el objeto Command
        ''' devolviendo un objeto DataTable.
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2010</author>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetDataReader(ByVal cmd As OdbcCommand) As OdbcDataReader
    
            If (cmd Is Nothing) Then _
                Throw New ArgumentNullException()
    
            Try
                ' Configuramos una conexión con el origen de datos.
                '
                Dim cnn As New OdbcConnection(cadenaConexionODBC)
                cmd.Connection = cnn
    
                cnn.Open()
    
                Dim dr As OdbcDataReader = _
                    cmd.ExecuteReader(CommandBehavior.CloseConnection)
    
                Return dr
    
            Catch ex As Exception
                Throw
    
            End Try
    
        End Function
    
        ''' <summary>
        ''' Ejecuta la consulta SQL de acción existente en el objeto Command
        ''' devolviendo el número de registros afectados.
        ''' </summary>
        ''' <author>Enrique Martínez Montejo - 2010</author>
        ''' <param name="cmd">objeto Command debidamente configurado.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function ExecuteAction(ByVal cmd As OdbcCommand) As Integer
    
            If (cmd Is Nothing) Then _
                Throw New ArgumentNullException()
    
            Try
                Using cnn As New OdbcConnection(cadenaConexionODBC)
    
                    cmd.Connection = cnn
    
                    cnn.Open()
    
                    Return cmd.ExecuteNonQuery()
    
                End Using
    
            Catch ex As Exception
                Throw
    
            End Try
    
        End Function
    

    Con el método 'GetDataReader' obtienes un objeto OdbcDataReader, el cual deberás de cerrarlo explícitamente en el procedimiento llamador. Y con el método 'ExecuteAction' podrás ejecutar cualquier consulta SQL de acción (INSERT INTO, UPDATE o DELETE) que desees.

    Ambos procedimientos requieren de un campo llamado 'cadenaConexionODBC', que como su nombre indica, almacenará la cadena de conexión con el origen de datos ODBC:

      Private cadenaConexionODBC As String = "DSN=NombreDSN"
    


    No quiere decir que a la cadena de conexión necesariamente le tengas que indicar un DSN; se trata de un ejemplo. ;-)

    Cuando desees recorrer los elementos de tu control ListView para insertar o actualizar la tabla de datos, ejecutarías lo siguiente:

            Dim dr As OdbcDataReader = Nothing
    
            Try
                ' Obtenemos un lector de datos
                Dim cmd As New OdbcCommand()
                cmd.CommandText = "select cod_suc from ruta"
                dr = GetDataReader(cmd)
    
                Dim dato1, dato2 As Integer
                Dim existe As Integer
    
                For Each item As ListViewItem In listViewRutas.Items
                
                    While dr.Read()
                        existe = Convert.ToInt32(dr("cod_suc"))
                        dato1 = CInt(item.Text)
                        dato2 = CInt(item.SubItems(3).Text)
                        
                        Dim comando As New OdbcCommand()
    
                        If (dato1 <> existe) Then
                            ' Insertar nuevo registro
    
                            comando.CommandText = "INSERT into ruta (cod_suc, zona) VALUES (?, ?)"
                            cmd.Parameters.AddWithValue("", dato1)
                            cmd.Parameters.AddWithValue("", dato2)
    
                        Else
                            ' Actualizar registro
    
                            comando.CommandText = "update ruta set cod_suc= ?, zona= ? where cod_suc= ?"
    
                            comando.Parameters.AddWithValue("", dato1)
                            comando.Parameters.AddWithValue("", dato2)
                            comando.Parameters.AddWithValue("", dato1)
                            
                            
                        End If
    
                        ' Ejecutamos el comando
                        ExecuteAction(comando)
    
                    End While
                Next
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            Finally
                If (dr IsNot Nothing) Then
                    ' Cerramos el lector e implícitamente la conexión
                    dr.Close()
                End If
    
                dr = Nothing
    
            End Try
    

    Como verás, ejecutamos consultas de acción con parámetros, los cuales los tendrás que añadir a la colección Parameters del objeto Command, en el mismo orden en el que se declaran en la consulta SQL de acción:

    > Dim sql As String = "update ruta set cod_suc= '" & dato1 & "',
    >  zona='" & dato2 & "' where cod_suc= '" & dato1 & "'"

    ¿Realmente deseas ejecutar esa consulta de actualización? Fíjate que en la cláusula WHERE le estás indicando que te modifique el registro cuyo valor del campo 'cod_suc' sea el mismo que el valor del campo que deseas actualizar. La verdad es que no le encuentro ningún sentido.

    A lo mejor deseas ejecutar:

      comando.CommandText = "update ruta set zona= ? where cod_suc= ?"
    
      comando.Parameters.AddWithValue("", dato2)
      comando.Parameters.AddWithValue("", dato1)
    

    Es decir, actualizar únicamente el valor del campo 'zona' que se corresponda con el valor del campo 'cod_suc' especificado en la cláusula WHERE.

    Insisto que los valores de los parámetros los tienes que añadir en el mismo orden en el que aparecen en la consulta SQL de acción.

    En fin, mira a ver si lo explicado te sirve para lo que necesitas hacer.

     


    Enrique Martínez
      [MS MVP - VB]

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

    • Marcado como respuesta 10Gox lunes, 3 de octubre de 2011 21:12
    lunes, 3 de octubre de 2011 17:05
    Moderador
  • hola

    porque usas odbc para conectarte a la base de datos

    deberias analziar todas las alternativas para evitar este proveedor dejandolo solo cuando sea la ultima opcion

    ademas cuando consultes menciona que base de datos utilizas. porque quizas para esa db haya alternativas mejores que puedan aplicarse

     

    ademas ya has realizado muchas preguntas relacionadas a la base de datos en el foro, porque sigues concatenando los valores en el string en lugar de usar parametros

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 3 de octubre de 2011 23:13