70-526 Resumen 2/8: ADO .NET.
Objetos de conexión:
· Conectar a orígenes de datos.
· Los objetos de conexión proveen comunicación “ida y vuelta” entre la aplicación y la fuente de datos, normalmente una base de datos.
· Existen varios objetos de conexión según el proveedor (OleDbConnection, OdbcConnection, SqlConnection y OracleConnection), pero se pueden añadir más de otros proveedores.
· Todos los objetos de conexión, son especializaciones de DbConnection, del espacio de nombres System.Data.Common.
· La principal propiedad de estos objetos es ConnectionString, que indica la cadena de conexión necesaria para acceder a la fuente. En esta cadena, se especifica el “donde”, “como” y “por quien” de la conexión, además de otra serie de parámetros opcionales para modificar el comportamiento del acceso.
Conectando a la BD:
· .Open() abre la conexión indicada en la cadena de conexión.
· .Close() cierra la conexión (que no hace un Dispose ;) ).
· El evento State-Changed salta cuando cambia el estado de la conexión a la base de datos de “Open” a “Close”.
· El evento InfoMessage , propio de cada objeto de conexión derivado (es decir, no esta en DbConnection) salta cuando el SGDB nos devuelve algún mensaje de advertencia ó información que implica una gravedad baja (“low severity”).
· La propiedad State representa los distintos estados en los que se puede encontrar una conexión.
Pools de Conexión:
· Agrupación de conexiones en ADO.NET.
· “Connection Pooling” es el proceso de almacenar por un tiempo las conexiones a la BD de forma que si en otra parte del código se llama a otra conexión con la misma ConnectionString, se le pase. De esta forma se evita la carga de sistema que produce el exceso de abrir y cerrar conexiones cada vez que se requieran datos.
· Se separan por proceso, dominio de aplicación y cadena de conexión.
· Las cadenas de conexión que usan seguridad integrada Windows también se separan en un pool distinto para cada identidad.
· El comportamiento del pool se configura a través de la ConnectionString.
· Los elementos más comunes son (entre paréntesis sus valores por defecto):
o Connection Lifetime(0): Tiempo que permanece en el pool antes de ser destruida.
o Connection Reset(true): Indica si se ha de reiniciar la conexión al introducirla en el pool.
o Enlist(true): Si vas a usar la conexión como parte de una transacción.
o Load Balance Timeout(0): Tiempo mínimo que permanecerá la conexión en el pool.
o Max Pool Size(100): Número máximo de conexiones permitidas en el pool para esta ConnectionString específica.
o Pooling(true): Si se hace pooling ó no de la conexión.
· Dependiendo del proveedor los comandos pueden variar.
Manejando errores de conexión:
- La clase SqlException representa un error en SQL Server.
- Cada instancia e SqlException contiene al menos una advertencia SqlError que contiene la información actual del error que dio el servidor.
- Cada proveedor tiene sus propias clases similares (ie: OracleException).
Listando los servidores SQL Server disponibles en una red:
· La clase SqlDataSourceEnumerator sirve para explorar la red en busca de servidores SQL Server.
· Enumeración de instancias de SQL Server.
· No siempre funciona, los firewalls u otras medidas de seguridad pueden ocultar los servidores. Los SQL Server 2005 necesitan tener activo un servicio llamado “SQL Browser”.
· SqlDataSourceEnumeator.GetDataSources devuelve un DataTable que contiene un registro por servidor disponible estructurado en las siguientes columnas:
o ServerName : Nombre del servidor.
o InstanceName: Nombre de la instancia del servidor ó string.empty si se ejecuta en la instancia por defecto.
o IsClustered: Indica si es parte de un cluster.
o Version: Nº de versión del SQL Server.
Proteger la cadena de conexión:
· El método recomendado es la seguridad integrada Windows, de esta forma no se “hardcodea” ningún usuario ni contraseña en la cadena de conexión, y la autenticación permanece centralizada. Se activa en la misma cadena de conexión:
o SqlClient: Integrated Security=True;
o OleDB: Integrated Security=SSPI;
o ODBC: Trusted_Connection=Yes;
o OracleClient: Integrated Security=Yes;
· Otro método es usar un proveedor de configuración protegida a fin de cifrar los datos sensibles en el archivo de configuración como DpapiProtectedConfigurationProvider.
· Especificar un proveedor de configuración protegida.
Objetos de comando:
· Trabajar con objetos de comando.
· Los objetos de comando son usados para ejecutar sentencias SQL ó procedimientos almacenados.
· Hay objetos de comando específicos para cada proveedor, pero todos especializan DbCommand. Las propiedades comunes más importantes son:
o CommandText : La sentencia SQL ó el nombre de un procedimiento almacenado.
o CommandTimeout: Tiempo de espera antes de abortar la ejecución.
o CommandType: que define si se ejecuta una sentencia SQL ó un proceso almacenado.
o Connection: Objeto de conexión que utilizará.
o Parameters: Colección de parámetros para la sentencia SQL ó procedimiento almacenado.
o Transaction: Objeto de contexto de transacción en la que el comando se ejecuta.
· Los métodos comunes de ejecución son:
o Cancel: Intenta cancelar la ejecución en curso.
o ExecuteNonQuery: Ejecuta un comando que no devuelve datos (ie:DDL).
o ExecuteReader: Ejecuta un comando que devuelve datos de forma tabular.
o ExecuteScalar: Ejecuta un comando que devuelve un único dato. Si no, devuelve la primera celda de la primera columna de la primera fila, el resto se ignora.
o ExecuteXMLReader: Devuelve datos formateados en XML.
· Los comandos pueden ser ejecutados de forma asíncrona.
· Los objetos DataReader son creados cuando la ejecución de un comando devuelve datos en forma tabular (tabla).
Parámetros en objetos de comando:
· Son objetos cuyo valor definen las variables de una sentencia SQL ó procedimiento almacenado.
· Dan una mayor seguridad evitando ataques como SQL Injection.
· El tipo define que tipo de parámetro es en función de la dirección de los datos: Input (por defecto), Output, InputOutput.
· Están asignados a tipos de dato consistentes en la base de datos.
· Son especializaciones de DbParameter.
· Pueden ser configurados en tiempo de ejecución.
Trabajando con BLOBs:
· BLOB : Binary Large OBjects.
· Se usan para salvar objetos de datos, como archivos ó incluso ensamblados en la BD.
· Normalmente necesitan ser transferidos en bloques mejor que en una sola pieza.
· Obtener valores BLOB a partir de una base de datos.
· DataReaders pueden leer estos objetos como si fuesen tipos de dato estándar.
Operaciones de copia en masa:
· Son una forma eficiente de copiar grandes cantidades de datos.
· Realizando operaciones de copia masiva.
· El objeto SqlBulkCopy provee la funcionalidad para realizarlas con ADO.NET.
· La sentencia SQL BULK INSERT provee la forma de realizar estas operaciones usando los recursos de SQL Server.
· Pueden ser realizadas como una transacción.
Transacciones:
· Una transacción es una operación formada por un grupo de operaciones relacionadas, cada una podría requerir varias operaciones de lectura y/ó escritura en la base de datos, y solo tiene validez si se ejecutan todas. En caso de producirse un error en el transcurso de la transacción, ha de ser posible “deshacer” todas las operaciones anteriores (rollback), en caso contrario se da por finalizada la transacción aplicando los cambios (commit).
· Son especificas de cada proveedor, pero todas especializan DbTransaction.
· Se crean a partir del objeto de conexión, normalmente con BeginTransaction.
· La disponibilidad de los datos que están siendo modificados en la transacción puede ser controlada configurando el nivel de aislamiento de la transacción.
· La enumeración IsolationLevel representa los distintos niveles de aislamiento de datos en la ejecución de una transacción.
· Los comandos (SQL ó procedimientos almacenados) pueden ser usados en tanto en transacciones distribuidas (varias DB) como locales.
DataSet:
· Clase DataSet.
· Utilizar DataSet en ADO.NET.
· Son objetos que representan un modelo relacional de datos similar al de una BD.
· Se usan como cache en memoria de los datos.
· Contienen objetos DataTables (que representan tablas) que pueden ser relacionados con objetos DataRelation (que representan relaciones).
· Pueden ser de dos tipos:
o No-Tipados: Por defecto. Instancias genéricas.
o Tipados: Asociados a un archivo .xsd que contiene colecciones explícitas de tipos.
· Con los métodos GetParentRow y GetChildRows se puede navegar a través de las relaciones.
· DataSet.Merge permite mezclar el contenido de dos DataSet con la forma indicada en el parámetro MissingSchemaAction.
· Para realizar una copia de un DataSet, utiliza DataSet.Copy.
DataTable:
· Clase DataTable.
· Crear y utilizar DataTable’s.
· Son objetos que contienen columnas (objetos DataColumn) y restricciones (objetos Constraint) como las tablas de una BD.
· DataColumn y Constraint definen el esquema de un DataTable.
· Se pueden definir columnas calculadas (expression columns) configurando la propiedad DataColumn.Expression.
· Se pueden crear columnas autoincrementales.
· Las restricciones se son creadas y añadidas a la colección DataTable.Constraints.
o ForeignKeyConstraint.
o UniqueConstraint.
DataAdapter:
· Son especializaciones de DbDataAdapter.
· Trabajo con DataAdapters.
· Contienen un objeto de conexión.
· Contienen 4 objetos de comando, Select, Insert, Update y Delete.
· Puedes generar un DataSet tipado basado en el comando Select configurado en un DataAdapter.
· El objeto CommandBuilder se usa para generar automáticamente los objetos de comando de Insert, Update y Delete a partir del objeto de comando Select.
· Puedes definir como resolver conflictos al llenar un DataSet/DataTable con las propiedades MissingSchemaAction y MissingMappingAction.
· Puedes usar un OleDbDataAdapter para llenar un DataSet usando Recordsets de ADO.
Trabajando con datos en un DataTable:
· Añade datos a un DataTable en la colección DataTable.Rows.
· Crea un DataRow tipado como un determinado DataTable con DataTable.NewRow.
· Añade un DataRow tipado con DataTable.ImportRow.
· Borra una fila llamando al DataRow.Delete.
· Las enumeraciones RowState y RowVersion permiten seguir y monitorizar los cambios en las DataRows.
· Los eventos del DataTable indican cuando han cambiado los datos en columnas ó filas específicas.
· La propiedad DataRow.RowError indica un error en los datos que contiene.
Trabajando con DataSet en XML:
· DataSet.WriteXml : Guarda los datos en XML.
· DataSet.WriteXmlSchema: Guarda el esquema en XML.
· DataSet.ReadXml : Carga un DataSet a partir de un fichero XML.
· DataSet.ReadXmlSchema: Carga el esquema de un DataSet a partir de un fichero XML.
· Un DataSet y un XMLDataDocument pueden mantenerse sincronizados y asi poder manipularse datos en una parte y verse reflejados en la otra.
· Se pueden hacer peticiones XPath sobre los datos de un DataSet.
DataView:
· Clase DataView.
· Proveen acceso a un DataTable con facilidades de filtrado y ordenación.
· DataView.Sort para ordenar y DataView.RowFilter para filtrar.
· Cada DataRow de un DataTable se representa como un DataViewRow.
· Puedes buscar registros concretos con los métodos DataView.Find y DataView.FindRows.
· Pueden navegar a través de relaciones y obtener registros relacionados.
· El evento ListChanged indica que se hicieron modificaciones en el DataTable asociado.
Controles enlazados a datos:
· El enlace simple muestra un único elemento de datos por control.
· El enlace complejo enlaza múltiples elementos a múltiples propiedades del control.
· Navega a través de los datos de un DataSet con un objeto BindingNavigator.
· Información general sobre BindingNavigator.
· BindingSource provee de la funcionalidad de un CurrencyManager.
· El componente BindingSource.
· Usa un objeto BindingSource como forma de abstraer los datos actuales en el código y mantener todos los controles enlazados a la misma fuente y a los mismos eventos.
Trabajando con el DataGridView:
· Clase DataGridView.
· Información general del control DataGridView.
· Es el control preferido para mostrar datos de forma tabular como un DataTable.
· Puedes añadir y quitar columnas usando los métodos Add Column y Del Column desde la “smart tag” en el diseñador.
· DataGridView.CurrentCell apunta a la celda seleccionada actualmente.
· Los eventos informan del estado de los datos cuando se modifican.
· Puedes personalizar el aspecto de un DataGridView usando estilos y pintado personalizado.
CrossPosting
desde vtortola.NET
70-526 Resumen 2/8: ADO .NET.