Anda di halaman 1dari 29

ACCESO A DATOS CON ADO.

NET

ADO .NET es la nueva versin del modelo de objetos ADO (ActiveX Data Objects), es decir, la Estrategia
que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado para cubrir todas las necesidades
que ADO no ofreca, y est diseado para trabajar con conjuntos de datos desconectados, lo que permite
reducir el trfico de red. ADO .NET utiliza XML como formato universal de transmisin de los datos.

COMPONENTES DE ADONET

Base de Datos
Database

Se conecta a un origen de datos


Connection

Ejecuta comandos sobre el origen de datos


Command

Carga un dataSet y provee el enlace entre ste y el origen de


datos. Requiere estar conectado
DataAdapter

Carga un conjunto de registros de solo lectura (Read Only) y


DataReader avance hacia delante (Forward Only)

Es el objeto principal en ADO.NET. Es un conjunto de datos


DataSet residente en memoria, incluyendo tablas relaciones, etc.

1
ADO .NET se puede definir como:

Un conjunto de interfaces, clases, estructuras y enumeraciones que permiten el acceso a datos


desde la plataforma .NET de Microsoft
La evolucin lgica del API ADO tradicional de Microsoft
Permite un modo de acceso desconectado a los datos, los cuales pueden provenir de mltiples
fuentes de datos, de diferente arquitectura de almacenamiento
Soporta un completo modelo de programacin y adaptacin, basado en el estndar XML

LOS ESPACIOS DE NOMBRES DE ADO.NET

ADO.NET se encuentra en la biblioteca System.Data.dll, y ofrece clases en cinco espacios de


nombres bien diferenciados que explico brevemente a continuacin:

System.Data: es el espacio de nombres primario. Dentro de este espacio de nombres tenemos un


conjunto de clases que representan, digamos, una base de datos virtual, tablas, filas, columnas, relaciones,
etc. Sin embargo, ninguna de estas clases ofrece conexin alguna con un origen de datos, sino que
simplemente representan los datos en s mismos.

System.Data.Common: ofrece clases comunes entre distintos orgenes de datos. Para lo que
vamos a tratar en este artculo, podemos decir que estas clases sirven de clase base para las que estn
contenidas en los dos espacios de nombres que vienen a continuacin.

System.Data.OleDb: contiene una serie de clases que nos permiten conectarnos con cualquier
origen de datos e interactuar con l al tiempo que sirven de "intermediarios" entre el origen de datos y las
clases del espacio de nombres System.Data que, segn decamos, no tienen conexin alguna con dicho
origen de datos. Las clases de System.Data.OleDb usan OLEDB como tecnologa subyacente.

2
System.Data.SqlClient: contiene clases que permiten interactuar con orgenes de datos SQL
Server de un modo mucho ms directo que OLEDB, mejorando el rendimiento para este tipo de origen de
datos. Por lo tanto, solamente se pueden utilizar para acceder a bases de datos de SQL Server. El uso de sus
clases es prcticamente equivalente al de las que se encuentran en System.Data.OleDb.

System.Data.SqlTypes: este espacio de nombres ofrece los tipos primitivos que usa SQL
Server. Obviamente, aunque se pueden usar los tipos equivalentes del CTS, los que se incluyen en este
espacio de nombres estn optimizados para trabajar con SQL Server.

A pesar de que el modelo de objetos ha sido simplificado, an sigue siendo lo suficientemente


extenso como para no poder entrar en detalle con todas sus clases en slo un artculo, sobre todo si no quiere
uno agobiar a los sufridos lectores ms de lo estrictamente necesario. Por este motivo, nos centraremos ms
en algunas clases fundamentales de los espacios de nombres System.Data y System.Data.SqlClient,
desarrollando para ello un ejemplo completo. Daremos tambin alguna pequea pincelada con clases
OleDb, pero no reproduciremos un ejemplo completo en este caso porque sera casi idntico al desarrollado
con SqlClient.

Objetos de Proveedor

Objeto Proveedor SQLServer Proveedor OLEDB


Connection SQLConnection OleDBConnection

Command SQLCommand OleDBCommand

DataReader SQLDataReader OleDBDataReader

DataAdapter SQLDataAdapter OleDBDataAdapter

Transaction SQLTransaction OleDBTransaction

3
Una ambiente conectado es uno en el cual los usuarios constantemente se conectan a la base de
datos

Ventajas:
El ambiente es ms fcil de asegurar
La concurrencia es ms fcilmente controlada
La data suele ser ms actual que en otros escenarios

Desventajas:
Se debe tener una conexin de red permanente

En un ambiente desconectado, un subconjunto de datos del data store puede ser copiado y
actualizado independientemente y los cambios devueltos al data store
Ventajas
Se trabaja en cualquier momento, y se puede conectar con la fuente de datos en
cualquier momento para procesar la peticin
Otros usuarios pueden usar la conexin
Incrementa la escalabilidad y rendimiento
Desventajas
La data no est siempre actualizada
Conflictos de actualizacin pueden ocurrir que deben ser resueltos

ADO .NET est basado en una arquitectura desconectada de los datos. En una aplicacin de datos se ha
comprobado que mantener los recursos reservados mucho tiempo, implica reducir el nmero de usuarios
conectados y aumenta el proceso del sistema al mantener una poltica de bloqueos y transacciones. Al
mismo tiempo, si la aplicacin mantiene ms de un objeto simultneamente, se encuentra con el problema
de tener que estar continuamente conectando con el servidor para alimentar las relaciones existentes entre
ambas, subiendo y bajando informacin va RPC.

Con ADO .NET se consigue estar conectado al servidor slo lo estrictamente necesario para realizar la
operacin de carga de los datos en el DataSet. De esta manera se reducen los bloqueos y las conexiones a
la mnima expresin. Se pueden soportar muchos ms usuarios por unidad de tiempo y disminuyen los
tiempos de respuesta, a la par que se aceleran las ejecuciones de los programas.

4
Un DataSet es una cach de registros recuperados de una base de datos que acta como un sistema de
almacenamiento virtual, y que contiene una o ms tablas basadas en las tablas reales de la base de datos.
Adicionalmente, almacena las relaciones y reglas de integridad existentes entre ellas para garantizar la
estabilidad e integridad de la informacin de la base de datos. Muy importante es recalcar, que los DataSets
son almacenes pasivos de datos, esto es, no se ven alterados ante cambios subyacentes de la base de datos.
Es necesario recargarlos siempre que queramos estar al da, en cuanto a datos se refiere.

CONEXIONES
Al tratar el tema de los proveedores de datos de ADO.NET, el primer objeto al que hay que hacer referencia
es al objeto Connection. Este objeto proporciona la base que permite al resto de los objetos de Proveedores
ADO.NET adquirir y mantener sus conexiones con los almacenes de datos asociados es decir que su funcin
es conectarse a un origen de datos.

Propiedades
ConnectionString: Esta propiedad especifica un origen de datos, el nombre de servidor, su nombre y
contrasea, el nombre de la base de datos predeterminada y otras cosas que puedan ayudarle a utilizar la
conexin.

Argumentos de ConnectionString
Provider: Especifica el nombre de un proveedor que debe utilizarse para la conexin.
Data Source: Nombre del servidor o la ruta y el nombre de la base de datos.
Integrated Security: True/False. Indica si espera que el dominio de Windows NT y SQL Server
autentifiquen el ID de usuario y la contrasea.

Initial Catalog: Nombre nuevo de la base de datos predeterminada.


User Id: El nombre de usuario que debe utilizarse al abrir la conexin.
Password: Especifica la contrasea que hay que utilizar al abrir la conexin.

Mtodos
Open: Abre la conexin que se ha indicado en su propiedad ConnectionString, es decir, esta propiedad
indicar la cadena de conexin que se va a utilizar para establecer la conexin con el almacn de datos
correspondiente. El mtodo Open () no posee parmetros.

Close: Cierra la conexin y libera los recursos utilizados por sta.

Proveedor Parmetros para la Propiedad Provider


Microsoft OLE DB Provider for SQL Server SQLOLEDB

Microsoft OLE DB Provider for Oracle MSDAORA

OLE DB Provider for Microsoft Jet Microsoft.ACE.OLEDB.12.0

5
LA CLASE DATASET

DataSet. Almacn de datos por excelencia y objeto principal en ADO .NET. Representa un conjunto de
datos desconectada del proveedor de datos. Almacena tablas y sus relaciones en memoria.

DataTable. Un contenedor de datos. Estructurado como un conjunto de filas (DataRow) y columnas


(DataColumn).

DataRow. Registro que almacena n valores. Representacin en ADO .NET de una fila/tupla de una tabla
de la base de datos.

DataColumn. Contiene la definicin de una columna. Metadatos y datos asociados a su dominio.


DataRelation. Enlace entre dos o ms columnas iguales de dos o ms tablas.
Constraint. Reglas de validacin de las columnas de una tabla.
DataColumnMapping. Vnculo lgico existente entre una columna de un objeto del DataSet y la
columna fsica de la tabla de la base de datos.

DataTableMapping. Vnculo lgico existente entre una tabla del DataSet y la tabla fsica de la base de
datos.

El DataSet de ADO .NET, se emplea para todo tipo de proveedores, por lo que no existe una versin
particular para SqlClient u OleDb.

Bsicamente, un objeto DataSet va a ser similar a un objeto Recordset de ADO, pero ms potente y
complejo. Es el almacn de datos por excelencia en ADO .NET, representando una base de datos en
memoria y desconectada del proveedor de datos, que contiene tablas y sus relaciones.

El objeto DataSet nos proporciona el mejor concepto sobre datos desconectados: una copia en el cliente de
la arquitectura de la base de datos, basada en un esquema XML que la independiza del fabricante,
proporcionando al desarrollador la libertad de trabajo independiente de la plataforma.

Cada tabla contenida dentro de un objeto DataSet se encuentra disponible a travs de su propiedad Tables,
que es una coleccin de objetos System.Data.DataTable. Cada objeto DataTable contiene una coleccin de
objetos DataRow que representan las filas de la tabla. Y si seguimos con esta analoga tenemos que decir
que cada objeto DataRow, es decir, cada fila, posee una coleccin de objetos DataColumn, que representan
cada una de las columnas de la fila actual. Existen adems, colecciones y objetos para representan las
relaciones, claves y valores por defecto existentes dentro de un objeto DataSet.

Cada objeto DataTable dispone de una propiedad llamada DefaultView, que devuelve un objeto de la clase
DataView, el cual nos ofrece una vista de los datos de la tabla para que podamos recorrer los datos, filtrarlos,
ordenarlos, etc.

Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto DataAdapter, que posee
las dos versiones, es decir, el objeto SqlDataAdapter para SQL Server y OleDbDataAdapter genrico de
OLE DB.

6
Al objeto DataAdapter le pasaremos como parmetro una cadena que representa la consulta que se va a
ejecutar, y que va a rellenar de datos el DataSet. Del objeto DataAdapter utilizaremos el mtodo Fill(), que
posee dos parmetros; el primero es el DataSet a rellenar de informacin; y el segundo, una cadena con el
nombre que tendr la tabla creada dentro del DataSet, producto de la ejecucin de la consulta.

Entre los mtodos ms destacables de la clase DataSet podemos mencionar los siguientes.

METODOS
Clear( ). Elimina todos los datos almacenados en el objeto DataSet, vaciando todas las tablas
contenidas en el mismo.
AcceptChanges( ). Confirma todos los cambios realizados en las tablas y relaciones
contenidas en el objeto DataSet, o bien los ltimos cambios que se han producido desde la ltima
llamada al mtodo AcceptChanges.
GetChanges( ). Devuelve un objeto DataSet que contiene todos los cambios realizados desde
que se carg con datos, o bien desde que se realiz la ltima llamada al mtodo AcceptChanges.
HasChanges( ). Devuelve true o false para indicar si se han realizado cambios al contenido
del DataSet desde que fue cargado o bien desde que se realiz la ltima llamada al mtodo
AcceptChanges.
RejectChanges( ). Abandona todos los cambios realizados en las tablas contenidas en el
objeto DataSet desde que fue cargado el objeto o bien desde la ltima vez que se lanz el mtodo
AcceptChanges.
Merge( ). Toma los contenidos de un DataSet y los mezcla con los de otro DataSet, de forma
que contendr los datos de ambos objetos DataSet. En lo que respecta a las propiedades de la
clase DataSet, podemos remarcar las siguientes.
CaseSensitive. Propiedad que indica si las comparaciones de texto dentro de las tablas
distinguen entre maysculas y minsculas. Por defecto tiene el valor False.
DataSetName. Establece o devuelve mediante una cadena de texto el nombre del objeto
DataSet.
HasErrors. Devuelve un valor lgico para indicar si existen errores dentro de las tablas del
DataSet.
Relations. Esta propiedad devuelve una coleccin de objetos DataRelation, que representan
todas las relaciones existentes entre las tablas del objeto DataSet.
Tables. Devuelve una coleccin de objetos DataTable, que representan a cada una de las tablas
existentes dentro del objeto DataSet.

En el ejemplo ofrecemos un sencillo ejemplo de creacin de un objeto DataSet que llenaremos con un
DataAdapter. Una vez listo el DataSet, recorreremos la tabla que contiene y mostraremos valores de sus
columnas en un ListBox.

' crear conexin

Dim oConexion As New SqlConnection()

oConexion.ConnectionString = "Server=(local);Database=Northwind;uid=sa;pwd=;"

' crear adaptador

Dim oDataAdapter As New SqlDataAdapter("SELECT * FROM Customers ORDER BY ContactName",


oConexion)

' crear conjunto de datos

Dim oDataSet As New DataSet()

7
oConexion.Open()

' utilizar el adaptador para llenar el dataset con una tabla

oDataAdapter.Fill(oDataSet, "Customers")

oConexion.Close()

' una vez desconectados, recorrer la tabla del dataset

Dim oTabla As DataTable

oTabla = oDataSet.Tables("Customers")

Dim oFila As DataRow

For Each oFila In oTabla.Rows

' mostrar los datos mediante un objeto fila

Me.lstCustomers.Items.Add(oFila.Item("CompanyName") & "-" & oFila.Item("ContactName") & " - " &


_ oFila.Item("Country"))

Next

Clase Descripcin
SqlCommand, OleDbCommand: Clases que representan un comando SQL contra un sistema gestor
de datos.

SqlConnection, OleDbConnection: Clase que representa la etapa de conexin a un proveedor de


datos. Encapsula la seguridad, pooling de conexiones, etc.

SqlCommandBuilder, OleDbCommandBuilder: Generador de comandos SQL de insercin,


modificacin y borrado desde una consulta SQL de seleccin de datos.

SqlDataReader, OleDbDataReader: Un lector de datos de slo avance, conectado a la base de datos.


SqlDataAdapter, OleDbDataAdapter: Clase adaptadora entre un objeto DataSet y sus operaciones
fsicas en la base de datos (select, insert, update y delete).

SqlParameter, OleDbParameter: Define los parmetros empleados en la llamada a procedimientos


almacenados.

SqlTransaction, OleDbTransaction: Gestin de las transacciones a realizar en la base de datos.

LAS CLASES COMMAND


Establecida una conexin con un almacn de datos, la siguiente operacin lgica consiste en enviarle
sentencias para realizar los distintos tipos de operaciones que habitualmente realizamos con los datos.

Las clases Command de ADO .NET sern las usaremos para realizar tales operaciones.

SqlCommand y OleDbCommand, son muy similares al objeto Command existente en ADO. El objeto
Command nos va a permitir ejecutar una sentencia SQL o un procedimiento almacenado sobre la fuente de
datos a la que estamos accediendo.

8
A travs de un objeto Command tambin podremos obtener un conjunto de resultados del almacn de datos.
En este caso, los resultados se pasarn a otros objetos de ADO .NET, como DataReader o DataAdapter;
estos dos objetos los comentaremos ms adelante.

Un objeto Command lo vamos a crear a partir de una conexin ya existente, y va a contener una sentencia
SQL para ejecutar sobre la conexin establecida con el origen de datos.

Entre las propiedades que ofrecen los objetos SqlCommand y OleDbCommand, cabe destacar las
siguientes:

PROPIEDADES
CommandText. Contiene una cadena de texto que va a indicar la sentencia SQL o procedimiento
almacenado que se va a ejecutar sobre el origen de los datos.

CommandTimeout. Tiempo de espera en segundos que se va a aplicar a la ejecucin de un objeto


Command. Su valor por defecto es de 30 segundos.

CommandType. Indica el tipo de comando que se va a ejecutar contra el almacn de datos, es decir,
indica como se debe interpretar el valor de la propiedad CommadText. Puede tener los siguientes valores:
StoredProcedure, para indicar que se trata de un procedimiento almacenado; TableDirect se trata de obtener
una tabla por su nombre (nicamente aplicable al objeto OleDbCommand); y Text que indica que es una
sentencia SQL. EL valor por defecto es Text.

Connection. Devuelve el objeto SqlConnection o OleDbConnection utilizado para ejecutar el objeto


Command correspondiente.

Parameters. Coleccin de parmetros que se pueden utilizar para ejecutar el objeto Command, esta
coleccin se utiliza cuando deseamos ejecutar sentencias SQL que hacen uso de parmetros, esta propiedad
devuelve un objeto de la clase SqlParameterCollection o un objeto de la clase OleDbParameterCollection.
Estas colecciones contendrn objetos de la clase SqlParameter y OleDbParameter, respectivamente, para
representar a cada uno de los parmetros utilizados. Estos parmetros tambin son utilizados para ejecutar
procedimientos almacenados.

Una vez vistas algunas de las propiedades de las clases SqlCommand y OleDbCommand, vamos a pasar a
comentar brevemente los principales mtodos de estas clases.

METODOS
CreateParameter. Crea un parmetro para el que despus podremos definir una serie de caractersticas
especficas como pueden ser el tipo de dato, su valor, tamao, etc. Devolver un objeto de la clase
SqlParameter u OleDbParameter.

ExecuteNonQuery. Ejecuta la sentencia SQL definida en la propiedad ComandText contra la conexin


definida en la propiedad Connection. La sentencia a ejecutar debe ser de un tipo que no devuelva un
conjunto de registros, por ejemplo Update, Delete o Insert. Este mtodo devuelve un entero indicando el
nmero de filas que se han visto afectadas por la ejecucin del objeto Command.

ExecuteReader. Ejecuta la sentencia SQL definida en la propiedad ComandText contra la conexin


definida en la propiedad Connection. En este caso, la sentencia s devolver un conjunto de registros. El
resultado de la ejecucin de este ser un objeto de la clase

SqlDataReader/OleDbDataReader, que nos va a permitir leer y recorrer los resultados devueltos por la
ejecucin del objeto Command correspondiente.

ExecuteScalar. Este mtodo se utiliza cuando deseamos obtener la primera columna de la primera fila
del conjunto de registros, el resto de datos no se tendrn en cuenta. La utilizacin de este mtodo tiene

9
sentido cuando estamos ejecutando una sentencia SQL del tipo Select Count(*). Este mtodo devuelve un
objeto de la clase genrica Object.

Prepare. Este mtodo construye una versin compilada del objeto Command dentro del almacn de
datos.

LAS CLASES DATAREADER


Un objeto DataReader permite la navegacin hacia delante y de slo lectura, de los registros devueltos por
una consulta. Carga un conjunto de registros de solo lectura (Read Only) y avanza hacia delante (Forward
Only). Es especial para consultas.

A diferencia del resto de objetos, que siguen un esquema desconectado de manipulacin de datos, los
DataReader permanecen conectados durante todo el tiempo que realizan el recorrido por los registros que
contienen. Las clases que implementan este tipo de objeto son SqlDataReader y OleDbDataReader.

Para obtener un DataReader, ejecutaremos el mtodo ExecuteReader( ) de un objeto Command basado en


una consulta SQL o procedimiento almacenado.

A continuacin vamos a pasar a describir las principales propiedades de las clases SqlDataReader y
OleDbDataReader.

PROPIEDADES
FieldCount. Devuelve el nmero de columnas (campos) presentes en el fila (registro) actual.
IsClosed. Devolver los valores True o False, para indicar si el objeto DataReader est cerrado o
no.
Item. Devuelve en formato nativo, el valor de la columna cuyo nombre le indicamos como ndice
en forma de cadena de texto.
Una vez vistas las propiedades, vamos a comentar los mtodos ms destacables.
Close( ). Cierra el objeto DataReader liberando los recursos correspondientes.
GetXXX( ). El objeto DataReader presenta un conjunto de mtodos que nos van a permitir
obtener los valores de las columnas contenidas en el mismo en forma de un tipo de datos
determinado, segn el mtodo GetXXX empleado. Existen diversos mtodos GetXXX. atendiendo
al tipo de datos de la columna, algunos ejemplos son GetBoolean(), GetInt32(), GetString(),
GetChar(), GetByte, GetDateTime, GetDecimal, GetDouble, GetFloat, Getint64, GetName,
GetValue, etc. Como parmetro a este mtodo le debemos indicar el nmero de orden de la
columna que deseamos recuperar.
NextResult( ). Desplaza el puntero actual al siguiente conjunto de registros, cuando la sentencia
es un procedimiento almacenado de SQL o una sentencia SQL que devuelve ms de un conjunto
de registros, no debemos confundir este mtodo con el mtodo MoveNext() de ADO, ya que en
este caso no nos movemos al siguiente registro, sino al siguiente conjunto de registros.
Read( ). Desplaza el cursor actual al siguiente registro permitiendo obtener los valores del mismo
a travs del objeto DataReader. Este mtodo devolver True si existen ms registros dentro del
objeto DataReader, False si hemos llegado al final del conjunto de registros. La posicin por
defecto del objeto DataReader en el momento inicial es antes del primer registro, por lo tanto para
recorrer un objeto DataReader debemos comenzar con una llamada al mtodo Read(), y as
situarnos en el primer registro.

El botn Empleados crea a partir de un comando, un objeto DataReader que recorremos para llenar un
ListBox con los valores de una de las columnas de la tabla que internamente contiene el DataReader.

Private Sub btnEmpleados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnEmpleados.Click

10
' crear conexion
Dim oConexion As New SqlConnection()
oConexion.ConnectionString = "Server=(local);" & "Database=Northwind;uid=sa;pwd=;"
' crear comando
Dim oComando As New SqlCommand("SELECT * FROM Employees", oConexion)
' crear DataReader
Dim oDataReader As SqlDataReader
oConexion.Open()
oDataReader = oComando.ExecuteReader() ' obtener DataReader
' recorrer filas
While oDataReader.Read()
Me.lstEmpleados.Items.Add(oDataReader("LastName"))
End While
oDataReader.Close()
oConexion.Close()
End Sub

LAS CLASES DATAADAPTER


Los objetos DataAdapter (SqlDataAdapter y OleDbDataAdapter) van a desempear el papel de puente
entre el origen de datos y el DataSet, permitindonos cargar el DataSet con la informacin de la fuente de
datos, y posteriormente, actualizar el origen de datos con la informacin del DataSet. Carga un DataSet y
provee el enlace entre ste y el origen de datos. Requiere estar conectado.

Un objeto DataAdapter puede contener desde una sencilla sentencia SQL, hasta varios objetos Command.

La clase DataAdapter dispone de cuatro propiedades, que nos van a permitir asignar a cada una, un objeto
Command (SqlCommand u OleDbCommand) con las operaciones estndar de manipulacin de datos.
Estas propiedades son las siguientes.

PROPIEDADES
InsertCommand. Objeto de la clase Command, que se va a utilizar para realizar una insercin de datos.

SelectCommand. Objeto de la clase Command que se va a utilizar para ejecutar una sentencia Select de
SQL.

UpdateCommand. Objeto de la clase Command que se va a utilizar para realizar una modificacin de los
datos.

DeleteCommand. Objeto de la clase Command que se va a utilizar para realizar una eliminacin de
datos.

METODOS

Un mtodo destacable de las clases SqlDataAdapter/OleDbDataAdapter es el mtodo Fill( ), que ejecuta


el comando de seleccin que se encuentra asociado a la propiedad SelectCommand, los datos obtenidos
del origen de datos se cargarn en el objeto DataSet que pasamos por parmetro.

Fill(): Llena datos de una base de datos a un cierto DataSet.

La Figura siguiente figura muestra la relacin entre los objetos DataAdapter y el objeto DataSet.

11
Update: Actualiza datos de DataSet hacia la base de datos.

Para demostrar el uso de los objetos DataAdapter vamos a desarrollar un proyecto con el nombre
PruDataAdapter. En esta aplicacin vamos a utilizar el mismo objeto DataAdapter para realizar una
consulta contra una tabla e insertar nuevas filas en esa misma tabla.

En primer lugar disearemos el formulario del programa. Como novedad, introduciremos el control
DataGrid, que trataremos con ms profundidad en un prximo apartado. Baste decir por el momento, que
a travs del DataGrid visualizaremos una o varias tablas contenidas en un DataSet.

La Figura siguiente muestra el aspecto de esta aplicacin en funcionamiento.

Respecto al cdigo del formulario, en primer lugar, vamos a declarar varios objetos de acceso a datos a
nivel de la clase para poder tenerlos disponibles en diversos mtodos. Veamos el cdigo siguiente:

Imports System.Data.SqlClient

Public Class Form1

Inherits System.Windows.Forms.Form

Private oConexion As SqlConnection

12
Private oDataSet As DataSet

Private oDataAdapter As SqlDataAdapter

'....

'....

En el siguiente paso escribiremos el procedimiento del evento Load del formulario, y el mtodo

CargarDatos( ), que se ocupa de cargar el DataSet, y asignrselo al DataGrid a travs de su propiedad


DataSource. Observe el lector que en el mtodo CargarDatos( ) lo primero que hacemos es vaciar el
DataSet, puesto que este objeto conserva los datos de tablas y registros; en el caso de que no limpiramos
el DataSet, se acumularan las sucesivas operaciones de llenado de filas sobre la tabla que contiene. Veamos
el Cdigo siguiente.

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


MyBase.Load
' crear conexin
oConexion = New SqlConnection()
oConexion.ConnectionString = "Server=(local);Database=MUSICA;uid=sa;pwd=;"
' crear adaptador
oDataAdapter = New SqlDataAdapter()
' crear comandos para insercin, consulta con sus parmetros y asignarlos al adaptador
Dim oCmdInsercion As New SqlCommand("INSERT INTO AUTORES " & _
"(IDAutor,Autor) VALUES(@IDAutor,@Autor)", oConexion)
oDataAdapter.InsertCommand = oCmdInsercion
oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@IDAutor", SqlDbType.Int))
oDataAdapter.InsertCommand.Parameters.Add(New SqlParameter("@Autor", SqlDbType.NVarChar))
Dim oCmdConsulta As New SqlCommand("Select * from autores", oConexion)
oDataAdapter.SelectCommand = oCmdConsulta
' crear conjunto de datos
oDataSet = New DataSet()
Me.CargarDatos()
End Sub

Private Sub CargarDatos()


' vaciar el dataset
oDataSet.Clear()
oConexion.Open() ' abrir conexin
' utilizar el adaptador para llenar el dataset con una tabla
oDataAdapter.Fill(oDataSet, "Autores")
oConexion.Close() ' cerrar conexin
' enlazar dataset con datagrid; en DataSource se asigna el dataset, en DataMember el nombre
' de la tabla del dataset que mostrar el datagrid
Me.grdDatos.DataSource = oDataSet
Me.grdDatos.DataMember = "Autores"
End Sub

Finalmente, en el botn Grabar, escribiremos las instrucciones para insertar un nuevo registro en la tabla.
Veamos el cdigo siguiente:

Private Sub btnGrabar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnGrabar.Click
Dim iResultado As Integer
' asignar valores a los parmetros para el comando de insercin
oDataAdapter.InsertCommand.Parameters("@IDAutor").Value = Me.txtIDAutor.Text
oDataAdapter.InsertCommand.Parameters("@Autor").Value = Me.txtAutor.Text

13
' abrir conexin
oConexion.Open()
' ejecutar comando de insercin del adaptador
iResultado = oDataAdapter.InsertCommand.ExecuteNonQuery()
' cerrar conexin
oConexion.Close()
Me.CargarDatos()
MessageBox.Show("Registros aadidos: " & iResultado)
End Sub

NAVEGACIN Y EDICIN DE REGISTROS EN MODO DESCONECTADO


Anteriormente vimos la forma de realizar operaciones de edicin, en modo conectado, sobre las tablas de
una base de datos, empleando los objetos Command.
Pero como tambin ya sabemos, la arquitectura de ADO .NET est orientada a un modelo de trabajo
desconectado del almacn de datos, al que recurriremos slo cuando necesitemos obtener los datos para su
consulta y manipulacin, o bien, cuando esos mismos datos desconectados, los hayamos modificado y
tengamos que actualizarlos en la fuente de datos.
El objeto DataSet, combinado con un grupo de objetos enfocados al mantenimiento de datos desconectados,
como son DataAdapter, DataTable, DataRow, etc., nos van a permitir realizar tareas como la navegacin
entre los registros de una tabla del DataSet, adems de la modificacin de sus datos en las operaciones
habituales de insercin, modificacin y borrado de filas.
El proyecto NavegaEdita que se acompaa como ejemplo, muestra los pasos necesarios que debemos dar
para crear un sencillo mantenimiento de datos para una tabla albergada en un DataSet, junto a las tpicas
operaciones de navegacin por las filas de dicha tabla. Seguidamente iremos desgranando el conjunto de
pasos a realizar.
Partimos de una sencilla base de datos en SQL Server, que contiene la tabla Clientes, con los campos ms
caractersticos de esta entidad de datos: cdigo cliente, nombre, fecha ingreso, crdito. Una vez creado un
nuevo proyecto en VB.NET, disearemos el formulario de la aplicacin que como vemos en la Figura
siguiente, a travs de sus controles, nos permitir realizar las operaciones mencionadas. Pasando a la
escritura del cdigo del programa, en primer lugar importaremos el espacio de nombres
System.Data.SqlClient, y declararemos a nivel de clase un conjunto de variables para la manipulacin de
los datos. Veamos el cdigo siguiente:

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
' variables a nivel de clase para la manipulacin de datos
Private oDataAdapter As SqlDataAdapter
Private oDataSet As DataSet
Private iPosicFilaActual As Integer
'....
'....

Como siguiente paso, escribiremos el manipulador del evento Load del formulario y un mtodo para cargar
los datos del registro actual en los controles del formulario, el cdigo siguiente muestra esta parte:

14
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles
MyBase.Load
' crear conexin
Dim oConexion As SqlConnection
oConexion = New SqlConnection()
oConexion.ConnectionString = "Server=(local); Database=Gestion;uid=sa;pwd=;"
' crear adaptador
Me.oDataAdapter = New SqlDataAdapter("SELECT * FROM Clientes", oConexion)
' crear commandbuilder
Dim oCommBuild As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)
' crear dataset
Me.oDataSet = New DataSet()
oConexion.Open()
' llenar con el adaptador el dataset
Me.oDataAdapter.Fill(oDataSet, "Clientes")
oConexion.Close()
' establecer el indicador del registro a mostrar de la tabla
Me.iPosicFilaActual = 0
' cargar columnas del registro en los controles del formulario
Me.CargarDatos()
End Sub

Private Sub CargarDatos()


' obtener un objeto con la fila actual
Dim oDataRow As DataRow
oDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)
' cargar los controles del formulario con los valores de los campos del registro
Me.txtIDCliente.Text = oDataRow("IDCliente")
Me.txtNombre.Text = oDataRow("Nombre")
Me.txtFIngreso.Text = oDataRow("FIngreso")
Me.txtCredito.Text = oDataRow("Credito")
' mostrar la posicin actual del registro y el nmero total del registros
Me.lblRegistro.Text = "Registro: " & _
Me.iPosicFilaActual + 1 & " de " & Me.oDataSet.Tables("Clientes").Rows.Count
End Sub

Observe que en el evento Load hemos creado un objeto CommandBuilder, pasndole como parmetro el
DataAdapter. Como ya sabemos, un DataAdapter contiene una serie de objetos Command para las
operaciones de consulta, insercin, etc. La misin en este caso del objeto CommandBuilder, es la de
construir automticamente tales comandos y asignrselos al DataAdapter, ahorrndonos ese trabajo de
codificacin.
En cuanto a las operaciones de navegacin por la tabla, no hay un objeto, como ocurra con el Recordset
de ADO, que disponga de mtodos especficos de movimiento como MoveNext( ), MoveLast( ), etc. Lo
que debemos hacer en ADO .NET, tal y como muestra el mtodo CargarDatos(), es obtener del DataSet, la
tabla que necesitemos mediante su coleccin Tables, y a su vez, a la coleccin Rows de esa tabla, pasarle
el nmero de fila/registro al que vamos a desplazarnos. En nuestro ejemplo utilizaremos la variable
iPosicFilaActual, definida a nivel de clase, para saber en todo momento, la fila de la tabla en la que nos
encontramos.
El cdigo siguiente muestra el cdigo de los botones de navegacin, reunidos en el GroupBox Navegar, del
formulario.

Private Sub btnAvanzar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnAvanzar.Click
' si estamos en el ltimo registro, no hacer movimiento
If Me.iPosicFilaActual = (Me.oDataSet.Tables("Clientes").Rows.Count - 1) Then
MessageBox.Show("ltimo registro")
Else
' incrementar el marcador de registro y actualizar los controles con los datos del registro actual
Me.iPosicFilaActual += 1

15
Me.CargarDatos()
End If
End Sub

Private Sub btnRetroceder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnRetroceder.Click
' si estamos en el primer registro, no hacer movimiento
If Me.iPosicFilaActual = 0 Then
MessageBox.Show("Primer registro")
Else
' disminuir el marcador de registro y actualizar los controles con los datos del registro actual
Me.iPosicFilaActual -= 1
Me.CargarDatos()
End If
End Sub

Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnPrimero.Click
' establecer el marcador de registro en el primero
Me.iPosicFilaActual = 0
Me.CargarDatos()
End Sub

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnUltimo.Click
' establecer el marcador de registro en el primero obteniendo el nmero de filas que contiene la tabla
menos uno
Me.iPosicFilaActual = (Me.oDataSet.Tables("Clientes").Rows.Count - 1)
Me.CargarDatos()
End Sub

Respecto a las operaciones de edicin, debemos utilizar los miembros del objeto tabla del DataSet, como
se muestra en el cdigo siguiente. Una vez terminado el proceso de edicin, actualizaremos el almacn de
datos original con el contenido del DataSet, empleando el DataAdapter.

Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnInsertar.Click
Dim oDataRow As DataRow
' obtener un nuevo objeto fila de la tabla del dataset
oDataRow = Me.oDataSet.Tables("Clientes").NewRow()
' asignar valor a los campos de la nueva fila
oDataRow("IDCliente") = Me.txtIDCliente.Text
oDataRow("Nombre") = Me.txtNombre.Text
oDataRow("FIngreso") = Me.txtFIngreso.Text
oDataRow("Credito") = Me.txtCredito.Text
' aadir el objeto fila a la coleccin de filas de la tabla del dataset
Me.oDataSet.Tables("Clientes").Rows.Add(oDataRow)
End Sub

Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnModificar.Click
Dim oDataRow As DataRow
' obtener el objeto fila de la tabla del dataset en el que estamos posicionados
oDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)
' modificar las columnas de la fila excepto la correspondiente al identificador cliente
oDataRow("Nombre") = Me.txtNombre.Text
oDataRow("FIngreso") = Me.txtFIngreso.Text
oDataRow("Credito") = Me.txtCredito.Text
End Sub

16
Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnActualizar.Click
' actualizar los cambios realizados en el dataset contra la base de datos real
Me.oDataAdapter.Update(Me.oDataSet, "Clientes")
End Sub

El caso del borrado de filas es algo diferente, por ello lo mostramos aparte del resto de operaciones de
edicin. En el cdigo siguiente vemos el cdigo del botn Eliminar, dentro del cual, obtenemos la fila a
borrar mediante un objeto DataRow, procediendo a su borrado con el mtodo Delete( ). Para actualizar los
borrados realizados, empleamos el mtodo GetChanges( ) del objeto DataTable, obteniendo a su vez, un
objeto tabla slo con las filas borradas; informacin esta, que pasaremos al DataAdapter, para que actualice
la informacin en el origen de datos.
Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
btnEliminar.Click
Dim oDataRow As DataRow
' obtener el objeto fila, de la tabla del dataset en el que estamos posicionados
oDataRow = Me.oDataSet.Tables("Clientes").Rows(Me.iPosicFilaActual)
oDataRow.Delete() ' borrar la fila
' mediante el mtodo GetChanges(), obtenemos una tabla con las filas borradas
Dim oTablaBorrados As DataTable
oTablaBorrados =
Me.oDataSet.Tables("Clientes").GetChanges(DataRowState.Deleted)
' actualizar en el almacn de datos las filas borradas
Me.oDataAdapter.Update(oTablaBorrados)
' confirmar los cambios realizados
Me.oDataSet.Tables("Clientes").AcceptChanges()
' reposicionar en la primera fila
Me.btnPrimero.PerformClick()
End Sub

DATA BINDING ENLACE DE DATOS A CONTROLES


Data Binding es el mecanismo proporcionado por la plataforma .NET, que en aplicaciones con interfaz
Windows Forms, enlaza objetos contenedores de datos con los controles del formulario, para poder realizar
operaciones automticas de navegacin y edicin.

Tipos de Data Binding


Existen dos tipos de enlace de datos: simple y complejo.
Enlace simple (Simple Data Binding). Este tipo de enlace consiste en una asociacin entre un
control que puede mostrar un nico dato y el objeto que acta como contenedor de datos. El
ejemplo ms ilustrativo es el control TextBox.
Enlace complejo (Complex Data Binding). En este enlace, el control que acta como interfaz o
visualizador de datos, dispone de la capacidad de mostrar varios o todos los datos del objeto que
contiene la informacin.

ELEMENTOS INTEGRANTES EN UN PROCESO DE DATA BINDING


El mecanismo de enlace automtico de datos a controles est compuesto por un elevado conjunto de
elementos del conjunto de tipos de .NET Framework, entre clases, colecciones, enumeraciones, etc. A
continuacin vamos a mencionar los ms importantes, que emplearemos en el ejemplo desarrollado
seguidamente.
Binding. Clase que permite crear un enlace (binding) para un control, indicando la propiedad del
control que mostrar los datos, el DataSet del que se extraer la informacin, y el nombre de la
tabla-columna, cuyos datos pasarn a la propiedad del control.
DataBindings. Coleccin de que disponen los controles, con la informacin de enlaces a datos.
Gracias a su mtodo Add( ), podemos aadir un objeto Binding, para que el control muestre los
datos que indica el enlace.
BindingContext. Propiedad de la clase Form, que representa el contexto de enlace a datos
establecido en los controles del formulario, es decir, toda la informacin de enlaces establecida
entre los controles y objetos proveedores de datos. Devuelve un objeto de tipo
BindingManagerBase.

17
BindingManagerBase. Objeto que se encarga de administrar un conjunto de objetos de enlace,
por ejemplo, los de un formulario, obtenidos a travs del BindingContext del formulario.

Empleo de Data Binding simple para navegar y editar datos


En el proyecto DataBindSimple vamos a utilizar los elementos de enlace a datos comentados en el apartado
anterior, para construir un formulario en el que, gracias a la arquitectura de enlace automtico
proporcionado por la plataforma .NET, simplificaremos en gran medida el acceso a datos hacia una tabla
de un DataSet.
El diseo del formulario ser muy similar al realizado para el ejemplo de navegacin y edicin manual,
descrito en un apartado anterior.

Pasando al cdigo de la clase del formulario, deberemos realizar las siguientes declaraciones a nivel de
clase, mostradas en el cdigo siguiente:

Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private oDataAdapter As SqlDataAdapter
Private oDataSet As DataSet
Private oBMB As BindingManagerBase
'....
'....
En el evento de carga del formulario, aparte de la creacin de los objetos de conexin, adaptador, etc.,
estableceremos el enlace entre los controles y el DataSet, como se muestra en el cdigo siguiente:

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


MyBase.Load
' crear conexin
Dim oConexion As New SqlConnection()
oConexion.ConnectionString = "Server=(local); Database=Gestion;uid=sa;pwd=;"
' crear adaptador
oDataAdapter = New SqlDataAdapter("SELECT * FROM Clientes", oConexion)
' crear commandbuilder
Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)
' crear dataset
oDataSet = New DataSet()
oDataAdapter.Fill(oDataSet, "Clientes")
' enlazar controles del formulario con el dataset; se debe utilizar un objeto Binding, al crear este
' objeto indicar en su constructor qu propiedad del control se debe enlazar, el dataset, y el nombre de '
tabla-columna; una vez creado el objeto Binding, aadirlo a la coleccin de enlaces de datos,
' DataBindings, del control que necesitemos, con el mtodo Add() de dicha coleccin
Dim oBind As Binding
oBind = New Binding("Text", oDataSet, "Clientes.IDCliente")
Me.txtIDCliente.DataBindings.Add(oBind)
oBind = Nothing

18
oBind = New Binding("Text", oDataSet, "Clientes.Nombre")
Me.txtNombre.DataBindings.Add(oBind)
oBind = Nothing
oBind = New Binding("Text", oDataSet, "Clientes.FIngreso")
'AddHandler oBind.Format, AddressOf FormatoFecha
Me.txtFIngreso.DataBindings.Add(oBind)
oBind = Nothing
oBind = New Binding("Text", oDataSet, "Clientes.Credito")
Me.txtCredito.DataBindings.Add(oBind)
oBind = Nothing
' obtener del contexto de enlace del formulario, el enlace de un dataset y una tabla determinadas
Me.oBMB = Me.BindingContext(oDataSet, "Clientes")
Me.VerContadorReg()
End Sub

Private Sub VerContadorReg()


' mostrar informacin sobre el nmero de registro actual y registros totales en la tabla del dataset
Me.lblRegistro.Text = "Registro: " & Me.oBMB.Position + 1 & " de " & Me.oBMB.Count
End Sub

Debido al enlace automtico, el cdigo para las operaciones de navegacin se simplifica en gran medida,
como muestra el cdigo siguiente, en el que vemos los manipuladores de evento para los botones de
desplazamiento del formulario.

Private Sub btnAvanzar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnAvanzar.Click
' avanzar a la siguiente fila; la actualizacin de los controles con los datos de la fila en la que acabamos '
de posicionarnos es automtica, gracias al objeto BindingManagerBase
Me.oBMB.Position += 1
Me.VerContadorReg()
End Sub

Private Sub btnRetroceder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnRetroceder.Click
Me.oBMB.Position -= 1
Me.VerContadorReg()
End Sub

Private Sub btnPrimero_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnPrimero.Click
Me.oBMB.Position = 0
Me.VerContadorReg()
End Sub

Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnUltimo.Click
Me.oBMB.Position = Me.oBMB.Count - 1
Me.VerContadorReg()
End Sub

La Figura siguiente muestra este formulario en ejecucin.

19
Como detalle importante a observar en las operaciones de navegacin entre los registros, destacaremos el
hecho de que al mostrar el campo que contiene una fecha, dicho dato se muestra con toda la informacin
al completo, fecha y hora, sin ningn formato especfico.
Para conseguir en este caso, que la fecha se muestre con el formato que necesitemos, al crear el objeto
Binding para ese control, deberemos asignar a su evento Format un procedimiento manipulador, que
realice tal formateo y lo devuelva a travs del objeto ConvertEventArgs, que recibe ese evento.
Veamos estas operaciones en el cdigo siguiente:

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


MyBase.Load
'....
oBind = New Binding("Text", oDataSet, "Clientes.FIngreso")
AddHandler oBind.Format, AddressOf FormatoFecha
Me.txtFIngreso.DataBindings.Add(oBind)
oBind = Nothing
'....
End Sub

' manipulador del Evento format del objeto Binding


Private Sub FormatoFecha(ByVal sender As Object, ByVal e As ConvertEventArgs)
Dim dtFecha As DateTime
dtFecha = e.Value
e.Value = dtFecha.ToString("dd-MMMM-yyyy")
End Sub

La Figura siguiente muestra ahora este control al haberle aplicado el formato.

El proceso de edicin (insercin en este ejemplo), es muy similar al caso anterior. Aunque debemos tener
en cuenta que debido a las particularidades del Data Binding, no podemos borrar el contenido de los
TextBox, teclear datos e insertarlos, ya que eso realmente modificara el registro sobre el que estbamos
posicionados. Por ese motivo, en el botn Insertar, asignamos los valores directamente a las columnas del
objeto DataRow. Ver el cdigo siguiente:

Private Sub btnInsertar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


btnInsertar.Click
Dim oDataRow As DataRow
' crear un nuevo objeto fila
oDataRow = Me.oDataSet.Tables("Clientes").NewRow()
' aadir datos a las columnas de la fila

20
oDataRow("IDCliente") = 100
oDataRow("Nombre") = "Isabel"
oDataRow("FIngreso") = "12/9/01"
oDataRow("Credito") = 228
' aadir el objeto fila a la coleccin de filas de la tabla
Me.oDataSet.Tables("Clientes").Rows.Add(oDataRow)
End Sub

Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnActualizar.Click

Me.oDataAdapter.Update(Me.oDataSet, "Clientes")

End Sub

EL CONTROL DATAGRID, RELACIONES Y VISTAS DATAGRID


Este control, del que ya realizamos una pequea demostracin en un apartado anterior, nos va a permitir
realizar enlace complejo de datos con ADO .NET.

Se trata de la versin mejorada del control DataGrid de ADO, disponible en Visual Basic 6, pero con una
serie de funcionalidades optimizadas, y otras nuevas aadidas.

Para utilizar algunas de sus caractersticas, crearemos un proyecto de prueba con el nombre DataGridPru,
consistente en un formulario MDI, con una serie de opciones de men, a travs de las cuales, mostraremos
diversas caractersticas de este control, y algunas otras adicionales sobre ADO .NET.

La opcin de men DataGrid + Normal, mostrar el formulario frmNormal, que contiene un sencillo
DataGrid con una tabla. Podemos editar los registros de la tabla y aadir nuevos; al trabajar en desconexin,
hasta que no pulsemos el botn Actualizar de este formulario, el objeto DataAdapter del mismo no
actualizar los datos del DataSet hacia la base de datos fsica. Otra caracterstica incluida por defecto es la
ordenacin de las filas por columna al hacer clic en su ttulo. Finalmente, al redimensionar el formulario,
tambin cambiar el tamao del DataGrid, puesto que hemos utilizado su propiedad Anchor para anclarlo
a todos los bordes de la ventana. La Figura siguiente muestra este formulario.

El Cdigo siguiente muestra el cdigo principal de este formulario. Recordamos al lector, la necesidad de
crear un objeto CommandBuilder para el DataAdapter, ya que en caso contrario, al intentar actualizar el
DataSet contra la base de datos, se producir un error.

Private oDataAdapter As SqlDataAdapter

21
Private oDataSet As DataSet
Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles
MyBase.Load
' crear conexin
Dim oConexion As New SqlConnection()
oConexion.ConnectionString = "Server=(local); Database=Musica;uid=sa;pwd=;"
' crear adaptador
oDataAdapter = New SqlDataAdapter("SELECT * FROM Grabaciones", oConexion)
' crear commandbuilder
Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter)
' crear dataset
oDataSet = New DataSet()
oDataAdapter.Fill(oDataSet, "Grabaciones")
' asignar dataset al datagrid
Me.grdDatos.DataSource = oDataSet
Me.grdDatos.DataMember = "Grabaciones"
End Sub

Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles btnActualizar.Click
Me.oDataAdapter.Update(oDataSet, "Grabaciones")
End Sub

ADO .NET y XML


XML se ha convertido en la piedra angular de la informtica distribuida de nuestros das. De ah que

gran parte de las motivaciones en cuanto a la redefinicin del API de ADO, se deban a la adaptacin de los
objetos a un modelo de procesos que se apoya en documentos XML, no en objetos especficos de cada
plataforma a partir de cursores. Esto permite que las clases de ADO .NET puedan implementar mecanismos
de conversin de datos entre plataformas, lectura de datos de cualquier origen, habilitar mecanismos de
persistencia en el mismo formato en el que se procesan., etc.

En esta redefinicin, Microsoft ha puesto como intermediario entre un cliente y sus datos, un adaptador que
transforma cada comando y cada dato en modelos de documentos XML. Tanto para consultas como para
actualizaciones. Esto es lo que posibilita la nueva filosofa de acceso a datos desconectados de ADO .NET:
primero se cargan en el cliente los documentos necesarios almacenndolos en DataSet, a partir de consultas
a tablas, vistas, procedimientos, etc.; se nos da la posibilidad de trabajar con documentos, sin necesidad de
estar continuamente consumiendo recursos de la red; y por ltimo, se procesarn los cambios producidos
envindolos a la base de datos, el adaptador tomar los cambios del documento, y los replicar al servidor.
En la Figura 340 se puede ver un esquema de la relacin entre ADO .NET y XML.

ORDENACIN DE FILAS MEDIANTE DATAVIEW


Para ordenar las filas en un DataView emplearemos su propiedad Sort, asignndole una cadena con el
nombre de columna/s a ordenar, tal y como muestra el Cdigo siguiente, de la opcin de men Ordenacin
+ Normal, en el formulario del ejemplo.

22
Private Sub mnuOrdNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles mnuOrdNormal.Click
' crear dataview y ordenar las filas con la propiedad Sort
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
oDataView.Sort = "Country"
Me.grdDatos.CaptionText = "Ordenar por campo Country"
Me.grdDatos.DataSource = oDataView
End Sub

Si necesitamos ordenar por mltiples columnas de la tabla, slo tenemos que asignar a Sort una cadena con
la lista de columnas requeridas. Ver siguiente:

DataView ordenando las filas por la columna Country.

oDataView.Sort = "Country, PostalCode"

Tambin es factible asignar a un DataView una combinacin de filtro y ordenacin, utilizando en la misma
operacin las propiedades RowFilter y Sort. El men del formulario Ordenacin + Con filtro realiza este
trabajo, que vemos en el cdigo siguiente:

Private Sub mnuOrdenFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles mnuOrdenFiltro.Click
Dim oDataView As New DataView()
oDataView.Table = oDataSet.Tables("Customers")
' establecer un filtro al dataview
oDataView.RowFilter = "Country='USA'"
' ordenar las filas del filtro
oDataView.Sort = "City"
Me.grdDatos.CaptionText = "Filtrar por USA. Ordenar por campo City"
Me.grdDatos.DataSource = oDataView
End Sub

MANTENIMIENTO DE TABLAS EN SQL SERVER CON SELECT, UPDATE, INSERT Y


DELETE

Crear una base de datos en SQL SERVER con el nombre BDNegocio y crear una tabla con el nombre de
Empleados con los campos siguientes:

Agregar un registro como mnimo


Crear un nuevo proyecto de Visual Basic

23
Colocar el nombre de WADatosSQL y clic en Aceptar

A continuacin vemos el proyecto de Visual Basic creado

24
Ahora debe crear una clase, para esto haga clic botn derecho del mouse sobre el nombre del proyecto
(WADatosSQL), haga clic en Agregar/Modulo, como se aprecia en la siguiente figura

A continuacin se observa la ventana del modulo creado

25
Al nombre que sale por defecto, renombrelo a Conexin sin borrar la extensin (.vb)
Aparecer la ventana de la clase en blanco

26
Agregar el siguiente cdigo en el mdulo respectivo

Realizar la interfaz visual siguiente

27
Codificar los siguientes procedimientos y botones siguientes

28
Ejecutar la aplicacin

29

Anda mungkin juga menyukai