Enlace de datos en tiempo de ejecución

Anuncio
CONEXIÓN VB NET – SQL SERVER
Enlace de datos en tiempo de ejecución
Crear un formulario tal y
como se muestra en la
siguiente imagen.
La forma más fácil de crear
un enlace con un origen de
datos ADO .NET,
es
mediante la utilización de los
componentes
diseñables
incluidos en el entorno de
desarrollo de Visual Studio
.NET, de ésta forma podrá
enlazar cualquier control con un campo de una tabla de datos, sin apenas escribir código
fuente alguno. Pero mediante la escritura de nuestros propios procedimientos y
funciones, es cuando podemos obtener unos resultados mucho más flexibles y
eficientes, al menos en líneas generales. Los pasos a seguir para configurar el enlace en
tiempo de ejecución, bien se podrían adaptar al siguiente esquema.
1. Definir a nivel del formulario una variable privada que referencie a un objeto
DataSet, de ésta manera crearemos un enlace de datos bidireccional, por lo que las
modificaciones efectuadas en los valores de los campos enlazados, se almacenarán en el
origen de datos, en éste caso, en el objeto DataSet creado, que será un objeto
desconectado de la propia base de datos, lo que significa que los datos de la base no se
actualizarán de manera automática, permaneciendo intactos.
Private ds As DataSet
2. Declarar en el módulo una variable privada del tipo BindingManagerBase, la
cual contendrá todos los objetos Binding que se encuentren asociados a un mismo
origen de datos, que en nuestro caso será el objeto DataSet mencionado en el punto
anterior.
Private bmb As BindingManagerBase
El objeto BindingManagerBase dispone de la propiedad Position, que es la encargada de
establecer la posición de los valores actuales de los controles. Cuando cambia el valor
de la propiedad Position, el objeto BindingManagerBase notifica a todos los objetos
Binding asociados, que deben de enviar al origen de datos los valores actuales
existentes en los controles de datos, recibiendo asimismo los nuevos valores existentes
en la nueva posición. Estos cambios de posición hacen que el objeto
BindingManagerBase desencadene el evento PositionChanged, el cual podremos
aprovechar para realizar cualquier otro tipo de operación que nos pueda resultar
necesaria.
3. Crear el objeto DataSet declarado en el primer punto. Para ello, podemos
habilitar en nuestro formulario un procedimiento genérico que sea el encargado de
ejecutar todo el código necesario para la creación del objeto DataSet:
~1~
Ing. Henry M. Arévalo Flores
CONEXIÓN VB NET – SQL SERVER




Apertura de la conexión.
Creación del adaptador de datos.
Relleno del objeto DataSet.
Cierre de la conexión.
Private Function CreateDataSetOleDb(ByVal cnnString As String, ByVal SQL As String, _
ByVal tableName As String) As DataSet
' Creamos un objeto OleDbConnection
Dim cnn As New OleDbConnection(cnnString)
Try
' Abrimos la conexión
cnn.Open()
' Creamos un adaptador de datos
Dim da As New OleDbDataAdapter(SQL, cnn)
' Rellenamos el objeto DataSet con los datos de la consulta SQL
Dim ds As New DataSet
da.Fill(ds, tableName)
Return ds
Catch ex As Exception
MessageBox.Show(ex.Message, "Crear DataSet")
Finally
' Cerramos la conexión
cnn.Close()
End Try
End Function
4. Enlazar los controles con los campos de la base de datos, creando el
correspondiente objeto Binding mediante el método Add de la colección DataBindings.
Dicho método acepta el nombre de la propiedad del control enlazado (generalmente la
propiedad Text), la referencia al origen de datos (el objeto DataSet), y el nombre del
campo de la tabla de la base de datos, en el formato nombretabla.nombrecampo.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
' Creamos el conjunto de datos
ds = CreateDataSetOleDb("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos\Northwind.mdb", _
"SELECT EmployeeID, FirstName, LastName FROM Employees", _
"Employees")
If ds Is Nothing Then Exit Sub
~2~
Ing. Henry M. Arévalo Flores
CONEXIÓN VB NET – SQL SERVER
bmb = Me.BindingContext(ds, "Employees")
' Asociamos el evento PositionChanged con un controlador de eventos
AddHandler bmb.PositionChanged, AddressOf PositionChanged
' Procedemos a enlazar los controles de texto
txtEmployeeID.DataBindings.Add("Text", ds, "Employees.EmployeeID")
txtFirstName.DataBindings.Add("Text", ds, "Employees.FirstName")
txtLastName.DataBindings.Add("Text", ds, "Employees.LastName")
' Actualizar
With bmb
.Position = .Count
.Position = 0
End With
End Sub
Una vez creado el conjunto de datos, y enlazados los correspondientes controles, solo
nos queda escribir el código necesario en los distintos botones de comando, para que
podamos movernos de una posición a otro dentro del origen de datos (el objeto
DataSet).
Private Sub PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
lblReg.Text = "Registro " & (bmb.Position + 1) & " de " & bmb.Count
End Sub
Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnFirst.Click
bmb.Position = 0
End Sub
Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnPrevious.Click
bmb.Position -= 1
End Sub
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnNext.Click
bmb.Position += 1
End Sub
Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnLast.Click
bmb.Position = bmb.Count - 1
End Sub
Si ejecuta el proyecto, observará que puede desplazarse por los distintos registros
pulsando sobre los correspondientes botones, almacenándose en el origen de datos (el
~3~
Ing. Henry M. Arévalo Flores
CONEXIÓN VB NET – SQL SERVER
objeto DataSet) todas las modificaciones que efectúe sobre los campos. Pero al estar
trabajando en un entorno desconectado de la propia base de datos, esas modificaciones
realizadas no tendrán efecto en la propia base de datos: tendrá que utilizar un objeto
DataAdapter apropiado para enviar las modificaciones a la base de datos. De ello se
encargará el siguiente procedimiento genérico, el cual actualiza un origen de datos
OleDb:
Private Sub UpdateOleDb(ByVal ds As DataSet, ByVal cnnString As String, _
ByVal SQL As String, ByVal tableName As String)
' Creamos un objeto OleDbConnection
Dim cnn As New OleDbConnection(cnnString)
Try
' Abrimos la conexión
cnn.Open()
' Creamos un adaptador de datos
Dim da As New OleDbDataAdapter(SQL, cnn)
' Rellenamos el objeto DataSet con los datos' de la consulta SQL
da.Fill(ds, tableName)
' Creamos un objeto CommandBuilder para actualizar los datos
Dim cmdBuilder As New OleDbCommandBuilder(da)
With da
.InsertCommand = cmdBuilder.GetInsertCommand
.DeleteCommand = cmdBuilder.GetDeleteCommand
.UpdateCommand = cmdBuilder.GetUpdateCommand
End With
' Enviamos los cambios a la base de datos
da.Update(ds, tableName)
Catch ex As Exception
MessageBox.Show(ex.Message, "Actualizar Datos")
Finally
' Cerramos la conexión
cnn.Close()
End Try
End Sub
Siguiendo con nuestro ejemplo, para llamar al procedimiento UpdateOleDb
utilizaríamos el siguiente código:
UpdateOleDb(ds, "Provider=Microsoft.Jet.OLEDB.4.0;" &_
"Data Source=C:\Mis documentos \Northwind.mdb", _
"SELECT EmployeeID, FirstName, LastName FROM Employees", "Employees")
~4~
Ing. Henry M. Arévalo Flores
Descargar