8.- Acceso a Datos Con Microsoft ADO

download 8.- Acceso a Datos Con Microsoft ADO

of 56

Transcript of 8.- Acceso a Datos Con Microsoft ADO

Acceso a datos con Microsoft ADO.NET

ndice Descripcin Leccin: introduccin al uso de ADO.NET Leccin: conectar a una base de datos Leccin: acceso a datos con DataSets Leccin: utilizar mltiples tablas Leccin: acceder a datos con DataReaders 1 2 6 14 34 44

Acceso a datos con Microsoft ADO.NET

1

DescripcinIntroduccin a ADO.NET Conectar a una base de datos Acceder a datos con DataSets Utilizar mltiples tablas Acceder a datos con DataReaders

*****************************

Introduccin

Crear un sitio Web dinmico que responda a las peticiones de los usuarios con datos personalizados puede requerir que vinculemos nuestra aplicacin Web a varias fuentes de datos. Microsoft ADO.NET es la herramienta que nos permite acceder programticamente a fuentes de datos desde un formulario Web Form. En este mdulo, aprenderemos a utilizar ADO.NET para agregar acceso a datos a nuestra aplicacin Web con Microsoft ASP.NET.

Objetivos de la leccin

En esta leccin, aprenderemos a: Describir el modelo de objetos de ADO.NET para acceder a datos. Crear conexiones seguras a una base de datos Microsoft SQL Server utilizando los objetos SqlConnection y SqlDataAdapter. Utilizar objetos DataSet para soportar los requerimientos de almacenamiento y manipulacin de datos locales de los formularios Web Forms. Almacenar mltiples tablas de datos en un objeto DataSet, y mostrar los datos en controles DataGrid. Leer datos programticamente de una base de datos SQL utilizando un objeto SqlDataReader.

2

Acceso a datos con Microsoft ADO.NET

Leccin: introduccin al uso de ADO.NETMultimedia: modelo de objetos ADO.NET Utilizar DataSets frente a DataReaders Prctica: cundo utilizar DataSets o DataReaders

*****************************

Introduccin

ADO.NET est diseado para cargar datos desde una fuente de datos y trabajar con esos datos en modo desconectado. Este estado de desconexin permite al formulario Web Form operar de forma semi-independiente de las fuentes de datos, reduciendo as el trfico de red. ADO.NET utiliza Extensible Markup Language (XML) como formato universal de transmisin de datos, lo cual garantiza la interoperabilidad con cualquier plataforma donde est disponible un parser XML. En esta leccin, estudiaremos el uso del modelo de objetos de ADO.NET para acceder a datos. Tambin estudiaremos cmo utilizar los objetos DataSet y DataReader para acceder a datos.

Objetivos de la leccin

En esta leccin, aprenderemos a: Describir el acceso a datos de los objetos DataSet y DataReader. Escoger entre los objetos DataSet y DataReader, dependiendo de las necesidades de acceso a datos de una aplicacin Web.

Acceso a datos con Microsoft ADO.NET

3

Uso de DataSets frente a DataReadersDataSet Acceso lectura/escritura a datos Incluye mltiples tablas de distintas bases de datos Desconectado Vinculado a mltiples controles Bsqueda de datos hacia delante y hacia atrs Acceso ms lento Soportado por las herramientas de Visual Studio .NET DataReader Slo lectura Basado en una instruccin SQL de una base de datos Conectado Vinculado a un nico control Slo hacia delante Acceso ms rpido Codificacin manual

*****************************

Introduccin

Los objetos DataSet son objetos complejos que nos permiten almacenar mltiples tablas de datos DataTables desde una fuente de datos. Los objetos DataSet son como una base de datos virtual ubicada dentro de una aplicacin Web. Los objetos DataSet tambin pueden contener relaciones entre los datos de las DataTables, y pueden utilizar esas relaciones para recuperar datos. Los objetos DataReader son objetos ligeros que se utilizan para leer datos desde una fuente de datos; los objetos DataReader proporcionan acceso slo hacia delante (forward-only) y de slo lectura (read-only) a los datos de una base de datos.

Uso de DataSets y DataReaders

La eleccin entre utilizar objetos DataSet u objetos DataReader debera basarse en el uso previsto para los datos. Normalmente, los objetos DataReader se utilizan para leer datos en situaciones en las que es necesario el acceso una nica vez, y de solo lectura, como cuando accedemos a una contrasea almacenada, o se cumplimenta un control enlazado a una lista. Los objetos DataSet se utilizan para un acceso a datos ms complejo, como el acceso a todo el historial de pedidos de un cliente. Algunos de los aspectos relativos al acceso a datos que se deben tener en cuenta a la hora de decidir entre objetos DataSet y DataReader incluyen: Acceso a datos Si nuestra intencin es leer y escribir a nuestra fuente de datos, debemos utilizar un objeto DataSet. Los objetos DataReader son conexiones de slo lectura y deberan utilizarse nicamente cuando los datos vayan a utilizarse en una situacin de slo lectura. Acceso a mltiples bases de datos Si nuestra intencin es combinar tablas de una o ms bases de datos, debemos utilizar un objeto DataSet. Los objetos DataReader se basan en una nica instruccin SQL de una sola base de datos. Enlace a controles

4

Acceso a datos con Microsoft ADO.NET

Si nuestra intencin es enlazar los datos a ms de un control, debemos utilizar un objeto DataSet. Los objetos DataReader slo pueden vincularse a un nico control. Modo conexin Si nuestra intencin es trabajar en un modo desconectado, debemos utilizar un objeto DataSet. Los objetos DataReader deben ejecutarse en modo conectado. Bsqueda (scanning) de datos Si nuestra intencin es buscar los datos hacia atrs y hacia delante, debemos utilizar un objeto DataSet. Los objetos DataReader buscan hacia adelante a medida que los datos fluyen desde la base de datos. Velocidad de acceso Si necesitamos acceso de alta velocidad a nuestra fuente de datos, utilizaremos un objeto DataReader. Los objetos DataSet son ms lentos que los objetos DataReader en el acceso a una base de datos, debido a que los objetos DataSet almacenan los datos en un objeto del servidor Web. Tambin la sobrecarga es mayor en la creacin del objeto DataSet debido a la capacidad de leer y escribir datos y bsqueda hacia delante y hacia atrs. Los objetos DataReader son ms rpidos debido a la naturaleza del objeto ms ligera. Hay muy poca sobrecarga para el objeto DataReader, ya que ste trabaja slo hacia delante y slo de lectura. Soporte de herramientas Si nuestra intencin es utilizar Microsoft Visual Studio .NET para crear la conexin a datos, utilizaremos objeto DataSet. Con los objetos DataSet, podemos elegir entre escribir nuestro propio cdigo o utilizar el cdigo mquina de Visual Studio .NET. Con los objetos DataReader, debemos escribir todo el cdigo de soporte.

Acceso a datos con Microsoft ADO.NET

5

Prctica: cundo utilizar DataSets o DataReadersLos estudiantes: Seleccionarn la mejor opcin de acceso a datos para determinados escenarios Tiempo: 5 minutos

*****************************

Leer los siguientes escenarios, y decidir si es mejor utilizar un objeto DataSet o un objeto DataReader Deseamos obtener informacin de dos tablas que se encuentran en dos bases de datos distintas, y mostrar las tablas al usuario. ____________________________________________________________ ____________________________________________________________ Deseamos obtener informacin de una tabla en una base de datos, permitir al usuario modificar los datos y almacenar esos cambios en la base de datos. ____________________________________________________________ ____________________________________________________________ Deseamos obtener informacin de dos tablas de la misma base de datos y mostrar esa informacin al usuario. ____________________________________________________________ ____________________________________________________________ Deseamos obtener informacin de una tabla de una base de datos y dejar al usuario visualizar los datos en mltiples configuraciones distintas. ____________________________________________________________ ____________________________________________________________

6

Acceso a datos con Microsoft ADO.NET

Leccin: conexin a una base de datosSeguridad SQL Server Crear la conexin Demostracin: establecer la seguridad SQL Server

*****************************

Introduccin

El primer paso en el uso de una base de datos para soportar nuestra aplicacin Web es crear una conexin segura a la base de datos. Las conexiones no seguras pueden exponer a ataques mal intencionados tanto la aplicacin Web como la base de datos. En esta leccin, aprenderemos a crear conexiones seguras a una base de datos SQL Server utilizando los objetos SqlConnection y SqlDataAdapter.

Objetivos de la leccin

En esta leccin, aprenderemos a: Explicar la diferencia entre el modo mixto y la autenticacin slo Windows. Crear una conexin, con autenticacin slo Windows, a una base de datos SQL Server.

Acceso a datos con Microsoft ADO.NET

7

Seguridad SQL ServerServidor Web Servidor Web Configuracin ASP.NET Configuracin ASP.NET predeterminada predeterminada Aqu est el nombre de usuario y la contrasea o o Cliente Cliente Enviar el nombre de usuario y contrasea en texto claro. Servidor SQL Servidor SQL Cada cuenta de usuario se Cada cuenta de usuario se agrega a grupo login de SQL Server agrega a grupo login de SQL Server No enviar el nombre de usuario y contrasea. Enviar slo que el usuario ha sido autenticado. Servidor SQL Servidor SQL Slo la cuenta ASPNET Slo la cuenta ASPNET tiene concedido acceso tiene concedido acceso

Autenticacin Autenticacin modo mixto modo mixto

Autenticacin Autenticacin slo Windows slo Windows Servidor Web Servidor Web Autenticacin Windows Autenticacin Windows

*****************************

Introduccin

Desde la perspectiva del usuario, el acceso a datos desde una base de datos SQL Server es un proceso en dos pasos. En primer lugar, el usuario enva una peticin a la aplicacin Web, y sta se conecta a la base de datos SQL Server para satisfacer la solicitud. Existen dos mtodos principales para que una aplicacin Web se conecte a una base de datos SQL Server: autenticacin en modo mixto y autenticacin en modo slo Windows. El mtodo ms utilizado es la autenticacin slo Windows. La autenticacin en modo mixto utiliza la configuracin predeterminada de ASP.NET y de la aplicacin Web. Cada usuario de la aplicacin Web debe tener una cuenta de usuario aadida al grupo logins de SQL Server. El punto dbil de la autenticacin en modo mixto es que los nombres de usuario y las contraseas se envan al equipo que ejecuta SQL Server en cdigo HTML no encriptado. Estos datos expuestos podran permitir a terceros obtener las credenciales de inicio de sesin. Adems, es necesario administrar cuentas de usuario tanto en el servidor Web como en el equipo que ejecuta SQL Server. Para utilizar la autenticacin en modo mixto, configurar SQL Server en modo de autenticacin mixto (SQL Server y Windows). El siguiente cdigo puede utilizarse para conectar a un SQL Server con autenticacin en modo mixto:

Autenticacin En modo mixto

Visual Basic .NET

Dim strConn As String = _ "data source=localhost; " & _ "initial catalog=northwind; " & _ "user id=CohoUser;password=1Coho" Dim conn As New SqlConnection(strConn) string strConn = "data source=localhost; " + "initial catalog=northwind; " + "user id=CohoUser; " + "password=1Coho"; SqlConnection conn = new SqlConnection(strConn);

C#

8

Acceso a datos con Microsoft ADO.NET

Aviso Utilizar la autenticacin en modo mixto para acceder a SQL Server desde una aplicacin Web es un riesgo de seguridad y no est recomendado. La autenticacin en modo mixto se describe aqu como una tcnica que puede utilizarse durante el desarrollo de la aplicacin Web. Autenticacin slo Windows La autenticacin en modo slo Windows es el mtodo ms utilizado para conectar una aplicacin Web a una base de datos SQL Server. Cuando utilizamos la autenticacin en modo slo Windows, SQL Server no necesita el nombre de usuario y la contrasea. Slo se requiere una confirmacin de que el usuario ha sido autenticado por una fuente de confianza para procesar la peticin a la base de datos. El proceso de la autenticacin en modo slo Windows utiliza una sola cuenta denominada ASPNET para todos los accesos a SQL Server desde la aplicacin Web. Esta nica cuenta elimina los problemas de transmitir nombres de usuario y contraseas no encriptados entre la aplicacin Web y SQL Server, junto con la necesidad de mantener cuentas de usuario en ambos servidores. Con la autenticacin en modo slo Windows, los usuarios acceden al formulario Web Form como usuarios annimos. ASP.NET se conecta a SQL Server y se autentica utilizando la cuenta de usuario ASPNET. Los datos solicitados son devueltos por SQL Server y utilizados por la aplicacin Web. Finalmente, el formulario Web Form que incluye los datos solicitados se devuelven al usuario. Para utilizar la autenticacin en modo slo Windows, configuramos SQL Server con la autenticacin en modo slo Windows. El siguiente cdigo puede utilizarse para conectar a un SQL Server con autenticacin en modo slo Windows: Visual Basic .NETDim strConn As String = _ "data source=localhost; " & _ "initial catalog=northwind; " & _ "integrated security=true" Dim conn As New SqlConnection(strConn) string strConn = "data source=localhost; " + "initial catalog=northwind; " + "integrated security=true"; SqlConnection conn = new SqlConnection(strConn);

C#

Acceso a datos con Microsoft ADO.NET

9

Configurar el SQL Server para ejecutar autenticacin en modo mixto o slo Windows

Cuando utilizamos la autenticacin en modo slo Windows, podemos mantener a SQL Server en el modo de autenticacin predeterminado de slo Windows. Si utilizamos la autenticacin en modo mixto, necesitamos modificar el modo de autenticacin de SQL Server. Cambiar el modo de autenticacin de SQL Server 1. En el men Inicio, hacer clic con el botn derecho en Mi PC y clic en Administrar. 2. En la consola Administracin de equipos, expandir la carpeta Servicios y Aplicaciones y la carpeta Servidores Microsoft SQL Server. 3. Hacer clic con el botn derecho en el servidor SQL Server (local) y clic en Propiedades. 4. En el cuadro de dilogo Propiedades de SQL Server, en la ficha Seguridad, hacer clic en el botn de opcin SQL Server y Windows o la opcin slo Windows de la seccin Autenticacin, y hacer clic en Aceptar. Nota Para ms informacin sobre securizar una aplicacin Web, ver el Mdulo Securizar una aplicacin Web con Microsoft ASP.NET.

10

Acceso a datos con Microsoft ADO.NET

Crear la conexinUso de SqlConnectionDim strConn As String = "data source=localhost; " & _ Dim strConn As String = "data source=localhost; " & _ "initial catalog=northwind; integrated security=true" "initial catalog=northwind; integrated security=true" Dim conn As New SqlConnection(strConn) Dim conn As New SqlConnection(strConn) string strConn = "data source=localhost; " + string strConn = "data source=localhost; " + "initial catalog=northwind; integrated security=true"; "initial catalog=northwind; integrated security=true"; SqlConnection conn = new SqlConnection(strConn); SqlConnection conn = new SqlConnection(strConn);

Establecer los parmetros de la cadena de conexin Timeout de conexin Fuente de datos Catlogo inicial Seguridad integrada*****************************

Contrasea Persistir informacin seguridad Proveedor ID de usuario

Introduccin

Para mover datos entre una base de datos y nuestra aplicacin Web, en primer lugar debemos crear una conexin a la base de datos. Para ello, debemos identificar el nombre del servidor de base de datos, el nombre de la base de datos, y la informacin de inicio de sesin requerida. Dependiendo del tipo de base de datos al que accedamos, podemos utilizar un objeto SqlConnection o un objeto OleDbConnection. Utilizamos un objeto SqlConnection para conectar a bases de datos SQL Server 7.0 o posterior, y objetos OleDbConnection para conectar al resto de bases de datos.

Crear una cadena de conexin

Creamos un objeto SqlConnection pasando una cadena de conexin que proporciona los parmetros necesarios para crear una conexin a una fuente de datos. El siguiente cdigo de ejemplo crea un objeto SQLConnection a la base de datos SQL Server Northwind:

Visual Basic .NET

Dim strConn As String = _ "data source=localhost; " & _ "initial catalog=northwind; " & _ "integrated security=true" Dim conn As New SqlConnection(strConn) string strConn = "data source=localhost; " + "initial catalog=northwind; " + "integrated security=true"; SqlConnection conn = new SqlConnection(strConn);

C#

Acceso a datos con Microsoft ADO.NET

11

Parmetros de la cadena de conexin

La siguiente tabla describe algunos de los parmetros ms habituales de un objeto de conexin:Parmetro Connection Timeout Descripcin El intervalo de tiempo de espera en segundos en una conexin al servidor antes de finalizar el intento y generar una excepcin. 15 segundos es el tiempo predeterminado. El nombre del servidor SQL Server utilizado cuando se abre una conexin, o el nombre del archivo que se utiliza cuando en la conexin a una base de datos Microsoft Access. El nombre de la base de datos. El parmetro que determina si la conexin es o no segura. Los valores posibles son True, False y SSPI. SSPI es el equivalente a True. La contrasea de inicio de sesin en la base de datos SQL Server. Cuando est establecido a False no se devuelve informacin sensible a la seguridad (como la contrasea) como parte de la conexin, si la conexin est abierta o ha estado en un estado abierto. Establecer esta propiedad a True puede constituir un riesgo de seguridad. La configuracin predeterminada es False. La propiedad que se utiliza para establecer o devolver el nombre del proveedor de la conexin; este parmetro se utiliza nicamente para objetos OleDbConnection. El nombre de cuenta de inicio de sesin de SQL Server.

Data Source

Initial Catalog Integrated Security

Password Persist Security Info

Provider

User ID

12

Acceso a datos con Microsoft ADO.NET

Demostracin: establecer la seguridad de SQL ServerAbrir SQL Server Enterprise Manager Establecer el modo de autenticacin Probar con seguridad integrada Probar con seguridad en modo mixto

*****************************

Introduccin

En esta demostracin, veremos cmo establecer y probar una conexin de seguridad integrada entre una aplicacin Web y un SQL Server. Ejecutar esta demostracin

Abrir SQL Server Enterprise Manager

1. En el men Inicio, hacer clic con el botn derecho en Mi PC y clic en Administrar. 2. En la consola Administracin de equipos, expandir la carpeta Servicios y aplicaciones y expandir la carpeta Servidores Microsoft SQL Server. 3. Hacer clic con el botn derecho en el servidor SQL Server (local) y clic en Propiedades.

Establecer el modo de autenticacin

4. En el cuadro de dilogo Propiedades de SQL Server, en la ficha Seguridad, hacer clic en el botn de opcin Slo Windows de la seccin Autenticacin y hacer clic en Aceptar. 5. Abrir el formulario Web Form SQLSecurityModes.aspx del proyecto Demo08VB o Demo08CS ue se pueden encontrar dentro del fichero demos08.zip 6. Generar y examinar la pgina SQLSecurityModes.aspx.

Prueba con seguridad integrada

7. Hacer clic en Utilizar seguridad integrada, y clic en Get Data. Los datos se recuperan de la base de datos y se muestran en el control DataGrid. 8. Hacer clic en Utilizar seguridad estndar, y clic en Get Data. Obtenemos un error porque el usuario no existe en el SQL Server. 9. Crear un nuevo usuario para SQL Server: a. En la consola Gestin de equipos, expandir la carpeta SQL Server (local) y expandir la carpeta Seguridad. b. Hacer clic con el botn derecho en Logins y hacer clic en Nuevo Login.

Acceso a datos con Microsoft ADO.NET

13

c. En el cuadro de dilogo Propiedades de login de SQL Server, escribir CohoUser en el campo Nombre, hacer clic en Autenticacin SQL Server en la seccin Autenticacin, escribir 1Coho en el campo Contrasea, y hacer clic en Aceptar. d. Teclear 1Coho en el cuadro de dilogo Confirmar contrasea, y hacer clic en Aceptar. Prueba con seguridad en modo mixto 10. Cambiar el modo de autenticacin de SQL Server a modo mixto. a. En la consola Gestin de equipos, hacer clic con el botn derecho en SQL Server (local) y clic en Propiedades. b. En el cuadro de dilogo Propiedades de SQL Server, en la ficha Seguridad, hacer clic en el botn de opcin SQL Server y Windows de la seccin Autenticacin, y hacer clic en Aceptar. c. A la pregunta de si es necesario reiniciar el servicio SQL Server, hacer clic en S. 11. Visualizar la pgina SQLSecurityModes.aspx en el navegador de nuevo y probar ambos mtodos para acceder a SQL Server. Ahora, funcionarn los dos mtodos.

14

Acceso a datos con Microsoft ADO.NET

Leccin: acceso a datos con DataSetsCrear un DataAdapter Crear un DataSet Demostracin: utilizar programticamente un DataSet Utilizar un DataView Prctica: organizar cdigo para crear un DataSet Vincular un DataSet a un control enlazado a lista Prctica dirigida por el instructor: visualizar un DataSet Gestin de errores

*****************************

Introduccin

El objeto DataSet representa una copia local de los datos que provienen de una o ms fuentes de datos. El uso de un objeto DataSet permite que un formulario Web Form se ejecute de forma semi-independiente de las fuentes de datos. El objeto DataSet puede utilizar un objeto DataAdapter para cargar los datos de una fuente de datos y puede desconectarse de la misma. El usuario puede entonces utilizar y manipular los datos. Cuando los datos necesitan ser actualizados contra la fuente de datos, se utiliza un objeto DataAdapter para volver a conectarse y actualizar la fuente de datos. En esta leccin, estudiaremos cmo utilizar los objetos DataSet para soportar el almacenamiento local de datos y los requerimientos de manipulacin de los formularios Web Forms.

Objetivos de la leccin

En esta leccin, aprenderemos a: Crear un objeto DataAdapter para enlazar un objeto DataSet a una fuente de datos. Crear un objeto DataSet para guardar datos de una fuente de datos. Utilizar objetos DataView para guardar un subconjunto de datos de un objeto DataSet. Vincular un objeto DataSet y un objeto DataView a un control enlazado a lista. Gestionar los errores tpicos que nos encontramos en el acceso a datos.

Acceso a datos con Microsoft ADO.NET

15

Crear un DataAdapterAlmacenar la consulta en un DataAdapterDim da As New SqlDataAdapter _ Dim da As New SqlDataAdapter _ ("select * from Authors", conn) ("select * from Authors", conn) SqlDataAdapter da = new SqlDataAdapter SqlDataAdapter da = new SqlDataAdapter ("select * from Authors",conn); ("select * from Authors",conn);

El constructor DataAdapter establece la propiedad SelectCommandda.SelectCommand.CommandText da.SelectCommand.CommandText da.SelectCommand.Connection da.SelectCommand.Connection da.SelectCommand.CommandText; da.SelectCommand.CommandText; da.SelectCommand.Connection; da.SelectCommand.Connection;

Establecer las propiedades InsertCommand, UpdateCommand y DeleteCommand si fuera necesario*****************************

Introduccin

El objeto DataSet representa una copia local de datos de una fuente de datos. Cuando se utiliza sin una fuente de datos, el objeto DataSet resulta til para guardar datos locales a los cuales pueden acceder los formularios Web Forms. Sin embargo, para actuar como una herramienta de gestin de datos real, un objeto DataSet debe poder interactuar con una o ms fuentes de datos. Para conseguir esta interaccin, el .NET Framework proporciona las clases SqlDataAdapter y OleDbDataAdapter. Un objeto DataAdapter acta como enlace entre un objeto DataSet y una fuente de datos que puede utilizarse para recuperar y guardar datos. La clase DataAdapter representa un conjunto de comandos de base de datos y una conexin a una base de datos que utilizamos para rellenar un objeto DataSet y actualizar la fuente de datos. Cada objeto DataAdapter intercambia datos entre un nico objeto DataTable en un objeto DataSet y un nico conjunto de resultados de una instruccin SQL o un procedimiento almacenado. Visual Studio .NET pone a disposicin dos clases principales DataAdapter para su uso con bases de datos: Clase OleDbDataAdapter Esta clase es adecuada para utilizarse con cualquier fuente de datos expuesta por un OLE DB Data Provider. Clase SqlDataAdapter Esta clase es especfica para una base de datos SQL Server versin 7.0 o posterior. El objeto SqlDataAdapter es ms rpido que el objeto OleDbDataAdapter porque funciona directamente con SQL Server y no debe funcionar a travs de una capa OLE DB Data Provider. Adems, las clases DataAdapter para otros tipos de fuentes de datos pueden integrarse con Visual Studio .NET.

DataAdapter

16

Acceso a datos con Microsoft ADO.NET

Propiedades del DataAdapter

Cuando utilizamos objetos DataAdapter para intercambiar datos entre un objeto DataSet y una fuente de datos, podemos especificar las acciones que deseamos realizar utilizando una de las cuatro propiedades DataAdapter. Las propiedades DataAdapter ejecutan una instruccin SQL o invocan un procedimiento almacenado. Las propiedades que estn disponibles con la clase DataAdapter se muestran en la siguiente tabla.Propiedad SelectCommand InsertCommand UpdateCommand DeleteCommand Funcin La propiedad SelectCommand recupera filas de la fuente de datos. La propiedad InsertCommand escribe filas insertadas del DataSet a la fuente de datos. La propiedad UpdateCommand escribe filas modificadas del DataSet a la fuente de datos. La propiedad DeleteCommand elimina filas en la fuente de datos.

Ejemplo de SqlDataAdapter Visual Basic .NET

El siguiente cdigo de ejemplo muestra cmo crear un objeto SqlDataAdapter denominado da que contiene una sentencia de consulta:'Create a connection Dim conn As New SqlConnection _ ("data source=localhost;initial catalog=pubs;" & _ "integrated security=true;persist security info=True;") 'Create the DataAdapter Dim da As New SqlDataAdapter _ ("select * from Authors", conn)

C#

//Create a connection SqlConnection conn = new SqlConnection ("data source=localhost; initial catalog=pubs; " + "integrated security=true; persist security info=True;"); //Create the DataAdapter SqlDataAdapter da = new SqlDataAdapter ("select * from Authors", conn);

Acceso a datos con Microsoft ADO.NET

17

Crear un DataSetCrear y poblar un DataSet con DataTables El mtodo Fill ejecuta el SelectCommandDataSet ds = new DataSet(); DataSet ds = new DataSet(); da.Fill(ds, "Authors"); da.Fill(ds, "Authors"); Dim ds As New DataSet() Dim ds As New DataSet() da.Fill(ds, "Authors") da.Fill(ds, "Authors")

Acceder a DataTableds.Tables["Authors"].Rows.Count; ds.Tables["Authors"].Rows.Count; string str=""; string str=""; foreach(DataRow r in foreach(DataRow r in ds.Tables["Authors"].Rows) ds.Tables["Authors"].Rows) { { str += r[2]; str += r[2]; str += r["au_lname"]; str += r["au_lname"]; } }*****************************

ds.Tables("Authors").Rows.Count ds.Tables("Authors").Rows.Count Dim r As DataRow Dim r As DataRow Dim str As String Dim str As String For Each r in _ For Each r in _ ds.Tables("Authors").Rows ds.Tables("Authors").Rows str &= r(2) str &= r(2) str &= r("au_lname") str &= r("au_lname") Next Next

Introduccin Crear a DataSet Visual Basic .NET C# Rellenar el DataSet

Para crear una copia local de una base de datos, creamos y poblamos un objeto DataSet utilizando objetos DataTable. El primer paso para crear un objeto DataSet es declarar el nombre del objeto DataSet. El siguiente cdigo crea un objeto DataSet denominado ds:Dim ds As New DataSet() DataSet ds = new DataSet();

Tras crear un objeto DataSet, rellenamos los objetos DataTable creando un objeto DataAdapter. Invocamos el mtodo Fill en el objeto DataAdapter y especificamos el objeto DataTable que deseamos rellenar. El siguiente cdigo rellena la tabla Authors del objeto DataSet ds utilizando un DataAdapter denominado da:da.Fill(ds, "Authors") da.Fill(ds, "Authors");

Visual Basic .NET C#

El mtodo Fill ejecuta implcitamente una consulta SQL en la propiedad SelectCommand del objeto DataAdapter. Los resultados de la consulta SQL se utilizan para definir la estructura del objeto DataTable, y para poblar la tabla con datos.

18

Acceso a datos con Microsoft ADO.NET

El siguiente cdigo de ejemplo muestra cmo crear un objeto SqlDataAdapter da, e invocar a continuacin el mtodo Fill para almacenar los datos en el objeto DataSet ds. Visual Basic .NET'Create a connection Dim conn As New SqlConnection _ ("data source=localhost;initial catalog=pubs;" & _ "integrated security=SSPI;persist security info=True;") 'Create the DataSet Dim ds As New DataSet() 'Create the DataAdapter Dim da As New SqlDataAdapter _ ("select * from Authors", conn) 'Fill the DataSet ds da.Fill(ds, "Authors")

C#

//Create a connection SqlConnection conn = new SqlConnection ("data source=localhost;initial catalog=pubs; " + "integrated security=SSPI;persist security info=True;"); //Create the DataSet DataSet ds = new DataSet(); //Create the DataAdapter SqlDataAdapter da = new SqlDataAdapter ("select * from Authors", conn); //Fill the DataSet ds da.Fill(ds, "Authors");

El segundo argumento del mtodo Fill es un nombre para el objeto DataTable que est creado. Utilizamos este nombre para acceder a los datos devueltos. Acceder a DataTable Una vez insertados los datos en un objeto DataSet, podemos acceder programticamente a los datos. Como muestra el siguiente cdigo, cada objeto DataSet est formado por uno o ms objetos DataTable a los que podemos hacer referencia por su nombre o posicin ordinal:ds.Tables("Authors") -ods.Tables(0) ds.Tables["Authors"]; -ods.Tables[0];

Visual Basic .NET

C#

Acceso a datos con Microsoft ADO.NET

19

Las clases DataRow y DataColumn son los componentes principales de una clase DataTable. Utilizaramos un objeto DataRow con sus propiedades y mtodos para recuperar y evaluar los valores de un objeto DataTable. DataRowCollection representa los objetos DataRow reales que se encuentran en el objeto DataTable, y DataColumnCollection contiene los objetos DataColumn que describen el esquema del objeto DataTable. La propiedad Rows del objeto DataTable proporciona acceso programtico a DataRowCollection. La propiedad Columns del objeto DataTable proporciona acceso programtico a DataColumnCollection. El siguiente cdigo de ejemplo agrega los nombres de columnas de un objeto DataSet al control ListBox denominado lstItems: Visual Basic .NETDim col As DataColumn For Each col In ds.Tables(0).Columns lstItems.Items.Add(col.ColumnName) Next foreach(DataColumn col in ds.Tables[0].Columns) { lstItems.Items.Add(col.ColumnName); }

C#

Tanto el objeto DataRowCollection como el objeto DataColumnCollection tienen una propiedad Count que nos permite determinar el nmero de filas o columnas de un objeto DataTable, como muestra el siguiente cdigo de ejemplo: Visual Basic .NET C#ds.Tables("Authors").Rows.Count ds.Tables("Authors").Columns.Count ds.Tables["Authors"].Rows.Count; ds.Tables["Authors"].Columns.Count;

Contar las filas y columnas del objeto DataTable nos permite acceder a campos individuales del objeto DataTable. Podemos acceder a campos por posicin ordinal (basada-en-0) o por el nombre. En el siguiente cdigo, x es el ndice de la fila de datos a la que deseamos acceder: Visual Basic .NET C#DataSet.Tables(0).Rows(x)(1) DataSet.Tables(0).Rows(x)("fieldname") ds.Tables["Authors"].Rows[x][1]; ds.Tables["Authors"].Rows[x]["fieldname"];

20

Acceso a datos con Microsoft ADO.NET

El siguiente cdigo recorre en bucle cada fila del objeto DataTable denominado Authors y crea una cadena utilizando los campos segundo y au_lname de Authors: Visual Basic .NETDim r As DataRow Dim str As String For Each r in ds.Tables("Authors").Rows str &= r(1) str &= r("au_lname") Next string str = ""; foreach(DataRow r in ds.Tables["Authors"].Rows) { str += r[1]; str += r["au_lname"]; }

C#

Acceso a datos con Microsoft ADO.NET

21

Demostracin: utilizar programticamente un DataSetCrear una conexin Crear DataAdapter Crear DataSet Leer los datos del DataSet programticamente

*****************************

Introduccin

En esta demostracin, examinaremos cdigo que crea y rellena un objeto DataSet, y veremos cmo ese cdigo rellena dinmicamente un control ListBox desde el objeto DataSet. Ejecutar la demostracin 1. Abrir la pgina UseDataSet.aspx del proyecto Demo08VB o Demo08CS que se pueden encontrar dentro del fichero demos08.zip. 2. Generar y examinar la pgina. La primera vez que se carga la pgina, el cuadro de lista lstItems se rellena dinmicamente con los nombres de las columnas del DataSet. El botn Get Number of Rows y el botn Get Values leen la informacin del DataSet. 3. Hacer clic en Get Number of Rows. El cdigo en el procedimiento de evento click muestra la propiedad Count de la coleccin Rows. 4. Seleccionar una columna en el cuadro de lista y hacer clic en Get Values. El cdigo en el procedimiento de evento click recorre en bucle las filas del DataSet y muestra el campo seleccionado. 5. En Visual Studio .NET, visualizar la pgina de cdigo subyacente de la pgina UseDataSet.aspx.

22

Acceso a datos con Microsoft ADO.NET

6. En el procedimiento de evento Page_Load, mostrar el cdigo que crea los siguientes objetos: SqlConnection SqlDataAdapter DataSet 7. En el procedimiento de evento Page_Load, mostrar cmo la primera vez que se muestra la pgina, el cuadro lista se rellena nicamente con los nombres de columnas. 8. En el procedimiento de evento cmdRows_Click, mostrar cmo se recupera el nmero de filas desde el DataSet. 9. En el procedimiento de evento cmdGetValues_Click, mostrar cmo se recupera el campo seleccionado desde el DataSet.

Acceso a datos con Microsoft ADO.NET

23

Utilizar un DataViewUn DataView puede personalizarse para presentar un subconjunto de datos de un DataTable La propiedad DefaultView devuelve el DataView predeterminado de la tablaDim dv As DataView = ds.Tables("Authors").DefaultView Dim dv As DataView = ds.Tables("Authors").DefaultView DataView dv = ds.Tables["Authors"].DefaultView; DataView dv = ds.Tables["Authors"].DefaultView;

Establecer una vista distinta de un DataSetDim dv As New DataView (ds.Tables("Authors")) Dim dv As New DataView (ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" dv.RowFilter = "state = 'CA'" DataView dv = new DataView(ds.Tables["Authors"]); DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = 'CA'"; dv.RowFilter = "state = 'CA'";

*****************************

Introduccin

Para mostrar los datos que almacena un objeto DataSet, podemos vincular el objeto DataSet directamente a un control enlazado a una lista o utilizar un objeto DataView. Un objeto DataView es una vista personalizada y enlazable de un nico objeto DataTable. Despus de crear un objeto DataView, el usuario puede utilizarlo para clasificar, filtrar, buscar, editar y navegar por datos. Los objetos DataView pueden personalizarse para presentar un subconjunto de datos de un objeto DataTable. Esta personalizacin permite tener dos controles vinculados al mismo objeto DataTable, pero con cada control mostrando distintas versiones de los datos. Por ejemplo, un control puede estar vinculado a un objeto DataView mostrando todas las filas de la tabla, y un segundo control puede estar vinculado a otro objeto DataView configurado para mostrar nicamente las filas que se han eliminado del objeto DataTable. Cada objeto DataTable de un objeto DataSet tiene una propiedad DefaultView, que devuelve la vista predeterminada de la tabla. El siguiente cdigo muestra cmo podemos acceder al objeto DataView dv predeterminado, de un objeto DataTable denominado Authors:Dim dv As DataView = ds.Tables("Authors").DefaultView DataView dv = ds.Tables["Authors"].DefaultView;

DataViews como subconjunto de un DataTable

DefaultView

Visual Basic .NET C#

24

Acceso a datos con Microsoft ADO.NET

DataView personalizado

Tambin podemos crear un objeto DataView personalizado basado en un subconjunto de datos que se encuentran en un objeto DataTable. Por ejemplo, podemos establecer la propiedad DataView RowFilter utilizando una expresin de filtro. La expresin de filtro puede tener el valor True o False. Tambin podemos establecer la propiedad Sort del objeto DataView utilizando una expresin de clasificacin. La expresin de clasificacin puede incluir los nombres de objetos DataColumn o un clculo. En el siguiente cdigo, la propiedad RowFilter, de un objeto DataView dv, est asignada para recuperar autores nicamente del estado de California y, a continuacin, ordenar los resultados por apellido:

Visual Basic .NET

Dim dv As New DataView(ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" dv.Sort = "au_lname" DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = CA"; dv.Sort = "au_lname";

C#

Acceso a datos con Microsoft ADO.NET

25

Prctica: organizar cdigo para crear un DataSetLos estudiantes: Reordenarn lneas de cdigo para crear un DataSet Tiempo: 5 minutos

*****************************

En esta prctica, reordenaremos lneas de cdigo ADO.NET en el orden correcto para crear un objeto DataSet. Ejecutar la prctica Visualizar la pgina http://localhost/Mod10VB/DataSetCode.aspx o http://localhost/Mod10CS/DataSetCode.aspx y organizar las lneas de cdigo ADO.NET en el orden correcto para crear un objeto DataSet. Nota Hay varias respuestas correctas para esta prctica.

26

Acceso a datos con Microsoft ADO.NET

Vincular un DataSet a un control enlazado a listaCrear el control

Vincular a un DataSet o un DataViewdg.DataSource = ds dg.DataSource = ds dg.DataMember = "Authors" dg.DataMember = "Authors" dg.DataBind() dg.DataBind() dg.DataSource = ds; dg.DataSource = ds; dg.DataMember = "Authors"; dg.DataMember = "Authors"; dg.DataBind(); dg.DataBind();

*****************************

Introduccin

ASP.NET incluye un conjunto de controles enlazados a listas, como los controles DataGrid, DataList y DataRepeater, que facilitan y flexibilizan la visualizacin de datos desde una fuente de datos. Los desarrolladores nicamente deben vincular estos controles a una fuente de datos para mostrar los datos seleccionados. El primer paso para vincular el objeto DataSet al control enlazado a lista es crear el control. El siguiente cdigo muestra cmo crear un control DataGrid dg que produce la salida HTML parecida a una hoja de clculo:

Crear el control

Vincular a un Dataset o DataView

Para vincular un objeto DataSet a un control DataGrid, en primer lugar debemos establecer la propiedad DataSource del control DataGrid a un objeto DataSet, DataTable o DataView, e invocar el mtodo DataBind. Si establecemos la propiedad DataSource del control DataGrid directamente a un objeto DataSet, el objeto DataTable con el ndice 0 se utiliza de forma predeterminada. Para especificar otro objeto DataTable, establecer la propiedad DataMember del control DataGrid con el nombre del objeto DataTable deseado. El siguiente cdigo de ejemplo muestra cmo vincular la tabla Authors, del objeto DataSet ds, a un control DataGrid denominado dg:

Visual Basic .NET

dg.DataSource = ds dg.DataMember = "Authors" dg.DataBind() dg.DataSource = ds; dg.DataMember = "Authors"; dg.DataBind();

C#

Acceso a datos con Microsoft ADO.NET

27

El siguiente cdigo muestra cmo podemos utilizar tambin la coleccin Tables del objeto DataSet ds para asignar el objeto DataTable Authors directamente a la propiedad DataSource del control DataGrid denominado dg: Visual Basic .NET C#dg.DataSource = ds.Tables("Authors") dg.DataBind() dg.DataSource = ds.Tables["Authors"]; dg.DataBind();

Si deseamos mostrar una vista distinta de los datos del control DataGrid, deberemos crear un nuevo objeto DataView desde el objeto DataSet y vincular ese objeto al control. Ejemplo de uso de una vista personalizada Visual Basic .NET El siguiente cdigo de ejemplo muestra cmo vincular un objeto DataView dv, filtrado para el estado de California, a un control DataGrid dg:Dim dv As New DataView(ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" dg.DataSource = dv dg.DataBind() DataView dv = new DataView(ds.Tables["Authors"]); dv.RowFilter = "state = 'CA'"; dg.DataSource = dv; dg.Databind();

C#

La siguiente ilustracin muestra el formato predeterminado del control DataGrid, mostrando datos de autores que viven en el estado de California.

28

Acceso a datos con Microsoft ADO.NET

Prctica dirigida por el instructor: mostrar un DataSetCrear una conexin Crear un DataAdapter Crear un DataSet Crear un DataView Vincular DataSet y DataView a controles DataGrid

*****************************

Introduccin

En esta prctica dirigida por el instructor, examinaremos cdigo que crea y rellena un objeto DataSet, crea un objeto DataView utilizando datos clasificados y filtrados del objeto DataSet, y vincula los controles DataGrid a los objetos DataSet y DataView. Ejecutar la prctica dirigida por el instructor 1. Abrir la pgina UseGrid.aspx del proyecto Mod10VB o Mod10CS de la solucin 2310Demos. 2. Generar y examinar la pgina UseGrid.aspx. Hay dos controles DataGrid vinculados al mismo objeto DataSet. El primer control DataGrid muestra todos los datos del objeto DataSet. El segundo control DataGrid est vinculado a un objeto DataView, que filtra y clasifica los datos. El segundo control DataGrid tambin implementa la clasificacin estableciendo la propiedad Sort del objeto DataView. 3. En Visual Studio .NET, visualizar el cdigo subyacente de la pgina UseGrid.aspx. 4. En el procedimiento de evento Page_Load, mostrar el cdigo que hace lo siguiente: Crea el objeto SqlConnection. Crea el objeto SqlDataAdapter. Crea un objeto DataSet. Vincula el primer control DataGrid con el objeto DataSet. Crea un objeto DataView y establece las propiedades RowFilter y Sort. Vincula el segundo control DataGrid con el objeto DataView.

Acceso a datos con Microsoft ADO.NET

29

Gestin de erroresLa conexin no se abre La cadena de conexin no es vlida El servidor o la base de datos no se encuentran Fallo de inicio de sesin El DataAdapter no puede crear un DataSet Sintaxis SQL no vlida Nombre de tabla o campo no vlido

Cdigo de ejemplo*****************************

Introduccin

Existen dos fuentes principales de error cuando intentamos acceder a datos desde un formulario Web Form utilizando ADO.NET: problemas de conexin y una falta de alineacin con la base de datos. Cuando se invoca el mtodo Open, puede producirse ms de un error. Ante la posibilidad de que ocurra ms de un error, debemos ser capaces de gestionar mltiples errores utilizando las instrucciones TryCatchFinally. Si se produce una o ms excepciones SqlException, podemos recorrer todos los objetos de excepciones SQL devueltos a nuestra aplicacin Web. El siguiente cdigo muestra cmo utilizar una instruccin Try...Catch para capturar mltiples tipos de excepciones. En este ejemplo, el cdigo captura el tipo de excepcin InvalidOperationException, junto con otras excepciones, utilizando un procesador de excepciones genrico:

La conexin no se abre

30

Acceso a datos con Microsoft ADO.NETTry Dim conn As New SqlConnection(...) Dim da As New SqlDataAdapter(..., conn) Dim ds As New DataSet() da.Fill(ds) Catch ex1 As System.Data.SqlClient.SqlException Select Case ex1.Number Case 17 lblErrors.Text = lblErrors.Text & _ ("invalid Server name") Case 156, 170 'bad SQL syntax lblErrors.Text = lblErrors.Text & _ ("incorrect syntax") Case 207 'bad field name in select lblErrors.Text = lblErrors.Text & _ ("invalid column name") Case 208 'bad table name in select lblErrors.Text = lblErrors.Text & _ ("invalid object name") Case 18452 lblErrors.Text = lblErrors.Text & _ ("invalid user name") Case 18456 lblErrors.Text = lblErrors.Text & _ ("invalid password") Case 4060 lblErrors.Text = lblErrors.Text & _ ("invalid database") End Select Catch ex2 As System.Exception lblErrors.Text = lblErrors.Text & _ ("Unexpected exception: " & ex2.Message & ". ") End Try

Visual Basic .NET

Acceso a datos con Microsoft ADO.NET

31

C#

try { SqlConnection conn = new SqlConnection("..."); SqlDataAdapter da = new SqlDataAdapter("...",conn); DataSet ds = new DataSet(); da.Fill(ds); } catch (System.Data.SqlClient.SqlException ex1) { switch(ex1.Number) { case 17: lblErrors.Text = lblErrors.Text + ("invalid Server name"); break; case 156: case 170: //bad SQL syntax lblErrors.Text = lblErrors.Text + ("incorrect syntax"); break; case 207: //bad field name in select lblErrors.Text = lblErrors.Text + ("invalid column name"); break; case 208: //bad table name in select lblErrors.Text = lblErrors.Text + ("invalid object name"); break; case 18452: lblErrors.Text = lblErrors.Text + ("invalid user name"); break; case 18456: lblErrors.Text = lblErrors.Text + ("invalid password"); break; case 4060: lblErrors.Text = lblErrors.Text + ("invalid database"); break; } } catch (System.Exception ex2) { lblErrors.Text = lblErrors.Text + ("Unexpected exception: " + ex2.Message + ". "); }

32

Acceso a datos con Microsoft ADO.NET

El DataAdapter no puede crear un DataSet

La clase SqlException contiene la excepcin que se lanza cuando SQL Server devuelve un aviso o error. Esta clase se crea siempre que el Proveedor de Datos .NET de SQL Server encuentra una situacin que no puede gestionar. La clase SqlException siempre contiene al menos la instancia de un objeto SqlError. Podemos utilizar el nivel de severidad de la clase para que nos ayude a determinar el contenido de un mensaje mostrado por una excepcin. Para capturar objetos SqlException, debemos buscar errores de tipo System.Data.SqlClient.SqlException. Cuando se produce un objeto SqlException, el objeto de excepcin contiene una coleccin Errors. El siguiente ejemplo muestra cmo podemos recorrer la coleccin Errors para encontrar informacin sobre los errores que se han producido:

Visual Basic .NET

Dim erData As SqlClient.SqlErrorCollection = ex1.Errors Dim i As Integer For i = 0 To erData.Count - 1 lblErrors.Text &= ("Error " & i & ": " & _ erData(i).Number & ", " & _ erData(i).Class & ", " & _ erData(i).Message & "
") Next i SqlErrorCollection erData = ex1.Errors; for(int i = 0; i < erData.Count; i++) { lblErrors.Text += "Error" + i + ": " + erData[i].Number + ", " + erData[i].Class + ", " + erData[i].Message + "
"; }

C#

Errores de SQL Server

Los errores de SQL Server comparten propiedades comunes y estn identificados por un nmero y un nivel de gravedad: La clase SqlError y propiedades comunes Cada objeto SqlError tiene las propiedades comunes que se muestran en la siguiente tabla.Propiedad Class LineNumber Descripcin Obtiene el nivel de gravedad del error devuelto por SQL Server. Obtiene el nmero de lnea del archivo de proceso por lotes con comandos Transact-SQL o el procedimiento almacenado que contiene el error. Obtiene el texto que describe el error. Obtiene un nmero que identifica el tipo de error.

Message Number

Nota Para una lista completa de las propiedades de la clase SqlError, consultar la documentacin de Visual Studio .NET.

Acceso a datos con Microsoft ADO.NET

33

Nmeros de error de SQL Server La propiedad Number permite determinar el error especfico que se ha producido. Por ejemplo, la siguiente tabla ofrece una lista de algunos nmeros de errores SQL Server ms habituales y sus descripciones.Nmero 17 4060 18456 Descripcin Nombre de servidor no vlido Nombre de base de datos no vlido Nombre de usuario o contrasea no vlidos

Niveles de gravedad de SQL Server La siguiente tabla describe niveles de severidad de errores de SQL Server, a los que se accede a travs de la propiedad Class de la clase SqlError.Gravedad 11-16 17-19 Descripcin Generado por usuario Errores de software o hardware Accin Puede ser corregido por el usuario. Podemos seguir trabajando, pero es posible que no podamos ejecutar una instruccin determinada. SqlConnection permanece abierto. El servidor cierra SqlConnection. El usuario puede volver a abrir la conexin.

20-25

Errores de software o hardware

34

Acceso a datos con Microsoft ADO.NET

Leccin: utilizar mltiples tablasAlmacenar mltiples tablas Crear relaciones Navegar programticamente entre tablas utilizando relaciones Navegar visualmente entre tablas utilizando relaciones Prctica dirigida por el instructor: mostrar datos de mltiples tablas

*****************************

Introduccin

Uno de los puntos fuertes de los objetos DataSet es que pueden contener mltiples objetos DataTable, y cada objeto DataTable puede provenir de una fuente distinta. En esta leccin, estudiaremos cmo almacenar mltiples tablas de datos en un objeto DataSet y cmo mostrar esos datos en controles DataGrid.

Objetivos de la leccin

En esta leccin, aprenderemos a: Almacenar datos en mltiples tablas de mltiples fuentes. Crear relaciones entre datos de mltiples fuentes de datos. Utilizar relaciones para navegar entre tablas de datos de mltiples fuentes.

Acceso a datos con Microsoft ADO.NET

35

Almacenar mltiples tablasAgregar la primera tabladaCustomers = New SqlDataAdapter _ daCustomers = New SqlDataAdapter _ ("select * from Customers", conn1) ("select * from Customers", conn1) daCustomers.Fill(ds, "Customers") daCustomers.Fill(ds, "Customers")

Agregar la(s) siguiente(s) tabla(s)daOrders = New SqlDataAdapter _ daOrders = New SqlDataAdapter _ ("select * from Orders", conn2) ("select * from Orders", conn2) daOrders.Fill(ds, "Orders") daOrders.Fill(ds, "Orders")Customers

conn1DataSet*****************************

conn2Orders

Introduccin

Para rellenar un objeto DataSet con mltiples objetos DataTable que provienen de una o ms fuentes de datos, debemos utilizar mltiples objetos DataAdapter. Cada objeto DataAdapter rellena una tabla distinta del objeto DataSet. Como el orden de los objetos DataAdapter controla el orden de implementacin, podemos controlar el orden en que se escriben las actualizaciones a y desde la base de datos. Este control sobre el orden de implementacin nos ayuda a conservar la integridad referencial entre las tablas relacionadas de la base de datos. Un ejemplo de control del orden en que se crean los objetos DataTable podra ser un responsable de ventas que necesita recuperar informacin de clientes, e informacin sobre rdenes de compra realizadas por cada cliente, desde una base de datos central. Para satisfacer este requerimiento, podemos crear una aplicacin Web que contenga dos objetos DataAdapter, el primero para recuperar registros de clientes y el segundo para recuperar registros de rdenes de compra. Cargando primero los datos de los clientes, podemos conservar la integridad referencial entre los clientes y sus rdenes de compra.

Agregar la primera tabla

36

Acceso a datos con Microsoft ADO.NET

El siguiente cdigo puebla un objeto Customers DataTable utilizando un objeto DataAdapter denominado daCustomers: Visual Basic .NETDim Dim Dim Dim conn As SqlConnection daCustomers As SqlDataAdapter daOrders As SqlDataAdapter ds As New DataSet()

'create a connection to the Pubs database conn = New SqlConnection("data source=localhost;" & _ "integrated security=true;initial catalog=northwind") 'create the first DataTable daCustomers = New SqlDataAdapter _ ("select CustomerID, CompanyName from Customers", conn) daCustomers.Fill(ds, "Customers")

C#

SqlConnection conn; SqlDataAdapter daCustomers; SqlDataAdapter daOrders; DataSet ds = new DataSet(); // Create a connection to the Pubs database conn = new SqlConnection("data source=localhost; " + "integrated security=true;initial catalog=northwind"); // Create the first DataTable daCustomers = new SqlDataAdapter ("select CustomerID, CompanyName from Customers", conn); daCustomers.Fill(ds, "Customers");

Agregar tablas subsiguientes

Despus de cargar el primer objeto DataTable, podemos rellenar objetos DataTable adicionales y definir las relaciones entre los objetos basadas en el objeto DataTable inicial. Siguiendo con el ejemplo anterior, rellenaramos el objeto Orders DataTable. El siguiente cdigo puebla el objeto Orders DataTable utilizando un objeto DataAdapter denominado daOrders:

Visual Basic .NET

'Create the second DataTable daOrders = New SqlDataAdapter _ ("select CustomerID, OrderID, OrderDate, ShippedDate " & _ "from Orders", conn) daOrders.Fill(ds, "Orders") // Create the second DataTable daOrders = new SqlDataAdapter ("select CustomerID, OrderID, OrderDate, ShippedDate " + "from Orders", conn); daOrders.Fill(ds, "Orders");

C#

Nota Deberamos utilizar un nuevo objeto DataAdapter para cada objeto DataTable de un objeto DataSet.

Acceso a datos con Microsoft ADO.NET

37

Crear relacionesIdentificar la columna primariaDim parentCol As DataColumn = _ Dim parentCol As DataColumn = _ ds.Tables("Customers").Columns("CustomerID") ds.Tables("Customers").Columns("CustomerID")

Identificar la columna secundariaDim childCol As DataColumn = _ Dim childCol As DataColumn = _ ds.Tables("Orders").Columns("CustomerID") ds.Tables("Orders").Columns("CustomerID")

Crear DataRelation

parentCol

Tabla Customers

DataRelation

Dim dr As New DataRelation _ Dim dr As New DataRelation _ ("name", parentCol, _ ("name", parentCol, _ childCol) childCol) ds.DataRelations.Add(dr) ds.DataRelations.Add(dr)

DataSet

childCol Tabla Orders

Cdigo de ejemplo C#*****************************

Introduccin

Se utiliza un objeto DataRelation para referenciar dos objetos DataTable entre s a travs de objetos DataColumn. Por ejemplo, en una relacin Customer/Orders, Customers es la tabla primaria de la relacin y Orders es la secundaria. Esta relacin es similar a una relacin clave principal/clave fornea. Las relaciones se crean entre columnas coincidentes de las tablas primaria y secundaria. El valor de DataType para ambas columnas debe ser idntico. Los objetos DataRelation estn contenidos en un objeto DataRelationCollection, al que podemos acceder no slo a travs de la propiedad Relations del objeto DataSet, sino tambin a travs de las propiedades ChildRelations y ParentRelations del objeto DataTable. Para crear un objeto DataRelation, utilizamos el constructor DataRelation y el mtodo Add de la coleccin Relations de un objeto DataSet.

38

Acceso a datos con Microsoft ADO.NET

Ejemplo de objeto DataRelation Visual Basic .NET

El siguiente ejemplo crea un objeto DataRelation dr y lo agrega al objeto DataSet ds:'Create DataRelation: each publisher publishes many titles Dim dr As DataRelation Dim parentCol As DataColumn Dim childCol As DataColumn parentCol = ds.Tables("Customers").Columns("CustomerID") childCol = ds.Tables("Orders").Columns("CustomerID") dr = New DataRelation("CustOrders", parentCol, childCol) ds.Relations.Add(dr)

C#

// Create DataRelation: each publisher publishes many titles DataRelation dr; DataColumn parentCol; DataColumn childCol; parentCol = ds.Tables["Customers"].Columns["CustomerID"]; childCol = ds.Tables["Orders"].Columns["CustomerID"]; dr = new DataRelation("CustOrders", parentCol, childCol); ds.Relations.Add(dr);

Nota Para ms informacin sobre relaciones de datos, ver Explorar una relacin entre tablas, en la documentacin de Visual Studio .NET.

Acceso a datos con Microsoft ADO.NET

39

Navegar programticamente entre tablas utilizando relaciones

ds.Tables(index).Rows(index).GetChildRows("relation") ds.Tables(index).Rows(index).GetChildRows("relation") ds.Tables(index).Rows(index).GetParentRow("relation") ds.Tables(index).Rows(index).GetParentRow("relation") ds.Tables[index].Rows[index].GetChildRows("relation"); ds.Tables[index].Rows[index].GetChildRows("relation"); ds.Tables[index].Rows[index].GetParentRow("relation"); ds.Tables[index].Rows[index].GetParentRow("relation");

Customers GetChildRows

Orders

DataSet

GetParentRow

*****************************

Introduccin

En muchos ejemplos de aplicaciones Web, necesitaremos trabajar con datos de ms de una tabla, y a menudo querremos trabajar con datos de tablas relacionadas. La relacin entre una tabla primaria y una tabla secundaria se denomina relacin principal-detalle. Un ejemplo de esta relacin sera recuperar el registro de un cliente y visualizar tambin informacin de los pedidos relacionados con ese cliente. El modelo de objetos DataSet desconectado nos permite trabajar con mltiples objetos DataTables en nuestra aplicacin Web y definir una relacin entre esos objetos DataTable. Podemos utilizar la relacin para navegar por registros relacionados de las tablas.

Navegar programticamente

Una de las principales funciones de una clase DataRelation es permitir la navegacin desde un objeto DataTable a otro objeto DataTable en un objeto DataSet. Esta capacidad de navegacin nos permite recuperar todos los objetos DataRow relacionados en un objeto DataTable cuando tenemos un nico objeto DataRow de un objeto DataTable relacionado. Por ejemplo, tras establecer un objeto DataRelation entre un objeto DataTable de clientes y un objeto DataTable de rdenes de compra, podemos recuperar todas las filas de los pedidos de un determinado cliente utilizando el mtodo DataRow.GetChildRows. El mtodo GetChildRows de un objeto DataRow recupera las filas relacionadas de un objeto DataTable secundario. El mtodo GetParentRow de un objeto DataRow recupera la fila primaria de un objeto DataTable primario.

40

Acceso a datos con Microsoft ADO.NET

Por ejemplo, podemos tener un control DataGrid denominado dgCustomers que muestre datos del objeto DataTable Customers, que es un objeto DataSet ds. El siguiente cdigo muestra un bucle que recorre todos los registros childOrder para obtener una lista de nmeros de pedido: Visual Basic .NETcurrentParentRow = ds.Tables("Customers"). _ Rows(dgCustomers.SelectedIndex) For Each r In currentParentRow.GetChildRows("CustOrders") Label1.Text &= r("OrderID") & ", " Next currentParentRow = ds.Tables["Customers"]. Rows[dgCustomers.SelectedIndex]; foreach(DataRow r in currentParentRow.GetChildRows("CustOrders")) { Label1.Text += r["OrderID"] + ","; }

C#

Acceso a datos con Microsoft ADO.NET

41

Navegar visualmente entre tablas utilizando relacionesDim tableView As DataView Dim tableView As DataView Dim currentRowView As DataRowView Dim currentRowView As DataRowView tableView = New DataView(ds.Tables("Customers")) tableView = New DataView(ds.Tables("Customers")) currentRowView = tableView(dgCustomers.SelectedIndex) currentRowView = tableView(dgCustomers.SelectedIndex) dgChild.DataSource = currentRowView.CreateChildView("CustOrders") dgChild.DataSource = currentRowView.CreateChildView("CustOrders") DataView tableView; DataView tableView; DataRowView currentRowView; DataRowView currentRowView; tableView = new DataView(ds.Tables["Customers"]); tableView = new DataView(ds.Tables["Customers"]); currentRowView = tableView[dgCustomers.SelectedIndex]; currentRowView = tableView[dgCustomers.SelectedIndex]; dgChild.DataSource = currentRowView.CreateChildView("CustOrders"); dgChild.DataSource = currentRowView.CreateChildView("CustOrders"); Customers DataRowView Orders

DataView

CreateChildView

DataSet*****************************

Navegar visualmente

Con Visual Studio .NET tambin podemos mostrar relaciones arrastrando controles desde el cuadro de herramientas. Si deseamos mostrar las filas secundarias de una relacin en otro control enlazado a lista, podemos utilizar el mtodo CreateChildView y vincular el control enlazado a lista al objeto DataView resultante. Para conectar dos controles enlazados a lista a travs de un objeto DataRelation, necesitamos obtener el objeto DataRowView de la fila seleccionada del control enlazado a lista primario, e invocar el mtodo CreateChildView del objeto DataRowView. El siguiente cdigo crea un objeto DataView desde un objeto DataRelation para mostrar registros secundarios en un control DataGrid:

Visual Basic .NET

Dim parentTableView As New _ DataView(ds.Tables("Customers")) Dim currentRowView As DataRowView = _ parentTableView(dgCustomers.SelectedIndex) dgChild.DataSource = _ currentRowView.CreateChildView("CustOrders") dgChild.DataBind() DataView parentTableView = new DataView(ds.Tables["Customers"]); DataRowView currentRowView = parentTableView[dgCustomers.SelectedIndex]; dgChild.DataSource = currentRowView.CreateChildView("CustOrders"); dgChild.DataBind();

C#

42

Acceso a datos con Microsoft ADO.NET

Prctica dirigida por el instructor: mostrar datos de mltiples tablasProgramticamente: Crear un DataSet Crear un DataRelation Mostrar registros secundarios utilizando DataRelation Visualmente: Invocar CreateChildView

*****************************

Ejecutar la prctica dirigida por el instructor 1. Abrir la pgina UseRelations.aspx del proyecto Mod10VB o Mod10CS de la solucin 2310Demos. 2. Generar y examinar la pgina UseRelations.aspx. La pgina tiene dos controles DataGrid. Cuando seleccionamos un cliente en el primer control DataGrid, el procedimiento de evento lee las filas relacionadas del objeto DataTable Orders, basndose en la relacin y los nmeros de pedido que se muestran, y genera un DataView para el control DataGrid secundario. 3. En Visual Studio .NET, visualizar la pgina de cdigo subyacente de la pgina UseRelations.aspx. 4. El procedimiento de evento Page_Load invoca tres sub-procedimientos: CreateDataSet, MakeDataRelation y BindToDataGrid: CreateDataSet. Este sub-procedimiento crea el objeto Connection, el objeto DataAdapter y el objeto DataSet. MakeDataRelation. Este sub-procedimiento crea el objeto DataRelation entre las dos tablas. La relacin es Publishers a Titles. BindToDataGrid. Este sub-procedimiento vincula el control DataGrid a la tabla primaria, Customers. 5. El procedimiento de evento dgParent_SelectedIndexChanged muestra filas secundarias de dos modos: programticamente y visualmente: Programticamente. El procedimiento invoca el mtodo GetChildRows de la fila actual recorre los registros devueltos para mostrar el campo OrderID de cada fila. Visualmente. El procedimiento invoca el mtodo CreateChildView de la vista de la fila actual y la vincula a un segundo control DataGrid.

Acceso a datos con Microsoft ADO.NET

43

Mostrar el Asistente para formularios de datos 1. Hacer clic con el botn derecho en el proyecto Mod10, clic en Agregar y clic en Agregar nuevo elemento. 2. En el cuadro de dilogo Agregar nuevo elemento, hacer clic en el Asistente para formularios de datos en la lista Plantillas, escribir CustOrders.aspx en el campo Nombre y hacer clic en Abrir. 3. Seguir los pasos del asistente como muestra la siguiente tabla.En esta pgina Bienvenido Escoger el DataSet que deseamos utilizar Escoger una conexin de datos Hacer lo siguiente Hacer clic en Siguiente. Hacer clic en Crear un nuevo DataSet denominado, escribir dsCustOrders en el campo y hacer clic en Siguiente. Seleccionar una conexin existente a la base de datos Northwind o crear una nueva, y hacer clic en Siguiente. Agregar las tablas Customers y Orders a la lista Elemento(s) seleccionado(s) y hacer clic en Siguiente. Introducir CustOrders en el campo Nombre, seleccionar Customers como Tabla primaria, seleccionar Orders como Tabla secundaria, seleccionar CustomerID como Clave para ambas tablas (primaria y secundaria), hacer clic en el botn > y clic en Siguiente. Mantener los valores predeterminados para mostrar todas las columnas en las tablas Principal y Detalle, y hacer clic en Finalizar.

Escoger tablas o vistas

Crear una relacin entre tablas

Escoger las tablas y columnas a mostrar

El Asistente para formularios de datos crea un formulario Web Form con un control DataGrid y un botn Load. 4. Hacer clic con el botn derecho en la pgina CustOrders.aspx del Explorador de soluciones y hacer clic en Ver en el navegador. 5. En el navegador, hacer clic en Cargar. El control DataGrid se carga con datos de la tabla Customers y se muestran los datos. 6. Hacer clic en Mostrar detalles para uno de los clientes y desplazarse hasta la parte inferior de la pgina. La informacin detallada del cliente seleccionado se muestra en otra tabla.

44

Acceso a datos con Microsoft ADO.NET

Leccin: acceder a datos con DataReadersQu es un DataReader? Crear un DataReader Leer datos de un DataReader Vincular un DataReader a un control enlazado a lista Prctica: organizar cdigo para crear un DataReader Demostracin: mostrar datos utilizando DataReaders

*****************************

Introduccin

La ventaja de utilizar un objeto DataSet es que proporciona una copia desconectada de la base de datos. Para aplicaciones Web de larga ejecucin, el uso de un objeto DataSet es a menudo la mejor opcin. Sin embargo, los desarrolladores frecuentemente realizan operaciones cortas y sencillas, como mostrar un nico conjunto de datos directamente al usuario o acceder a una nica contrasea, con cada peticin de datos. Para ese tipo de operaciones, los desarrolladores no necesitan mantener un objeto DataSet; pueden utilizar un objeto DataReader. En esta seccin, aprenderemos a leer datos de una fuente de datos utilizando la clase DataReader.

Objetivos de la leccin

En esta leccin, aprenderemos a: Explicar cmo funciona la clase DataReader. Crear un objeto DataReader. Leer datos de un objeto DataReader. Vincular un control de servidor enlazado a lista a un objeto DataReader.

Acceso a datos con Microsoft ADO.NET

45

Qu es un DataReader?Slo hacia delante, slo lectura Acceso rpido a datos Conexin a una fuente de datos Gestin de la conexin por s mismo Gestin de los datos por s mismo, o vincularlos a un control enlazado a lista Utiliza menos recursos del servidor

*****************************

Introduccin

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 crtico. Para abordar estas situaciones del uso de memoria, la clase DataReader est diseada para producir un flujo de datos de slo lectura y slo hacia delante que la base de datos devuelve. Por tanto, slo hay un registro en memoria cada vez en el servidor. La clase DataReader proporciona una transferencia de datos de slo lectura y slo hacia delante que puede vincularse a un control enlazado a lista. Por ejemplo, si slo 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 ms rpidos que los objetos DataSet por la naturaleza ligera de la clase DataReader. En la creacin 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 atrs. Hay muy poca sobrecarga en un objeto DataReader ya que es slo hacia delante y slo de lectura. Esta relativa falta de sobrecarga supone un acceso a datos ms rpido con un objeto DataReader que con un objeto DataSet. ADO.NET incluye dos tipos de objetos DataReader: el objeto SqlDataReader para datos SQL Server versin 7.0 o posterior, y el objeto OleDbDataReader para datos OLE DB Data Provider. Utilizamos los objetos OleDbCommand y SqlCommand, y el mtodo ExecuteReader, para transferir datos a un objeto DataReader.

Slo hacia delante, slo lectura

Acceso rpido a datos

Conexin a la fuente de datos

46

Acceso a datos con Microsoft ADO.NET

Gestin de la conexin por s mismo

A diferencia de un objeto DataAdapter que se abre y cierra automticamente, debemos gestionar la conexin del objeto DataReader por nosotros mismos. La clase DataReader se parece a la clase DataAdapter en que creamos un objeto Command desde una instruccin y una conexin SQL. Sin embargo, con el objeto DataReader Command, debemos abrir y cerrar explcitamente el objeto Connection. Tenemos la opcin de recorrer los datos del objeto DataReader y mostrarlo programticamente, o podemos vincular un objeto DataReader a un control enlazado a lista. En ambos casos, debemos escribir el cdigo nosotros mismos. Debido a que el DataReader no es una representacin en memoria de los datos, utilizar un DataReader afecta poco a la disponibilidad de los recursos del servidor.

Gestin de los datos uno mismo Utiliza menos recursos del servidor

Acceso a datos con Microsoft ADO.NET

47

Crear un DataReaderPara utilizar un DataReader:1 1. Crear y abrir la conexin a la base de datos 1 2 2. Crear un objeto Command 2 3 3. Crear un DataReader desde el objeto Command 3 4 4. Invocar el mtodo ExecuteReader 4 5 5. Utilizar el objeto DataReader 5 6 6 6. Cerrar el objeto DataReader 7 7 7. Cerrar el objeto Connection

Utilizar el controlador de errores TryCatchFinally Cdigo de ejemplo*****************************

Introduccin

Para utilizar un objeto SqlDataReader, necesitamos crear un objeto SqlCommand en lugar de un objeto SqlDataAdapter, que es lo que se necesitaba con los objetos DataSet. El objeto SqlCommand expone un mtodo ExecuteReader que devuelve un objeto SqlDataReader. Similar a un objeto DataAdapter, creamos un objeto Command desde una instruccin SQL y una conexin. Sin embargo, con el objeto DataReader Command, debemos explcitamente abrir y cerrar el objeto Connection.

Utilizar un DataReader

Para utilizar un objeto DataReader, debemos codificar manualmente todo el proceso de conexin. Para utilizar un objeto DataReader se requieren los siguientes pasos: 1. Crear y abrir la conexin a la base de datos. 2. Crear un objeto Command. 3. Crear el objeto DataReader desde el objeto Command. 4. Invocar el mtodo ExecuteReader. 5. Utilizar el objeto DataReader. 6. Cerrar el objeto DataReader. 7. Cerrar el objeto Connection.

48

Acceso a datos con Microsoft ADO.NET

El siguiente cdigo de ejemplo abre una conexin a una base de datos, crea un objeto DataReader desde un objeto Command, y recorre el objeto DataReader y agrega campos de los registros a un control ListBox: Visual Basic .NET'Create connection and command objects Dim conn As New SqlConnection _ ("data source=localhost;integrated security=true;" & _ "initial catalog=pubs") Dim cmdAuthors As New SqlCommand _ ("select * from Authors", conn) conn.Open() 'create DataReader and display data Dim dr As SqlDataReader dr = cmdAuthors.ExecuteReader() Do While dr.Read() lstBuiltNames.Items.Add(dr("au_lname") + ", " + _ dr("au_fname")) Loop 'close DataReader and Connection dr.Close() conn.Close()

C#

// Open Connection and create command SqlConnection conn = new SqlConnection ("data source=localhost; integrated security=true; " + "initial catalog=pubs;"); SqlCommand cmdAuthors = new SqlCommand ("select * from Authors", conn); conn.Open(); // Create DataReader and read data SqlDataReader dr; dr = cmdAuthors.ExecuteReader(); while (dr.Read()) { lstBuiltNames.Items.Add(dr["au_lname"] + ", " + dr["au_fname"]); } // Close DataReader and Connection dr.Close(); conn.Close();

Acceso a datos con Microsoft ADO.NET

49

Utilizar el controlador de eventos TryCatchFinally

Cuando se utilizan conexiones con el objeto DataReader, debemos utilizar siempre una instruccin TryCatchFinally para garantizar que si algo falla, la conexin se cerrar. De lo contrario, la conexin puede permanecer abierta de forma indefinida. El siguiente cdigo de un objeto DataReader captura errores y cierra la conexin:

Visual Basic .NET

Try conn.Open() dr = cmdAuthors.ExecuteReader() 'use the returned data in the DataReaders Catch e As Exception 'handle the error Finally dr.Close() conn.Close() End Try try { conn.Open(); dr = cmdAuthors.ExecuteReader(); // use the returned data in the DataReaders } catch(Exception e) { // Handle error } finally { dr.Close(); conn.Close(); }

C#

50

Acceso a datos con Microsoft ADO.NET

Leer datos desde un DataReaderInvocar Read para cada registro Devuelve false cuando no hay ms registros Acceso a campos Parmetro es la posicin ordinal o nombre del campo Las funciones Get ofrecen un mejor rendimientoDo While myReader.Read() Do While myReader.Read() str &= myReader(1) str &= myReader(1) str &= myReader("field") str &= myReader("field") str &= myReader.GetDateTime(2) str &= myReader.GetDateTime(2) Loop Loop while (myReader.Read()) while (myReader.Read()) { { str += myReader[1]; str += myReader[1]; str += myReader["field"]; str += myReader["field"]; str += myReader.GetDateTime(2); str += myReader.GetDateTime(2); } }

Cerrar el DataReader Cerrar la conexin*****************************

Invocar Read para cada registro

Tras invocar el mtodo ExecuteReader del objeto Command, podemos acceder a un registro del objeto DataReader invocando el mtodo Read. El objeto DataReader se posiciona de modo predeterminado antes del primer registro; por tanto, debemos invocar el mtodo Read antes de acceder a algn dato. Cuando ya no hay ms registros disponibles, el mtodo Read devuelve un valor nulo. El siguiente cdigo recorre todos los registros de un objeto DataReader dr, y muestra el campo au_fname en el control Label lblName:

Visual Basic .NET

Do While dr.Read() lblName.Text &= dr("au_fname") Loop while (dr.Read()) { lblName.Text += dr["au_name"]; }

C#

Acceso a datos con Microsoft ADO.NET

51

Acceso a campos

Para obtener los datos de los campos del registro actual, podemos acceder a un campo por su posicin ordinal, por su nombre o invocando un mtodo Get adecuado, como GetDateTime, GetDouble, GetInt32 o GetString. Sugerencia Utilizar un mtodo Get especfico es ms rpido que acceder por la posicin ordinal o por el nombre, porque el DataReader no necesita comprobar el formato de los datos. Por ejemplo, el siguiente cdigo de ejemplo lee los campos del primer y ltimo nombre, ambos valores de cadena, desde el primer registro del objeto DataReader dr, utilizando el mtodo GetString():

Visual Basic .NET

dr.Read() lblName.Text = dr.GetString(1) + ", " + _ dr.GetString(2) dr.Read(); lblName.Text = dr.GetString(1) + ", " + dr.GetString(2);

C#

Tambin podemos referenciar, por nombre, los campos de datos del registro actual del objeto DataReader. Seguidamente, podemos invocar una funcin de conversin apropiada, como muestra el siguiente cdigo de ejemplo: Visual Basic .NET C# Cerrar el DataReadermyReader("au_fname") myReader["au_fname"];

Mientras el objeto DataReader est en uso, la conexin asociada est ocupada dando servicio al objeto DataReader. Por tanto, debemos invocar el mtodo Close para cerrar el objeto DataReader cuando finalicemos su uso, como muestra el siguiente cdigo de ejemplo:myReader.Close() myReader.Close();

Visual Basic .NET C# Cerrar la conexin

DataReader no cierra automticamente la conexin. Debemos invocar explcitamente el mtodo Close para cerrar la conexin cuando finalicemos su uso, como muestra el siguiente cdigo de ejemplo:conn.Close() conn.Close();

Visual Basic .NET C#

52

Acceso a datos con Microsoft ADO.NET

Vincular un DataReader a un control enlazado a listaCrear el control

Vincular a un DataReaderdgAuthors.DataSource = dr dgAuthors.DataSource = dr dgAuthors.DataBind() dgAuthors.DataBind() dgAuthors.DataSource = dr; dgAuthors.DataSource = dr; dgAuthors.DataBind(); dgAuthors.DataBind();

*****************************

Introduccin

Adems de recorrer los datos del objeto DataReader y mostrarlos programticamente, podemos vincular un objeto DataReader a un control enlazado a lista. Para vincular un objeto DataReader a un control enlazado a lista, establecemos la propiedad DataSource del control enlazado a lista al objeto DataReader. El siguiente cdigo de ejemplo crea un objeto DataReader dr, lo vincula a un control ListBox au_lname, y cierra los objetos DataReader y Connection:

Visual Basic .NET

Dim conn As New SqlConnection _ ("data source=localhost;integrated security=true;" & _ "initial catalog=pubs") conn.Open() Dim cmdAuthors As New SQLCommand _ ("select * from Authors", conn) 'bind the datareader to a listbox Dim dr As SqlDataReader dr = cmdAuthors.ExecuteReader() lstBoundNames.DataSource = dr lstBoundNames.DataTextField = "au_lname" lstBoundNames.DataBind() 'close the datareader and the connection dr.Close() conn.Close()

Acceso a datos con Microsoft ADO.NET

53

C#

SqlConnection conn = new SqlConnection ("data source=localhost; integrated security=true; " + "initial catalog=pubs"); conn.Open(); SqlCommand cmdAuthors = new SqlCommand ("select * from Authors", conn); //bind the datareader to a listbox SqlDataReader dr; dr = cmdAuthors.ExecuteReader(); lstBoundNames.DataSource = dr; lstBoundNames.DataTextField = "au_lname"; lstBoundNames.DataBind(); //close the datareader and the connection dr.Close(); conn.Close();

54

Acceso a datos con Microsoft ADO.NET

Prctica: organizar cdigo para crear un DataReaderLos estudiantes: Reordenarn lneas de cdigo para crear un DataReader Tiempo: 5 minutos

*****************************

En esta prctica, reorganizaremos las lneas de cdigo ADO.NET en el orden correcto para crear un objeto DataReader. Ejecutar la prctica Visualizar la pgina http://localhost/Mod10VB/DataReaderCode.aspx o http://localhost/Mod10CS/DataReaderCode.aspx y colocar las lneas de cdigo ADO.NET en el orden correcto para crear un objeto DataReader. Nota Hay varias respuestas correctas para esta prctica.

Acceso a datos con Microsoft ADO.NET

55

Demostracin: mostrar datos utilizando DataReadersCrear un objeto SqlConnection Crear un objeto DataReader Vincular el DataReader a un Cuadro de lista Generar los elementos del Cuadro de lista a partir de datos proporcionados por el DataReader

*****************************

Introduccin

En esta demostracin, examinaremos el cdigo que crea y rellena un objeto DataReader utilizando un objeto SQLCommand que vincula el objeto DataReader a un control ListBox, y vuelve a crear el DataReader para vincularlo a un segundo control ListBox. Ejecutar la demostracin 1. Abrir la pgina DataReader.aspx del proyecto Demo08VB o Demo08CS que se pueden encontrar dentro del fichero demos08.zip. 2. Generar y examinar la pgina DataReader.aspx. Hay dos cuadros de lista que muestran los mismos datos. El primer cuadro de lista est vinculado a un objeto DataReader, mientras que el segundo cuadro de lista se genera recorriendo los registros del objeto DataReader y generando programticamente cada entrada del control ListBox. 3. En Visual Studio .NET, visualizar el cdigo subyacente de la pgina DataReader.aspx. 4. En el procedimiento de evento Page_Load, mostrar el cdigo que hace lo siguiente: Crea un objeto SqlConnection. Crea un objeto SqlCommand. Crea un objeto DataReader. Vincula el objeto DataReader al primer control ListBox. Cerrar el objeto DataReader y crearlo de nuevo. Este paso es necesario debido a que un objeto DataReader es una vista de los datos slo hacia delante y ya habamos llegado al final de los datos cuando el objeto DataReader se vincul al control ListBox. Recorre el objeto DataReader y agrega dos campos por cada elemento del segundo control ListBox.