Está en la página 1de 24

UNIVERSIDAD NACIONAL DE TRUJILLO

FACULTAD DE INGENIERIA E.A.P. INGENIERIA DE SISTEMAS

Sqlconnection, dataset, sqldataadapter

ADO.NET

ALUMNOS: Balarezo Requena, Gaby Bruno Cervera, Sheyla Cabanillas Cancino, Arnold Cabanillas Tejada, Ronal Vigo Cabanillas, Carlos CURSO: Sistemas Avanzados de Ingeniera de Sistemas I DOCENTE: Ing. Robert Snchez Ticona
Guadalupe, mayo de 2012

ADO NET

ADO.NET
INTRODUCCION
ADO.NET no es una actualizacin de ADO, sino un rediseo completo. En el ncleo de ADO.NET es un conjunto de bibliotecas que estn diseados para comunicarse con una variedad de servicios de fondo almacenes de datos. Las bibliotecas de ADO.NET son parte del espacio de nombres System. Data y abarcan una gran variedad de bibliotecas adicionales que permiten la conexin de origen de datos, presentacin de consultas, y los resultados de procesamiento. Uno de los objetivos del nuevo diseo de ADO.NET es proporcionar una cach jerrquica, desconectado de datos que funciona offline y online. El objeto central desconectada, llamado el conjunto de datos, permite la bsqueda, el filtrado, la navegacin y el almacenamiento de espera de los cambios de datos. El diseo de ADO.NET se basa en XML y permite ADO.NET para cerrar la brecha entre el acceso a bases de datos tradicionales y el desarrollo de XML. Los desarrolladores son capaces de trabajar tanto con los datos XML y los datos de base de datos utilizando un conjunto comn de interfaces de datos, como se muestra en la Figura.

ADO.NET est diseado para proporcionar un acceso coherente a orgenes de datos comunes a travs de un proveedor de datos administrado. Esto proporciona una interfaz comn para las fuentes de datos como SQL Server, as como las personas expuestas a travs de OLE-DB y las interfaces XML. Cada uno de los proveedores administrados est diseado especficamente para el tipo de acceso a datos que proporcionar. Estos resultados pueden ser procesados directamente o se colocan en un objeto DataSet de ADO.NET que luego pueden ser expuestos al usuario, combinados juntos, o incluso de forma remota entre niveles de aplicacin. Una de las mayores ventajas del objeto DataSet es que se puede utilizar de forma independiente en l. NET Framework para administrar los datos almacenados localmente o archivos XML. ADO realmente ha sido el pilar de acceso a la base de datos durante aos, pero haba varios problemas de diseo inherentes que ADO NET 2

ADO.NET se cre para superar. Uno de los principales problemas que ADO.NET est diseado para resolver es la falta de elementos necesarios para construir fcilmente aplicaciones que formaban parte de. NET y la arquitectura orientada a servicios. Por ejemplo, XML se aadi en el ltimo momento a ADO como el estndar comenz a surgir dentro de la industria. ADO.NET en el otro lado fue diseado basado en XML.Adems, el motor de cursor de ADO permite pasar objetos Recordset de ADO desconectados entre los niveles de las aplicaciones, pero no proporciona una forma de combinar varios objetos de registros juntos. ADO tambin proporciona una forma de enviar los cambios a la base de datos en cach, pero no proporciona control mediante programacin de la lgica utilizada para enviar las actualizaciones. Una de las principales limitaciones para el desarrollo de aplicaciones basadas en SOA escalables que carecen en el motor de cursor de ADO es la posibilidad de enviar los cambios pendientes en la base de datos a travs de procedimientos almacenados. Muchos administradores de bases de datos permiten a los usuarios modificar slo el contenido de sus bases de datos a travs de procedimientos almacenados, que no es posible a travs del objeto binario del objeto de conjunto de registros ADO.

CONCEPTO
El ADO.NET es un conjunto de componentes del software que pueden ser usados por los programadores para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que estn incluidas en el Microsoft .NET Framework. Es comnmente usado por los programadores para acceder y para modificar los datos almacenados en un Sistema Gestor de Bases de Datos Relacionales, aunque tambin puede ser usado para acceder a datos en fuentes no relacionales. ADO.NET es a veces considerado como una evolucin de la tecnologa ActiveX Data Objects (ADO), pero fue cambiado tan extensivamente que puede ser concebido como un producto enteramente nuevo.

ADO NET

Esta tecnologa es una parte del .NET Framework 3.0 (habiendo sido parte del framework desde la versin 1.0). ADO.NET consiste en dos partes primarias:

Data provider
Estas clases proporcionan el acceso a una fuente de datos, como Microsoft SQL Server y Oracle. Cada fuente de datos tiene su propio conjunto de objetos del proveedor, pero cada uno tiene un conjunto comn de clases de utilidad: Connection: Proporciona una conexin usada para comunicarse con la fuente de datos. Tambin acta como Abstract Factory para los objetos command. Command: Usado para realizar alguna accin en la fuente de datos, como lectura, actualizacin, o borrado de datos relacionales. Parameter: Describe un simple parmetro para un command. Un ejemplo comn es un parmetro para ser usado en un procedimiento almacenado. ADO NET 4

DataAdapter: "Puente" utilizado para transferir data entre una fuente de datos y un objeto DataSet (ver abajo). DataReader: Es una clase usada para procesar eficientemente una lista grande de resultados, un registro a la vez.

DataSets
Los objetos DataSets, un grupo de clases que describen una simple base de datos relacional en memoria, fueron la estrella del show en el lanzamiento inicial (1.0) del Microsoft .NET Framework. Las clases forman una jerarqua de contencin: Un objeto DataSet representa un esquema (o una base de datos entera o un subconjunto de una). Puede contener las tablas y las relaciones entre esas tablas. Un objeto DataTable representa una sola tabla en la base de datos. Tiene un nombre, filas, y columnas. Un objeto DataView "se sienta sobre" un DataTable y ordena los datos (como una clusula "order by" de SQL) y, si se activa un filtro, filtra los registros (como una clusula "where" del SQL). Para facilitar estas operaciones se usa un ndice en memoria. Todas las DataTables tienen un filtro por defecto, mientras que pueden ser definidos cualquier nmero de DataViews adicionales, reduciendo la interaccin con la base de datos subyacente y mejorando as el desempeo. Un DataColumn representa una columna de la tabla, incluyendo su nombre y tipo. Un objeto DataRow representa una sola fila en la tabla, y permite leer y actualizar los valores en esa fila, as como la recuperacin de cualquier fila que est relacionada con ella a travs de una relacin de clave primaria clave extranjera. Un DataRowView representa una sola fila de un DataView, la diferencia entre un DataRow y el DataRowView es importante cuando se est interactuando sobre un resultset. Un DataRelation es una relacin entre las tablas, tales como una relacin de clave primaria - clave ajena. Esto es til para permitir la funcionalidad del DataRow de recuperar filas relacionadas. Un Constraint describe una propiedad de la base de datos que se debe cumplir, como que los valores en una columna de clave primaria deben ser nicos. A medida que los datos son modificados cualquier violacin que se presente causar excepciones. ADO NET 5

Un DataSet es llenado desde una base de datos por un DataAdapter cuyas propiedades Connection y Command que han sido iniciados. Sin embargo, un DataSet puede guardar su contenido a XML (opcionalmente con un esquema XSD), o llenarse a s mismo desde un XML, haciendo esto excepcionalmente til para los servicios web, computacin distribuida, y aplicaciones ocasionalmente conectadas.

Entity Framework
El ADO.NET Entity Framework es un conjunto de APIs de acceso a datos para el Microsoft .NET Framework, apuntando a la versin de ADO.NET que se incluye con el .NET Framework 3.5. Fue lanzado como actualizacin separada junto con el Service Pack 1 para el .NET Framework, despus del lanzamiento de tanto el .NET Framework 3.5 y el Visual Studio 2008. Una nueva versin del Entity Framework (v 4.0) ser liberada junto al Visual Studio 2010 y el .NET Framework 4.0. Una entidad del Entity Framework es un objeto que tiene una clave representando la clave primaria de una entidad lgica de datastore. Un modelo conceptual Entity Data Model (modelo Entidad-Relacin) es mapeado a un modelo de esquema de datastore. Usando el Entity Data Model, el Framework permite que los datos sean tratados como entidades independientemente de sus representaciones del datastore subyacente. El Entity SQL es un lenguaje similar al SQL para consultar el Entity Data Model (en vez del datastore subyacente). Similarmente, las extensiones del Linq, Linq-toEntities, proporcionan consultas tipeadas en el Entity Data Model. Las consultas Entity SQL y Linq-to-Entities son convertidas internamente en un Canonical Query Tree que entonces es convertido en una consulta comprensible al datastore subyacente (ej. en SQL en el caso de una base de datos relacional). Las entidades pueden utilizar sus relaciones, y sus cambios enviados de regreso al datastore.

SQLCONNECTION EN ADO.NET
Introduccin
Lo primero que tendr que hacer al interactuar con una base de datos es crear una conexin. La conexin le dice al resto de la base de datos de cdigo de ADO.NET que se est hablando. Gestiona toda la lgica de bajo nivel asociada con los protocolos especficos de bases de datos. Esto hace que sea fcil para usted debido a que la mayor parte del trabajo que tendr que hacer en el cdigo es una instancia del objeto de conexin, abrir la conexin, a continuacin, cerrar la conexin cuando haya terminado. Debido a la ADO NET 6

forma en que otras clases de ADO.NET se construyen, a veces ni siquiera tiene que hacer mucho trabajo. Aunque el trabajo con conexiones es muy fcil de ADO.NET, es necesario comprender las conexiones con el fin de tomar las decisiones correctas al codificar sus rutinas de acceso a datos. Entender que una conexin es un recurso valioso. Claro, si usted tiene una aplicacin de cliente independiente que trabaja en una sola base de datos una sola mquina, es probable que no se preocupan por esto. Sin embargo, piense en una aplicacin de empresa, donde cientos de usuarios en toda la empresa a acceder a la misma base de datos. Cada conexin representa sobrecarga y slo puede haber una cantidad finita de ellos. Para ver un caso ms extremo, considere un sitio Web que se ve afectado con cientos de miles de visitas al da algunas aplicaciones que se llevan las conexiones y no dejar ir puede tener graves impactos negativos en el rendimiento y la escalabilidad.

Creacin de un objeto SqlConnection


Un SqlConnection es un objeto, al igual que cualquier otro objeto C #. La mayor parte del tiempo, que acaba de declarar y crear instancias de la conexin SqlConnection, todo al mismo tiempo, como se muestra a continuacin: SqlConnection conn = new SqlConnection ( "Data Source = (local); Initial Catalog = Neptuno; Integrated Security = SSPI"); El objeto SqlConnection instancia anterior se utiliza un constructor con un solo argumento de tipo cadena se llama este argumento una cadena de conexin. La Tabla 1 describe las partes comunes de una cadena de conexin. El objeto SqlConnection se encarga de la parte de la comunicacin fsica entre la aplicacin y el servidor SQL de base de datos. Una instancia de la clase SqlConnection en. NET Framework es compatible con el proveedor de datos para la base de datos SQL Server. La instancia de SqlConnection lleva cadena de conexin como argumento y pasar el valor de la declaracin de constructor. Cuando se establece la conexin, los comandos de SQL pueden ser ejecutados, con la ayuda del objeto de conexin, para recuperar o manipular los datos en la base de datos. Una vez que las actividades de base de datos ms, la conexin debe ser cerrada y liberar los recursos de base de datos. El mtodo Close () en la clase SqlConnection se utiliza para cerrar la conexin con la base. El mtodo Close deshace todas las transacciones pendientes y libera la conexin de la base de datos SQL Server. Imports System.Data.SqlClient Public Form1 clase

ADO NET

Private Sub Button1_Click (ByVal sender As System.Object e, ByVal como System.EventArgs) Handles Button1.Click ConnetionString dvil como secuencia Dim cnn Como SqlConnection connetionString = "Data Source = ServerName; Initial Catalog = DatabaseName, ID de usuario = nombre de usuario, contrasea = contrasea" cnn = New SqlConnection (connetionString) Tratar de cnn.Open () MsgBox ("Conexin Abre!") cnn.Close () Catch ex As Exception MsgBox ("No se puede abrir la conexin!") End Try End Sub End Class Usted tiene que proporcionar las informaciones necesarias para la cadena de conexin. connetionString = "Data Source = ServerName; Initial Catalog = DatabaseName, ID de usuario = nombre de usuario, contrasea Contrasea =" De la declaracin anterior reemplace ServerName, DatabaseName, UserName, Password a los nombres reales . Tabla 1. Cadenas de conexin ADO.NET contienen ciertos pares clave / valor para especificar cmo hacer una conexin de base de datos. Estos incluyen la ubicacin, el nombre de la base de datos y credenciales de seguridad. Cadena de conexin Descripcin Nombre del parmetro Fuente de datos Initial Catalog La seguridad integrada ID de usuario Contrasea Identifica el servidor. Podra ser equipo local, el nombre de dominio de la mquina o direccin IP. Base de datos de nombre. Se establece en SSPI para realizar la conexin con el usuario de Windows de inicio de sesin Nombre de usuario configurado en SQL Server. Contrasea juego de SQL Server ID de usuario.

La seguridad integrada es seguro cuando usted est en una sola mquina de desarrollo haciendo. Sin embargo, a menudo tendr que especificar la seguridad basada en un ID de usuario de SQL Server con los permisos establecidos ADO NET 8

especficamente para la aplicacin que est utilizando. A continuacin se muestra una cadena de conexin, utilizando el ID de usuario y contrasea parmetros: SqlConnection conn = new SqlConnection ( "Data Source = DatabaseServer; Initial Catalog = Neptuno; ID de usuario = IDdeUsuario; Contrasea = YourPassword"); Observe cmo el origen de datos est establecida en DatabaseServer para indicar que es posible identificar una base de datos ubicada en un equipo diferente, en una red LAN o por Internet. Adems, ID de usuario y la contrasea con sustituir el parmetro de seguridad integrada.

El uso de un objeto SqlConnection


El propsito de crear un objeto SqlConnection es lo que puede permitir que otro cdigo ADO.NET para trabajar con una base de datos. Otros objetos de ADO.NET, como un objeto SqlCommand y un SqlDataAdapter tomar un objeto de conexin como parmetro. La secuencia de operaciones que ocurren en el curso de la vida de un SqlConnection son como sigue: 1. 2. 3. 4. Cree una instancia del objeto SqlConnection. Abrir la conexin. Pase la conexin con otros objetos de ADO.NET. Realizar operaciones de base de datos con el resto de los objetos de ADO.NET. 5. Cerrar la conexin. Ya hemos visto cmo crear una instancia de SqlConnection. El resto de los pasos, abriendo, de paso, el uso, y el cierre se muestran en el Listado 1.

Listado 1. El uso de un objeto SqlConnection


con Sistema; utilizando System.Data; con System.Data.SqlClient; / / / <summary> / / / Muestra cmo trabajar con objetos SqlConnection / / / </ summary> clase SqlConnectionDemo { static void Main () { / / 1 . Crear instancias de la conexin SqlConnection conn = nueva SqlConnection ( "Data Source = (local); Initial Catalog = Neptuno; Integrated Security = SSPI"); SqlDataReader rdr = NULL ; tratar ADO NET 9

/ / 2. Abra la conexin conn.Open (); / / 3. Pasar la conexin a un objeto de comando cmd = SqlCommand nuevo SqlCommand ("select * from clientes", conn); / / / / 4. Utilice la conexin / / / / obtener resultados de la consulta rdr = cmd.ExecuteReader (); / / imprimir el CustomerID de cada registro , mientras que (rdr.Read ()) { Console.WriteLine (rdr [0]); } }

finalmente { / / cerrar el lector , si (rdr =! nula ) { rdr.Close (); } / / 5. Cierra la conexin si (conn =! nula ) { conn.Close (); } } } } Como se muestra en el Listado 1, se abre una conexin mediante una llamada al Open () mtodo de la SqlConnection ejemplo, conn . Las operaciones en una conexin que no se ha abierto an generarn una excepcin. Por lo tanto, debe abrir la conexin antes de usarla. Antes de utilizar un objeto SqlCommand , debe permitir que el cdigo de ADO.NET saber que la conexin que necesita. En el Listado 1, se establece el segundo parmetro a la SqlCommand objeto con el SqlConnection objeto, conn . Las operaciones realizadas con el objeto SqlCommand se utiliza esa conexin. El cdigo que utiliza la conexin es un SqlCommand objeto, el cual realiza una consulta en la tabla Clientes. El conjunto de resultados se devuelven como un objeto SqlDataReader y al mismo tiempo bucle lee la primera columna de cada fila del conjunto de resultados, que es la columna CustomerID. Vamos a discutir el SqlCommand y SqlDataReader objetos en lecciones posteriores. Por el momento, es importante que usted entienda que estos objetos se utiliza el SqlConnection objeto para que sepan qu base de datos para interactuar con l. Cuando haya terminado de usar el objeto de conexin, debe cerrarlo. De no hacerlo, podra tener graves consecuencias en el rendimiento y la escalabilidad de la aplicacin. Hay un par de puntos que se hacen sobre la forma en que ha cerrado la conexin en el Listado 1: el Close () se llama al mtodo en un ltimo bloque y nos aseguramos de que la conexin no es nulo antes de cerrarlo.

ADO NET

10

DATASETS EN ADO.NET
El DataSet de ADO.NET es una representacin de datos residente en memoria que proporciona un modelo de programacin relacional coherente independientemente del origen de datos que contiene. Un DataSet representa un conjunto completo de datos, incluyendo las tablas que contienen, ordenan y restringen los datos, as como las relaciones entre las tablas. Hay varias maneras de trabajar con un DataSet, que se pueden aplicar de forma independiente o conjuntamente. Puede: Crear mediante programacin una DataTable, DataRelation y una Constraint en un DataSet y rellenar las tablas con datos. Llenar el DataSet con tablas de datos de un origen de datos relacional existente mediante DataAdapter. Cargar y hacer persistente el contenido de DataSet mediante XML. Para obtener ms informacin, vea Utilizar XML en un DataSet.

Tambin se puede transportar un DataSet con establecimiento inflexible de tipos mediante un servicio Web XML. El diseo del DataSet lo convierte en idneo para el transporte de datos mediante servicios Web XML. Para obtener informacin general sobre servicios Web XML, vea Informacin general acerca de servicios Web XML. Para ver un ejemplo de cmo utilizar un DataSet de un servicio Web XML, vea Consumir DataSet a partir de un servicio Web XML.

Crear un DataSet
Puede crear una instancia de DataSet llamando al constructor DataSet. Si lo desea, especifique un nombre de argumento. Si no especifica ningn nombre para el DataSet, se establecer el nombre "NewDataSet". Tambin es posible crear un nuevo DataSet basado en un DataSetexistente. El nuevo DataSet puede ser una copia exacta del DataSet existente; un clon del DataSet que copia la estructura relacional o el esquema, pero que no contiene ningn dato del DataSet existente; o un subconjunto del DataSet, que contiene solamente las filas modificadas delDataSet existente mediante el mtodo GetChanges. Para obtener ms informacin, vea Copiar contenido de DataSet. En el siguiente ejemplo de cdigo se muestra cmo construir una instancia de un DataSet. VB DataSet customerOrders = new DataSet("CustomerOrders");

ADO NET

11

Agregar DataTable a DataSet


ADO.NET permite crear objetos DataTable y agregarlos a un DataSet existente. Es posible establecer informacin de restricciones para una DataTable mediante las propiedadesPrimaryKey y Unique. Ejemplo En el siguiente ejemplo se construye un DataSet, se agrega un objeto DataTable nuevo al DataSet y, a continuacin, se agregan tres objetos DataColumn a la tabla. Por ltimo, el cdigo establece una columna como columna de clave principal.

Distinguir maysculas de minsculas


Pueden existir dos o ms tablas o relaciones con el mismo nombre, pero que difieran en maysculas y minsculas, en un DataSet. En estos casos, las referencias a tablas y relaciones por nombre distinguen maysculas y minsculas. Por ejemplo, si el DataSet dataSet contiene las tablas Table1 y table1, se hace referencia por nombre a Table1como dataSet.Tables["Table1"] y se hace referencia a table1 como dataSet.Tables["table1"]. Si se intentara hacer referencia a cualquiera de las tablas mediante dataSet.Tables["TABLE1"] se generara una excepcin. El comportamiento de distincin entre maysculas y minsculas no se aplica si slo hay una tabla o relacin con un nombre concreto. Por ejemplo, si el DataSet slo tieneTable1, se puede hacer referencia a sta mediante dataSet.Tables["TABLE1"].

Compatibilidad con los espacios de nombres


En versiones anteriores de ADO.NET, dos tablas no podan tener el mismo nombre, aunque se encontrasen en espacios de nombres diferentes. Esta limitacin ha desaparecido en ADO.NET 2.0. Un DataSet puede contener dos tablas con el mismo valor propiedad TableName, pero con valores de propiedad Namespace diferentes. de

Agregar una relacin entre tablas


En un DataSet que contiene varios objetos DataTable, es posible utilizar objetos DataRelation para relacionar una tabla con otra, desplazarse por las tablas y devolver filas secundarias o primarias de una tabla relacionada. Los argumentos necesarios para crear una DataRelation son un nombre para la DataRelation que se va a crear y una matriz de una o ms referencias DataColumn a las columnas que actan como columnas primaria y ADO NET 12

secundaria en la relacin. Una vez creado un objeto DataRelation, es posible utilizarlo para desplazarse por las tablas y recuperar valores. Al agregar una DataRelation a una DataSet, se agrega de forma predeterminada una UniqueConstraint a la tabla primaria y una ForeignKeyConstraint a la tabla secundaria. Para obtener ms informacin sobre cmo crear restricciones, vea Agregar restricciones a una tabla. En el siguiente ejemplo de cdigo se crea una DataRelation mediante dos objetos DataTable en un DataSet. Cada DataTable contiene una columna denominada CustID, que acta como vnculo entre los dos objetos DataTable. En el ejemplo se agrega una nica DataRelation a la coleccin Relations del DataSet. El primer argumento del ejemplo especifica el nombre de la DataRelation que se va a crear. El segundo argumento establece la DataColumn primaria y el tercer argumento establece la DataColumnsecundaria. VB customerOrders.Relations.Add("CustOrders", customerOrders.Tables["Customers"].Columns["CustID"], customerOrders.Tables["Orders"].Columns["CustID"]); Una DataRelation tiene tambin una propiedad Nested que, cuando tiene el valor true, hace que las filas de la tabla secundaria se aniden dentro de la fila asociada de la tabla primaria cuando se escriben como elementos XML mediante WriteXml. Para obtener ms informacin, vea Utilizar XML en un DataSet.

Explorar una relacin entre tablas


Una de las principales funciones de una DataRelation es permitir el desplazamiento de una DataTable a otra dentro de un DataSet. Esto permite recuperar todos los objetos DataRow relacionados de una DataTable cuando se da una nica DataRow de una DataTable relacionada. Por ejemplo, despus de establecer una DataRelation entre una tabla de clientes y una tabla de pedidos, es posible recuperar todas las filas de pedidos de una fila de clientes determinada mediante GetChildRows. En el siguiente ejemplo de cdigo se crea una DataRelation entre la tabla Customers y la tabla Orders de un DataSet, y se devuelven todos los pedidos de cada cliente. El ejemplo siguiente se basa en el anterior; se relacionan cuatro tablas y se exploran dichas relaciones. Como en el ejemplo anterior, CustomerID relaciona la tabla Customerscon la tabla Orders. Para cada cliente de la tabla Customers se determinan todas las filas secundarias de la tabla Orders con el fin de devolver el nmero de pedidos que tiene un cliente concreto y sus valores de OrderID. ADO NET 13

El ejemplo ampliado tambin devuelve los valores de las tablas OrderDetails y Products. La tabla Orders est relacionada con la tabla OrderDetails mediante OrderID con el fin de determinar, para cada pedido de cliente, qu productos y cantidades se pidieron. Como la tabla OrderDetails slo contiene el ProductID de un producto pedido, OrderDetails est relacionada con Products mediante ProductID para devolver el ProductName. En esta relacin, Products es la tabla primaria y Order Details es la secundaria. Por lo tanto, al recorrer en iteracin la tabla OrderDetails, se llama a GetParentRow para recuperar el valor de ProductName relacionado. Hay que tener en cuenta que al crear la DataRelation para las tablas Customers y Orders no se especifica ningn valor para el indicador createConstraints (el valor predeterminado es true). Se supone que todas las filas de la tabla Orders tienen un valor CustomerID que existe en la tabla primaria Customers. Si un CustomerID existe en la tabla Orders pero no existe en la tabla Customers, una ForeignKeyConstrain har que se inicie una excepcin. Cuando la columna secundaria pueda contener valores no incluidos en la columna primaria, hay que asignar el valor false al indicador createConstraints cuando se agregue laDataRelation. En el ejemplo, el indicador createConstraints tiene el valor false para la DataRelation entre las tablas Orders y OrderDetails. Esto permite que la aplicacin devuelva todos los registros de la tabla OrderDetails y slo un subconjunto de registros de la tabla Orders sin generar una excepcin en tiempo de ejecucin. El ejemplo ampliado genera el resultado con el siguiente formato. Customer ID: NORTS Order ID: 10517 Order Date: 4/24/1997 12:00:00 AM Product: Filo Mix Quantity: 6 Product: Raclette Courdavault Quantity: 4 Product: Outback Lager Quantity: 6 Order ID: 11057 Order Date: 4/29/1998 12:00:00 AM Product: Outback Lager Quantity: 3 El siguiente ejemplo de cdigo es un ejemplo ampliado en el que se devuelven los valores de las tablas OrderDetails y Products, y slo se devuelve un subconjunto de los registros de la tabla Orders.

ADO NET

14

VB DataRelation customerOrdersRelation = customerOrders.Relations.Add("CustOrders", customerOrders.Tables["Customers"].Columns["CustomerID"], customerOrders.Tables["Orders"].Columns["CustomerID"]); DataRelation orderDetailRelation = customerOrders.Relations.Add("OrderDetail", customerOrders.Tables["Orders"].Columns["OrderID"], customerOrders.Tables["OrderDetails"].Columns["OrderID"], false); DataRelation orderProductRelation = customerOrders.Relations.Add("OrderProducts", customerOrders.Tables["Products"].Columns["ProductID"], customerOrders.Tables["OrderDetails"].Columns["ProductID"]); foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows) { Console.WriteLine("Customer ID: " + custRow["CustomerID"]); )) foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation { Console.WriteLine(" Order ID: " + orderRow["OrderID"]); Console.WriteLine("\tOrder Date: " + orderRow["OrderDate"]); foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation) { Console.WriteLine("\t Product: " + detailRow.GetParentRow(orderProductRelation)["ProductName"]); Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);

Utilizar DataSet con datos existentes


El DataSet es una representacin relacional de datos en memoria independiente del origen de datos. Sin embargo, el DataSet puede utilizarse junto con datos existentes en un origen de datos cuando se usa con un proveedor de datos de .NET Framework. Un proveedor de datos de .NET Framework utiliza un DataAdapter para rellenar el DataSet con datos e informacin de esquema, as como para resolver modificaciones de los datos en el origen de datos. ADO NET 15

Consulte los siguientes temas para obtener ms informacin sobre cmo cargar un DataSet y resolver los cambios en el origen de datos: Llenar un DataSet desde un DataAdapter. En este tema se describe cmo se carga un DataSet con datos desde un origen de datos. Actualizar orgenes de datos con DataAdapters. En este tema se describe cmo se resuelven los cambios relacionados con los datos de un DataSet en el origen de datos. Agregar restricciones existentes a DataSet. En este tema se describe cmo se rellena un DataSet con informacin de clave principal desde un origen de datos. Utilizar parmetros con DataAdapter y Especificar parmetros y valores devueltos. En estos temas se describe cmo asociar columnas de tablas de un DataSet con parmetros de entrada y salida de comandos ejecutados en un origen de datos.

El DataSet tambin puede leer y escribir datos XML existentes. Para obtener ms informacin, vea Utilizar XML en un DataSet.

DataAdapter EN ADO.NET
El objeto de DataAdapter del proveedor de datos de .NET se ajusta la lectura de registros en un objeto DataSet y actualiza la base de datos del DataSet. El DataAdapter administra objetos Command y DataReader y simplifica el proceso de sincronizacin. Puede utilizar el objeto OleDbDataAdapter para rellenar un DataSetdesde un objeto de ActiveX Data Objects (ADO) Recordset o Record. El objeto DataAdapter es simplemente una forma de transferir datos entre una base de datos y un DataSet. Si necesita ms control sobre la funcionalidad de actualizacin o de relleno, puede escribir una funcin personalizada para administrar este proceso y manipular directamente el comando y los objetos DataReader.

Arquitectura
El DataAdapter administra varios objetos de comando:

SelectCommand DeleteCommand InsertCommand UpdateCommand

El DataAdapter incluye tres mtodos principales:

Rellenar. Este mtodo utiliza el DataReader para leer registros y, a continuacin, copia los registros en un DataSet (o un objeto DataTable). 16

ADO NET

Muchas aplicaciones (especialmente aplicaciones basadas en Web) slo requieren acceso de slo lectura a los datos. De forma predeterminada, el DataAdapter recupera slo la cantidad mnima de esquema que es necesario (el nombre de columna y el tipo de datos) para admitir operaciones de slo lectura. DataAdapter utiliza la propiedad SelectCommand para devolver un DataReader desde que se leen los registros.

FillSchema. Este mtodo consulta informacin de esquema que es necesaria actualizar la base de datos. Esto incluye las columnas de clave, la capacidad de columnas y as sucesivamente para aceptar NULL. Para configurar el mtodo Rellenar para recuperar esta informacin de esquema adicionales, establezca el valor de propiedad se haya dado el valor MissingSchemaAction.AddWithKey aDataAdapter.MissingSchemaAc tion. Puede utilizar SelectCommand para devolver un DataReader desde el que se lee el esquema. Dado que resulta costoso recuperar el esquema del DataSet, o almacenar el esquema como un archivo de lenguaje de marcado extensible (XML) o utiliza un DataSet con.

la actualizacin. Cuando datos, DataAdapter comprueba objeto DataRow en DataTable.

la

actualiza la base propiedad RowState de

de cada

El DataAdapter despus llama a DeleteCommand ,InsertCommand o la propiedad UpdateCommand para cambiar a la base de datos segn corresponda. Puede enlazar el evento RowUpdating y los eventos RowUpdated para personalizar cmo DataAdapter procesan las actualizaciones. El DataAdapter no tiene ninguna informacin acerca de la base de datos que est leyendo desde y escribir en; el DataAdapter slo ejecuta los comandos que administra. Por lo tanto, el DataAdapter no crea los objetos DataRelation en el DataSet. Para crear objetos DataRelation en el DataSet, debe utilizar uno de los mtodos siguientes:

Cree los objetos mediante programacin en tiempo de ejecucin. Cargar el esquema de un definicin de esquemas XML (XSD) archivo. Crear los objetos en el esquema de DataSet de tiempo de diseo.

Cosas a tener en cuenta


Cuando utilizamos un objeto del tipo DataAdapter (por ejemplo SqlDataAdapter) ste se encarga de crear la conexin a la base de datos, abrir dicha conexin y despus de actualizar los datos tambin se encarga de cerrar la conexin. ADO NET 17

Y lo importante es que NUNCA necesitamos un objeto Connection especfico (e independiente) para hacer todo ese proceso de conexin, ya que el adaptador se encarga de todo ese tema por nosotros. Pero para que todo esto de las transacciones con un DataAdapter funcione, lo mejor es crear nuestro objeto Connection para poder obtener la transaccin por medio del mtodo BeginTransaction (a lo mejor hay otra forma ms fcil de hacerlo, pero esta es la que yo conozco y es la que te explico). El segundo punto que debemos tener en cuenta es que si los comandos de actualizacin, insercin y eliminacin los automatizamos con un objeto del tipo CommandBuilder tendremos que hacer un pequeo truco para que todo funcione como debe funcionar, ya que a esos comandos debemos asignarle el objeto Transaction que hemos obtenido por medio del mtodo BeginTransaction de la conexin. Si los comandos de actualizacin los creamos de forma manual, tendremos que hacer lo que te expliqu en el artculo anterior para asignar el objeto Transaction que cada comando debe usar. Aunque esto no es demasiado til, al menos si queremos tener la "automatizacin" que nos da el modo desconectado... pero bueno, que sepas que se puede hacer. En cualquier caso, solo debemos asignar el objeto de la transaccin a los comandos INSERT, UPDATE y DELETE, pero no al de seleccin. Y si algunos de esos tres comandos no vamos a usarlo, por ejemplo porque no permitamos eliminar datos, no ser necesario crear el comando correspondiente y por tanto no hay que asignarle nada... pero ante la duda... lo mejor es asignarlo a todos, al menos si usamos un objeto SqlCommandBuilder, para que no tengamos un error por falta de "previsin". Un ejemplo para usar transacciones con un DataAdapter Lo mejor es que veamos qu tenemos que hacer para que todo esto que te he comentado funcione correctamente. En el siguiente ejemplo slo veremos la parte en la que se utiliza un objeto CommandBuilder. En estos ejemplos voy a usar una base de datos de SQL Server 2005 Express, que es la misma que ya us en el ejemplo del artculo anterior.

Nota: Por ahora solo te muestro el cdigo de Visual Basic, en otra ocasin actualizar el cdigo para incluir el de C#.

ADO NET

18

Aqu solamente veremos la parte de la actualizacin, es decir, lo que debemos ejecutar para actualizar los datos una vez modificados, por tanto este cdigo que te muestro es cuando ya has modificado los datos... eso no te lo muestro porque en realidad no cambia con respecto a lo que ya te he explicado en otras ocasiones, desde el ndice de la seccin de ADO.NET tienes varios ejemplos de cmo acceder a los datos usando un adaptador.

Nota: Hay que tener en cuenta que este cdigo solo es para mostrar los pasos a dar, ya que antes se han tenido que leer los datos, asignarlos al DataSet o DataTable, y modificarlos de alguna forma que aqu no se muestra (esto lo aclaro para que despus no andes preguntando o diciendo que esto no cambia nada en la base de datos o que este ejemplo no funciona, y te puedo asegurar que s funciona, que yo lo he probado insertando y modificando datos...)

Paso 1. Creamos el adaptador (y la conexin y el objeto Connection) El comando SELECT es necesario para que el CommandBuilder sepa cmo debe crear los comandos. ' La cadena de conexin Dim csb As New SqlConnectionStringBuilder With csb ' El servidor al que nos conectamos .DataSource = "(local)\SQLEXPRESS" ' La base de datos que vamos a usar .InitialCatalog = "prueba" ' Usamos la seguridad integrada .IntegratedSecurity = True End With ' Creamos la conexin ' la ponemos dentro de Using para asegurarnos de que se cierre si hay errores Using con As New SqlConnection(csb.ConnectionString) Dim dt As New DataTable ' Creamos el adaptador usando el objeto Connection Dim da As New SqlDataAdapter("SELECT * FROM Table1", con) da.MissingSchemaAction = MissingSchemaAction.AddWithKey

ADO NET

19

Paso 2. Creamos los comandos y los asignamos al adaptador, si no lo hacemos de esta forma, al intentar acceder a los comandos desde el objeto del DataAdapter... obtendremos un error indicando que no estn creados (son nulos).

' Creamos los comandos con el CommandBuilder Dim cb As New SqlCommandBuilder(da) ' pero para asignarle el objeto Transaction debemos ' obtenerlos por medio de los mtodos Get...Command ' ya que si intentamos acceder directamente a esos comandos ' del adaptador nos indicar que no estn asignados (son nulos) da.InsertCommand = cb.GetInsertCommand() da.UpdateCommand = cb.GetUpdateCommand() da.DeleteCommand = cb.GetDeleteCommand()
Paso 3. Abrimos la conexin y creamos el objeto Transaction llamando al mtodo BeginTransaction, y asignamos ese objeto a cada uno de los comandos del adaptador, salvo al comando de seleccin.

' Abrimos la conexin con.Open() ' Creamos el objeto Transaction Dim tran As SqlTransaction = con.BeginTransaction ' Asignamos el objeto Transaction a los comandos da.InsertCommand.Transaction = tran da.UpdateCommand.Transaction = tran da.DeleteCommand.Transaction = tran Paso 4. Dentro de un bloque Try/Catch (para detectar los errores) es cuando actualizamos los datos llamando al mtodoUpdate del adaptador. Es importante que la conexin siga abierta, ya que el objeto de la variable tran depende de esa conexin, pero el adaptador no depende directamente de la conexin abierta en la variable con, ya que el adaptador gestiona por su cuenta las conexiones y si ve que est cerrada, la abrir, pero esa apertura es independiente del objeto que hemos usado para indicarle cul es la conexin que debe usar... un lo! pero es as... Hay que tener en cuenta que la "aceptacin" de los cambios del DataTable (o DataSet) se hace de forma independiente de la llamada a los mtodos Commit (o Rollback) del objeto Transaction. En el caso de que todo vaya bien, el propio mtodo Update del adaptador se encarga de decirle a la tabla que acepte los cambios, por tanto no es necesario llamar de forma explcita al mtodo AcceptChanges, ya que esa es la forma ADO NET 20

"predeterminada" de actuar (lee el comentario del cdigo si quieres saber algo ms de esto... y, por supuesto, despus te lees la documentacin para informarte mejor, que con un par de lneas de comentarios no lo vas a aprender todo, jejeje). Cuando se cancela la actualizacin (en el bloque Catch del ejemplo), se hace una llamada al mtodo Rollback del objeto Transaction, y tambin podras llamar al mtodo RejectChanges de la tabla, pero esto supondra perder TODAS las modificaciones que hayas hecho en los datos que estn en memoria. Y debido a que esos datos estn en memoria, puedes volver a actualizarlos posteriormente si as lo consideras necesario. Nuevamente te invito a que leas los comentarios del cdigo para que veas qu debes hacer. Try ' Para probar con un error If chkProducirError.Checked Then Throw New Exception("Candemore") End If ' Actualizamos los datos de la tabla da.Update(dt) ' Si llega aqu es que todo fue bien, ' por tanto, llamamos al mtodo Commit tran.Commit() ' Esto no es necesario si dejamos el valor predeterminado ' de la propiedad AcceptChangesDuringUpdate del adaptador dt.AcceptChanges() txtInfo.Text = "Se han actualizado los datos" Catch ex As Exception ' Si hay error, desahacemos lo que se haya hecho tran.Rollback() ' Desechar los cambios del DataTable ' si as lo estimamos oportuno, ' pero esto obligar a volver a aadir, modificar o eliminar ' nuevamente los datos. ' Por tanto, solo debemos hacerlo si no intentaremos nuevamente ' la actualizacin de los datos. ' Yo preguntara al usuario antes de hacerlo... 'dt.RejectChanges() txtInfo.Text = "ERROR: " & vbCrLf & ex.Message End Try

ADO NET

21

Paso 5. Finalmente cerramos la conexin, aunque no es necesario hacerlo de forma explcita ya que al incluir el objetoConnection dentro de un bloque Using, se cerrar automticamente. ' Cerramos la conexin, ' aunque no es necesario ya que al finalizar ' el using se cerrar con.Close() End Using

Creacin de un SqlDataAdapter
SqlDataAdapter La clase es una parte de la C # Proveedor de datos de ADO.NET y se encuentra en el System.Data.SqlClient espacio de nombres. SqlDataAdapter proporciona la comunicacin entre el conjunto de datos y la base de datos SQL. Podemos utilizar el objeto SqlDataAdapter en combinacin con el objeto DataSet. DataAdapter proporciona esta combinacin por el mtodo de mapeo de relleno, que cambia los datos en el conjunto de datos para que coincida con los datos del origen de datos y actualizacin, que cambia los datos de la fuente de datos para que coincida con los datos en el conjunto de datos. SqlDataAdapter adapter = new SqlDataAdapter (); adapter.Fill (DS); El objeto SqlDataAdapter y los objetos DataSet son combinan para llevar a cabo tanto en el acceso de datos y las operaciones de manipulacin de datos en el SQL Server de base de datos. Cuando el usuario realice las operaciones de SQL como select, insert, etc en los datos que contienen en el conjunto de datos de objetos, no afectar directamente a la base de datos, hasta que el usuario invoca el mtodo de actualizacin en los SqlDataAdapter. using System; using System.Windows.Forms; using System.Data; using System.Data.SqlClient; espacio de nombres WindowsApplication1 { public partial class Form1: Form { public Form1 () ADO NET 22

{ }

InitializeComponent ();

private void Button1_Click (object sender, EventArgs e) { connetionString cadena = null; SqlConnection sqlCnn; SqlCommand sqlcmd; SqlDataAdapter adapter = new SqlDataAdapter (); DataSet ds = new DataSet (); int i = 0; string sql = null; connetionString = "Data Source = ServerName; Initial Catalog = DatabaseName, ID de usuario = nombre de usuario, contrasea = contrasea"; sql = "Select * from producto"; sqlCnn = new SqlConnection (connetionString); tratar de { sqlCnn.Open (); sqlcmd = new SqlCommand (sql, sqlCnn); adapter.SelectCommand = sqlcmd; adapter.Fill (DS); for (i = 0; i <= ds.Tables [0] Rows.Count - 1;. i + +) { MessageBox.Show (.. Ds.Tables [0] filas [i] ItemArray [0] + "-" + ds.Tables [0] filas [i] ItemArray [1]..); } adapter.Dispose (); sqlCmd.Dispose (); sqlCnn.Close (); } catch (Exception ex) { MessageBox.Show ("No se puede abrir la conexin"); } } } }

ADO NET

23