lunes, 9 de julio de 2012

Uso básico de Datagridview (DataSet y SQL server 2008)

A continuación,

Como llenar de datos un datagridview por medio de un dataset en visual studio 2010 (VB.NET) y SQL server 2008.

Lo haré de dos formas.
  1. Asignando a la propiedad de la tabla source el dataset
  2. Recorriendo el dataset y agregando los datos a la tabla
Nota: Según microsoft un dataset representa una caché de memoria interna de datos.

Primero tenemos que hacer lo siguiente:

Nota: no necesariamente tienen que poner los mismos nombres es según la necesidad del lector

  1. Crear una base de datos llamada DBEJEMPLO
  2. Crear una una tabla llamada DEPARTAMENTOS con los siguientes 
  • id_departamento nvarchar(5) Unchecked
  • descripcion nvarchar(30) Checked
  1. Crear un nuevo proyecto en visual studio .net llamado LLENARDATAGRIDVIEW
  2. Ir a herramientas y seleccionar una DATAGRIDVIEW y arrastrarlo al formulario FORM1 que se genera automáticamente.
  3. Crear FORM2, agregarle un DATAGRIDVIEW  y además Crearle dos columnas.
  4. Hasta aquí tendremos:
datagridview

5.
Creamos una clase llamada DATOS

Nota: La programación del código es orientada a objetos, no estructurada.

6. La clase tendrá el siguiente código:

Imports System.Data
Imports System.Data.SqlClient
Public Class datos 
    private ServerName As String = "."    'Nombre del servidor local, pueden escribir ".", si no les funciona escriban el nombre completo, por ejemplo: "EVELYN-PC\SQLEXPRESS"
     private  DBname As String = "DBEJEMPLO" ' Nombre de la base de datos
     private  sqlstringConexion As String = "Data Source=" + Servername + ";Initial Catalog=" + DBname + ";Integrated Security=True"
     private  Sqlconexion As New SqlClient.SqlConnection(sqlstringConexion) ' asigna la conexion de la base de datos con string de la conexion
     private  SqlCommand As SqlClient.SqlCommand
     private  Sqldapter As New SqlClient.SqlDataAdapter
     private  SqlDataAdapter As SqlDataAdapter

  Private Function CargarDataset(ByVal SqlString As String, ByVal tabla As String) As DataSet
        Try
            Dim SQLdataset As New DataSet
            Sqlconexion.Open()
            Sqldapter = New SqlDataAdapter(SqlString, Sqlconexion)
            Sqldapter.Fill(SQLdataset, tabla)
            Return SQLdataset
        Catch ex As Exception
            Return Nothing
            MessageBox.Show("No se pudo completar la operación, intente de verificar la conexión a la base de datos.", "Fallo conexión a la base de datos", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            Sqlconexion.Close()
        End Try
    End Function

    Public Sub Cargargrid(ByVal formulario As String, ByRef dtg As DataGridView)
        Try
            Dim tabla As String = "departamentos"
           Dim SqlString As String = "select a.id_departamento as Código, a.descripcion as Departamento from  " + tabla + " a"
            Dim ds As DataSet = CargarDataset(SqlString, tabla)

            If ds Is Nothing Then
                Exit Sub
            End If

            Select Case formulario
                Case "Forma 1"
                    CargarForma1(ds, dtg, tabla)
                Case "Forma 2"
                    CargarForma2(ds, dtg, tabla)
                Case Else
                    Exit Sub
            End Select
       Catch ex As Exception
           MessageBox.Show(Err.Description)
        End Try
    End Sub 

    Private Sub CargarForma1(ByVal ds As DataSet, ByRef dtg As DataGridView, ByVal tabla As String)
        Try
            Dim n As Integer ' variables para el for
            Dim fila As DataGridViewRow ' representa una fila del datagridview
            ' ciclo para limpiar el datagrid de cualquier dato y evitar que se repitan
            If dtg.Rows.Count > 0 Then
                For n = dtg.Rows.Count - 2 To 0 Step -1
                    fila = dtg.Rows(n)
                    dtg.Rows.Remove(fila) ' Eliminamos la fila de la colección
                Next
            End If

            dtg.DataSource = Nothing ' limpiar el datasourse
            dtg.Refresh() ' actualizar
            dtg.DataSource = ds ' asignar en la memoria la tabla
            dtg.DataMember = tabla ' asignar la tabla escogida
         Catch ex As Exception
           MessageBox.Show(Err.Description)
        End Try
    End Sub 

Private Sub CargarForma2(ByVal ds As DataSet, ByRef dtg As DataGridView, ByVal tabla As String)
        Try
            If dtg.Rows.Count > 0 Then
                dtg.Rows.Clear() 'limpiar el datagridview
            End If
            Dim filas As Integer = ds.Tables(tabla).Rows.Count - 1 ' verificamos que existan datos
            If filas < 0 Then
                Exit Sub
            End If
            Dim Codigo As String 
            Dim descripcion As String 
            For i As Integer = 0 To filas ' recorrer las filas del dataset cargado
               Codigo = ds.Tables(tabla).Rows(i)(0)
               descripcion  = ds.Tables(tabla).Rows(i)(1)
               dtg.Rows.Add(Codigo, descripcion)
            Next
      Catch ex As Exception
            MessageBox.Show(Err.Description, "Fallo conexión a la base de datos", MessageBoxButtons.OK, messageBoxIcon.Error)
    End Try
    End Sub 
End Class

7. Agregamos un botón para cargar los datos y en el evento click del botón, colocamos el siguiente código.

        Dim objetoDatos As New datos   ' instanciar un objeto de la clase datos
        objetoDatos.Cargargrid("Forma 2", DataGridView1)

Nota: El "Forma 1" o "Forma 2" depende del formulario del que se llama al método

8. Corremos la aplicación y el resultado será:



Espero que les sea de utilidad...!! :)

34 comentarios:

  1. hola amiga yo estoy agarrando este codigo pero para mysql pero como soy nuevo no me se muy bien la sintaxis, no se si tu sepas y me puedas ayudar.. :)

    ResponderEliminar
    Respuestas
    1. mmm ahorita no tengo tu respuesta, la última ves que trabaje con mysql fue con JAVA..cualquier cosa te aviso!!

      Eliminar
    2. Investigando lo de Pedro, que de paso fue una buen lugar para comenzar, la librería se llama MySql.Data.MySqlClient disponible en http://dev.mysql.com/downloads/connector/net/, puedes visitar está página http://programandoideas.com/conectar-visual-basic-net-y-mysql/.

      Eliminar
    3. Que requieres hacer con MySql?lo mismoo desplegar algo de la base de datos.??

      Eliminar
    4. has codigos mas faciles que estos como la coneccion podria ser asi
      ejemplo:
      Dim cn As New SqlConnection("server=localhost;integrated security=sspi;database=ventas")

      Eliminar
    5. Tienes toda la razón, pero la idea era demostrar que datos conformaban el string de conexión para la base de datos.

      Yo prefiero tener un parámetros donde pueda cambiar los datos con configuración, ya que podemos cambiarla en ejecución, y si su forma es sencilla pero no flexible.

      Eliminar
  2. En MySQL es lo mismo, solo tienes que utlizar la librería Mysq.Data y cambiar el prefijo Sql por Mysql en los objetos que se encuentran en MySqlClient

    ResponderEliminar
  3. muchas gracias.....te agradeceria pero con MySQL

    ResponderEliminar
    Respuestas
    1. Hola!! podías revisar este tema ya lo había considerado!!! Bueno espero todavía te sirva!!
      http://eve-ingsistemas-u.blogspot.com/2012/10/conectar-vbnet-con-mysql.html

      Eliminar
  4. Hola Eve , felicidades muy productivo tu blog, tengo una consulta.
    y es que deseo darle doble clic a un datagrid y q como evento se me carguen los datos en otro formulario pero en cajas de textos ...gracias por tu aporte

    ResponderEliminar
    Respuestas
    1. Hola!! muchas gracias..! si todavía te sirve podías hacerlo de varias maneras maneras... la más sencilla para mi es guardar los datos en un vector en el evento click del datagrid o doble click, luego cuando tuvieras el foco del otro formulario o apenas cierres el form del datagrid, puedes cargar los textbox con los datos del vector!!.. si tienes alguna..con gusto!!

      Eliminar
  5. Quiero en primer lugar agradecer por la calidad del material y por sobre todo, la didáctica con que expone este ejemplo, felicidades en verdad.

    Seguí cuidadosamente paso a paso la descripción del código sin embargo; en mi caso cuando ejecuto la aplicación para comprobar si me muestra los datos no consigo nada, ya he revisado 2 o 3 veces el código comparándolo con el que describe y no logro entender donde tengo el error.

    Aunque le de clic sobre el botón mostrar datos, no aparece nada en la grilla. Pero me quedo con el buen ejemplo que nos regala, gracias. Siga adelante

    ResponderEliminar
    Respuestas
    1. También seguí cuidadosamente el material y ocurrio lo mismo, sin embargo deduzco que estas utilizando la forma 2.

      Para utilizar esta forma Eve no aclaro muy bien esta parte "y además Crearle dos columnas.", para la forma 2 tienes que crear 2 o más columnas manualmente en el DataGridView con los nombres que utilizas en tu consulta (Select x,y,z).

      Mas vale tarde que nunca, estoy seguro que a alguien mas le servira.

      Eliminar
    2. Hola armando, si revisas el código en ejecución es más fácil saber donde está el error

      Guidex, solo en la segunda forma se crean manuales en la primera no porque se asigna un dataset al datasourse del datagridview. No son iguales y tienen funciones que la otra no! Por ejemplo llenar de la forma 2 es muy útil si debes manipular los datos del dataset y necesitas hacer algún cálculo ya que recorres todos los rows.

      Saludos

      Eliminar
  6. muy buen ejemplo gracias me sirvió de mucho

    ResponderEliminar
  7. Hola Eve...

    una consulta, que pasa si tu query tiene por ejemplo un left outer join??

    Saludos

    ResponderEliminar
    Respuestas
    1. Asumo que tambien puedes usar algo como
      SELECT *
      FROM empleado, departamento
      WHERE empleado.ID= departamento.ID

      Eliminar
    2. Puedes igual hacer un join con los campos que ud quiera, el código llena el dataset como una nueva tabla y esa se muestra!

      Eliminar
  8. podrias hacer el mismo ejemplo en C# por favor

    ResponderEliminar
    Respuestas
    1. Te recomiendo buscar un traductor ONLINE de lenguajes de programación de .net a C#. Es sencillo en realidad!

      Eliminar
  9. Hola eve, gracias por tu pagina, estoy intentando aprender al maximo visual basic net y buscando encontre esta magnifica pagina queria pedir tu ayuda en ejercicios de formularios para poder luego entrar de lleno con bases de datos, si ojala pudieras ayudarme con ello te dejo mi correo por si deseas prestarme tu valiosa ayuda, quedo inmensamente agradecido contigo y aqui estoy estudiando con tu pagina mil y mil gracias. mi correo es oscarydey200@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola. disculpa hace tiempo que deje el blog a un lado!

      Espero hayas aprendido durante este tiempo, cualquier cosa me puedes contactar al correo patrypz@hotmail.com

      Saludos.

      Eliminar
  10. Hola Eve, es un verdadero gusto saludarte. Te escribo desde Honduras y te felicito por las explicaciones tan detalladas que nos brindas a los que estamos aprendiendo el mundo del VB .NET.

    Te tengo una consulta, por ejemplo si un datagridview yo quiero recuperar el valor de varias tablas de una base de datos SQL ¿cómo lo hago?, pues la tabla principal contiene los códigos que sirven para relacionar los valores en texto de las otras tablas, espero me explique.

    El asunto es que cuando quiero utilizar la consulta sql desde vb. net utilizando un "inner join" me genera un error.

    Espero por favor me puedas dar un tip o ayuda para lograrlo.

    Un gran saludo.

    ResponderEliminar
    Respuestas
    1. Hola. disculpa hace tiempo que deje el blog a un lado!

      Espero hayas resuelto tus dudas.

      Saludos.

      Eliminar
    2. que pena por que eres muy buena ....... bueno ojala verte o leerte de vuelta luego.... me gustaron mucho tus respuestas informaticas un saludo desde CHILE....

      Eliminar
    3. Claro, igual puedes contactarme al correo patrypz@hotmail.com y con gusto si puedo te ayudo con cualquier duda!

      Eliminar
  11. Hola, muy buen aporte, tengo una inquietud, tal vez me puedas ayudar.
    Lleno un grid con datos de un BDD, en el cual existe un campo x, y los datos de este deben ser un link para que puedan llamar al archivo que hace referencia a estos datos. Lo e intentado de mil formas pero no lo e logrado.

    ResponderEliminar
    Respuestas
    1. Hola, con el datagridView puedes declarar una columna tipo DataGridViewLinkColumn.!!

      Eliminar
    2. http://www.cambiaresearch.com/articles/38/custom-hyperlink-column-for-datagrid te dejo esté link espero te sirva!!

      Eliminar
  12. Gracias por el buen codigo puesto.

    ResponderEliminar
  13. desde que parte seria solo para un formulario gracias

    ResponderEliminar