10.-ADO

14

Click here to load reader

Transcript of 10.-ADO

Page 1: 10.-ADO

1

ADO.NET

INTRODUCCIÓN

En este tema veremos cómo crear soluciones que respondan a las peticiones realizadas por usuarios, vinculando nuestra aplicación a fuentes de datos.

En nuestro caso, los datos se almacenan en el servidor de bases de datos Microsoft SQL Server 2008. Para crear esos vínculos con nuestra información utilizaremos el modelo de objetos ADO.NET (Access Data Object). ADO.NET proporciona acceso a orígenes de datos como Microsoft SQL Server, así como a orígenes de datos expuestos mediante ODBC, Oracle, OLE y XML. Las aplicaciones para usuarios que comparten datos pueden utilizar ADO.NET para conectar esos orígenes de datos y recuperar, manipular y actualizar los datos.

Las clases de ADO.NET se encuentran en System.Data.

El esquema del sistema ADO.NET se refleja en el siguiente gráfico

Podemos dividir las funcionalidades de ADO.NET en dos capas:

• Capa Desconectada: El objeto característico de esta capa es el DataSet. Estos objetos contienen contenidos parciales de bases de datos y permiten trabajar con ellos sin necesitar una conexión. Los DataSet se pueden almacenar tablas, relaciones, registros, etc.

• Capa Conectada: En la capa conectada residen distintos objetos que requieren de una conexión abierta a la base de datos trabajar con la información que contienen. En el namespace System.Data.Common, nos encontramos con las siguientes clases abstractas:

DbConnection. Establece la conexión con la base de datos mediante una cadena de conexión.

DbCommand. Ejecuta una instrucción SQL o procedimiento almacenado en la base de datos.

DbDataReader. Lee los resultados de forma secuencial de la ejecución del objeto Command mientras permanece conectado al origen de datos.

Page 2: 10.-ADO

2

DbDataAdapter. Hace de puente entre la capa conectada y desconectada.

Son los proveedores de datos (Oracle, MS SQL Server, MySQL, etc) los que nos proporcionan una implementación concreta de esas clases abstractas. Por ejemplo, MS SQL Server nos proporciona las clases SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se encuentran bajo el espacio de nombres System.Data.SqlClient

Proveedor de datos .NET Espacio de nombres Descripción

ODBC System.Data.Odbc Fuentes de datos a través de un puente ODBC

OLE DB System.Data.OleDb Conexión utilizando un proveedor OLEDB, al igual que el ADO clásico.

Oracle Client System.Data.OracleClient Acceso a bases de datos Oracle

SQL Server System.Data.SqlClient Acceso a SQL Server 7.0 o posterior.

Por otra parte hay proveedores “puente” que se utilizan para acceder al origen de datos a través de ODBC u OLEDB cuando no existe un proveedor nativo para nuestro origen de datos. Estos proveedores puente, ofrecen un rendimiento mucho menor que los nativos, por lo que conviene utilizar siempre un proveedor nativo.

CONEXIONES

Las conexiones las usamos para enlazar una aplicación con la fuente de datos. Las clases específicas creadas para conectarse con un servidor SQL Server son del tipo SqlConnection. Las peticiones que realiza la aplicación a la base de datos viajan a través de las conexiones y el resultado devuelto es leído por objetos del tipo DataReader o almacenados directamente dentro de DataSets.

Un objeto SqlConnection representa una única sesión con un origen de datos de SQL Server. En el caso de un sistema de bases de datos de cliente y servidor, equivale a una conexión de red al servidor.

La cadena de conexión se creara se la siguiente forma: “server=nombrehost\nombreservidor; Initial Catalog=basedatos; Integrate security=true”

Si la base de datos no está incluida en el servidor se debe sustituir Initial Catalog por AttachDbFileName Los parámetros habituales de las cadenas de conexión son:

Page 3: 10.-ADO

3

Connection Timeout El intervalo de tiempo de espera en segundos en una conexión al servidor antes de finalizar el intento y generar una excepción. 15 segundos es el tiempo predeterminado.

server El nombre del servidor SQL Server utilizado Initial Catalog o AttachDbFileName

El nombre de la base de datos en el servidor El nombre de la base de datos no enlazada al servidor

Integrated Security Determina si la conexión es o no segura. Los valores posibles son True, False.

Password Contraseña de inicio de sesión en la base de datos SQL Server.

User ID El nombre de cuenta de inicio de sesión de SQL Server.

Los métodos más utilizados con los objetos de la clase SqlConnection son

• Open(): abrir base de datos

• Close(): cerrar la base de datos.

Usaremos la clase StringWriter para mostrar los mensajes enviados por la aplicación a la pantalla. Esta clase captura lo que muestra WriteLine de la clase Console. Esta clase se encuentran dentro del espacio de nombres System.IO.

Vamos a realizar una conexión a la base de datos Usuarios que ya debemos tener instalada en nuestro servidor Imports System.Data.SqlClient Imports System.IO Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'Capturar lo que se lanza a pantalla Dim escritor As StringWriter = New StringWriter() Console.SetOut(escritor) ' Cadena de conexión Dim cadenaConexion As String = "server=PUESTOT\MIINSTANCIA; Initial Catalog=Usuarios; Integrated Security=true" 'Crear el objeto conexión Dim miSqlConnection As SqlConnection = New SqlConnection(cadenaConexion) Try miSqlConnection.Open() Console.WriteLine("<p>Abierta la conexión</p> " + _ miSqlConnection.ConnectionString) miSqlConnection.Close() Console.WriteLine("<p>Cerrada la conexión</p>") lblMensaje.Text = escritor.ToString() Catch Console.WriteLine("Imposible realizar la conexión") lblMensaje.Text = escritor.ToString() End Try End Sub

Page 4: 10.-ADO

4

End Class

Las sentencias Try/Catch en el código capturan posibles errores en la conexión que en caso de producirse podrían provocar la caída del sistema.

Lo que se mostrará en pantalla si todo sale bien es:

A continuación se muestra un método que devuelve una objeto SqlConnection con una conexión creada. Private Function CrearConexion() As SqlConnection 'Crear una conexión con la base de datos Return New SqlConnection("server=PUESTOT\MIINSTANCIA; Initial Catalog=Usuarios; Integrated Security=true") End Function

SqlCommand

Los objetos de la clase SqlCommand representan procedimientos almacenados o instrucciones que se ejecutan en una base de datos de SQL Server. Las acciones a ejecutar pueden ser: insertar, borrar, actualizar registros, etc.

El constructor más utilizado de esta clase es: Dim miSqlCommand As SqlCommand= _ new SqlCommand (string ordenSql, SqlConnecition cadenaConexion)

o bien Dim miSqlCommand As SqlCommand = new SqlCommand ()

y después se pueden utilizar las propiedades miSqlCommand.CommandText = ordenSql miSqlCommand. = cadenaConexión

Los dos argumentos son, por un lado, la cadena que contiene la instrucción SQL a ejecutar y por otro la cadena de conexión a la base de datos.

En el caso de que ejecute un procedimiento almacenado debemos configurar el comando de la siguiente manera miSqlCommand.CommandType = CommandType.StoreProcedure

Si se ejecuta una orden SQL no es necesario indicarle el tipo específico (CommandType.Text) pues es la opción por defecto miSqlCommand.CommandType = CommandType.Text

Page 5: 10.-ADO

5

Para ejecutar las instrucciones introducidas en CommandText tenemos 3 métodos:

• ExecuteNonQuery() para realizar operaciones de catálogo (por ejemplo, consultar la estructura de la base de datos o crear objetos (tablas…) o para cambiar los datos de una base de datos ejecutando UPDATE, INSERT o DELETE.

• ExecuteScalar() para cuando la instrucción devuelve un solo valor, por ejemplo el resultado de SELECT COUNT(*) FROM MiTabla

• ExecuteReader() para leer el resultado usando un DataReader (veremos más adelante).

En el siguiente ejemplo nos conectaremos a la base de datos Usuarios, insertaremos un nuevo registro mediante un SqlCommand y lo borraremos a continuación. Imports System.Data.SqlClient Private Sub EjecutarSql() 'Definir los objetos necesarios SqlConnection y SqlCommand Dim miSqlConexion As SqlConnection Dim miSqlAñadir As SqlCommand 'Crear una conexión con la base de datos miSqlConexion = New SqlConnection("server=PUESTOT\MIINSTANCIA; Initial Catalog=Usuarios; Integrated Security=true") 'Ejecutar ordenes Sql enl a conexión creada miSqlAñadir = New _ SqlCommand("INSERT INTO Usuarios (nombre,contraseña) Values ('miNombre','miContraseña')", miSqlConexion) 'Abrir la conexión y ejecutar las instrucciones Sql de los objetos Command Try miSqlConexion.Open() miSqlAñadir.ExecuteNonQuery() lblMensaje1.Text = "Operación realizada" Catch e1 As Exception lblMensaje1.Text = e1.ToString() Finally 'Cerrar la conexión si ésta quedó abierta If (miSqlConexion.State = ConnectionState.Open) Then miSqlConexion.Close() End If End Try End Sub

SqlDataAdapter

La clase SqlDataAdapter representa un conjunto de comandos de la base de datos y una conexión. Se utilizará para rellenar un DataSet y actualizar la fuente de datos. Cada objeto SqlDataAdapter intercambia datos entre un único objeto DataTable (de un DataSet) y un único conjunto de resultados de una instrucción SQL o procedimiento almacenado.

Los métodos más importantes de DataAdapter son

Page 6: 10.-ADO

6

• Fill: se utiliza para llenar un DataSet con los datos obtenidos al realizar una consulta, para luego trabajar con ellos sin preocuparnos de su origen. Abre y cierra la conexión automáticamente.

• Update se utiliza para conciliar automáticamente con el origen de datos, los datos modificados de un DataSet mientras no había conexión.

La clase DataAdapter puede tener incluidas cuatro tipos de procedimientos SQL que se corresponden con las acciones a realizar en el DataSet.

Propiedad Función SelectCommand recupera filas de la fuente de datos. InsertCommand escribe filas insertadas del DataSet a la fuente de datos. UpdateCommand escribe filas modificadas del DataSet a la fuente de datos. DeleteCommand elimina filas en la fuente de datos

A la hora de actualizar la base de datos en función de las modificaciones realizadas en un DataSet se deben configurar las propiedades InsertCommnad, UpdateCommnad y DeleteCommnad que contendrán las órdenes SQL que se corresponden con las actualizaciones que se deben realizar. Estas propiedades se generan automáticamente mediante la clase SqlCommandBuilder miCommandBuilder=new SqlCommandBuilder (miSqlAdapter)

Después de ejecutar SqlCommandBuilder se puede llamar al método Update de la siguiente manera: miSqlAdapter.Update (miDateSet,”nombreTabla”);

Este comando actualiza la tabla nombreTabla del miDataSet en la fuente de datos.

Vamos a ver como crear un objeto SqlDataAdapter que utilice una instrucción Select 'Llamo al método para abrir una conexión Dim miConexion As SqlConnection = CrearConexion() miConexion.Open() 'Crear el objeto SqlCommand Dim miSqlCommand As SqlCommand = New SqlCommand miSqlCommand.CommandText = "SELECT * FROM Usuarios" miSqlCommand.Connection = miConexion 'Crear el objeto SqlDataAdapter Dim miSqlAdapter As SqlDataAdapter = New SqlDataAdapter() miSqlAdapter.SelectCommand = miSqlCommand 'Crear un DataSet y rellenar con los datos que tiene el DataAdapter Dim miDataSet As DataSet = New DataSet() miSqlAdapter.Fill(miDataSet, "Usuarios") 'Ver número de registros de un DataTable lblMensaje1.Text = "El número de empleados es " & _ miDataSet.Tables("Usuarios").Rows.Count.ToString() 'Ver un campo de DataTable en un control label lblMensaje2.Text = ""

Page 7: 10.-ADO

7

DataSet

El objeto DataSet será el que almacene los datos recuperados de la base de datos mientras necesitemos trabajar con ellos, así evitamos estar conectados permanentemente.

Potencial de DataSet.

• Recuperar datos de cualquier origen de datos (BDD, XML, etc.) y trabajar con ellos en forma relacional.

• Economizar en el número de conexiones realizadas a las BDD, principal cuello de botella en las aplicaciones Web.

• Los datos pueden estar distribuidos en diferentes máquinas, el cliente puede modificarlos y se actualizarán de forma transparente en el origen de datos del que procedan.

• Los objetos DataSet son los más importantes de ADO.NET y se comportan como un verdadero motor de datos relacionales en memoria.

• No dependen del proveedor de datos que hayamos utilizado. Clases dependientes de un DataSet

• DataTable. Representa una tabla donde se almacena el resultado de una consulta.

• DataColumn. Ofrece información sobre los campos de un DataTable.

• DataRow. Representa un registro de la tabla virtual DataTable.

• Constraint. Se utiliza para definir restricciones en los campos del DataTable (por ejemplo, que se trata de una clave única).

• DataRelations. Se utiliza para definir relaciones entre objetos DataTable.

Page 8: 10.-ADO

8

• DataView. Representa una vista, suelen ser ordenaciones o filtros del DataTable original.

• DataRowCollection representa a los objetos DataRow que se encuentran en un objeto DataTable.

• DataColumCollection representa a los objetos DataColum que se encuentran en DataTable.

El objeto DataSet será el que almacene los datos recuperados en la base de datos mientras necesitemos trabajar con ellos, así evitamos estar conectados permanentemente.

Utilizamos el método Fill del DataAdapter creado anteriormente para rellenar el DataSet con los datos y después cerramos la conexión Dim miDataSet As DataSet = New DataSet() miSqlAdapter.Fill(miDataSet, "Usuarios")

Después de haber ejecutado estas instrucciones, el DataSet contiene los datos que son el resultado de ejecutar la cadena Sql definida en la clase SqlCommand y se puede trabajar con ellos después de cerrar la conexión como si la base de datos estuviese abierta.

DataTable Los objetos DataTable forman parte del objeto DataSet. Un DataSet puede tener varias DataTables que se han podido crear directamente o que se han cargado desde un objeto SqlConnection con el método Fill. Cada tabla (objeto DataTable) está formada por:

• Una colección de columnas (colección de objetos DataColumn).

• La propiedad Columns permite acceder a cada una de las columnas.

• Cada columna guarda información de las características de cada uno de los campos (tipo de dato, longitud, etc.).

• Es posible acceder a ellas mediante el índice o mediante el nombre de la columna.

Ejemplos de accesos dentro de un DataSet: • Para hacer referencia a la primera tabla cargada.

miDataSet.Tables(0)

• Para saber el nombre de la tabla que está en primer lugar.

Page 9: 10.-ADO

9

dataSet.Tables(0).TableName

• Para hacer referencia a la tabla llamada “Clientes”. miDataSet.Tables(“Clientes”)

• Para acceder al campo nombre del primer registro de un DataTable. miDataSet.Tables(“Clientes”).Rows(0)(“nombre”)

• Para acceder al campo situado en segundo lugar del tercer registro de un DataTable.

miDataSet.Tables(“Clientes”).Rows(2)(1)

• Para saber el número de campos que contiene un DataTable. dataSet.Tables(0).Columns.Count

• Para saber el número de registros que contiene un DataTable. dataSet.Tables(0).Rows.Count

• Para saber el nombre del campo que está en segundo lugar. dataSet.Tables(0).Columns(1).ColumnName

Ejemplo A continuación vemos un programa que realiza las funciones básicas de un DataSet: insertar, buscar, borrar, modificar, etc.

Nota: Para evitar problemas con la operación de borrar registro se recomienda añadir un registro cuyo LastName sea Pin y después buscar ese para borrar. 'Llamo al método para abrir una conexión Dim miConexion As SqlConnection = CrearConexion() miConexion.Open() 'Crear el objeto SqlCommand Dim miSqlCommand As SqlCommand = New SqlCommand miSqlCommand.CommandText = "SELECT * FROM Usuarios" miSqlCommand.Connection = miConexion 'Crear el objeto SqlDataAdapter a partir del commando Dim miSqlAdapter As SqlDataAdapter = New SqlDataAdapter(miSqlCommand) 'Crear un DataSet y rellenar con los datos que tiene el DataAdapter Dim miDataSet As DataSet = New DataSet() miSqlAdapter.Fill(miDataSet, "Usuarios") 'Ver número de registros de un DataTable lblMensaje1.Text = "El número de empleados es " & _ miDataSet.Tables("Usuarios").Rows.Count.ToString() 'Ver un campo de todos los registros de DataTable en un control label For Each r As DataRow In miDataSet.Tables("Usuarios").Rows lblMensaje2.Text = lblMensaje2.Text & r(2) + "-" Next 'Añadir un registro al dataSet Dim nuevaFila As DataRow = miDataSet.Tables("Usuarios").NewRow() nuevaFila(1) = "Elisa" nuevaFila(2) = "Elisanick" miDataSet.Tables("Usuarios").Rows.Add(nuevaFila) 'Borrar el registro cuyo campo Nombre sea Elisa Dim aux As Byte = 0

Page 10: 10.-ADO

10

For i As Byte = 0 To miDataSet.Tables("Usuarios").Rows.Count - 1 If (miDataSet.Tables("Usuarios").Rows(i)("Nombre").ToString() = "Elisa") Then aux = i End If Next miDataSet.Tables("Usuarios").Rows(aux).Delete() 'Modificar el 2º regsitro miDataSet.Tables("Usuarios").Rows(2)(1) = "Pepe" 'Generar las instrucciones de actualización en el dataAdapter Dim objComm As SqlCommandBuilder = _ New SqlCommandBuilder(miSqlAdapter) 'Actualizar la fuente de datos miSqlAdapter.Update(miDataSet, "Usuarios") 'Mostrar el resultado en un DataGrid Me.miBinding.DataSource = miDataSet.Tables("Usuarios") Me.miDataGridView.DataSource = Me.miBinding

DataView Un objeto DataView es una vista personalizada de un único objeto DataTable de un DataSet. Después de crear un objeto DataView, el usuario puede usarlo para

• clasificar, • filtrar, • buscar, • editar y • navegar por los datos.

Podemos utilizar las vistas para presentar un subconjunto de datos de un objeto DataTable. Propiedades y Métodos:

• DefaultView: Cada objeto DataTable tiene una vista predeterminada. Dim miVista As DataView = miDataSet.Tables (“Customers”).DefaultView

• RowFilter: Se puede aplicar un filtro a una vista para que ésta muestre un subconjunto de datos.

Dim miVista As DataView = new DataView(miDataSet.Tables(“Usuarios”)) miVista.RowFilter=” Nombre=’Ana”;

• DataView: Se pueden ordenar los datos de una vista. Se puede ordenar por varios campos separados por comas y determinar a la derecha de cada uno de ellos si los queremos en orden ASC o DESC.

miVista.Sort=” ContactName DESC” • Find: Se utiliza para buscar por contenido. Devuelve el índice del

elemento localizado y -1 si no lo encuentra. En el caso de que existan más de un registro coincidente sólo se recuperará el primero localizado. El método Find necesita que las filas del DataTable estén ordenadas por el campo que se va a buscar.

Dim miVista As DataView = = miDataSet.Tables("Usuarios").DefaultView; miVista.Sort="LastName ASC"; Dim intItemIndex As Integer = miVista.Find ("Pepe");

Page 11: 10.-ADO

11

Using Un bloque Using permite gestionar recursos tales como una conexión de la base de datos, garantizando la eliminación de la misma cuando su código termina de usarlos.

Por ejemplo, en el siguiente código, se utiliza un bloque Using que gestiona una conexión a la base de datos, dentro del bloque la conexión está abierta, al cerrar el bloque cierra y elimina la conexión. 'Conexion con la base de datos Dim miSqlConnection As SqlConnection = CrearConexion() 'Creamos un objeto Command para almacenar la instrucción Sql Dim miSqlCommand As SqlCommand Using miSqlConnection miSqlCommand = _ New SqlCommand("SELECT * FROM Usuarios", miSqlConnection) 'Creamos el objeto Adapter para rellenar el DataSet en memoria miAdaptador.SelectCommand = miSqlCommand 'Crear un DataSet y lo llenamos con el Adapter miAdaptador.Fill(miDataSet, "Usuarios") End Using

Los recursos administrados por el bloque Using se eliminan mediante el recolector de elementos no utilizados de .NET Framework sin necesidad de código adicional por su parte.

RESUMEN 1. Crear un SqlCommand para almacenar la instrucción que selecciona los

datos con los que queremos trabajar 2. Crear un DataAdapter adecuado que almacene el objeto SqlCommand

en función del tipo de operación a realizar 3. Abrir la base de datos 4. Rellenar un DataSet con la información del DataAdapter 5. Cerrar la base de datos 6. Trabajar con el DataSet

Mostrar sus datos o Crear una vista

7. Mostar los datos en un control

Ejemplo Vamos a mostrar los datos de una tabla que tengan de Nombre “Ana” ordenándolos por el campo “Apellidos”. Cualquier modificación que se realice en el DataGridView se trasladará a la base de datos debido al uso de miAdaptador.Update(miDataSet, "Usuarios") Public Class miFormulario Dim miAdaptador As SqlDataAdapter = New SqlDataAdapter() Dim miDataSet As DataSet = New DataSet() 'Abrir una conexion Private Function CrearConexion() As SqlConnection 'Crear una conexión con la base de datos Return New SqlConnection _

Page 12: 10.-ADO

12

("server=PUESTOT\MIINSTANCIA; Initial Catalog=Usuarios; Integrated Security=true") End Function 'Al eliminar el formulario de la memoria actualizar la base de datos Private Sub miFormulario _Disposed (ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Disposed miAdaptador.Update(miDataSet, "Usuarios") End Sub 'Al cargar el formulario Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'Conexion con la base de datos Dim miSqlConnection As SqlConnection = CrearConexion() Dim miSqlCommand As SqlCommand Using miSqlConnection miSqlCommand = New SqlCommand("SELECT * FROM Usuarios", _ miSqlConnection) miAdaptador.SelectCommand = miSqlCommand miAdaptador.Fill(miDataSet, "Usuarios") End Using 'Crear una vista Dim miVista As DataView = New DataView(miDataSet.Tables("Usuarios")) miVista.RowFilter = "nombre='Ana'" miVista.Sort = "nombre DESC , apellidos ASC" 'Mostrar el resultado en un DataGrid Me.miBinding.DataSource = miDataSet.Tables("Usuarios") Me.miDataGridView.DataSource = Me.miBinding ‘Construyo los comandos para actualizar la base de datos Dim objComm As SqlCommandBuilder = New SqlCommandBuilder(miAdaptador) End Sub

Al código anterior se le pueden añadir métodos que respondan a botones para Añadir, Eliminar, Modificar, etc.

PARAMETRIZACIÓN DE SELECCIONES

En este apartado vamos a ver como incluir parámetros en las selecciones de fuentes de datos. Los parámetros nos permiten realizar o diseñar consultas SQL dinámicas en nuestra aplicación Web.

Podemos añadir parámetros al objeto SqlCommand (miSqlCommand) de la siguiente manera miSqlCommand.Parameters.AddWithValue(“@parametro”,valor)

Ejemplo: Seleccionar registros A continuación vemos un ejemplo del código para borrar un registro cuyo campo nombre coincida con el contenido de un campo de texto. Dim miSqlConnection As SqlConnection = CrearConexion() Dim miSqlCommand As SqlCommand Using miSqlConnection

Page 13: 10.-ADO

13

‘Incluimos en la instrucción Where un parámetro miSqlCommand = New SqlCommand _ ("SELECT * FROM Usuarios WHERE nombre=@Nombre", miSqlConnection) ‘Le damos valor al parámetro miSqlCommand.Parameters.AddWithValue("@Nombre", txtFiltroNombre.Text) miAdaptador.SelectCommand = miSqlCommand miAdaptador.Fill(miDataSet, "Usuarios") End Using Me.miBinding.DataSource = miDataSet.Tables("Usuarios") Me.miDataGridView.DataSource = Me.miBinding

DataReader

Cuando se recupera una gran cantidad de datos de una fuente de datos, mantener la memoria abierta puede ser un problema. Por ejemplo, leer 10.000 filas de una base de datos hace que un objeto DataTable asigne y mantenga memoria para esas 10.000 filas durante la vida de la tabla. Si 1.000 usuarios hacen esto contra el mismo equipo a la vez, el uso de la memoria será un factor crítico.

La clase DataReader está diseñada para producir un flujo de datos de sólo lectura y sólo hacia delante que la base de datos devuelve. Por tanto, sólo hay un registro en memoria cada vez en el servidor.

La clase DataReader proporciona una transferencia de datos de sólo lectura y sólo hacia delante que puede vincularse a un control enlazado a lista.

Por ejemplo, si sólo deseamos mostrar los resultados de una consulta a una base de datos en un único control enlazado a lista, y si no vamos a manipular esos datos, una clase DataReader es una forma ideal de conseguirlo.

Los objetos DataReader son más rápidos que los objetos DataSet. En la creación del objeto DataSet, la sobrecarga es mayor debido a que los objetos DataSet tienen la capacidad de leer y escribir datos y examinar hacia delante y hacia atrás. Hay muy poca sobrecarga en un objeto DataReader ya que es sólo hacia delante y sólo de lectura. Esta relativa falta de sobrecarga supone un acceso a datos más rápido con un objeto DataReader que con un objeto DataSet. Tenemos la opción de recorrer los datos del objeto DataReader y mostrarlo mediante programación, o podemos vincular un objeto DataReader a un control enlazado a lista. En ambos casos, debemos escribir el código nosotros mismos.

Debido a que el DataReader no es una representación en memoria de los datos, utilizar un DataReader afecta poco a la disponibilidad de los recursos del servidor.

Page 14: 10.-ADO

14

Ejemplo El siguiente código accede a la tabla Usuarios y muestra sus datos en un DataGridView Dim miSqlConnection As SqlConnection miSqlConnection = CrearConexion() Dim miSqlCommand As SqlCommand miSqlCommand = New SqlCommand("SELECT * FROM Usuarios", miSqlConnection) miSqlConnection.Open() ‘Crear un objeto DataReader a partir del SqlCommand Dim miSqlReader As SqlDataReader miSqlReader = miSqlCommand.ExecuteReader() ‘Añado las conlumnas al DataGridView miDataGridView.Columns.Add("Codigo", "Codigo del producto") miDataGridView.Columns.Add("Nombre", "Nombre") miDataGridView.Columns.Add("Nick", "Nick") miDataGridView.Columns.Add("Contraseña", "Contraseña") ‘Paso los elementos del SqlReader al DataGridView Do While (miSqlReader.Read()) miDataGridView.Rows.Add(miSqlReader.GetDecimal(0), _ miSqlReader.GetString(1), miSqlReader.GetString(2), miSqlReader.GetString(3)) Loop

Acceso más lento

Sólo hacia delante

Vinculado a un único control

Basado en una instrucción SQL de una base de datos

Sólo lectura

Acceso más rápido

Búsqueda de datos hacia delante y hacia atrás

Vinculado a múltiples controles

Incluye múltiples tablas de distintas bases de datos

Acceso lectura/escritura a datos

DataReader DataSet

Desconectado Conectado