ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

57
ADO .NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina

Transcript of ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Page 1: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

ADO .NET

Diego CasaliSERegión Córdoba y NOAMicrosoft de Argentina

Page 2: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Lo que vamos a cubrir

• Entender la diferencia entre ADO y ADO.NET

• Cómo integrar ADO.NET con .NET utilizando Visual Studio.NET

• Cómo utilizar las capacidades avanzadas de ADO.NET

• Cómo aprovechar el soporte XML con ADO.NET

Page 3: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Prerrequisitos de la sesión

• Diseño y programación de la base de datos relacional

• Programación de Visual Basic 6.0

• ADO de Microsoft

• Entendimiento de XML

Page 4: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Agenda

• Introducción a ADO.NET

• Programación con ADO.NET

• Soporte XML

• Funciones avanzadas

• ¿Cuándo utilizar qué?

Page 5: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NET¿Qué es ADO.NET?

• Evolución natural de ADO• Interoperabilidad

– Basado en estándares como XML, XSD• Escalabilidad

– Objetivos distribuidos, escenarios web desconectados

• Modelo– Arquitectura distribuida que reemplaza al

cliente / servidor– Integración de datos de

diferentes recursos heterogéneos

Page 6: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NET¿Por qué ADO.NET?

• Para acomodar un modelo de aplicación Web– Unido de manera flexible– Mantiene el estado entre solicitudes– Utiliza HTTP

Page 7: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NETComparación entre ADO y ADO.NET

Función ADO ADO.NET

Representación de datos residentes en la memoria

RecordSet puede contener una tabla

DataSet puede contener una o más tablas representadas por Objeto DataTable

Relación entre múltiples tablas

Requiere la consulta JOIN (UNIRSE)

Soporta el objeto DataRelation

Visita de datos Escanea de manera secuencial la filas RecordSet

Utiliza un paradigma de exploración para acceso no secuencial

Acceso desconectado

Proporcionado por RecordSet pero generalmente soporta el acceso conectado

Se comunica con llamadas estandarizadas al DataAdapter

Page 8: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NETComparación entre ADO y ADO.NET

Función ADO ADO.NET

Programabilidad Utiliza el objeto de conexión para transmitir comandos

Utiliza características de programación de XML escritas de manera sólida

Uso compartido de datos desconectados entre niveles y componentes

Utiliza la clasificación COM para transmitir el conjunto de registros desconectados

Transmite un DataSet con un archivo XML

Transmisión de datos a traves de Firewalls

Problemático ya que los firewall generalmente se configuran para evitar solicitudes a nivel sistema

Los objetos DataSet soportados utilizan XML, los cuales pueden atravezar firewalls

Escalabilidad Seguros de base de datos y conexiones activas de base de datos para largas duraciones

Acceso desconectado a la base de datos sin retener los seguros de la base de datos

Page 9: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NETObjetos de datos .NET

.NET Data Provider.NET Data Provider

DataReaderDataReader

CommandCommandConnectionConnection

SyncSync

Controls,Controls,Designers,Designers,

Code-gen, etcCode-gen, etc

DataSetDataSet

XmlReaderXmlReader

XmlText-XmlText-ReaderReader

XmlNode-XmlNode-ReaderReader

XSL/T, X-Path,XSL/T, X-Path,Validation, etcValidation, etc

XmlData-XmlData-DocumentDocument

DataAdapterDataAdapter

Page 10: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Introducción a ADO.NETObjetos de datos .NET

Page 11: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Agenda

• Introducción a ADO.NET

• Programación con ADO.NET

• Soporte XML

• Funciones avanzadas

• ¿Cuándo utilizar qué?

Page 12: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Programación con ADO.NET..NET Data Provider

• Administra la interacción a una fuente de datos – Administrado equivalente a capa OLE DB

– Expone directamente las interfaces del consumidor

– Específico para (optimizada para) DataSource

• Modelo de objeto de .NET Data Provider– Conexión

– Comando

– DataReader

– DataAdapter

Page 13: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• SQL Server .NET Data Provider

• OLE DB .NET Data Provider – Microsoft OLE DB Provider for SQL Server– Microsoft OLE DB Provider for Oracle– Microsoft OLE DB Provider for Microsoft Jet

• ODBC .NET Data Provider

Programación con ADO.NET..NET Data Provider

Page 14: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Programación con ADO.NETConexión

• Representa una conexión a la Fuente de datos

• En una conexión, usted puede…– Personalizar la conexión a la base de datos– Iniciar, comprometer y abortar transacciones

• Equivalente al objeto ADODB.Connection

Page 15: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

// Ejemplo en C#// Ejemplo en C#

//Especificar el //Especificar el NamespaceNamespace System.Data.SQLSystem.Data.SQLUsing System.Data.SqlClient;Using System.Data.SqlClient;

// Crear una instancia del objeto SQLConnection// Crear una instancia del objeto SQLConnectionSQLConnection cnn = new SQLConnection();SQLConnection cnn = new SQLConnection();

// Definir la cadena de conexión// Definir la cadena de conexióncnn.ConnectionString = cnn.ConnectionString = "server=localhost;uid=sa;database=pubs";"server=localhost;uid=sa;database=pubs";

//Abrir la conexión//Abrir la conexióncnn.Open();cnn.Open();

Programación con ADO.NETConexión

Page 16: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Representa un comando que se va a ejecutar– No necesariamente SQL

• Con un comando ADO usted puede:– Definir un enunciado para que se ejecute en el servidor– Establecer información de parámetros para ese

comando– Recuperar valores de retorno de la ejecución del

comando

• Corresponde al objeto ADODB.Command• Puede contener parámetros

– Valores que se van a utilizar cuando se ejecute el enunciado

Programación con ADO.NETComando

Page 17: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• ExecuteNonQuery

• ExecuteReader

• ExecuteScalar

• ExecuteXmlReader (únicamente para el objeto SqlCommand)

Programación con ADO.NETComando

Page 18: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Acceso a datos rápido, únicamente hacia delante, únicamente de lectura

• Funciona como un socket

• Permite un acceso escrito de manera sólida

• Debe ser cerrado

Programación con ADO.NETDataReader

Page 19: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Almacén en memoria para datos del cliente• Vista relacional de datos

– Tablas, columnas, filas, restriciones, relaciones

• Persisten los datos y el esquema como XML• Modelo desconectado explícito

– Objeto remoto, desconectado– Índice en forma de arreglo

• No hay conocimiento de Fuente de datos o Propiedades– Modelo común sobre datos heterogéneos– Características de rendimiento predecibles

Programación con ADO.NETDataSet

Page 20: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

DataSetDataSet

DataTableDataTable

DataTableDataTable

DataRowDataRow

DataColumnDataColumn

RelationesRelationes

RestriccionesRestriccionesEsquema XML Esquema XML

Programación con ADO.NETDataSet

Page 21: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• ¿Qué es DataRelation?– Se utiliza para relacionar dos objetos

DataTable– Las relaciones se crean entre columnas

equivalentes en las tablas padre e hijo– Las relaciones también pueden presentar en

cascada varios cambios de la fila padre hacia las filas hijo

Programación con ADO.NETDataRelation

Page 22: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Clase generada al momento del diseño– Hereda de DataSet– Esquema codificado en la clase

• Beneficios– IntelliSense– Verificación de tipos en tiempo de compilación– Código legible, conciso

Programación con ADO.NETTyped DataSet

Page 23: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Administra el Intercambio de datos entre DataSet y la Fuente de datos– Llenar (DataSet o DataTable)– Actualizar (DataSet o DataTable)

• Ofrece Cruces de información entre tablas y columnas

• El usuario puede anular los comandos Insertar / actualizar / eliminar– Componente de autogeneración disponible

• Permite que un único DataSet se llene de varios Orígenes de datos diferentes

Programación con ADO.NETDataAdapter

Page 24: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

DataAdapterDataAdapter

SelectCommandSelectCommand

InsertCommandInsertCommand

UpdateCommandUpdateCommand

DeleteCommandDeleteCommand

TableMappingsTableMappings

Base de datosBase de datos

DataSetDataSet

Programación con ADO.NETDataAdapter

Page 25: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

// Ejemplo en C#// Ejemplo en C#

// Crear un DataAdapter// Crear un DataAdapter

SQLDataAdapter objDataAdapter = new SQLDataAdapter(SQLDataAdapter objDataAdapter = new SQLDataAdapter(

"Select * from authors",cnn);"Select * from authors",cnn);

  

// Cargar los datos en el DataSet// Cargar los datos en el DataSet

objDataAdapter.Fill(pubs, "Authors");objDataAdapter.Fill(pubs, "Authors");

  

// hacer cambios de datos de clientes en el dataset// hacer cambios de datos de clientes en el dataset

pubs.Tables["Authors"].Rows[0]["au_lname"]="smith";pubs.Tables["Authors"].Rows[0]["au_lname"]="smith";

objDataAdapter.Update(pubs, "Authors");objDataAdapter.Update(pubs, "Authors");

Programación con ADO.NETDataAdapter

Page 26: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Programación con ADO.NETRecursos para DataBinding

• DataReader

• DataTable

• DataView

• DataSet

• Arreglo

• Colección

• IList

Page 27: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Programación con ADO.NETDataBinding

• DataView– Concibe a ésta como una vista en DataTable– Permite establecer una solicitud de clasificación y Filtro

en una vista de la tabla– Puede crear cualquier número de DataViews en una

tabla para permitir diferentes vistas de la misma tabla

Page 28: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Demostración 1DataSet, DataAdapter y

DataReader

Page 29: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Agenda

• Introducción a ADO.NET

• Programación con ADO.NET

• Soporte XML

• Funciones avanzadas

• ¿Cuándo utilizar qué?

Page 30: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Soporte XMLADO.NET y XML

• DataSet– Carga / guarda datos XML dentro / fuera de DataSet– El esquema se puede cargar / guardar como XSD– El esquema se puede inferir de datos XML

• XmlDataDocument– Expone una vista relacional sobre XML estructurado– Permite una escritura, unión de control, acceso

relacional sólidos de datos XML– Permite herramientas XML (validación de esquemas,

XSL/T, consultas Xpath) contra datos relacionales– Preserva una fidelidad total de documentos XML

Page 31: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Soporte XMLADO.NET y XML

// Ejemplo en C#// Ejemplo en C#

// Asociar un XmlDataDocument con el DataSet// Asociar un XmlDataDocument con el DataSetXmlDataDocument xmlDocument = new XmlDataDocument(pubs);XmlDataDocument xmlDocument = new XmlDataDocument(pubs);

// Obtener un XmlNavigator para el XmlDataDocument// Obtener un XmlNavigator para el XmlDataDocumentDataDocumentNavigator xmlNavigator = new DataDocumentNavigator xmlNavigator = new

DataDocumentNavigator(xmlDocument);DataDocumentNavigator(xmlDocument);

// Obtener todos los autores de CA// Obtener todos los autores de CAxmlNavigator.Select("//Authors[state='CA']/au_lname");xmlNavigator.Select("//Authors[state='CA']/au_lname");

// Mostrar todos los apellidos de autores// Mostrar todos los apellidos de autoreswhile(xmlNavigator.MoveToNextSelected())while(xmlNavigator.MoveToNextSelected()){{

Console.WriteLine("Name = " + xmlNavigator.InnerText);Console.WriteLine("Name = " + xmlNavigator.InnerText);}}

Page 32: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• DataSet ofrece manejo directo de documentos y esquemas XML– ReadXml()– ReadXmlSchema()– WriteXml()– WriteXmlSchema()

Soporte XMLADO.NET y XML

Page 33: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Soporte XMLSQLXML

• SQLXML Managed Classes 3.0– SqlXmlCommand– SqlXmlParameter– SqlXmlAdapter

Page 34: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Demontración 2Soporte XML

Page 35: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Agenda

• Introducción a ADO.NET

• Programación con ADO.NET

• Soporte XML

• Funciones avanzadas

• ¿Cuándo utilizar qué?

Page 36: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Funciones avanzadasConnectionPooling

• El proveedor OLE DB utiliza agrupación de sesiones tradicional OLEDB

• El proveedor de clientes SQL utiliza agrupación de sesiones basada en COM+

Page 37: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

// Ejemplo en C#// Ejemplo en C#SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI; Initial conn.ConnectionString = “Integrated Security=SSPI; Initial

Catalog=Northwind”Catalog=Northwind”conn.Open();conn.Open(); // Se crea el Pool A;// Se crea el Pool A;

SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI; Initial conn.ConnectionString = “Integrated Security=SSPI; Initial

Catalog=pubs”Catalog=pubs”conn.Open();conn.Open(); // Se crea el Pool B ya que la cadena de // Se crea el Pool B ya que la cadena de

conexión es diferenteconexión es diferente

SqlConnection conn = new SqlConnection();SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI; Initial conn.ConnectionString = “Integrated Security=SSPI; Initial

Catalog=Northwind”Catalog=Northwind”conn.Open();conn.Open(); // Se usa el Pool A// Se usa el Pool A

Funciones avanzadasConnectionPooling

Page 38: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Funciones avanzadasTransacciones distribuidas

• Para utilizar las transacciones distribuidas:– Utilice System.EnterpriseServices– Cree un ServicedComponent para ofrecer

soporte para transacciones automático– Agregue funciones al ServicedComponents– Ejecute transacciones en el

ServicedComponents

Page 39: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Funciones avanzadasManejo de errores

• ADO.NET permite a los desarrolladores agregar mensajes de error a cada fila de datos en un DataSet

• Usted puede filtrar para filas en error

• El error persiste con DataSet aún cuando haya sido transferido utilizando XML O Servicios Web

Page 40: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Demostración 3Funciones avanzadas

Page 41: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Agenda

• Introducción a ADO.NET

• Programación con ADO.NET

• Soporte XML

• Funciones avanzadas

• ¿Cuándo utilizar qué?

Page 42: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

¿Cuándo utilizar qué?Consideraciones

• Acceso a datos conectados

• Acceso a datos desconectados

• Vista XML de datos relacionales

Page 43: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

¿Cuándo utilizar qué?Acceso a datos conectados

• Proveedores administrados– Conexión, operación

• Conectar a DataSource• Iniciar / terminar transacciones

– Comando, parámetros• Actualizaciones de Base de datos, selecciones, DDL

– DataReader• Cursor de servidor (FO/RO)

– DataAdapter• Empujar los datos dentro de un Dataset• Leer los cambios fuera de DataSet

Page 44: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

¿Cuándo utilizar qué?Acceso a datos desconectados

• DataSet– Datos de aplicación– Resultados remotos

• SOAP, WebMethods, Remoting– Resultados de memoria caché

• Caché ASP.NET– Resultados persistentes

• Guardar datos como XML, esquema como XSD– Interacción del usuario

• Desplazar, clasificar, filtrar– DataView, DataViewManager

• Unir controles Windows

Page 45: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

¿Cuándo utilizar qué?Acceso de datos XML

• XML– XmlDocument

• XmlDataDocument• Implementa el núcleo de nivel 1 y 2 del W3C DOM

– XPathNavigator• Ofrece acceso aleatorio de sólo lectura

– XslTransform• Soporta sintaxis XSLT 1.0

Page 46: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Resumen de la sesión

• Una evolución natural de ADO

• Diseñado para trabajar con XML

• Integrado estrechamente con el marco .NET

• Ofrece mecanismos rápidos y eficientes para acceso a datos conectados y desconectados

Page 47: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Para mayor información…

• MSDN Web site at – msdn.microsoft.com

• .NET Framework at– www.microsoft.com/net

• Visual Studio .NET at– www.microsoft.com/vstudio

• ADO– www.microsoft.com/data

Page 48: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

MS PressRecursos esenciales para desarrolladores

Ahora puede Ahora puede crear sus propios libros personalizados crear sus propios libros personalizados MS Press books enMS Press books en

mspress.microsoft.com/custombookmspress.microsoft.com/custombookEscoja entre Windows 2000, SQL Server 200, Exchange 2000, Office 2000 Escoja entre Windows 2000, SQL Server 200, Exchange 2000, Office 2000

y XMLy XML

Créelo y después pídalo en versión MS Reader, PDF o impresaCréelo y después pídalo en versión MS Reader, PDF o impresa

Page 49: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Capacitación Capacitación & Eventos& Eventos

MSDN Training, Tech-Ed, PDC, MSDN Training, Tech-Ed, PDC, Developer Days, MSDN/Eventos en el Developer Days, MSDN/Eventos en el sitiositio

MSDNRecursos esenciales para desarrolladores

Servicios de Servicios de suscripciónsuscripción

Información Información en líneaen línea

Programas de Programas de membresíamembresía

Publicaciones Publicaciones impresasimpresas

Biblioteca, Profesional, UniversalBiblioteca, Profesional, UniversalProporcionado vía CD-ROM, DVD, WebProporcionado vía CD-ROM, DVD, Web

MSDN Online, MSDN FlashMSDN Online, MSDN Flash

Grupos de usuarios MSDN Grupos de usuarios MSDN

MSDN MagazineMSDN MagazineMSDN NewsMSDN News

Page 50: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

¿Dónde puedo obtener MSDN?

• Visite MSDN en línea en msdn.microsoft.com

• Regístrese para el Boletín de noticias por correo electrónico MSDN Flash en msdn.microsoft.com/resources/msdnflash.asp

• Conviértase en un suscriptor del CD de MSDN en msdn.microsoft.com/subscriptions

• Asista a más eventos de MSDN

Page 51: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.
Page 52: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

ANEXO

Page 53: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• Application Blocks– Data Access

– Exception Management

Page 54: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Data Access Application Block• Simplifies calling ADO.NET SqlClient

• Stored procedure parameter management– Caches s. proc. parameter definitions– Cache can be loaded manually (enforcing type

manually) or automatically ‘on the fly’

• Simplifies returning many formats– Get DataSets, DataReaders, Scalars, XmlReaders –

all in one line of code

• Simplifies calling with many sources– Connections, Conn. Strings, SQL Transactions– Plays well with COM+

dr = SqlHelper.ExecuteReader( CONN_STRING,“spSaveCustomer", “John” , “Doe” );

Page 55: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Data Access Application Block

Data Access Application Block

SqlHelper

ExecuteNonQuery

ExecuteDataset

ExecuteReader

ExecuteScalar

ExecuteXmlReader

SqlHelperParameterCache

CacheParameterSet

GetCachedParameterSet

GetSpParameterSet

Data Access Client

T-SQL Statement orStored Procedure

int

DataSet

SqlDataReader

object

XmlReader

SqlParameter Array

Data Access Application Block

SqlHelper

ExecuteNonQuery

ExecuteDataset

ExecuteReader

ExecuteScalar

ExecuteXmlReader

SqlHelperParameterCache

CacheParameterSet

GetCachedParameterSet

GetSpParameterSet

Data Access Client

T-SQL Statement orStored Procedure

int

DataSet

SqlDataReader

object

XmlReader

SqlParameter Array

Page 56: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

• SqlHelper class has the following overloaded static methods:– ExecuteNonQuery - execute Transact-SQL

statements or stored procedures that do not return rows

– ExecuteDataset - retrieve a DataSet object that contains the resultset of a Transact-SQL statement or stored procedure

– ExecuteReader - return a DataReader object that contains the resultset of a Transact-SQL statement or stored procedure

– ExecuteScalar - retrieve a single value resultset from a Transact-SQL statement or stored procedure

– ExecuteXMLReader - retrieve XML data

Data Access Application Block

Page 57: ADO.NET Diego Casali SE Región Córdoba y NOA Microsoft de Argentina.

Demostración 4DAAB

Usando el “Data Access Application Block”