jueves, 7 de noviembre de 2013

Datagridview llenar con datos obtenido desde consulta SQL

He decidido crear este articulo pensando en muchos desarrolladores que apenas estan comenzando con Visual Basic .Net.


Y la primer consulta que uno se hace al mirar este control es como lleno el datagridview con mi consulta, para esto vamos a realizar los siguientes pasos.

1.- Insertamos un control Datagridview en nuestro formulario.


2.- Insertamos un boton para obtener los datos de la consulta.
  •      Colocamos el texto a mostrar del boton en la propiedad Text, en este caso usaremos el texto  "Obtener datos."
3.- Ahora vamos a escribir el codigo para conectarnos a una base de datos y obtener los datos.
  • Antes debemos tener creada una base de datos en mi caso la llamaremos Pruebas.
  •  
  • Crearemos una tabla llamada personas.
  • USE [pruebas]
    GO

    /****** Object:  Table [dbo].[Personas]    Script Date: 07/11/2013 09:06:34 a.m. ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[Personas](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Nombres] [nvarchar](50) NULL,
        [Apellidos] [nchar](10) NULL,
     CONSTRAINT [PK_Personas] PRIMARY KEY CLUSTERED
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
     
  • Llenamos la tabla con registros de prueba.
  •  
  •  En la vista codigo de nuestro formulario o haciendo doble click en el formulario, nos aparecera la ventana donde escribiremos todo el codigo necesario para interactuar en nuestra aplicacion.
  •  Debemos hacer referencias al espacio de nombres Imports System.Data.SqlClient ya que trabajaremos con clases que pertenecen a este espacio de nombres.
  •  
  •  Ejecutamos la aplicacion, y probamos el resultado al dar click en el boton Obtener datos.


Ya para despedirme cabe aclarar que es una buena practica de programacion encapsular nuestro codigo con un bloque de Try Catch, por cualquier problema inesperado y asi evitar que nuestra aplicacion se cuelgue.

el codigo final quedaria asi.
Eso es todo por hoy, cualquier duda comentario o sugerencia, pueden hacerla publicando su comentario en la parte de abajo.

Si hay algun tema en especial sobre el que les gustaria que escribiera tambien me lo pueden indicar,  y se los hare saber por medio de un correo electronico.

El codigo fue escrito en Visual Basic.Net 2008
La Base de datos se hizo en SQL Server 2012.

29 comentarios:

  1. Gracias, excelente aporte.

    ResponderEliminar
  2. Como hago para que el datagrid solo me muestre el resultado de la busqueda es decir que no pueda ver los demas registros si no solo el que haya buscado agaredeceria su respuesta.

    ResponderEliminar
    Respuestas
    1. Hola Eliza, disculpa que no conteste tu consulta, ya dias no entraba al blog, todavia nececitas la respuesta?, o ya resolviste tu consulta?.

      Me avisas.

      Eliminar
  3. Muy interesante y nada complicado
    Seria tambien interesante que mostraras si, a partir del datagridview, se puede rellenar la BD

    ResponderEliminar
    Respuestas
    1. Te refieres a pasar los datos que estan en el datagrid hacia la base de datos?
      Recuerda que estos estan ya en la base de datos.
      Si me explicas mejor la idea para entender que es lo que deseas saber con gusto encontrare una solución.

      Eliminar
  4. que pasa si programe en tres capas¡¡ como puedo mostrar los datos en datagridview

    ResponderEliminar
  5. que pasa si programe en tres capas¡¡ como puedo mostrar los datos en datagridview

    ResponderEliminar
  6. seria igual, ya que los datos que obtienes los puedes colocar en un dataset o un datatable y este enlazarlo al datagrid con la propiedad datasource.

    ResponderEliminar
  7. gracias hermano, yo lo utilice para organizar mi tabla por orden alfabético según mi criterio.


    aqui mi aporte por si a alguien le interesa lo mismo, solo deben sustituir donde dice "select id, nombre, apellido from personas" por "SELECT * FROM PROVEEDORES ORDER BY NOMBRE_PROVEEDOR ASC" donde provvedores es mi tabla y nombre_proveedor en la columna la cual se va a organizar, ASC significa que se van a organizar de manera ascendente, si se quiere organizar de manera descendente solo deben poner DESC.

    ResponderEliminar
  8. muy buen dato estimado, peor una pequeña consulta, que pasaria si quisiera hacer que por ejemplo...
    que mi datagridview tenga mas campos que los que tengo en la tabla por ejemplo tiene de cabecera 1 2 3 4 5 y en mi tabla tengo 1 3 5, como le puedo hacer para que en el datagridview se muestren en el orden que quiero, es decir que mi datagridview deberia quedar con los campos 1 3 5 llenos y los 2 y 4 en blanco

    ResponderEliminar
    Respuestas
    1. Si lo que quieres es agregar nuevas columnas a tu datagriview si que estas salgan de una tabla de base de datos, solo debes darle click derecho a tu datagridview luego punchar la opción "editar columnas" ahi agregas las columnas adicionales que quieras.

      Eliminar
    2. Si lo que quieres es agregar nuevas columnas a tu datagriview si que estas salgan de una tabla de base de datos, solo debes darle click derecho a tu datagridview luego punchar la opción "editar columnas" ahi agregas las columnas adicionales que quieras.

      Eliminar
  9. XQ ESTAN RAYADAS ESAS BASES?

    ResponderEliminar
  10. Disculpa me podrias ayudar para poder agragar filas a un datagridview que se encuentra enlazado a datos.

    Te explico.

    Tengo un formulario el cual contiene un texbox y un datagridview. Cuando se introduce un codigo en el textbox y se precione enter se busca en la bd y me muestra el resultado en el datagridview.

    Si quiero seguir introduciendo codigos al textbox se vayan añadiendo al datagridview.

    Solo puedo hacer que se muestre una fila y si busco un nuevo codigo se sobreescribe el que ya estaba.

    Te dejo mi correo si me puedes ayudar.

    frank33bet@gmail.com

    Saludos

    ResponderEliminar
    Respuestas
    1. Saludos frank.


      Quisas pueda ayudarte, por lo que entiendo estas tratando de filtar los datos en tu datagridview, pero cuando lo haces y borras para buscar otro la datagridview se queda solo con los datos consultados?

      De ser asi notificame y si no aclarame bien para ayudarte.

      Saludos.

      Eliminar
    2. Asi es solo me muestra el dato consultado mas reciente. Te Muestro el codigo con el que lo estoy realizando

      Imports System.Data.SqlClient

      Public Class Form1

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      DataGridView1.AutoGenerateColumns = False //Las columnas las genero en tiempo de diseño
      End Sub

      Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
      If e.KeyChar = Convert.ToChar(Keys.Enter) Then
      DataGridView1.DataSource = GetByid(TextBox1.Text)
      End If
      End Sub

      Public Function GetByid(ByVal idProducto As String) As List(Of EProducto)
      Dim productos As New List(Of EProducto)
      Using cnx As New SqlConnection("Data Source=.;Initial Catalog=FACTURACION;Integrated Security=True")
      cnx.Open()
      Const sqlGetById As String = " SELECT IdProducto, Descripcion, Precio FROM PRODUCTOS WHERE IdProducto=@id ORDER BY IdProducto ASC "
      Using cmd As New SqlCommand(sqlGetById, cnx)
      cmd.Parameters.AddWithValue("@id", idProducto)
      Dim dataReader As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
      While dataReader.Read()
      Dim producto As New EProducto()
      producto.IdProducto = Convert.ToString(dataReader("IdProducto"))
      producto.Descripcion = Convert.ToString(dataReader("Descripcion"))
      producto.Precio = Convert.ToDecimal(dataReader("Precio"))
      productos.Add(producto)
      End While
      Return productos
      End Using
      End Using
      Return Nothing
      End Function

      End Class

      Solo tengo un textbox y un datagridview en el formulario.

      y quiero que se vayan agregando al datagridview los resultados de la busqueda.

      En el datagridview No hay nada hasta que se realiza la primer consulta

      Saludos

      Eliminar
    3. En ese caso solo debes devolver los valores de la tabla completa a tu datagridview, en el evento formload debes hacer que tus datos se cargen en el datagrid, eso en caso de que quieras ver los datos al iniciar tu formulario, lo otro seria para cuando borres el texbox de busqueda y te cargen todos los datos en tu datagrid nuevamente puedes hacer lo siguiente:


      1- vas al evento keydown de tu textbox.
      2- escribes la condicion :

      If e.KeyCode = Keys.Back Then

      Using cnx As New SqlConnection("Data Source=.;Initial Catalog=FACTURACION;Integrated Security=True")
      cnx.Open()
      Const sqlGetById As String = " SELECT * FROM PRODUCTOS ORDER BY IdProducto ASC "
      Using cmd As New SqlCommand(sqlGetById, cnx)

      End If


      y listo, la condicion es que "si la tecla precionada es igual a back(borrar) entonces te ejecutara la sentecia que quieras", puse de ejemplo una parte de tu codigo, lo unico que fijate para que te cargen todos los datos de esa tabla colocas "select * from tabla", ahi te llamara todas las columnas de tu tabla y el order by de organizara bajo tu criterio.

      espero que te aya servido de algo, cualquier duda podemos charlar
      adamfrancisco09@gmail.com

      saludos.


      Eliminar
  11. Disculpa amigo buenas noches estoy trabajando en un proyecto y usando tu codigo solo tengo un detalle quiero filtar con la busqueda del usuario haciendo uso de una caja de texto denominada Poliza.txt me podrias ayudar

    ResponderEliminar
    Respuestas
    1. Private Sub Poliza_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Poliza.KeyPress
      If Asc(e.KeyChar) = 13 Then
      Dim dt As New DataTable
      Dim conexion As String = "Server=CIAMAS01-PLC\TECHNOTEL;Database=ENTERPRISEADMINDB;User Id=sa;Password=12345;"
      Using adaptador As New SqlDataAdapter("SELECT * FROM TABLA WHERE Poliza='" & Poliza.Text & "'", conexion)
      adaptador.Fill(dt)
      End Using
      DataGridView1.DataSource = dt
      End If

      End If

      End Sub

      Eliminar
    2. Al usar este último código, me manda este mensaje de error:

      NO SE CONTROLÓ ARGUMENTEXCEPTION:
      El formato de la cadena de inicialización no se ajusta a la especificación que comienza en el índice 46.

      ¿Me puedes ayudar por favor?

      Eliminar
  12. hola como estas, a mi me funciono perfecto tu codigo, solo que me gustaría que ayudaras con el tema de filtros, es decir que pueda filtrar los resultados de la consulta entre un rango de fechas específico. te agradeceria mucho tu ayuda.

    ResponderEliminar
  13. Tendrías que agregar dos parámetros mas a la consulta fecha de Inicio y fecha Final para poder generar la consulta de acuerdo al rango especificado.

    Ejemplo
    SELECT ID, Descripcion, Costo, Precio, FechaCreacion
    FROM PRODUCTOS With (NoLock)
    WHERE FechaCreacion between @fechaInicio and @fechaFinal

    Saludos!!

    ResponderEliminar
  14. Y como lo puedo hacer para entorno web con datareader? De antemano muchas gracias

    ResponderEliminar
  15. como le hago para agregar el resultado en una columna especifica creada con anterioridad en el data?

    ResponderEliminar
  16. hola que tal, quisiera saber si me pueden ayudar a mi, quisiera que cuando yo ponga una palabra clave o numero clave correspodiente a algun producto ya almacenado en mi base de datos me lo agrege al datagrid. Utilizando un text box, un boton y el datagrid.
    Quisiera que pueda hacer mas de una consulta osea que yo llame varios productos con el Id y me los agrege uno bajo el otro sin que me los pise.

    ResponderEliminar
  17. Vi este video y me funcionó y me permitió descargar el proyecto , se los comparto! https://www.youtube.com/watch?v=-99UfBDSZeE&t=3s

    ResponderEliminar