none
Pasar los datos de una consulta a un DataGridView.

    Pregunta

  • Buenas estoy pasando mi programa de Visual Basic 6.0 a .net 2015 windows form y no se como realizar lo siguiente:

    Tengo un formulario de facturación en el que está el DataGridView, en un textbox digito el codigo del articulo y en otro la cantidad y a partir de ahí con el codigo del articulo digitado en el textbox hago una consulta a la tabla articulos verificando si ese codigo existe, sino existe se le hace saber al usuario que digitó mal el codigo del articulo, si existe recojo los datos de la consulta y lo cargo en una linea del datagridview y así sucesivamente hasta que se termine de realizar la compra, luego con el datagridview ya cargado con esa informacion y cuando se guarda la factura voy a la tabla artículos y la actualizo con los articulos rebajados.

    Uso una base de datos MySql y no he encontrado muchos ejemplos del objeto MysqlDataAdapter y su uso, el metodo fill parece no funcionar en MySql y desconozco cual será su similar.

    He pasado días tratando de hacer la primera parte de consultar a la base de datos el articulo y luego mostrarlo en el datagridview pero no lo he logrado.

    Agradezco mucho su ayuda.


    martes, 15 de noviembre de 2016 1:23

Respuestas

  • Hola Frank Jarquin,

    Si estás usando MySQL debes usar su driver para tener acceso a sus clases de conexión y no usar el SqlClient que es para SQL Server.

    - Puedes descargar el driver desde nuget. (Referencias / Administrar paquetes NuGet)

    - Luego solo importarías : Imports MySql.Data.MySqlClient

    Try
        Using con As New MySqlConnection("MiCadenaConexion")
    
            Dim query = "SELECT campo1, campo2 From Articulos Where Codigo = @cod"
    
            Dim dt As New DataTable
            Using daa As New MySqlDataAdapter(query, con)
                daa.SelectCommand.Parameters.AddWithValue("@cod", TextBox9.Text)
                daa.Fill(dt)
            End Using
    
            Me.DataGridView1.DataSource = dt
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

    Procura parametrizar la consulta y evitar la concatenación directa.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Frank Jarquin miércoles, 16 de noviembre de 2016 1:11
    martes, 15 de noviembre de 2016 2:26
  • Hola:
    Tienes que añadir una referencia a System.Transactions
    Al principio, tienes que añadir la siguiente linea
    Imports System.Transactions
    Luego seria algo como esto
            Try
                Using loConexion As New MySqlConnection(TUCadenaMySQL)
                    Using MiTransaccion As TransactionScope = New TransactionScope
                        lsQuery = String.Format("INSERT INTO Tabla1 (Campo1, Campo2) Values ({0}, {1})", Valor1, Valor2))
                        loConexion.Open()   ' abrir conexión
                        ' crear comando
                        Using loComando As New MySqlCommand(lsQuery, loConexion)
                            loComando.ExecuteNonQuery()
                        End Using
                        '
                        lsQuery = String.Format("UPDATE Tabla2 SET Campo2={0} WHERE Campo1={1}", Valor2, Valor1)
                        Using loComando As New MySqlCommand(lsQuery, loConexion)
                            loComando.ExecuteNonQuery()
                        End Using
                        MiTransaccion.Complete()
                    End Using
                End Using
            Catch Exp As MySqlException
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Frank Jarquin miércoles, 16 de noviembre de 2016 1:11
    martes, 15 de noviembre de 2016 8:30

Todas las respuestas

  • Hola Frank Jarquin,

    ¿Qué base de datos estás usando ?

    No sería mejor implementar un 'ComboBox' con todos los artículos y sea el usuario quien escoja? Evitando tener que estar escribiendo el código, además de la validación si existe o no ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 15 de noviembre de 2016 1:30
  • Hola Crispín gracias por contestar tan pronto, uso base de datos MYSQL, esta es una tienda en donde hay màs de 3.000 artículos y el programa si tiene una opcion de buscar los articulos en un listado que también tendré que implementar ahora en esta nueva version de .net, el tema es que despues de un tiempo te aprendes la mayoria de los codigos que son usados con frecuencia por lo que es mas rapido digitar el codigo y la cantidad, darle enter y ya está cargado en la tabla (datagridview).

    Intenté crear este codigo pero me da error supongo porque debo usar el Mysqldataadapter pero no conozco el similar del medoto fill porque no funciona con Mysqldataadapter.

    Try
                Dim Cadena_de_Conexion As String = "server=localhost; database=ciclo taller frank; user id=root; password=liberiano"
                'Crear DataTable
                Dim Tabla_de_Articulos As New DataTable
                ' Configuramos una conexión con el origen de datos.
                Using Conexion_a_la_Base As New SqlClient.SqlConnection(Cadena_de_Conexion)
                    Dim ConsultaSql As String = "SELECT * From Articulos Where Codigo = '" & TextBox9.Text & "'"
                    ' crear adaptador
                    Using daDataAdapter As New SqlClient.SqlDataAdapter(ConsultaSql, Conexion_a_la_Base)
                        ' utilizar el dataadapter para llenar el datatable
                        daDataAdapter.Fill(Tabla_de_Articulos)
                    End Using
                End Using
                Me.Tabla1.DataSource = Tabla_de_Articulos
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

    martes, 15 de noviembre de 2016 2:12
  • Hola Frank Jarquin,

    Si estás usando MySQL debes usar su driver para tener acceso a sus clases de conexión y no usar el SqlClient que es para SQL Server.

    - Puedes descargar el driver desde nuget. (Referencias / Administrar paquetes NuGet)

    - Luego solo importarías : Imports MySql.Data.MySqlClient

    Try
        Using con As New MySqlConnection("MiCadenaConexion")
    
            Dim query = "SELECT campo1, campo2 From Articulos Where Codigo = @cod"
    
            Dim dt As New DataTable
            Using daa As New MySqlDataAdapter(query, con)
                daa.SelectCommand.Parameters.AddWithValue("@cod", TextBox9.Text)
                daa.Fill(dt)
            End Using
    
            Me.DataGridView1.DataSource = dt
        End Using
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

    Procura parametrizar la consulta y evitar la concatenación directa.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Frank Jarquin miércoles, 16 de noviembre de 2016 1:11
    martes, 15 de noviembre de 2016 2:26
  • De nuevo muchas gracias Crispin el código que me puso arriba me ayudó montones a obtener la información del registro, aunque no me era util pasar la informacion directa al registro porque necesito coger el precio del articulo y multiplicarlo por la cantidad solicitada para obtener un total, con su ayuda y un poco más de pruebas ya lo logré. Muchas gracias y ahí estaré de seguro pidiendo más ayuda.

    Me gustaría que me dieras una idea de como usar la instrucción transaccion para que una modificacion en la base de datos se realice de forma completa o no en caso de algun error.

    martes, 15 de noviembre de 2016 5:26
  • Hola:
    Tienes que añadir una referencia a System.Transactions
    Al principio, tienes que añadir la siguiente linea
    Imports System.Transactions
    Luego seria algo como esto
            Try
                Using loConexion As New MySqlConnection(TUCadenaMySQL)
                    Using MiTransaccion As TransactionScope = New TransactionScope
                        lsQuery = String.Format("INSERT INTO Tabla1 (Campo1, Campo2) Values ({0}, {1})", Valor1, Valor2))
                        loConexion.Open()   ' abrir conexión
                        ' crear comando
                        Using loComando As New MySqlCommand(lsQuery, loConexion)
                            loComando.ExecuteNonQuery()
                        End Using
                        '
                        lsQuery = String.Format("UPDATE Tabla2 SET Campo2={0} WHERE Campo1={1}", Valor2, Valor1)
                        Using loComando As New MySqlCommand(lsQuery, loConexion)
                            loComando.ExecuteNonQuery()
                        End Using
                        MiTransaccion.Complete()
                    End Using
                End Using
            Catch Exp As MySqlException
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Frank Jarquin miércoles, 16 de noviembre de 2016 1:11
    martes, 15 de noviembre de 2016 8:30
  • Saludos

    en el evento txtcodigo_keypess coloca lo siguente

     Private Sub Txtcodigo_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Txtcodigo.KeyPress

            If e.KeyChar = ChrW(Keys.Enter) Then
                e.Handled = True
                SendKeys.Send("{TAB}")

                Try
                    ' Using cn As New SqlConnection(ConfigurationManager.ConnectionStrings("cnxString").ToString())
                    Dim da As New sqlCommand("select * from articulos WHERE CODIGO='" & Txtcodigo.Text.Trim & "'", cn)

                    Dim DR As sqlDataReader

                    cn.Open()
                    DR = da.ExecuteReader

                    If DR.Read Then

                        Txtdescripcion.Text = DR!DESCRIPCION.ToString
                      txtprecio.text = DR!precio1.ToString
                       cn.Close()

                       txtcantidad.Focus()

                    
                    Else

     MsgBox("ESTE ARTICULO NO EXISTE")

                        cn.Close()
                    End If

    martes, 15 de noviembre de 2016 12:37
  • Muchas gracias JC Crispin, super agradecido por su ayuda.
    martes, 15 de noviembre de 2016 19:20
  • JC Herrero, muchas gracias por la ayuda.
    martes, 15 de noviembre de 2016 19:22