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