Archivo de la categoría: DataBinding

Como enlazar columnas de una tabla SQL a unos ‘TextBox’

‘ En respuesta a la pregunta de como añadir o modificar registros

‘ a una tabla de SQL con bindings sin DGV y al viejo estilo ADO.

‘ Utilizaremos solo las columnas de Nombre y Telefono de la tabla ‘Shippers’

‘ Despues de insertar un nuevo registro, deberemos utilizar el boton

‘ de actualizar para que dichos cambios sean actualizados a la BD.

‘ En caso de modificacion solo necesitaremos llamar a la ‘actualizacion’

 

Imports System.Data

Imports System.Data.SqlClient

 

Public Class Form1

   

    ‘Constructores para el acceso a la tabla ‘Shippers’ y su correspondiente BindingSource

    Private MiConexion As New SqlConnection( _

               «Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Temp\Northwind\NORTHWND.MDF» + _

               «;Integrated Security=True;Connect Timeout=30;User Instance=True»)

 

    Private MiDataSet As New DataSet()

    Private MiAdaptador As New SqlDataAdapter(«SELECT * FROM Shippers», MiConexion)

    Private MiEnlazador As New BindingSource

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       

        ‘ Panel conteniendo los textbox para la entrada/modificacion

        Dim Nombre As New TextBox

        Dim Telefono As New TextBox

 

        Dim marcoDatos = New FlowLayoutPanel

        marcoDatos.Dock = DockStyle.Top

        marcoDatos.Controls.AddRange(New Control() {Nombre, Telefono})

        Me.Controls.AddRange(New Control() {marcoDatos})

 

       

        ‘ Panel conteniendo los botones de control

        Dim Avanza As New Button

        Dim Retrocede As New Button

        Dim Insertar As New Button

        Dim Actualizar As New Button

        Dim Controles As New FlowLayoutPanel

        Controles.Dock = DockStyle.Bottom

        Retrocede.Text = «<- Re»

        Avanza.Text = «Av ->»

        Insertar.Text = «Insertar»

        Actualizar.Text = «Actualizar»

        Controles.Controls.AddRange(New Control() {Retrocede, Avanza, Insertar, Actualizar})

        Me.Controls.AddRange(New Control() {Controles})

       

        ‘ Asignar el evento a las funciones de cada boton de control

        AddHandler Retrocede.Click, AddressOf retroceder

        AddHandler Avanza.Click, AddressOf Avanzar

        AddHandler Insertar.Click, AddressOf Nuevo

        AddHandler Actualizar.Click, AddressOf Actualizacion

       

        ‘ Conexion, relleno y asignacion del enlace a datos

        MiConexion.Open()

        MiAdaptador.Fill(MiDataSet)

        MiEnlazador.DataSource = MiDataSet.Tables(0)

        Dim Micommandbuilder As New SqlCommandBuilder(Me.MiAdaptador)

       

        ‘ Enlace de los TextBox a sus omologos en la tabla

        Dim EnlaceNombre As New Binding(«Text», MiEnlazador, «CompanyName»)

        Nombre.DataBindings.Add(EnlaceNombre)

        Dim EnlaceDireccion As New Binding(«Text», MiEnlazador, «Phone»)

        Telefono.DataBindings.Add(EnlaceDireccion)

    End Sub

    ‘ Avanzar un registro dentro del ‘recordset’ 🙂

    Sub Avanzar()

        MiEnlazador.MoveNext()

    End Sub

    ‘ Retroceder un registro

    Sub retroceder()

        MiEnlazador.MovePrevious()

    End Sub

    ‘Crear un nuevo registro

    Sub Nuevo()

        MiEnlazador.AddNew()

    End Sub

    ‘ Actualizar el registro en curso o el recien creado

    Sub Actualizacion()

        MiEnlazador.EndEdit()

        MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))

    End Sub

End Class

Saludos,
Pep Lluis,

Un Combo, Una MDB, Un DataGridView y una MDF

Aquí una idea de cómo utilizar MDF y MDB’s.

En este ejemplo utilizamos la tabla de proveedores de una MDB para rellenar un DataGridView de los productos del proveedor en la MDF de ‘NorthWnd’ seleccionado en el Combo. 

Combo+Datagrid

Debo advertir que el siguiente codigo no ejemplo de metodologia, tan solo pretende enseñar en un solo ejemplo como conectar una BD Access y otra de SQL, pero en ningun caso es un modelo de uso, pues en realidad nunca he trabajado con una aplicacion que utilice los dos formatos conjuntamente.

Imports System.Data.OleDb

Imports System.Data.SqlClient

 

Public Class Form1

    Private WithEvents ComboBox1 As New ComboBox

    Private WithEvents DataGridView1 As New DataGridView

   

    ‘Definir enlace a datos y objetos del form

    Private SQLConexion As New SqlConnection( _

        «Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Temp\Northwnd.mdf» + _

        «;Integrated Security=True;Connect Timeout=30;User Instance=True»)

 

    Private MDBConexion As New OleDbConnection( _
        «Provider=Microsoft.Jet.OLEDB.4.0;» + _

        «Data Source=C:\Temp\bd1.mdb»)

 

    Private Sub Form1_Load() Handles Me.Load

        Me.Controls.Add(ComboBox1)

        Me.ComboBox1.Dock = DockStyle.Top

        AddHandler ComboBox1.SelectedIndexChanged, AddressOf Obtener_Articulos

 

        Me.Controls.Add(Me.DataGridView1)

        Me.DataGridView1.Dock = DockStyle.Fill

 

        Me.ComboBox1.DisplayMember = «CompanyName»

        Me.ComboBox1.ValueMember = «SupplierID»

        Me.ComboBox1.DataSource = Obtener_Proveedores()

    End Sub

   

    ‘ Cargar el DGV con la seleccion de articulos segun el proveedor

    Private Sub Obtener_Articulos()

        Dim Articulos = _
          «SELECT * FROM Products Where SupplierId = « + _
          ComboBox1.SelectedValue.ToString

        SQLConexion.Open()

        Dim MiSqladapter As New SqlDataAdapter

        MiSqladapter.SelectCommand = New SqlCommand(Articulos, SQLConexion)

        Dim MiTabla As New DataTable()

        MiSqladapter.Fill(MiTabla)

        SQLConexion.Close()

        Me.DataGridView1.DataSource = MiTabla

    End Sub

   

    ‘ Obtener la tabla de proveedores como ‘datasource del ComboBox’

    Private Function Obtener_Proveedores()

        MDBConexion.Open()

        Dim MDBadapter As New OleDbDataAdapter(«Select * from Suppliers», MDBConexion)

        Dim MiTabla As New DataTable()

        MDBadapter.Fill(MiTabla)

        Return MiTabla

    End Function

 

End Class

Compartir una Clase (VbDosFormsUnaBd)

Atendiendo la solicitud de Carlos…


«Bueno mi pregunta es la siguiente, tengo dos formularios el primero busca un nombre mediante un inputbox y encuentra el nombre y despliega nombre y apellidos mediante dos textbox, en este formulario quiero poner un boton que diga «Ver» y que me abra el otro formulario que ya tengo y me muestre direccion, telefono, edad, etc de ese nombre que encontro, la conexion de la tabla es con access mediante ado.
Gracias!!»


Os adjunto un ejemplo muy simple de como compartir una clase entre dos Forms.
Espero vuestras sugerencias.
Pep Lluis,


Como siempre podeis descargaros el ejemplo de ‘attachments’

Introducir datos desde un textbox a una base access en vb.net

La idea basica es utilizar un 'bindingsource' y un commandbuilder para tu adataptador de datos, a partir de este concepto es tan simple como añadir un 'datarow' o registro a tu tabla de datos 'datatable' cada vez que pulsamos 'enter' y la longitud de los datos introducidos es mayor de cero. Posteriormente para actualizar o añadir los registros del 'datatable' a la BD de access utilizaremos el mandato 'update' (al pulsar un boton en nuestro caso), o asociado al momento que consideres oportuno.

Puedes descargarte este ejemplo haciendo click en 'attachments'

Imports System.Data.OleDb
Imports System.Data.DataRow

Public Class Form1
 
Private MiConexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\bd1.mdb")
 
Private MiAdaptador As New OleDbDataAdapter("SELECT * FROM Nombres", MiConexion)
 
Private MiDataSet As New DataSet()
 
Private MiEnlazador As New BindingSource

  Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
   
If (e.KeyChar = Chr(Keys.Enter)) And (Me.TextBox1.Text.Length > 0) Then
     
Dim nombre As DataRow
      nombre = MiDataSet.Tables(0).NewRow()
      nombre(
"Nombre") = TextBox1.Text
      MiDataSet.Tables(0).Rows.Add(nombre)
     
Me.TextBox1.Text = ""
     
Me.ComboBox1.SelectedIndex = Me.ComboBox1.Items.Count – 1
   
End If
 
End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   
Dim commandbuilder As New OleDb.OleDbCommandBuilder(Me.MiAdaptador)
    MiConexion.Open()
    MiAdaptador.Fill(MiDataSet)
    MiEnlazador.DataSource = MiDataSet.Tables(0)
   
Me.ComboBox1.DataSource = MiEnlazador
   
Me.ComboBox1.DisplayMember = "Nombre"
   
Me.ComboBox1.ValueMember = "Id"
   
Me.TextBox1.Select()
 
End Sub

  Private Sub Guardar(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   
Me.MiAdaptador.Update(CType(Me.MiEnlazador.DataSource, DataTable))
 
End Sub

Espero que sea de tu utilidad.
Pep Lluis,

Actualizar una BD Access, utilizando un DataGridView

A peticion de Ester, en el foro Español de Visual Basic, me complace adjuntaros un pequeño proyecto para actualizar los datos de una BD de access desde un DataGridView. Debo destacar y debemos situar este ejemplo dentro de un contexto de manipulacion de bases de datos relativamente pequeñas, desconozco su rendimiento si es usado en tablas de dimensiones considerables, por lo que este ejemplo es solo para dar una idea de como lo hariamos desde este control y en ningun caso como solucion profesional a la consulta/actualizacion de una BD.

Saludos,
Pep LLuis,

Visualizar una columna de una BD de Access en un Combo

En plena efervescencia del SQL Express 2005 como almacen de lujo en nuestras pequeñas aplicaciones de datos, continua siendo frecuente en algunos foros de VB preguntas referentes al enlace de ciertos controles con BD's de Access. La respuesta habitual es un link a toda la documentacion de ADO… DAO… SqlClient, lo que ha cambiado desde VB6, desde VB2003 o lo que es mas recomendable en VB2005. Verdaderamente es una buena practica conocer todas las posibilidades de acceso a datos (tipados, no tipados… ufff), pero en ayuda a los que estan empezando creo que es mas beneficioso un simple ejemplo. ¡ Ahi Va ! 

En algunas ocasiones puede sernos util poder cargar las opciones de nuestros combos, desde una base de datos access. Imagemos que mantenemos una lista de poblaciones… provincias… articulos, etc. desde Access, y que posteriormente utilizamos esta en una aplicacion para seleccionar las opciones de las mismas como parte de formularios cliente, en un proceso de introduccion de datos.

Imports System.Data.OleDb

Class Form1
   Private objConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Data Source=C:\Bd1.mdb"
)
   Private objAdapter As New OleDbDataAdapter("SELECT * FROM Productos"
, objConn)
   Private objDataSet As New
DataSet()
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase
.Load
      objConn.Open()
      objAdapter.Fill(objDataSet)
      Me
.ComboBox1.DataSource = objDataSet.Tables(0)
      Me.ComboBox1.DisplayMember =
"Columna"
      Me.ComboBox1.ValueMember =
"Id"
      objConn.Close()
   End
Sub
End
Class

¿verdad que facil?
Pep Lluis,

¿como conectar el msflexgrid con una base de datos de access?

Solo necesitas arrastrar y soltar un MsFlexGrid y un objeto Data de la barra de herramientas al form. El siguiente paso es asignar el Valor data source del MsFlexGrid con el nombre del objeto de datos… por defecto 'data1'. Finalmente solo tenemos que asignar el nombre de la base de datos del 'data1' en la propiedad databasename….

Luego en el evento de load o activate….

  1. Data1.DataBaseName="C:\MibaseAccess.mdb"
  2. Data1.RecordSource="Select * from MiTabla where …."
  3. Data1.Refresh

Por si acaso tambien os dejo un ejemplo para VB2005 con DAO (sin el control 'data' de VB6), simplemente es para ver como se actualizaria el acceso a una MDB de VB6 a VB.NET.

  1. Dim dbs as DAO.Database
  2. Dim rst as DAO.Recordset
  3. Dim fld as DAO.Field
  4. dbs = DAODBEngine_definst.OpenDatabase("C:\MiBasedeDatos.mdb")
  5. rst = dbs.OpenRecordset("MiTabla", DAO.RecordsetTypeEnum.dbOpenDynaset)
  6. fld = rst.Fields("MiColumna")
  7. MsgBox(fld.Value)
  8. dbs.Close