Vous êtes sur la page 1sur 20

WorkShop ADO.NET 2.

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

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

WorkShop ADO.NET 2.0

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

Objetos Importantes en ADO.NET


La arquitectura ADO.NET se divide en dos: Conectada y Desconectada. Las clases se dividen dentro de estas categoras.

Los Objetos Conectados


Los objetos que tienen que tener una conexin abierta para poder trabajar e interactuar con la fuente de datos. Connection: Establece una conexin con la fuente de datos. Transaction: Cuando quieres ejecutar un grupo de comandos juntos y se tienen que ejecutar todos o ninguno. Ejemplo: transacciones bancarias. DataAdapter: Acta de puente entre el modo desconectado y conectado. Se conecta en automtico a la fuente de datos. Command: Se ejecuta en la fuente de datos, para manipular datos con consultas, actualizar, insertar o borrar datos. Parameter: Un comando acepta parmetros. Pueden ser de entrada o de salida, pueden regresar valores de un stored procedure o ? argumentos pueden ser pasados por la consulta SQL. DataReader: Es un cursor de solo lectura y solo se puede leer para adelante.

Los Objetos Desconectados


DataSet: Es una representacin en miniatura de una base de datos relacional todo en memoria. o Espacio de nombres: System.Data; trabaja con todos los proveedores de datos. o Puede tener una coleccin de DataTables y DataRelations. DataTable: Similar a una tabla en una base de datos. Tiene DataColumns, DataRows y restricciones. Almacena informacin en una fila con columnas. DataRow: Una de las propiedades de un DataTable es Rows del tipo DataRowCollection que representan una coleccin enumerable de objetos DataRow. DataColumn: Un DataTable contiene una propiedad Columns del tipo DataColumnCollection. DataView: Similar a una vista en base de datos. Permite crear un vista en un DataTable y ver un sub-conjunto de datos, por medio de la propiedad Filter. O puedes usar la propiedad Sort para ordenar un conjunto de datos. Un DataTable puede tener varias vistas asociadas a l.
llopez@na-at.com.mx

Luis Lpez CEL: 55.29.71.65.22

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.

En la siguiente tabla se muestra cuando usar cada uno


Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx

WorkShop ADO.NET 2.0

ADO.NET - Hola NA-AT Consulting!


Configurando la Fuente de Datos
La fuente de datos ser en SQL Server 2005 y Oracle 10g. La base de datos se llamara en SQL Server Test, en Oracle usaremos XE y estas contendrn una tabla llamada Demo. Este es el script
SQL Server
Create Table Demo ( DemoID int primary key, DemoValue varchar(200) ) GO Insert Into Demo (demoID,DemoValue) Values (1,'Hello World') GO

Oracle
Create Table Demo ( DemoID number primary key, DemoValue varchar(200) ); Insert Into Demo (demoID,DemoValue) Values (1,'Hello World');

Arrastrando en ASP.NET 2.0


La manera ms simple de crear aplicaciones es arrastrando en ASP.NET 2, de esta manera se ocupa el control SqlDataSource, para Oracle no existe un control como este. Ver video de cmo se hace en ASP.NET Arrastrando_ASP.NET_SQL y tambin est el video en Windows Forms Arrastrando_WinForms_SQL Como se pueden dar cuenta esto no es programar, solo es arrastrar y en la vida real en muy pocas ocasiones lo van a manejar. Ahora vean el siguiente video de cmo se hace desde C# Primer_Acercamiento_ADO.NET_SQLServer y Primer_Acercamiento_ADO.NET_Oracle10g

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

WorkShop ADO.NET 2.0

Conectndose a Una Fuente de Datos


Objeto Connection
El objeto Connection indica a que servidor, base de datos y con qu credenciales podr tener acceso y hacer operaciones desde .NET; esto por medio de una cadena de conexin que regularmente se escribe con un Data Source que indica el servidor donde se conectara; una seccin Initial Catalog que indica la base de datos; las secciones User id y Password indican las credenciales con las que se conectara a la fuente de datos, para ver tipos de cadenas de conexin vea la siguiente pgina: http://www.connectionstrings.com/ Ver video ObjetoConnection_SQLServer_Oracle que indica el estado de una conexin. Estas son algunas razones por la cual no es bueno dejar en hard-code (cdigo duro) una cadena de conexin. Regularmente se tienen que cambiar una vez que entra a produccin y si se cambia la cadena hay que recompilar el assembly. El cdigo .NET se puede ver con el Ildasm.exe mostrando la cadena de conexin.

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>

Y podemos tener acceso a esta cadena con el siguiente cdigo:


string cadena = ConfigurationManager.ConnectionStrings["Oracle"].ConnectionString;

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

Obteniendo Datos en Modo Conectado


Comunicacin con la Fuente de Datos
Despus del objeto Connection hay dos operaciones que tenemos que hacer Especificar que datos nos interesan (Command por medio de un query) o Con SQL podemos obtener datos con la instruccin SELECT; o modificar registros con las instrucciones INSERT; DELETE; UPDATE (Data Manipulation Language - DML) Ejemplos Consulta simple SE SELECT useraddress, userphone FROM users WHERE username = 'John'; Consulta parametrizada SELECT useraddress, userphone FROM users WHERE username = @UserName; Stored Procedure EXEC sp_getUserAddressPhone(@UserName); Obtener los resultados e interactuar con ellos.

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

WorkShop ADO.NET 2.0

Obteniendo un Valor Scalar


Tenemos que trabajar con el objeto XXXCommand. ExecuteScalar(); para obtener el valor de la primera columna y de la primera
fila de una consulta. Este mtodo regresa un tipo Object por lo que tenemos que hacer el cast correspondiente. Ver video Command_ExecuteScalar_Oracle y Command_ExecuteScalar_SQL

Obteniendo Datos en un Result Set por el mtodo ExecuteReader()


ExecuteReader() es el mtodo que regresa un objeto tipo DbDataReader el cual nos permite recorrer un conjunto de resultados y sus columnas. Se puede mover a travs de varias consultas por medio de su mtodo NextResult(); la interfase IDataReader implementa IDataRecord (Un registro) y IDisposable (liberar memoria). Estos son mtodos que implementa IDataRecord Get[DataType]: En realidad el nombre lo completa el tipo de la columna, ejemplo GetBoolean si se sabe el tipo de la columna en base de datos. GetName: Obtener el valor de una columna por su nombre. GetOrdinal: Obtener el valor por medio de su ndice. IsDbNull: Se usa para validar que una columna tenga valores null.

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

Trabajando con el mtodo NextResult() del objeto XXXDataReader


Para recorrer mltiples consultas en un solo objeto XXXDataReader es necesario invocar el mtodo NextResult() , ver video SQLDataReader_NextResult y ver video con Oracle OracleDataReader_NextResult

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.

Para entender el DataSet primero hay que entender el DataTable.

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"));

Este ejemplo muestra cmo crear un DataTable desde cdigo


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));

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

Eventos del DataTable

Luis Lpez CEL: 55.29.71.65.22

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.

Luis Lpez CEL: 55.29.71.65.22

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();

El cual tiene siete sobrecargas...

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

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

11

WorkShop ADO.NET 2.0 Y para verlo en accin ver DataRelationWinForms

Buscando Datos: DataAdapter


Un DataAdapter no solo llena un objeto DataSet o DataTable de datos, tiene un mecanismo para guardar cambios que se hayan hecho en la base de datos.

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]

CONSTRAINT [FK_UserPermissionsTable_UserTable] FOREIGN

Oracle
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx

12

WorkShop ADO.NET 2.0


CREATE TABLE PermissionsTable ( PermissionID NUMBER PRIMARY KEY, PermissionType VARCHAR2(50) not null ); --Esta instruccin es similar a un IDENTITY(1,1) en SQL Server --para la tabla PermissionsTable. CREATE SEQUENCE SEQ_PT_ID MINVALUE 1 MAXVALUE 999999999999999999 START WITH 1 INCREMENT BY 1 NOCACHE ; CREATE TABLE UserTable ( UserID NUMBER PRIMARY KEY, FirstName VARCHAR2(50) not null, LastName VARCHAR2(50) null ); --Esta instruccin es similar a un IDENTITY(1,1) en SQL Server --para la tabla UserTable. CREATE SEQUENCE SEQ_UT_ID MINVALUE 1 MAXVALUE 999999999999999999 START WITH 1 INCREMENT BY 1 NOCACHE ; CREATE TABLE UserPermissionsTable ( UserPermissionsID NUMBER PRIMARY KEY, UserID NUMBER not null CONSTRAINT FK_UPT_UserTable REFERENCES UserTable(UserID), PermissionsID NUMBER not null CONSTRAINT FK_UPT_PermissionsTable REFERENCES PermissionsTable(PermissionID) ); --Esta instruccin es similar a un IDENTITY(1,1) en SQL Server --para la tabla UserPermissionsTable. CREATE SEQUENCE SEQ_UPT_ID MINVALUE 1 MAXVALUE 999999999999999999 START WITH 1 INCREMENT BY 1 NOCACHE ; --En Oracle tenemos que hacer truco para que se incremente en automtico --la columna esto por la consulta: SELECT SEQ_PT_ID.nextval from dual; donde SEQ_PT_ID es el --nombre de la secuencia. --Y --Crear un Trigger que se dispare antes de la sentencia insert, el cual llama la secuencia en automtico --obtiene el siguiente valor e insterta en el campo PermissionID de la tabla PermissionsTable -CREATE OR REPLACE TRIGGER TRG_PT BEFORE INSERT ON PermissionsTable FOR EACH ROW BEGIN IF :new.PermissionID IS NULL THEN SELECT SEQ_PT_ID.nextval INTO :new.PermissionID FROM DUAL; END IF; END; --Ahora solo tenemos que insertar valore de la siguiente forma: insert into PermissionsTable (PermissionType) values ('Luis'); --Y en automtico se genera el siguiente valor para la columna PermissionID --Estos son los otros dos triggers CREATE OR REPLACE TRIGGER TRG_UT BEFORE INSERT ON UserTable FOR EACH ROW BEGIN IF :new.UserID IS NULL THEN SELECT SEQ_UT_ID.nextval INTO :new.UserID FROM DUAL; END IF;

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

13

WorkShop ADO.NET 2.0


END; CREATE OR REPLACE TRIGGER TRG_UPT BEFORE INSERT ON UserPermissionsTable FOR EACH ROW BEGIN IF :new.UserPermissionsID IS NULL THEN SELECT SEQ_UPT_ID.nextval INTO :new.UserPermissionsID FROM DUAL; END IF; END;

-----------------------------------------------------------------------------------------------------------------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;

Este es el diagrama de la tablas creadas.

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

Llenando DataSet: Ms de una Tabla


En estos ejemplos siguientes vemos como llenar un objeto DataSet, se llenan con varas consultas desde SQL Server u Oracle. SQL_Oracle FillDataSetSQLServer_Oracle
Luis Lpez CEL: 55.29.71.65.22 llopez@na-at.com.mx

14

WorkShop ADO.NET 2.0

Consultando el esquema de una base de datos


Un DataAdapter no puede identificar filas duplicadas, ya que no tiene informacin de esquema de la base de datos. Esto se puede solucionar con un DataSet. Video FillSchemaDataSet

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

Ordenando, Buscando y Filtrando


Para trabajar con los siguientes temas tenemos que configurar nuestro ambiente de SQL Server, no se har en Oracle ya que la forma de llenar la informacin es similar.
Customers
Column Name CustomerId FirstName LastName Condensed Type int varchar(50) varchar(50) Nullable No Yes Yes

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

Trabajando con el objeto DataView


Un DataView es similar a una Vista en base de datos, tiene la habilidad de tener un conjunto de resultados en cada DataView y podemos tener los DataViews que necesitemos. Creando un DataView Hay tres constructores para crear un DataView
1. 2. 3. DataView myView = new DataView() ; DataView myView = new DataView(myTable) ; DataView dv = new DataView(productsTable, "ProductID = 1", "ProductName", DataViewRowState.Unchanged);

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

Un DataView tiene propiedades para obtener la informacin que se necesite.


RowFilter: Un criterio de seleccin Sort: Permite ordenar un conjunto de resultados RowStateFilter: El DataTable mantiene una historia de los cambios que se han hecho. Esta propiedad permite especificar un DataViewRowState e identificar la versin de datos

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"];

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

16

WorkShop ADO.NET 2.0

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)

Moviendo Cantidades Largas de Datos: SqlBulkCopy


Te has preguntado cmo mover grandes cantidades de informacin entre bases de datos, puede ser con BCP (BulkCopy) o DTS (Data Transformation Services), estos son mejores que ir copiando DataRow tras DataRow. .NET 2.0 tiene una clase para este propsito: SqlBulkCopy. Video SqlBulkCopy

Transacciones
Qu es una Transaccin?
Es un conjunto de operaciones que deben de ejecutarse con xito todas o ninguna.

Propiedades del ACIDO


Una transaccin debe ser Atmica, Consistente, Aislada y Durable.
Atmica: Deben de tener xito todas las operaciones o ninguna. Consistente: Una transaccin toma la base de datos de un estado estable a otro.

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

17

WorkShop ADO.NET 2.0


Durable: Los cambio se almacenan en memoria (HD) antes que se declare exitosa la transaccin. Se almacenan en disco por si hay que hacer un RollBack para mantener la integridad. Aislada: Cada transaccin es una entidad independiente. Una transaccin no debe afectar otra transaccin que se encuentre corriendo al mismo tiempo.

Vocabulario de las Transacciones


Hay comandos que se usan para las transacciones; son BEGIN, COMMIT, SAVE y ROLLBACK.

Soporte para las Transacciones ADO.NET


Existe el espacio de nombres System.Transactions para trabajar con transacciones. Se puede usar en modo conectado y desconectado. Esta es la secuencia tpica. 1. Abre la base de datos. 2. Begin a la transaccin. 3. Mandar los querys por medio de objetos Command. 4. Commit o roll back la transaccin. 5. Cerrar la conexin.

Y este es diagrama en modo desconectado

Luis Lpez CEL: 55.29.71.65.22

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.

Este es un ejemplo de cmo implementar las transacciones

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.

Luis Lpez CEL: 55.29.71.65.22

llopez@na-at.com.mx

20