Professional Documents
Culture Documents
Tabla de contenido
Introduccin ADO.NET ............................................................................................................................................................ 3 Qu es ADO.NET? .............................................................................................................................................................. 3 Objetos Importantes en ADO.NET ...................................................................................................................................... 3 Los Objetos Conectados ...................................................................................................................................................... 3 Los Objetos Desconectados ................................................................................................................................................ 3 Proveedores ADO.NET ........................................................................................................................................................ 4 ADO.NET - Hola NA-AT Consulting!......................................................................................................................................... 5 Configurando la Fuente de Datos ....................................................................................................................................... 5 Arrastrando en ASP.NET 2.0................................................................................................................................................ 5 Conectndose a Una Fuente de Datos ................................................................................................................................... 6 Objeto Connection .............................................................................................................................................................. 6 Connection Pooling ............................................................................................................................................................. 6 Obteniendo Datos en Modo Conectado ................................................................................................................................. 6 Comunicacin con la Fuente de Datos................................................................................................................................ 6 Obteniendo un Valor Scalar ................................................................................................................................................ 7 Obteniendo Datos en un Result Set por el mtodo ExecuteReader() ............................................................................... 7 Trabajando con el mtodo NextResult() del objeto XXXDataReader ................................................................................. 7 DataSets .................................................................................................................................................................................. 7 DataTable ............................................................................................................................................................................ 8 DataColumn ........................................................................................................................................................................ 8 DataRow .............................................................................................................................................................................. 8 Constraints .......................................................................................................................................................................... 8 ForeignKeyConstraint...................................................................................................................................................... 9 UniqueConstraint ............................................................................................................................................................ 9 Configurando Primary Key .............................................................................................................................................. 9 Eventos del DataTable ........................................................................................................................................................ 9 Ejemplos de los Eventos en el DataTable...................................................................................................................... 10 Datos Relacionales ............................................................................................................................................................ 10 Coleccin de Relaciones ................................................................................................................................................ 11 Buscando Datos: DataAdapter .............................................................................................................................................. 12
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
WorkShop ADO.NET 2.0 Que es un DataAdapter? ................................................................................................................................................... 12 Usando el DataAdapter ..................................................................................................................................................... 12 Configurando la Fuente de Datos ................................................................................................................................. 12 Llenando DataSet: Ms de una Tabla ............................................................................................................................... 14 Consultando el esquema de una base de datos ............................................................................................................... 15 ADO.NET Mapping ............................................................................................................................................................ 15 Ordenando, Buscando y Filtrando .................................................................................................................................... 15 Mtodo Find() ............................................................................................................................................................... 15 Obteniendo un conjunto de DataRows......................................................................................................................... 15 Creando Columnas Calculadas en un DataTable .......................................................................................................... 16 Funciones de Agregacin en DataTable ........................................................................................................................ 16 Trabajando con el objeto DataView.................................................................................................................................. 16 Creando un DataView ................................................................................................................................................... 16 Convertir un DataView a un DataTable......................................................................................................................... 16 Actualizando Datos ............................................................................................................................................................... 17 Estado de un DataRow y Usarlo para actualizar Datos ..................................................................................................... 17 Moviendo Cantidades Largas de Datos: SqlBulkCopy ....................................................................................................... 17 Transacciones........................................................................................................................................................................ 17 Qu es una Transaccin? ................................................................................................................................................ 17 Propiedades del ACIDO ..................................................................................................................................................... 17 Vocabulario de las Transacciones ..................................................................................................................................... 18 Soporte para las Transacciones ADO.NET ......................................................................................................................... 18 La Clase Transaction ...................................................................................................................................................... 19 Examinando los efectos de los niveles de Aislamiento (Isolation) ............................................................................... 19
llopez@na-at.com.mx
Introduccin ADO.NET
Qu es ADO.NET?
Microsoft ADO.NET es parte del Framework .NET: Un conjunto de herramientas y capas que permiten la comunicacin con una fuente de datos. Espacio de nombres System.Data
WorkShop ADO.NET 2.0 Constraint: Otra propiedad es Constraint del tipo ConstraintCollection. Permite crear objetos ForeignKeyConstraint o UniqueConstraint y asociarlos a varias columnas. DataRelations: Un DataSet como una base de datos, puede tener tablas relacionadas. Este objeto permite relacionar varias tablas y as permitir validar datos de las tablas y buscar las filas hijas dependiendo de la fila padre.
Proveedores ADO.NET
ADO.NET divide los objetos dependiendo la base de datos.
Oracle
Create Table Demo ( DemoID number primary key, DemoValue varchar(200) ); Insert Into Demo (demoID,DemoValue) Values (1,'Hello World');
llopez@na-at.com.mx
Poniendo la cadena de conexin en un lugar comn nos aseguramos que todos ocupen la misma cadena en el proyecto. Este lugar es un archivo de configuracin XML (Web.config) en las aplicaciones web.
<connectionStrings> <add name="Oracle" connectionString="Data Source=XE; User Id=system; Password=system;"/> </connectionStrings>
Connection Pooling
Cuando una nueva conexin es pedida, el administrador del Pool checa si tiene conexiones sin usar y regresa una conexin disponible. Si todas estn ocupadas y el tamao mximo del Pool no se ha pasado, se crea una conexin y se agrega al Pool. Cuando esta al nivel mximo del Pool las nuevas conexiones se encolan hasta que haya una conexin disponible. En ADO.NET siempre est activa, para deshabilitarla se usa Pooling=false; en la cadena de conexin. Ver video ConnectionPooling Escuchar ProblemaPooling.mp3
llopez@na-at.com.mx
Para terminar necesitamos un mtodo que regrese un conjunto de IDataRecord esto lo hace un ExecuteReader() que regresa un DBDataReader. Ver Video XXXCommandExecuteReaderSQL_Oracle en este video se muestra como recorrer un XXXDataReader y crear una tabla en HTML. En el siguiente video se muestra como enlazar datos de modo conectado a un GridView, se recorre con un foreach el DataReader XXXCommandExecuteReaderSQL_Oracle_foreach
DataSets
Permite cargar una porcin de datos y proporciona un espacio similar a una tabla relacional. Mantiene la historia por columna, permitiendo actualizar los datos con ms facilidad. Estas son algunas caractersticas del DataSet: Es serializable: Puede convertirse en un stream de bytes o en memoria para poder leer los datos despus. Trabaja con XML: Serializacin que entiende el hombre y la computadora. Mantiene un historial de cambios: No solo obtiene datos, tambin hace cambios en la base de datos.
Esta lista muestra las propiedades del DataSet que juntas forman la representacin en memoria de un DataSet
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
WorkShop ADO.NET 2.0 Tables: Un DataSet puede contener 0 o ms objetos DataTable. Relations: Define una relacin entre tablas por medio de llaves forneas. ExtendedProperties: Se puede usar para almacenar informacin personalizada como la hora en que se crea el DataSet.
DataTable
Un objeto DataTable puede estar independiente de un DataSet. En la versin 2.0 es serializable y tiene mtodos como Merge y GetChanges como el DataSet. Contiene una coleccin de Columns, Rows y Constraints. Las Columns y Constraints definen el esquema del DataTable. Los Rows contienen los datos.
DataColumn
Define el nombre y el tipo de dato del una columna en un DataTable.
//Agregando una columna usando el constructor DataColumn myColumn = new DataColumn("ID", typeof(System.Int32)); //El primer argumento es el nombre de la columna y el segundo es el tipo de dato DataTable productsTable = new DataTable(); //Agreagando columnas usando un DataTable productsTable.Columns.Add("ID", Type.GetType("System.Int32"));
DataRow
Ahora con la definicin de la tabla, podemos llenarlo con datos. Esto agregando nuevos objetos DataRows por medio del mtodo NewRow() del objeto DataTable, el cual regresa un DataRow con el esquema hecho.
DataTable productsTable = new DataTable("Products"); // Creamos el esquema productsTable.Columns.Add("ID", typeof(System.Int32)); productsTable.Columns.Add("Name", typeof(System.String)); productsTable.Columns.Add("Category", typeof(System.Int32)); // Creamos un DataRow con el esquema hecho DataRow tempRow = productsTable.NewRow(); tempRow["ID"] = 1; tempRow["Name"] = "Caterham Seven de Dion"; tempRow["Category"] = 1; // Agregamos el DataRow a la tabla productsTable.Rows.Add(tempRow);
Constraints
Reglas que se aplican a las columnas que definen que accin tomar cuando un dato es alterado. En ADO.NET hay dos tipos de Constraints: ForeignKeyConstraints y UniqueConstraints
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
WorkShop ADO.NET 2.0 ForeignKeyConstraint Se usa para forzar una integridad referencial. Se puede establecer el comportamiento en cascada, esto se puede configurar por las propiedades ForeignKeyConstraint.DeleteRule y/o the ForeignKeyConstraint.UpdateRule, se pueden llenar con le enumeracin siguiente: Cascade - Borra o actualiza en cascada SetNull - Pone el valor DBNull en todas las columnas afectadas. SetDefault - Deja los valores que tienen las columnas. None - No se toman acciones.
UniqueConstraint Obliga a que el valor de una columna sea nica, mejor conocida como PrimaryKey. Si se pone el valor repetido en la columna se arroja el tipo de excepcin System.Data.ConstraintException. Configurando Primary Key
DataTable productsTable = new DataTable("Products"); // Creamos el esquema productsTable.Columns.Add("ID", typeof(System.Int32)); productsTable.Columns.Add("Name", typeof(System.String)); productsTable.Columns.Add("Category", typeof(System.Int32)); // Creamos un DataRow con el esquema hecho DataRow tempRow = productsTable.NewRow(); tempRow["ID"] = 1; tempRow["Name"] = "Caterham Seven de Dion"; tempRow["Category"] = 1; // Agregamos el DataRow a la tabla productsTable.Rows.Add(tempRow); //Ponemos el la llave primaria productsTable.PrimaryKey = new DataColumn[] { productsTable.Columns["ID"] };
Ver video de cmo crear un DataTable y enlazarlo a un GridView CrearDataTableDinamicamente Ver video de cmo crear un DataTable y crear un XML con su contenido CrearDataTableDinamicamenteXML Los dos ejemplos muestran como se hace dinmicamente desde el code-behind
llopez@na-at.com.mx
WorkShop ADO.NET 2.0 Estos son los valores que tienen los argumentos cuando se trabaja con eventos de columna (Columns)
Estos son los valores que tienen los argumentos cuando se trabaja con eventos de fila (Rows)
Estos son los valores que tienen los argumentos cuando se trabaja con eventos de tabla (Table)
Ejemplos de los Eventos en el DataTable Como vimos los eventos del objeto DataTable se dividen en tres categoras: Column-based: ColumnChanging, ColumnChanged Row-based: RowChanging, RowChanged, RowDeleting, RowDeleted Table-based: TableClearing, TableCleared, TableNewRow Los eventos de columna y los de fila se pueden usar para validar y controlar los datos. Los eventos de fila se usan para poner valores a las nuevas filas. Ver video ManejandoEventosDataTable
Datos Relacionales
El DataSet puede tener relaciones entre tablas por medio de llaves forneas. Entonces podemos decir que un DataSet es una coleccin de Tables y Relations.
llopez@na-at.com.mx
10
WorkShop ADO.NET 2.0 Coleccin de Relaciones La propiedad DataSet.Relations es una instancia de la clase DataRelationCollection. La coleccin tiene objetos DataRelation, el cual se crea para tener relaciones padre-hijo entre DataTables en un DataSet. Un ejemplo de este tipo de relaciones es una llave primaria y con una fornea. Cuando creamos una relacin invocamos el mtodo Add() de la propiedad Relations del objeto DataSet ejemplo
DataSet.Relations.Add();
Con cualquiera de estas sobrecargas podemos crear una relacin. Vamos a crear un ejemplo, es importante que te des cuenta que todos los objetos que hemos trabajado se encuentran en el espacio de nombres System.Data, no nos hemos metido con ninguna base de datos (todava). Trabajaremos con dos DataTables su esquema se muestra a continuacin Tabla Animal
Tabla Mascota
llopez@na-at.com.mx
11
Que es un DataAdapter?
Es un puente entre el modo conectado y desconectado de ADO.NET, usa objetos conectados como un DbCommand para llenar objetos desconectados como un DataSet o un DataTable. No tenemos problemas de Pooling de conexiones con el DataAdapter. Un DataAdapter ocupa un DbCommand y acta de puente entre el modo conectado del DbCommand, DbConnection y el modo desconectado del DataSet y DataTable.
Usando el DataAdapter
Puede ser usado para consultas o actualizar la fuente de datos. Configurando la Fuente de Datos Estos son los scripts (SQL Server, Oracle) para trabajar con los ejemplos del DataAdapter. Crearemos tres tablas con relaciones de muchos a muchos entre ellas: UserTable, PermissionsTable y UserPermissionsTable. Hay ciertas diferencias entre SQL Server y Oracle aqu los scripts SQL Server
CREATE TABLE [dbo].[PermissionsTable]([PermissionID] [int] IDENTITY(1,1) NOT NULL,[PermissionType] [varchar](50) NOT NULL, CONSTRAINT [PK_PermissionsTable] PRIMARY KEY CLUSTERED ([PermissionID] ASC) ON [PRIMARY]) ON [PRIMARY] Go CREATE TABLE [dbo].[UserPermissionsTable]( [UserPermissionsID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [PermissionsID] [int] NOT NULL, CONSTRAINT [PK_UserPermissionsTable] PRIMARY KEY CLUSTERED ([UserPermissionsID] ASC) ON [PRIMARY]) ON [PRIMARY] Go CREATE TABLE [dbo].[UserTable]( [UserID] [int] IDENTITY(1,1) NOT NULL, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NULL, CONSTRAINT [PK_UserTable] PRIMARY KEY CLUSTERED ([UserID] ASC) ON [PRIMARY]) ON [PRIMARY] Go ALTER TABLE [dbo].[UserPermissionsTable] WITH CHECK ADD FOREIGN KEY( [PermissionsID]) REFERENCES [PermissionsTable] ([PermissionID]) GO ALTER TABLE [dbo].[UserPermissionsTable] KEY([UserID]) REFERENCES [UserTable] ([UserID]) GO WITH CHECK ADD CONSTRAINT [FK_UserPermissionsTable_PermissionsTable]
Oracle
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
12
llopez@na-at.com.mx
13
-----------------------------------------------------------------------------------------------------------------Ejemplos de como agregar unas lneas insert into PermissionsTable (PermissionType) values ('Luis'); select * from PermissionsTable; insert into userTable (UserTable.FIRSTNAME,UserTable.LASTNAME) values ('Luis','Lpez'); select * from userTable; insert into UserPermissionsTable (UserPermissionsTable.USERID, UserPermissionsTable.PermissionsID) values (1,1); select * from UserPermissionsTable; --Ejemplo de como quitar de la base de datos los objetos creados drop table UserPermissionsTable; drop table UserTable; drop table PermissionsTable; drop sequence SEQ_PT_ID; drop sequence SEQ_UT_ID; drop sequence SEQ_UPT_ID;
El DataAdapter siempre deja la conexin como la encontr. El mtodo Fill del DataAdapter llena un objeto DataTable o DataSet. Llenar un DataTable para cuando manejamos solo una consulta en SQL Server u Oracle. Llenar un DataSet cuando obtenemos ms de un conjunto de resultados. Ver video FillDataTable_SQLServer_Oracle_querys Ver video FillDataTable_SQLServer_Oracle_SP
14
ADO.NET Mapping
Si NO quieres usar alias en las columnas dentro de ADO.NET es necesario ocupar el objeto DataTableMapping y su propiedad ColumnMappings para ocupar los nombres de las columnas y no los alias. Video DataTableMapping
Products
Column Name ProductId ProductName Price TaxPercent Condensed Type int varchar(50) money decimal(3, 2) Nullable No Yes Yes Yes
CustomerProducts
Column Name CustomerProductId CustomerId ProductId Condensed Type int int int Nullable No No No
Una vez que tenemos las tablas creadas les ponemos datos para poder trabajar con los ejemplos.
--Ests son algunas de las operaciones que podemos hacer desde --el SQL Select * from products where productid = 1 --filtrar datos por ID Select * from products where productname like '%MP%' --filtrar datos por nombre Select * from products where productname like '%MP%' order by price --ordenarlos por una columna Select price + (price * taxPercent) as totalprice from products --columnas calculadas
Esto lo podemos hacer desde un DataTable Mtodo Find() Para encontrar una fila existe el mtodo Find en la propiedad Rows del objeto DataTable. Este mtodo solo funciona para encontrar datos en columnas que tienen una restriccin de primary key o foreign key. Ver video DataTable.Rows.Find Obteniendo un conjunto de DataRows En SQL para obtener un conjunto de filas utilizamos la clausula where
select * from Customers where LastName like '%EZ' Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
15
WorkShop ADO.NET 2.0 En un DataTable es similar. Existe el mtodo Select del objeto DataTable este es un ejemplo
DataRow[] drs = dt.Select("LastName Like '%EZ'");//obtiene los que terminen en EZ
Video DataTable.Select Creando Columnas Calculadas en un DataTable Podemos crear columnas calculadas en un DataTable por medio de un objeto DataColumn, ver video DataTableCalculateColumn Funciones de Agregacin en DataTable Podemos usar funciones de SQL como SUM para obtener la suma de un conjunto de columnas, o COUNT para conocer la cantidad de filas, o el AVG para conocer el porcentaje. Video DataTable.FuncionesAgregacion
El 1, es el default. El 2, Se enlaza directamente al DataTable El 3, Permite crear una vista en una sola lnea, la tabla, filtro, ordenar y el estado de las Rows
Otra forma de buscar DataRowViews en un objeto DataView es por medio de los mtodos Find y FindRows
Find: permite buscar sobre las columnas mencionadas en la propiedad Sort, lo que quiere decir que la propiedad Sort y Find trabajan juntos. Solo regresa el ndice de la DataRowView encontrado. FindRows: Regresa un conjunto de DataRowView.
Ver Video DataView Convertir un DataView a un DataTable En la versin 2.0 podemos convertir un DataView en un DataTable.
DataTable subsetTable = view.ToTable[]; // or DataTable subsetTable = view.ToTable["TableName"];
llopez@na-at.com.mx
16
Actualizando Datos
Estado de un DataRow y Usarlo para actualizar Datos
Un DataSet permite almacenar datos en memoria, por medio de un DataAdapter y su mtodo Update() puede actualizar datos que estn en DataRow, el DataAdapter debe saber cual DataRow debe Actualizar, Borrar, Insertar. Esto lo podemos validar con la propiedad DataRow.RowState le podemos asignar una enumeracin tipo DataRowState.
En el siguiente video vamos a ver como actualizar la base de datos por medio de DataAdapter DataAdapter.Update(DataTable)
Transacciones
Qu es una Transaccin?
Es un conjunto de operaciones que deben de ejecutarse con xito todas o ninguna.
llopez@na-at.com.mx
17
llopez@na-at.com.mx
18
WorkShop ADO.NET 2.0 La Clase Transaction Todos los proveedores tienen su clase para las transacciones SqlTransaction, OracleTransaction Mtodos de la Clase Transaction Tiene dos mtodos
Commit: Este mtodo identifica la transaccin como exitosa y todos los cambios se quedan en la base de datos. Rollback: Identifica una transaccin como no exitosa y los cambios se descartan.
Ver video de Transacciones en SqlServer TransactionSQLServer Ver video de Transacciones en ADO.NET TransactionADO.NET Examinando los efectos de los niveles de Aislamiento (Isolation) Con Isolation podemos controlar el comportamiento de las transacciones y como las consultas afectan otras consultas corriendo en el mismo servidor, esto se hace poniendo el nivel de aislamiento. Qu son los niveles de aislamiento? Determina como las transacciones se comportan con otras transacciones. Ejemplo, en SQL Server por default, si dos transacciones se encuentran corriendo independientemente una de otra, la primera transaccin no hace visible los registros a la segunda transaccin a menos que la primera transaccin sea confirmada (commited). Si quieres ver el cambiar el comportamiento de las transacciones para que la segunda transaccin vea los registros de la primera transaccin a esto se le conoce como dirty read ya que puede que se lean datos invlidos porque no se ha confirmado en la primera transaccin. Es importante entender algunos trminos para entender los niveles de asilamiento
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx
19
WorkShop ADO.NET 2.0 Dirty read: es una condicin donde las transacciones leen datos que no han sido confirmadas. Nonrepeatable read: cuando una transaccin A lee un registro de una tabla. La transaccin B modifica o borra el registro y confirma el cambio. Si la transaccin A intenta leer de nuevo el registro, ver que ha cambiado o no se encuentra. Phantom read: imagina que la transaccin A obtiene un conjunto de resultados. Inicialmente la transaccin A tiene 100 registros. Ahora la transaccin B agrega algunos registros que se agregan a la consulta de la transaccin A. Si la transaccin A ejecuta la consulta de nuevo, se mostraran los registros agregados por la transaccin B.
Niveles de Aislamiento en ADO.NET Se encuentran en una enumeracin IsolationLevel: Chaos: no soportada en SQL Server ni en Oracle. ReadUncommitted: el dirty read es posible y no es soportado en Oracle. ReadCommited: evita el dirty read, pero los datos pueden cambiar antes que la transaccin acabe. Este nivel es apropiado cuando quieres trabajar con los datos que han sido confirmados. Soportado por Oracle y es el nivel para SqlTransaction. RepeatableRead: previene que otros modifiquen los datos. Phantom rows son posibles, este tipo de transaccin se asegura que todas las otras modificaciones a los datos paren hasta que esta transaccin termine. No es soportada en Oracle. Snapshot: si una transaccin A modifica un dato, entonces la transaccin B no ser capaz de ver los cambios que se han hecho. Este tipo es ideal cuando las aplicaciones que necesitan integridad de datos en consultas largas. Primero hay que configurarlo en la base de datos. Serializable: es de ayuda cuando necesitamos trabajar en un conjunto de registros y necesitas absoluta consistencia entre las operaciones y un mayor control sobre los datos. El costo es alto, es compatible con Oracle. Unspecified: el nivel no puede ser determinado.
llopez@na-at.com.mx
20