Manual Ado Net

Embed Size (px)

DESCRIPTION

Ado

Citation preview

  • Escuela de Informtica del Ejrcito

    1

    Contenido 1 INTRODUCCIN ............................................................................ 3

    1.1 SIN NUEVO MODELO DE OBJETOS ............................................................... 3 1.2 MODELO DE OBJETOS DE ADO.NET.......................................................... 3

    1.2.1 Proveedores de datos .NET ........................................................................... 4 1.2.2 Por qu usar clases y libreras separadas .................................................... 4 1.2.3 Cobertura de los proveedores de datos en este texto .................................... 5 1.2.4 Objetos conectados ........................................................................................ 5 1.2.5 Clases desconectadas .................................................................................... 7 1.2.6 Metadatos .................................................................................................... 10 1.2.7 Clases DataSet fuertemente tipadas ............................................................ 11

    2 CONECTAR CON SU BASE DE DATOS ................................... 13 2.1 CREAR OBJETOS SQLCONNECTION ........................................................... 13 2.2 ABRIR OBJETOS SQLCONNECTION ........................................................... 13 2.3 CERRAR OBJETOS SQLCONNECTION ......................................................... 13 2.4 HACER LIMPIEZA POR DONDE PASE .......................................................... 13 2.5 CADENAS DE CONEXIN ........................................................................... 14

    2.5.1 Qu es una cadena de conexin .................................................................. 14 2.5.2 Generadores de cadena de conexin ........................................................... 15 2.5.3 Seguridad de cadenas de conexin .............................................................. 17

    2.6 AGRUPAMIENTO DE CONEXIONES ............................................................. 18 2.6.1 Manipuladores de conexin y conexiones fsicas ........................................ 18 2.6.2 Qu es agrupamiento de conexiones ........................................................... 19 2.6.3 Cmo mejora su cdigo el agrupamiento.................................................... 19 2.6.4 Cundo se cierra una conexin agrupada .................................................. 19 2.6.5 Desactivar el agrupamiento de conexiones ................................................. 19 2.6.6 Controlar el agrupamiento .......................................................................... 20 2.6.7 Cmo determina ADO.NET si usar una conexin agrupada ...................... 20 2.6.8 Liberar manualmente conexiones agrupadas ............................................. 20 2.6.9 Otras opciones de agrupamiento ................................................................. 21

    2.7 SQLCONNECTION COMO PUNTO INICIAL ................................................... 21 2.7.1 Crear SqlCommand ..................................................................................... 21 2.7.2 Iniciar transacciones ................................................................................... 22 2.7.3 Recuperar informacin de esquema ............................................................ 22

    2.8 EXPLORADOR DE SERVIDORES ................................................................. 23 2.9 REFERENCIA DEL OBJETO SQLCONNECTION............................................. 24

    2.9.1 Propiedades ................................................................................................. 24 2.9.2 Mtodos ....................................................................................................... 25 2.9.3 Eventos ........................................................................................................ 28

    3 CONSULTAR LA BASE DE DATOS .......................................... 31 3.1 USAR OBJETOS SQLCOMMAND EN EL CDIGO .......................................... 31

    3.1.1 Crear un objeto SqlCommand ..................................................................... 31 3.1.2 Ejecutar una consulta que devuelve filas .................................................... 31 3.1.3 Recuperar un valor nico ............................................................................ 32 3.1.4 Ejecutar una consulta que no devuelve un conjunto de resultados ............. 33 3.1.5 Ejecutar lotes de consultas de accin.......................................................... 33 3.1.6 Ejecutar consultas para recuperar datos XML ........................................... 34 3.1.7 Ejecutar una consulta en una transaccin .................................................. 34 3.1.8 Ejecutar una consulta asncronamente ....................................................... 35

    3.2 TRABAJAR CON SQLDATAREADER .......................................................... 38 3.2.1 Examinar los resultados de su consulta ...................................................... 38 3.2.2 Cerrar el SqlDataReader ............................................................................ 38 3.2.3 Examinar el esquema de los resultados ...................................................... 39 3.2.4 Obtener datos ms deprisa con buscas basadas en ordinal ........................ 40 3.2.5 Lectores fuertemente tipados ....................................................................... 41 3.2.6 Manejo de valores nulos .............................................................................. 41 3.2.7 Tipos SQL .................................................................................................... 43 3.2.8 Manejar mltiples conjuntos de resultados de una consulta ...................... 43 3.2.9 SQL Server 2005 y mltiples conjuntos de resultados activos .................... 44

    3.3 CONSULTAS PARAMETRIZADAS ................................................................ 46 3.3.1 Entrada de usuario en cadena de consulta ................................................. 46 3.3.2 Construccin de consultas e inyeccin SQL................................................ 46 3.3.3 Consultas parametrizadas ........................................................................... 47 3.3.4 Procedimientos almacenados ...................................................................... 48

    3.4 REFERENCIA ............................................................................................ 49 3.4.1 Propiedades de SqlCommand ...................................................................... 49 3.4.2 Mtodos de SqlCommand ............................................................................ 50 3.4.3 Eventos de SqlCommand ............................................................................. 52 3.4.4 Propiedades de SqlDataReader .................................................................. 52 3.4.5 Mtodos de SqlDataReader ......................................................................... 53 3.4.6 Crear objetos SqlParameter ........................................................................ 55 3.4.7 Propiedades de la clase SqlParameter ........................................................ 55

    4 RECUPERAR DATOS CON SQLDATAADAPTER ................... 57 4.1 QU ES UN SQLDATAADAPTER ................................................................ 57

    4.1.1 Utilidad de la clase SqlDataAdapter ........................................................... 57 4.1.2 Anatoma de la clase SqlDataAdapter......................................................... 58

    4.2 CREAR Y USAR OBJETOS SQLDATAADAPTER ........................................... 59 4.2.1 Crear un SqlDataAdapter ............................................................................ 59 4.2.2 Recuperar resultados de una consulta ........................................................ 59 4.2.3 Hacer corresponder los resultados de la consulta con el DataSet ............. 62 4.2.4 Trabajar con lotes de consultas................................................................... 63 4.2.5 Obtener informacin de esquema ................................................................ 63

    4.3 REFERENCIA DE LA CLASE SQLDATAADAPTER ........................................ 64 4.3.1 Propiedades ................................................................................................. 64 4.3.2 Mtodos ....................................................................................................... 66 4.3.3 Eventos ........................................................................................................ 67

    5 TRABAJAR CON OBJETOS DATASET .................................... 71 5.1 CARACTERSTICAS DE LA CLASE DATASET .............................................. 71

    5.1.1 Trabajar con datos desconectados .............................................................. 71 5.1.2 Recorrer, ordenar, buscar y filtrar .............................................................. 71 5.1.3 Trabajar con datos jerrquicos ................................................................... 71 5.1.4 Almacenar cambios ..................................................................................... 72 5.1.5 Integracin XML ......................................................................................... 72

    5.2 USO DE OBJETOS DATASET ...................................................................... 72 5.2.1 Crear un objeto DataSet .............................................................................. 72

    5.2.2 Examinar la estructura creada al llamar a Fill ........................................... 72 5.2.3 Examinar los datos que devuelve el SqlDataAdapter .................................. 73 5.2.4 Validar datos en el DataSet ......................................................................... 73 5.2.5 Crear objetos DataTable en cdigo ............................................................. 75 5.2.6 Modificar el contenido de un DataTable ..................................................... 80 5.2.7 Opciones de serializacin y remoting de DataSet ....................................... 85

    5.3 TRABAJAR CON OBJETOS DATASET EN VISUAL STUDIO ........................... 87 5.3.1 Crear DataSet fuertemente tipados .............................................................. 87 5.3.2 Crear un DataSet sin tipo............................................................................. 87

    5.4 REFERENCIA DE CLASES ........................................................................... 88 5.4.1 Propiedades de la clase DataSet .................................................................. 88 5.4.2 Mtodos de la clase DataSet ........................................................................ 90 5.4.3 Eventos de la clase DataSet ......................................................................... 93 5.4.4 Propiedades de la clase DataTable ............................................................. 94 5.4.5 Mtodos de la clase DataTable .................................................................... 96 5.4.6 Eventos de la clase DataTable ..................................................................... 99 5.4.7 Propiedades de la clase DataColumn ........................................................ 100 5.4.8 Propiedades de la clase DataRow ............................................................. 103 5.4.9 Mtodo de la clase DataRow ..................................................................... 103 5.4.10 Propiedades de la clase UniqueConstraint ................................................ 106 5.4.11 Propiedades de la clase ForeignKeyConstraint ........................................ 106

    6 TRABAJO CON DATOS RELACIONALES ........................... 109 6.1 INTRODUCCIN AL ACCESO A DATOS RELACIONAL ................................. 109

    6.1.1 Consultas de unin ..................................................................................... 109 6.1.2 Consultas separadas .................................................................................. 109 6.1.3 Objetos DataRelation ................................................................................. 110

    6.2 TRABAJAR CON OBJETOS DATARELATION EN EL CDIGO ....................... 110 6.2.1 Crear objetos DataRelation ....................................................................... 110 6.2.2 Localizar datos relacionados ..................................................................... 111 6.2.3 Validar datos con objetos DataRelation .................................................... 113 6.2.4 Objetos DataRelation autoreferencia ........................................................ 114 6.2.5 Relaciones varios a varios ......................................................................... 115 6.2.6 Objetos DataRelation en columnas basadas en expression ....................... 116 6.2.7 Propagar cambios ...................................................................................... 117 6.2.8 Apartarse de las consultas de unin .......................................................... 118

    6.3 CREAR OBJETOS DATARELATION EN VISUAL STUDIO ............................ 118 6.3.1 Aadir un DataRelation a un DataSet con tipo ......................................... 118 6.3.2 Aadir un DataRelation a un DataSet sin tipo .......................................... 118

    6.4 REFERENCIA DEL OBJETO DATARELATION ............................................. 118 6.4.1 Propiedades de la clase DataRelation ....................................................... 118

    7 ORDENAR, BUSCAR Y FILTRAR ........................................... 121 7.1 CARACTERSTICAS DE BSQUEDA Y FILTRADO DE DATATABLE ............. 121

    7.1.1 Localizar una fila por su clave principal ................................................... 121 7.1.2 Bsquedas ms dinmicas .......................................................................... 122 7.1.3 Bsquedas con comodines .......................................................................... 122 7.1.4 Delimitadores ............................................................................................. 122 7.1.5 Mtodos Select adicionales ........................................................................ 123

    7.2 QUE ES UN OBJETO DATAVIEW .............................................................. 123 7.3 OBJETOS DATAVIEW EN CDIGO ............................................................ 124

    7.3.1 Crear objetos DataView ............................................................................. 124 7.3.2 Propiedad RowStateFilter .......................................................................... 124 7.3.3 Clase DataRowView ................................................................................... 124 7.3.4 Examinar todas las filas mediante un DataView ....................................... 125 7.3.5 Buscar datos en un DataView .................................................................... 125 7.3.6 Modificar objetos DataRowView ............................................................... 126 7.3.7 Usar un DataView para crear un nuevo DataTable .................................. 126

    7.4 CREAR OBJETOS DATAVIEW EN VISUAL STUDIO .................................... 127 7.5 REFERENCIA ........................................................................................... 127

    7.5.1 Propiedades de la clase DataView............................................................. 127 7.5.2 Mtodos de la clase DataView ................................................................... 129 7.5.3 Eventos de la clase DataView .................................................................... 129 7.5.4 Propiedades de la clase DataRowView ..................................................... 130 7.5.5 Mtodos de la clase DataRowView ............................................................ 130

    8 DATASET CON TIPO Y TABLEADAPTER ............................. 131 8.1 DATASET CON TIPO ................................................................................ 131 8.2 CREAR OBJETOS DATASET CON TIPO ...................................................... 131

    8.2.1 La forma difcil ........................................................................................... 131 8.2.2 La forma fcil ............................................................................................. 132

    8.3 USAR DATASET CON TIPO ...................................................................... 133 8.3.1 Aadir una fila ........................................................................................... 133 8.3.2 Localizar una fila ....................................................................................... 134 8.3.3 Editar una fila ............................................................................................ 134 8.3.4 Datos nulos ................................................................................................. 134 8.3.5 Datos jerrquicos ....................................................................................... 135 8.3.6 Otras caractersticas de DataSet, DataTable y DataRow ......................... 135 8.3.7 Aadir su propio cdigo ............................................................................. 135

    8.4 CUNDO USAR DATASET CON TIPO ........................................................ 136 8.4.1 Ventajas en tiempo de diseo ..................................................................... 136 8.4.2 Ventajas en tiempo de ejecucin ................................................................ 137 8.4.3 Consideraciones adicionales...................................................................... 137 8.4.4 Aadir manualmente tables y columnas..................................................... 138 8.4.5 Mejorar los valores predeterminados ........................................................ 140

    8.5 INTRODUCCIN A TABLEADAPTER ......................................................... 140 8.5.1 Crear un TableAdapter .............................................................................. 140 8.5.2 Usar un DataAdapter ................................................................................. 141 8.5.3 Aadir ms consultas ................................................................................. 143 8.5.4 Aadir su propio cdigo ............................................................................. 143 8.5.5 Limitaciones de TableAdapter ................................................................... 143

    8.6 ELEGIR SU CAMINO ................................................................................. 144 9 ENVIAR CAMBIOS A LA BASE DE DATOS ......................... 145

    9.1 ACTUALIZACIONES CON SQLCOMMAND PARAMETRIZADOS ................... 147 9.1.1 Enviar una nueva fila ................................................................................. 147 9.1.2 Actualizar una fila existente ....................................................................... 147 9.1.3 Borrar una fila existente ............................................................................ 150 9.1.4 Qu ms puede necesitar............................................................................ 151

  • ADO.NET 2.0

    2

    9.2 ACTUALIZACIONES CON DATAADAPTER ................................................ 151 9.3 CONFIGURACIN OBJETOS DATAADAPTER MANUALMENTE ................... 152

    9.3.1 Parmetros vinculados .............................................................................. 153 9.3.2 Uso de procedimientos almacenados ........................................................ 153 9.3.3 Proporcionar su propia lgica .................................................................. 154

    9.4 GENERAR LGICA DE ACTUALIZACIN CON SQLCOMMANDBUILDER .... 155 9.4.1 Cmo genera CommandBuilder la lgica de actualizacin...................... 155 9.4.2 Opciones de concurrencia ......................................................................... 155 9.4.3 Ventajas e inconvenientes.......................................................................... 155

    9.5 GENERAR LA LGICA DE ACTUALIZACIN EN TIEMPO DE DISEO ........... 156 9.5.1 Examinar la lgica de actualizacin ......................................................... 156 9.5.2 Opciones para construir la lgica de actualizacin ................................. 156 9.5.3 Uso de procedimientos almacenados ........................................................ 156 9.5.4 Ventajas e inconvenientes.......................................................................... 157

    9.6 EL REGRESO DE LOS DATAADAPTER ...................................................... 157 9.6.1 Llamar al asistente de configuracin de adaptador de datos ................... 157 9.6.2 Capa de acceso a datos con SqlDataAdapter ........................................... 158

    9.7 ENVIAR CAMBIOS SOBRE SQLTRANSACTION .......................................... 160 9.8 USO DE LA COLECCIN TABLEMAPPINGS ............................................... 161 9.9 LA MEJOR FORMA DE ACTUALIZAR ........................................................ 162 9.10 REFERENCIA DEL OBJETO SQLCOMMANDBUILDER ................................ 162

    9.10.1 Propiedades ............................................................................................... 162 9.10.2 Mtodos ..................................................................................................... 163

    10 ESCENARIOS DE ACTUALIZACIN AVANZADOS .......... 165 10.1 ACTUALIZAR UNA FILA TRAS ENVIAR UN CAMBIO .................................. 165

    10.1.1 Actualizar un DataRow tras enviar cambios............................................. 165 10.1.2 Consultas por lotes para actualizar tras enviar cambios ......................... 166 10.1.3 Recuperar datos con parmetros de salida ............................................... 167 10.1.4 Evento RowUpdated de la clase SqlDataAdapter ..................................... 168 10.1.5 Cdigo de ejemplo ..................................................................................... 168

    10.2 RECUPERAR VALORES DE AUTO INCREMENTO ........................................ 169 10.2.1 Con SQL Server ......................................................................................... 169 10.2.2 Con Access................................................................................................. 169 10.2.3 Con secuencias Oracle .............................................................................. 170 10.2.4 Aplicaciones de ejemplo ............................................................................ 171

    10.3 ENVIAR CAMBIOS JERRQUICOS ............................................................. 171 10.3.1 Enviar borrados e inserciones pendientes ................................................ 171 10.3.2 Valores auto incremento y datos relacionales .......................................... 172

    10.4 AISLAR Y REINTEGRAR CAMBIOS ............................................................ 173 10.4.1 Ahorrar ancho de banda con GetChanges ................................................ 173 10.4.2 Cdigo de ejemplo ..................................................................................... 176

    10.5 MANEJAR INTENTOS DE ACTUALIZACIN FALLIDOS ............................... 176 10.5.1 Planifique los conflictos por adelantado ................................................... 176 10.5.2 Informar al usuario de fallos ..................................................................... 177 10.5.3 Obtener el contenido actual de filas en conflicto ...................................... 177 10.5.4 Si no se consigue a la primera .................................................................. 178 10.5.5 Aplicacin de ejemplo ............................................................................... 178

    10.6 TRANSACCIONES DISTRIBUIDAS ............................................................. 179 10.6.1 Coordinadores de transacciones y administradores de recursos ............. 179 10.6.2 Transacciones distribuidas en .NET.......................................................... 180 10.6.3 Soporte de base de datos para transacciones distribuidas ....................... 180 10.6.4 Crear sus componentes.............................................................................. 180 10.6.5 Ejemplos .................................................................................................... 181

    10.7 CONSULTAS POR LOTES .......................................................................... 181 10.7.1 Transacciones y actualizaciones por lotes ................................................ 182 10.7.2 Valor adecuado para UpdateBatchSize .................................................... 182 10.7.3 Eventos ...................................................................................................... 182 10.7.4 Refrescar filas ............................................................................................ 183 10.7.5 Ejemplos .................................................................................................... 183

    10.8 COPIA MASIVA SQL ............................................................................... 183 10.8.1 Crear un objeto SqlBulkCopy .................................................................... 183 10.8.2 Escribir datos en el servidor ..................................................................... 184 10.8.3 Correspondencia de datos con la tabla de destino ................................... 184 10.8.4 Enumeracin SqlBulkCopyOptions ........................................................... 184 10.8.5 Ejemplo ...................................................................................................... 185

    10.9 OBJETOS DATASET Y TRANSACCIONES .................................................. 185 10.9.1 Ejemplo ...................................................................................................... 185

    11 TRABAJAR CON DATOS XML ................................................ 187 11.1 LLENAR EL HUECO ENTRE XML Y ACCESO A DATOS .............................. 187 11.2 LEER Y ESCRIBIR DATOS XML ................................................................ 187

    11.2.1 Mtodos XML de la clase DataSet ............................................................. 187 11.2.2 Inferir esquemas ......................................................................................... 188 11.2.3 Propiedades que afectan al esquema ......................................................... 189 11.2.4 Almacenar en cache cambios en documentos XML ................................... 189

    11.3 DATASET + XMLDOCUMENT = XMLDATADOCUMENT .......................... 190 11.3.1 Clase XmlDataDocument ........................................................................... 190 11.3.2 Acceder a su DataSet como documento XML ............................................ 191 11.3.3 Almacenar actualizaciones al documento XML ......................................... 191

    11.4 CARACTERSTICAS XML DE SQL SERVER 2005 .................................... 191 11.4.1 Tipo XML de SQL Server 2005 .................................................................. 192 11.4.2 Ejecutar una consulta XPath para recuperar datos .................................. 193 11.4.3 Recuperar resultados XML usando XQuery .............................................. 195

    11.5 RECUPERAR DATOS XML DESDE SQL SERVER 2000 ............................. 196 11.6 EL PROVEEDOR DE DATOS .NET SQL XML ........................................... 197

    11.6.1 SqlXmlCommand ........................................................................................ 198 11.6.2 SqlXmlAdapter ........................................................................................... 198 11.6.3 Consultas plantilla ..................................................................................... 198 11.6.4 Consultas XPath ......................................................................................... 199 11.6.5 Aplicar una transformacin XSL ............................................................... 201 11.6.6 Enviar actualizaciones ............................................................................... 201

    11.7 UN EJEMPLO SENCILLO ........................................................................... 201 12 APLICACIONES WINDOWS .................................................... 203

    12.1 CREAR UN INTERFACE CON VINCULACIN DE DATOS .............................. 203 12.1.1 Paso 1: Crear el DataSet con tipo ............................................................. 203 12.1.2 Paso 2: Aadir controles con vinculacin simple...................................... 203 12.1.3 Paso 3: Recuperar datos ............................................................................ 205 12.1.4 Paso 4: Recorrer los resultados ................................................................. 206 12.1.5 Paso 5: Aadir y borrar elementos ............................................................ 207 12.1.6 Paso 6: Enviar cambios ............................................................................. 207 12.1.7 Paso 7: Aadir botones para Editar, Aceptar y Rechazar......................... 208 12.1.8 Paso 8: Ver datos hijos .............................................................................. 209 12.1.9 Paso 9: Enlazar un segundo formulario al mismo origen de datos ........... 211 12.1.10 Paso 10: Mejorar el interface .................................................................... 211 12.1.11 Paso 11: Si quiere que salga bien ............................................................. 213

    12.2 CONSIDERACIONES DE DISEO DE APLICACIONES ................................... 214 12.2.1 Recupere solo los datos que necesita ......................................................... 214 12.2.2 Estrategias de actualizacin ...................................................................... 214 12.2.3 Estrategias de conexin ............................................................................. 216 12.2.4 Trabajar con datos BLOB .......................................................................... 217

    13 OTROS PROVEEDORES DE DATOS .NET ........................... 221 13.1 EL MODELO DE FACTORA DE PROVEEDOR .............................................. 221

    13.1.1 Limitaciones de los interfaces comunes de ADO.NET............................... 221 13.1.2 Solucin mediante el modelo de factora de proveedor ............................. 222 13.1.3 Limitaciones del modelo de factora .......................................................... 224 13.1.4 Descubrimiento de esquema de base de datos ........................................... 225

    13.2 PROVEEDOR DE DATOS ODBC ............................................................... 227 13.2.1 Conectar con la base de datos ................................................................... 227 13.2.2 Ejecutar consultas ...................................................................................... 227 13.2.3 Recuperar los resultados de una consulta ................................................. 229 13.2.4 Recuperar informacin de esquema........................................................... 229

    13.3 PROVEEDOR DE DATOS OLE DB ............................................................ 230 13.3.1 Conectar con su base de datos ................................................................... 230 13.3.2 Ejecutar consultas ...................................................................................... 231 13.3.3 Recuperar resultados de una consulta ....................................................... 232 13.3.4 Recuperar informacin de esquema........................................................... 232

    13.4 PROVEEDOR DE DATOS .NET PARA ORACLE........................................... 233 13.4.1 Conectar con su base de datos ................................................................... 233 13.4.2 Ejecutar consultas ...................................................................................... 234 13.4.3 Clase OracleDataAdapter .......................................................................... 237 13.4.4 Recuperar informacin de esquema........................................................... 238

    14 SIGLAS .......................................................................................... 241

  • Escuela de Informtica del Ejrcito

    3

    1 Introduccin ADO.NET es un conjunto de libreras incluidas con el marco de trabajo .NET que le ayudan a

    comunicarse con diferentes almacenes de datos desde aplicaciones .NET. Las libreras ADO.NET incluyen clases para conectar con un origen de datos, enviar consultas y procesar los resultados. Tambin puede usar ADO.NET como un cach de datos desconectado robusto y jerrquico para trabajas con los datos fuera de lnea. El objeto desconectado central, DataSet, permite ordenar, buscar, filtrar, almacenar cambios pendientes y navegar datos jerrquicos. DataSet tambin incluye una serie de caractersticas que llenan el hueco entre el acceso a datos tradicional y el desarrollo XML. Los desarrolladores ahora pueden trabajar con datos XML por medio de interfaces de acceso a datos tradicionales y viceversa.

    En resumen, si est creando una aplicacin .NET que accede a datos necesitar ADO.NET. Microsoft Visual Studio incluye un conjunto de caractersticas de acceso a datos en tiempo de diseo que

    pueden ayudarle a crear aplicaciones de acceso a datos de una forma ms eficiente. Muchas de estas caractersticas pueden ahorrarle tiempo durante el proceso de desarrollo generando grandes cantidades de cdigo montono por Vd. Otras caractersticas mejoran el rendimiento de las aplicaciones creadas mediante el almacenamiento de metadatos y lgica de actualizacin en el cdigo en lugar de obtener esta informacin en tiempo de ejecucin. Lo crea o no, las caractersticas de acceso a datos de Visual Studio logran las dos cosas.

    Segn examinemos ADO.NET veremos tambin las caractersticas de Visual Studio que puede usar para ahorrar tiempo y esfuerzo. 1.1 Sin nuevo modelo de objetos

    Visual Studio 2005 abre un nuevo terreno para Microsoft al ser la primera gran revisin de Visual Studio que no introduce un nuevo modelo de objetos de acceso a datos (Visual Studio 2003 no cuenta porque solo contena pequeas mejoras respecto a Visual Studio 2002). Los desarrolladores que han afilado sus capacidades ADO.NET con las versiones 1.0 y 1.1 del marco de trabajo .NET pueden seguir mejorndolas con la versin 2.0.

    Muchos desarrolladores nuevos en el marco de trabajo .NET pueden tener experiencia con la tecnologa de acceso a datos previa de Microsoft ADO. ASO sirvi bien a muchos desarrolladores, pero carece de caractersticas clave necesarias para crear aplicaciones ms potentes. Por ejemplo, cada vez ms desarrolladores trabajan con datos XML. Aunque las ltimas versiones de ADO aadan caractersticas XML, ADO no se cre par trabajar con estos datos. Por ejemplo, no permite separar la informacin de esquema de los datos reales. Microsoft podra aadir ms caractersticas XML en versiones futuras de ADO, pero ADO nunca manejar los datos XML de modo tan eficiente como ADO.NET porque ADO.NET se dise pensando en XML y ADO no. El motor de cursor de ADPO permite pasar objetos Recordset desconectados entre diferentes capas de la aplicacin, pero no es posible combinar el contenido de varios objetos Recordset. ADO permite enviar cambios almacenados en cach a la base de datos, pero no es posible controlar la lgica utilizada para este envo. Adems, el motor de cursor ADO, por ejemplo, no proporciona una forma de enviar cambios pendientes a la base de datos por medio de procedimientos almacenados. Como muchos administradores de base de datos slo permiten la modificacin por medio de procedimientos almacenados, en muchos casos no es posible hacer cambios usando objetos Recordset.

    Microsoft cre ADO.NET para enfrentarse a estos escenarios clave, junto con otros que se vern a lo largo del texto.

    ADO.NET est diseado para combinar las mejores caractersticas de sus predecesores, a la vez que aade caractersticas pedidas por los desarrolladores mejor soporte para XML, acceso a datos desconectados ms sencillo, ms control sobre las actualizaciones, y mayor flexibilidad de actualizaciones. 1.2 Modelo de objetos de ADO.NET

    Ahora que comprende el objetivo de ADO.NET y dnde encaja en el conjunto de la arquitectura de Visual Studio, es el momento de examinar ms de cerca esta tecnologa. En este captulo veremos brevemente el modelo de objetos de ADO.NET y cmo se diferencia de tecnologas de acceso a datos previas de Microsoft.

    ADO.NET est diseado para ayudar a los desarrolladores a crear aplicaciones de base de datos multicapa eficientes sobre intranets e Internet, y el modelo de objetos de ADO.NET proporciona los medios. La figura 1.1 muestra las clases que forman este modelo de objetos. Una lnea de puntos parte el modelo en dos. Los objetos a la izquierda de la lnea son los objetos conectados; estos objetos se comunican directamente con la base de datos para gestionar la conexin y transacciones as como para recuperar datos y enviar cambios. Los objetos a la derecha de la lnea son objetos desconectados que permiten a un usuario trabajar con datos fuera de lnea.

  • ADO.NET 2.0

    4

    Los objetos que forman la parte desconectada del modelo de objetos de ADO.NET no se comunican directamente con los objetos conectados. Este es un cambio importante respecto a los modelos de acceso a datos previos. En ADO el objeto Recordset almacena los resultados de las consultas. Puede llamar a su mtodo Open para obtener los resultados de una consulta y a su mtodo Update o UpdateBatch para enviar los cambios almacenados en el Recordset a la base de datos.

    El DataSet de ADO.NET, que describiremos en breve, es comparable en funcionalidad al Recordset de ADO. Salvo que DataSet no se comunica con la base de datos. Para cargar datos de la base de datos en un DataSet se pasa el DataSet al mtodo Fill de un objeto ADO.NET conectado el DataAdapter. Igualmente, para enviar los cambios pendientes que almacena el DataSet a la base de datos se pasa el DataSet al mtodo Update del DataAdapter. 1.2.1 Proveedores de datos .NET

    Un proveedor de datos .NET es una coleccin de clases diseadas para permitir la comunicacin con un tipo concreto de almacn de datos. El marco de trabajo .NET incluye cuatro de estos proveedores: cliente SQL, cliente Oracle, ODBC y OLE DB. Los proveedores de datos SQL y Oracle estn diseados para comunicarse con bases de datos concretas: SQL Server y Oracle respectivamente. Los proveedores de datos ODBC y OLE DB se denominan a menudo componentes puente porque sirven como puente con tecnologas heredadas ODBC y OLE DB. Estos proveedores permiten comunicarse con varios almacenes de datos por medio de controladores ODBC y proveedores OLE DB respectivamente.

    Cada proveedor de datos .NET implementa las mismas clases bsicas ProviderFactory, Connection, ConnectionStringBuilder, Command, DataReader, Parameter y Transaction aunque los nombres reales dependen de cada proveedor. Por ejemplo, el proveedor de datos .NET para cliente SQL incluye una clase SqlConnection y el proveedor ODBC una clase OdbcConnection. Independientemente del proveedor de datos que se use, la clase Connection del proveedor implementa las mismas caractersticas bsicas por medio de los mismos interfaces bsicos. Para abrir una conexin con un almacn de datos se crea una instancia de la clase conexin del proveedor, se configura su propiedad ConnectionString y se llama a su mtodo Open.

    Cada proveedor de datos .NET tiene su propio espacio de nombres. Los cuatro proveedores incluidos en el marco de trabajo .NET son subconjuntos del espacio de nombres System.Data en el que residen los objetos desconectados. El proveedor de datos .NET para cliente SQL reside en el espacio de nombres System.Data.SqlClient, el proveedor de datos ODBC reside en System.Data.Odbc, el proveedor de datos OLE DB en System.Data.OleDb y el proveedor de datos para cliente Oracle en System.Data.OracleClient.

    Como todos los proveedores de datos .NET implementan las mismas caractersticas bsicas el cdigo escrito es muy similar independientemente del proveedor que se use. Como puede ver en los siguientes fragmentos todo lo que necesita para cambiar de usar el proveedor de datos .NET ODBC a usar el proveedor de datos .NET para cliente SQL es cambiar la clase que instancie y los contenidos de la cadena de conexin para adaptarse a los estndares del proveedor.

    //Abre y cierra un OdbcConnection OdbcConnection conOdbc = new OdbcConnection(); conOdbc.ConnectionString = @Driver={SQL Server};Server=.\SQLExpress; + Database=Northwind; conOdbc.Open(); ... conOdbc.Close(); //Abre y cierra un SqlConnection SqlConnection conSQL =new SqlConnection(); conSQL.ConnectionString = @DataSource=.\SQLExpress;Initial Catalog=Northwind; conSQL.Open(); ... conSQL.Close();

    1.2.2 Por qu usar clases y libreras separadas Ninguna tecnologa de acceso a datos previa de Microsoft utiliz libreras y clases separadas para

    almacenes de datos diferentes. Muchos desarrolladores se preguntan por qu Microsoft ha hecho un cambio tan importante; las tres razones principales son rendimiento, extensibilidad y proliferacin.

    Fig.1. 1: Modelo de objetos ADO.NET

  • Escuela de Informtica del Ejrcito

    5

    Mejor rendimiento Cmo mejora el rendimiento el paso a proveedores de datos .NET?. Cuando se escribe cdigo ADO

    esencialmente se estn usando los interfaces ADO como intermediarios para comunicarse con su almacn de datos. Se le dice a ADO que proveedor se quiere usar y ADO remite las llamadas al proveedor adecuado. El proveedor ejecuta la accin solicitada y devuelve el resultado por medio de la librera ADO adecuada.

    Los proveedores de datos .NET no implican una capa intermedia. El programador se comunica directamente con el proveedor de datos, que se comunica con el almacn de datos usando los interfaces de programacin de bajo nivel del almacn de datos. La comunicacin con SQL Server usando el proveedor de datos .NET para cliente SQL de ADO.NET es ms rpida que usando ADO y el proveedor OLE DB para SQL Server porque implica una capa menos. Mayor extensibilidad

    Cuando SQL Server introdujo caractersticas XML el equipo de desarrollo de ADO se enfrent a un interesante reto. Para aadir a ADO caractersticas que permitieran a los desarrolladores recuperar datos XML desde SQL Server 2000 era necesario aadir nuevos interfaces al API OLE DB y al proveedor OLE DB para SQL Server.

    Los proveedores de datos .NET son ms fciles de ampliar. Slo necesitan dar soporte a los mismos interfaces bsicos y pueden proporcionar caractersticas propias especficas del proveedor cuando sea adecuado. El objeto SqlCommand expone los mismos mtodos y propiedades que OleDbCommand, pero adems aade un mtodo para obtener los resultados de una consulta como XML.

    SQL Server 2005 incluye una serie de nuevas caractersticas, incluyendo la posibilidad de que las aplicaciones usen los servicios de notificacin cuando los resultados de una consulta cambien en el servidor. En lugar de cambiar el funcionamiento interno de las clases comunes de ADO.NET simplemente se han introducido dos nuevas clases en el proveedor de datos .NET para cliente SQL para aprovechar estas caractersticas. Proliferacin

    Microsoft distribuy por primera vez los proveedores OLE DB para SQL Server, Access y Oracle con la versin 2.0 de MDAC en Julio de 1998. Microsoft y otros desarrolladores han creado proveedores OLE DB nativos para comunicarse con otros almacenes de datos, pero no hay un conjunto completo de proveedores OLE DB. Si est usando ADO pero no un proveedor OLE DB creado por Microsoft hay una alta probabilidad de que est usando en su lugar un controlador ODBC, un predecesor de OLE DB. Hay disponibles muchos ms controladores ODBC, principalmente porque eran ms fciles de desarrollar. Muchos desarrolladores sencillamente encontraron demasiado difcil crear sus propios proveedores OLE DB.

    En comparacin, un proveedor de datos .NET es simple de escribir. Hay muchos menos interfaces que implementar. Microsoft ha simplificado el proceso de creacin de proveedores para ADO.NET de modo que los desarrolladores pueden crear proveedores de datos .NET con mucha ms facilidad. Mientras ms proveedores de datos .NET haya, a ms orgenes de datos diferentes podr acceder mediante ADO.NET. 1.2.3 Cobertura de los proveedores de datos en este texto

    Como todos los proveedores de datos .NET implementan los mismos interfaces base, no es necesario explicar el uso de todos ellos. Nos centraremos en uno: el proveedor de datos .NET para cliente SQL.

    El Captulo 13 discute las caractersticas de los otros tres proveedores de datos .NET, as como el modelo comn de proveedor. El Captulo 11 trata el proveedor de datos .NET para SQL XML para mostrar el uso de algunas de las caractersticas relacionadas con XML de ADO.NET. Como el proveedor de datos .NET las SQL XML no ofrece nuevas caractersticas y omite muchas clases incluidas en otros proveedores por lo general no se considera un proveedor completo.

    Cuando se discuta una clase comn a todos los proveedores de datos .NET a menudo se usar su nombre independiente de proveedor, por ejemplo, DataAdapter en lugar de OdbcDataAdapter o SqlDataAdapter. 1.2.4 Objetos conectados

    El modelo de objetos ADO.NET incluye clases diseadas para ayudarle a comunicarse directamente con su origen de datos. Denominar a estas clases, que aparecen en el lado izquierdo de la figura 1.1, como clases conectadas de ADO.NET. La mayora de estas clases representan conceptos bsicos de acceso a datos como la conexin fsica, una consulta y los resultados de una consulta.

  • ADO.NET 2.0

    6

    Clase ProviderFactory La clase ProviderFactory es una novedad de ADO.NET 2.0 y acta como una factora de objetos,

    permitiendo crear instancias de otras clases. Cada clase ProviderFactory ofrece un mtodo Create que crea objetos Connection, ConnectionStringBuilder, Command, Parameter, DataAdapter y CommandBuilder. Clase Connection

    Un objeto Connection representa una conexin con un origen de datos. Puede especificar el tipo de origen de datos, su ubicacin y otros atributos por medio de las propiedades de esta clase. Un objeto Connection acta como un conducto mediante el cual otros objetos, como DataAdapter y Command, se comunican con la base de datos para enviar consultas y recuperar resultados. Clase ConnectionStringBuilder

    La clase ConnectionStringBuilder es nueva en ADO.NET 2.0 y simplifica el proceso de creacin de cadenas de conexin para un proveedor de datos .NET. Cada clase ConnectionStringBuilder expone propiedades que corresponden con opciones disponibles en la cadena de conexin del proveedor de datos .NET. Una vez creada la cadena de conexin usando esta clase se puede acceder a ella mediante la propiedad ConnectionString. Clase Command

    Los objetos Command representan una consulta contra una base de datos, una llamada a un procedimiento almacenado o una peticin directa para recuperar los contenidos de una tabla concreta.

    Las bases de datos soportan muchos tipos de consultas. Algunas consultas recuperan filas de datos haciendo referencia a una o ms tablas o vistas o llamando a un procedimiento almacenado. Otras consultas modifican filas de datos, y otras manipulan la estructura de la base de datos creando o modificando objetos como tablas, vistas o procedimientos almacenados. Puede usar un objeto Command para ejecutar cualquiera de estos tipos de consultas contra una base de datos.

    El uso de un objeto Command para consultar una base de datos es bastante directo. Se asigna a la propiedad Connection un objeto conexin que se conecta con la base de datos y se especifica el texto de la consulta en la propiedad CommandText.

    El texto de la consulta puede ser una consulta SQL estndar, el nombre de una tabla o vista o un procedimiento almacenado. La propiedad CommandType del objeto Command indica el tipo de consulta. La clase Command ofrece varios mtodos para ejecutar la consulta. Si la consulta no retorna filas llame a ExecuteNonQuery. El mtodo ExecuteReader devuelve un DataReader que puede usar para examinar las filas devueltas por la consulta. Si solo quiere recuperar la primera fila de la primera columna devuelta por la consulta, puede ahorrar algunas lneas de cdigo empleando el mtodo ExecuteScalar. El objeto SqlCommand incluye un cuarto mtodo de ejecucin, ExecuteXmlReader, similar a ExecuteReader pero diseado para manejar consultas que devuelven resultados en formato XML. Clase DataReader

    La clase DataReader est diseada para ayudarle a recuperar y examinar las filas devueltas por su consulta lo ms rpidamente posible. Puede usar la clase DataReader para examinar los resultados de una consulta fila a fila. Cuando pasa a la fila siguiente se descartan los contenidos de la anterior. El objeto DataReader no permite actualizaciones; los datos que contiene son de solo lectura. Como la clase DataReader soporta un conjunto de caractersticas mnimo es extremadamente rpido y ligero. Clase Transaction

    En ocasiones querr agrupar un conjunto de cambios en una base de datos y tratarlos como una nica unidad de trabajo. En programacin de bases de datos esta unidad de trabajo se denomina transaccin.

    La clase Connection tiene un mtodo BeginTransaction que puede usar que puede usar para crear objeto Transaction. Un objeto Transaction se usa para consignar o cancelar los cambios hechos en una base de datos durante el tiempo de vida del objeto. Clase Parameter

    Supongamos que quiere pedir a la tabla Orders todos los pedidos de un cliente concreto. Su consulta sera algo as:

    SELECT OrderID, OrderDate FROM Orders WHERE CustomerID = ALFKI El valor usado para la columna CustomerID en la clusula WHERE depende del cliente cuyos pedidos

    quiere examinar. Pero si usar este tipo de consulta, debe modificar su texto cada vez que quiere examinar los pedidos de un cliente diferente.

    Para simplificar el proceso de ejecutar este tipo de consultas puede reemplazar el valor por un indicador de parmetro:

  • Escuela de Informtica del Ejrcito

    7

    SELECT OrderID, OrderDate FROM Orders WHERE CustomerID = @CustomerID Entonces, antes de ejecutar la consulta se proporciona un valor para el parmetro. Muchos

    desarrolladores confan fuertemente en las consultas parametrizadas porque pueden ayudar a simplificar la programacin y crear un cdigo ms eficiente.

    Para usar un objeto Command parametrizado se crea un objeto Parameter para cada uno de los parmetros de la consulta y se aaden a la coleccin Parameters del objeto Command. La clase Parameter de ADO.NET expone propiedades y mtodos que permiten definir el tipo de datos y valor de los parmetros. Para trabajar con un procedimiento almacenado que devuelva datos por medio de parmetros de salida asigne el valor adecuado de la enumeracin ParameterDirection a la propiedad Direction del objeto Parameter. Clase DataAdapter

    La clase DataAdapter representa un nuevo concepto para los modelos de acceso a datos de Microsoft; no tiene un equivalente en ADO o DAO.

    Los objetos DataAdapter actan como un pueden entre la base de datos y los objetos desconectados en el modelo de objetos ADO.NET. El mtodo Fill, que es parte de la clase DataAdapter, proporciona un mecanismo eficiente para recuperar los resultados de una consulta en un DataSet o DataTable de forma que se pueda trabajar con los datos fuera de lnea. Tambin puede usar objetos DataAdapter para enviar los cambios pendientes almacenados en objetos DataSet a la base de datos.

    La clase DataAdapter de ADO.NET expone una serie de propiedades que son realmente objetos Command. Por ejemplo, la propiedad SelectCommand contiene un objeto Command que representa la consulta que se usa para rellenar el objeto DataSet. Tambin existen propiedades UpdateCommand, InsertCommand y DeleteCommand que se corresponden con objetos Command que se usan para enviar filas modificadas, nuevas o borradas a su base de datos respectivamente.

    Estos objetos Command proporcionan funcionalidad de actualizacin que en mecanismos anteriores era automtica (o automgica" segn el punto de vista). Por ejemplo, cuando se ejecuta una consulta en ADO para generar un Recordset, el motor de cursor pide a la base de datos metadatos sobre la consulta para determinar de donde proceden los resultados. ADO usa estos metadatos para crear la lgica de actualizacin para traducir los cambios en el Recordset a cambios en la base de datos.

    Entonces para qu cuatro propiedades separadas en la clase DataAdapter?. Para permitirle definir su propia lgica de actualizacin. La funcionalidad de actualizacin en ADO y DAO es muy limitada porque ambos modelos traducen los cambios en los Recordset en consultas de accin que hacen referencia directamente a tablas de la base de datos. Para mantener la seguridad e integridad de los datos muchos administradores de base de datos restringen el acceso a las tablas de modo que la nica forma de cambiar los contenidos sea llamar a procedimientos almacenados. ADO y DAO no saben cmo enviar cambios usando procedimientos almacenados ni proporcionan mecanismos que permitan especificar su propia lgica de actualizacin. DataAdapter de ADO.NET si.

    Con un objeto DataAdapter puede configurar las propiedades UpdateCommand, InsertCommand y DeleteCommand para llamar a procedimientos almacenados que modificarn, aadirn o eliminarn filas de la tabla adecuada en la base de datos. Entonces podr llamar simplemente al mtodo Update del objeto DataAdapter y ADO.NET usar los objetos Command creados para enviar los cambios almacenados en el DataSet a la base de datos.

    Como ya se ha indicado, la clase DataAdapter rellena tablas del objeto DataSet y lee los cambios almacenados y los enva a la base de datos. Para hacer un seguimiento de qu va donde un DataSet tiene algunas propiedades de soporte. La coleccin TableMappings es una propiedad que se usa para registrar qu tabla de la base de datos se corresponde con cul del DataSet. Cada correspondencia entre tablas tiene una propiedad similar para hacer corresponder columnas, adecuadamente denominada coleccin ColumnMappings. 1.2.5 Clases desconectadas

    Ya ha visto que puede usar las clases conectadas de un proveedor de datos .NET para conectar con un origen de datos, enviar consultas y examinar sus resultados. Sin embargo, estas clases conectadas permiten examinar los datos solo en forma de un flujo de datos solo de avance y de solo lectura. Qu pasa si quiere ordenar, buscar, filtrar o modificar los resultados?.

    El modelo de objetos de ADO.NET incluye clases para proporcionar estas funcionalidades. Estas clases actan como un cach de datos fuera de lnea. Una vez obtenidos los resultados de la consulta en un DataTable puede cerrar la conexin con el origen de datos y seguir trabajando con los datos. Como se mencion anteriormente, como estas clases no necesitan una conexin viva con la base de datos se denominan clases desconectadas.

  • ADO.NET 2.0

    8

    Clase DataTable La clase DataTable de ADO.NET permite examinar datos por medio de colecciones de filas y columnas.

    Puede almacenar los resultados de una consulta en un DataTable llamando al mtodo Fill de un objeto DataAdapter:

    string cadcon, consulta; cadcon = @Data Source=.\SQLExpress;Initial Catalog=Northwind; + Integrated Security=true; consulta = SELECT CustomerID, CompanyName FROM Customers; SqlDataAdapter adaptador = new SqlDataAdapter(consulta, cadcon); DataTable tabla = new DataTable(); adaptador.Fill(tabla); Una vez obtenidos los datos de la base de datos y almacenados en un objeto DataTable este objeto est

    desconectado del servidor. Puede examinar los contenidos del DataTable sin crear ningn trfico entre la aplicacin y la base de datos. Trabajando con los datos fuera de lnea no es necesario tener una conexin viva, pero recuerde que no ver los cambios hechos por otros usuarios despus de ejecutar la consulta.

    La clase DataTable contiene colecciones de otros objetos desconectaos que veremos poco ms adelante. Se accede a los contenidos de un DataTable por medio de su propiedad Rows, que devuelve una coleccin de objetos DataRow. Si quiere examinar la estructura se usa la propiedad Columns para recuperar una coleccin de objetos DataColumn. La clase DataTable tambin permite definir limitaciones, como clave principal, sobre los datos almacenados. Puede acceder a estas limitaciones por medio de la propiedad Constraints. Clase DataColumn

    Cada DataTable tiene una coleccin Columns, que es un contenedor para objetos DataColumn. Como implica su nombre, un objeto DataColumn se corresponde con una columna de la tabla. Sin embargo, un objeto DataColumn no contiene realmente datos; almacena informacin sobre la estructura de la columna. Este tipo de informacin, datos sobre datos, se denomina habitualmente metadatos. Por ejemplo, DataColumn expone una propiedad DataType que describe el tipo de datos que almacena la columna. La clase DataColumn tiene otras propiedades, como ReadOnly, AllowDBNull, Unique, Default y AutoIncrement que permiten controlar si los datos en la columna se pueden actualizar, restringen el contenido de la columna o indican cmo se deben generar valores para nuevas filas.

    La clase DataColumn expone tambin una propiedad Expression que puede usar para definir cmo se calculan los datos en la columna. Es habitual que una columna se base en una expresin en lugar de los contenidos de una columna de la base de datos. Por ejemplo, en la base de datos de ejemplo Northwind cada fila de la tabla Order Details contiene una columna UnitPrice y una columna Quantity. Tradicionalmente si se quera examinar el coste total el elemento de pedido se aada una columna calculada a la consulta. El siguiente ejemplo de SQL define una columna calculada llamada TotalElemento:

    SELECT OrderID, ProductID, Quantity, UnitPrice, Quantity * UnitPrice AS TotalElemento FROM [Order Details] El inconveniente de esta tcnica es que el motor de base de datos realiza los clculos solo en el

    momento de la consulta. Si modifica los contenidos de UnitPrice o Quantity en el objeto DataTable, el valor de TotalElemento no cambia.

    La clase DataColumn de ADO.NET define una propiedad Expression para manejar este escenario de una forma ms elegante. Cuando se comprueba el valor de un objeto DataColumn en base a una expresin, ADO.NET evala la expresin y devuelve un valor recin calculado. De esta forma, si actualiza el valor de cualquiera de las columnas que intervienen en la expresin, el valor de la columna calculada se mantiene preciso. Esta es la forma de usar la propiedad Expression:

    DataColumn columna = new DataColumn(); columna.ColumnName = TotalElemento; columna.DataType = typeof(Decimal); columna.Expression = UnitPrice * Quantity;

    Clase Constraint La clase DataTable tambin proporciona un modo de colocar limitaciones sobre los datos almacenados

    en local dentro de un objeto de este tipo. Por ejemplo, puede crear un objeto Constraint que asegure que los valores de una columna, o de varias, son nicos en el DataTable. Los objetos Constraint se mantienen en la coleccin Constraints del DataTable. Clase DataRow

    Para acceder a los valores reales almacenados en un objeto DataTable se usa la coleccin Rows, que contiene objetos DataRow. Para examinar los datos almacenados en una columna concreta de una fila

  • Escuela de Informtica del Ejrcito

    9

    especfica se usa la propiedad Item del objeto DataRow. La clase DataRow proporciona varias sobrecargas de la propiedad Item; puede especificar la columna por su nombre, ndice u objeto DataColumn asociado. En C# esta propiedad es el indexador de la clase, por lo que se puede usar de la siguiente manera:

    DataRow fila = tabla.Rows[0]; Console.WriteLine(fila[0]); Console.WriteLine(fila[CustomerID]); Console.WriteLine(fila[tabla.Columns[CustomerID]]); En lugar de devolver datos solo de la fila actual, DataTable hace que todas las filas estn disponibles por

    medio de una coleccin de DataRow. Para examinar los contenidos de un DataTable se recorre esta coleccin por medio de la propiedad Rows:

    string consulta, cadcon; cadcon = @Data Source=.\SQLExpress;Initial Catalog=Northwind; + Integrated Security=True; Consulta = SELECT CustomerID, CompanyName FROM Customers; SqlDataAdapter adaptador = new SqlDataAdapter(consulta, cadcon); DataTable tabla = new DataTable(); adaptador.Fill(tabla); foreach(DataRow fila in tabla.Rows) Console.WriteLine(row[CustomerID]); La clase DataRow es tambin el punto inicial para sus actualizaciones. Por ejemplo, puede llamar al

    mtodo BeginEdit de un objeto DataRow, cambiar el valor de algunas columnas en la fila por medio de la propiedad Item y llamar al mtodo EndEdit para guardar los cambios. Al llamar al mtodo CancelEdit de un objeto DataRow se cancelan los cambios hechos en la edicin actual. La clase DataRow tambin expone mtodos para borrar o eliminar un elemento de la coleccin de DataRows.

    Cuando se cambian los contenidos de una fila el DataRow almacena estos cambios de modo que se pueden enviar posteriormente a la base de datos. As, cuando se cambia el valor de una columna en una fila el DataRow mantiene el valor original adems del nuevo para actualizar la base de datos. La propiedad Item de un objeto DataRow tambin permite examinar el valor original de una columna cuando la fila tiene un cambio pendiente. Clase DataSet

    Un objeto DataSet, como su nombre indica, contiene un conjunto de datos. Puede imaginarlo como un contenedor para una serie de objetos DataTable almacenados en su coleccin Tables. Recuerde que ADO.NET se cre para ayudar a los desarrolladores a crear gantes aplicaciones de base de datos multicapa. En ocasiones querr acceder a un componente que se ejecuta en un servidor de capa media para recuperar el contenido de mltiples tablas. En lugar de tener que llamar repetidamente al servidor para obtener los datos tabla a tabla puede empaquetar todos los datos en un nico objeto DataSet y devolverlo en una nica llamada. Pero un objeto DataSet hace bastante ms que actuar como contenedor para objetos DataTable.

    Los datos almacenados en un objeto DataSet estn desconectados de la base de datos. Cualquier cambio hecho en los datos se almacena en su DataRow. Cuando es el momento de enviar estos cambios a la base de datos puede que no sea eficiente enviar el DataSet completo al servidor. Puede usar el mtodo GetChanges para extraer solo las filas modificadas en el DataSet. De esta forma se mueven menos datos entre diferentes procesos o servidores.

    La clase DataSet expone tambin un mtodo Merge que puede actuar como complemento de GetChanges. El servidor de capa media que use para enviar cambios a la base de datos usando el DataSet ms pequeo obtenido por el mtodo GetChanges puede devolver un DataSet que contenga datos recin recuperados. Puede usar el mtodo Merge para combinar los contenidos de dos objetos DataSet en uno solo. Este es otro ejemplo que muestra que ADO.NET se dise pensando en aplicaciones multicapa.

    Puede crear un objeto DataSet y cargar su coleccin Tablas con informacin mediante programacin sin tener que comunicarse con una base de datos. No necesita comunicarse con la base de datos hasta que no est listo para enviar las filas nuevas.

    La clase DataSet tiene caractersticas que le permiten escribir en y leer de un archivo o un rea de memoria. Puede guardar solo el contenido del DataSet, solo su estructura o ambos. ADO.NET almacena estos datos como documento XML. Como ADO.NET y XML estn tan relacionados, el movimiento de datos entre objetos DataSet y documentos XML es inmediato. De esta forma puede aprovechar una de las ms potentes caractersticas de XML: su capacidad para transformar fcilmente la estructura de los datos. Por ejemplo, puede usar una plantilla XSL para convertir datos exportados a un documentos XML en HTML.

  • ADO.NET 2.0

    10

    Clase DataRelation Las tablas de una base de datos por lo general estn relacionadas de alguna manera. Por ejemplo, en la

    base de datos Northwind cada entrada de la tabla Orders se relaciona con una entrada de la tabla Customers, de modo que se puede determinar qu cliente hizo qu pedido. Probablemente querr usar datos relacionados de mltiples tablas en su aplicacin. La clase DataSet maneja datos de objetos DataTable relacionados con ayuda de la clase DataRelation.

    La clase DataSet expone una propiedad Relations que es una coleccin de objetos DataRelation. Puede usar un objeto DataRelation para indicar una relacin entre diferentes objetos DataTable de un DataSet. Una vez creado un objeto DataRelation se usa cdigo como el siguiente para recuperar un array de pedidos que corresponden a un cliente concreto.

    DataSet ds; DataTable tblClientes, tblPedidos; DataRelation relacin; //Crea e inicializa el DataSet Relacin = ds.Relations.Add(Clientes_Pedidos, tblClientes.Columns[CustomerID], tblPedidos.Columns[CustomerID]); foreach(DataRow filaCliente in tblClientes.Rows){ Console.WriteLine(filaCliente[CompanyName]); foreach(DataRow filaPedido in filaCliente.GetChildRows(relacin)) Console.WriteLine( {0}, filaPedido[OrderID]); Console.WriteLine(); } Los objetos DataRelation exponen tambin propiedades que permiten imponer la integridad referencial.

    Por ejemplo, puede configurar un objeto DataRelation de modo que si modifica el valor del campo de clave principal en la fila madre el cambio se propague en cascada automticamente a las filas hijas. Tambin puede configurar su objeto DataRelation de modo que si borra una fila en un DataTable las filas correspondientes de cualquier objeto DataTable hijo, tal como lo defina la relacin, se borran automticamente. Clase DataView

    Una vez recuperados los resultados de una consulta en un objeto DataTable puede usar un objeto DataView para ver los datos de formas diferentes. Si quiere ordenar los contenidos de un objeto DataTable en base a una columna sencillamente configure la propiedad Sort del objeto DataView con el nombre de la columna. Tambin puede configurar la propiedad Filter de un DataView de modo que solo sean visibles las filas que cumplen ciertos criterios.

    Puede usar varios objetos DataView a la vez para examinar el mismo DataTable. Por ejemplo puede tener dos rejillas en un formulario, una que muestre todos los clientes en orden alfabtico y la otra mostrando las filas ordenadas por un campo diferente, como el pas. Para mostrar cada vista se vincula cada objeto DataView con una rejilla. Esta caracterstica hace innecesario manejar dos copias separadas de los datos en estructuras separadas. 1.2.6 Metadatos

    ADO.NET permite elegir entre usar un par de lneas de cdigo y dejar que ADO.NET determine automticamente la estructura de los resultados, o usar ms cdigo que incluye metadatos sobre la estructura de los resultados de la consulta.

    Por qu elegir la opcin que implica escribir ms cdigo?. Las ventajas principales son un incremento en la funcionalidad y un mayor rendimiento. Pero cmo puede aumentar el rendimiento tener que escribir ms cdigo?. Esto no parece lgico no?.

    Salvo que est escribiendo una herramienta de consulta a medida por lo general conocer la estructura de los resultados de la consulta. Para recuperar los resultados de la consulta y almacenar los datos, ADO.NET necesita conocer la estructura de estos datos, nmero de columnas, sus tipos, nombres, etc. Puede proporcionar esta informacin mediante programacin u obligar a ADO.NET a pedrsela al proveedor. El cdigo ser ms rpido usando la primera opcin porque pedir la informacin al proveedor en tiempo de ejecucin puede provocar una penalizacin importante.

    Escribir cdigo para preparar la estructura del DataSet puede ser tedioso. Afortunadamente, Visual Studio incluye caractersticas de acceso a datos en tiempo de diseo que ofrecen lo mejor de ambos mundos. Por ejemplo, puede crear un objeto DataSet basado en una consulta, un nombre de tabla o un procedimiento almacenado y un asistente de configuracin generar cdigo para ejecutar la consulta y dar soporte a las actualizaciones en la base de datos.

  • Escuela de Informtica del Ejrcito

    11

    1.2.7 Clases DataSet fuertemente tipadas Visual tambin le ayuda a simplificar el proceso de creacin de aplicaciones de acceso a datos

    generando DataSet fuertemente tipados. Suponga que tiene una tabla simple llamada Clientes que contiene dos columnas, IdCliente y NombreCia. No ser necesario escribir cdigo como este:

    DataSet ds; //Crea y rellena el DataSet Console.WriteLine(ds.Tables[Clientes].Rows[0][IdCliente]); Si no que su cdigo ser como este: DataSet ds; //Crea y rellena el DataSet Console.WriteLine(ds.Clientes[0].IdCliente]); El DataSet fuertemente tipado es simplemente una clase que genera Visual Studio con toda la

    informacin de tablas y columnas disponibles por medio de propiedades. Los DataSet fuertemente tipados tambin exponen mtodos modificados para caractersticas como crear nuevas filas. En lugar de cdigo como este:

    DataSet ds; //Cdigo para crear el DataSet y el DataTable de clientes DataRow filaNuevoCliente; filaNuevoCliente = ds.Tables[Clientes].NewRow(); filaNuevoCliente[IdCliente] = ALFKI; filaNuevoCliente[NombreCia] = Alfredo Futterkiste; ds.Tables[Clientes].Rows.Add(filaNuevoCliente); Podemos crear y aadir una nueva fila a la tabla con una sola lnea de cdigo: ds.Clientes.AddClientesRow(ALFKI, Alfredo Futterkiste);

  • ADO.NET 2.0

    12

  • Escuela de Informtica del Ejrcito

    13

    2 Conectar con su base de datos Parte de la creacin de una aplicacin de base de datos es conectar con su origen de datos y gestionar

    la conexin. En el modelo de objetos ADO.NET un objeto Connection representa una conexin con su origen de datos. Los objetos conexin tambin sirven como punto inicial para crear consultas y transacciones.

    Este captulo ser su gua para el uso de objetos conexin, explicando las caractersticas principales disponibles en ADO.NET. Discutiremos cmo abrir y cerrar conexiones, agrupamiento de conexiones y algunas caractersticas nuevas disponibles en ADO.NET 2.0 que permite cmo intenta ADO.NET controlar la forma de conectar con el origen de datos seguridad de cadena de conexin y generadores de cadena de conexin. Tambin examinaremos cmo usar otra nueva caracterstica de ADO.NET, el mtodo GetSchema, que permite descubrir el esquema disponible en una base de datos.

    En el modelo de objetos de ADO.NET todas las clases de conexin derivan de la clase DbConnection del espacio de nombres System.Data.Common. A lo largo de este captulo nos centraremos en la clase diseada especficamente para comunicar con bases de datos SQL Server, la clase SqlConnection. Si no se indica otra cosa, las caractersticas expuestas son genricas y se aplican a todas las clases conexin.

    Los fragmentos de cdigo asumen que se usan los espacios de nombres System.Data y System.Data.SqlClient. 2.1 Crear objetos SqlConnection

    Hay dos formas de crear objetos SqlConnection en tiempo de ejecucin. Puede simplemente crear un objeto SqlConnection sin inicializar usando el constructor sin parmetros, o puede usar el constructor que acepta una cadena de conexin.

    string cadcon = @Data Source=.\SQLExpress;Initial Catalog=Northwind; + Integrated Security=True; SqlConnection conexin = SqlConnection(cadcon); Una cadena de conexin consiste en pares clave/valor que describe cmo debe ADO.NET intentar

    conectar con el origen de datos. Esta cadena concreta indica que se debe buscar una instancia de SQL Server llamada SQLExpress en la mquina local, buscar un catlogo llamado Northwind e intentar acceder mediante una conexin de confianza usando credenciales Microsoft Windows. Ms adelante veremos ms opciones permitidas en una cadena de conexin. 2.2 Abrir objetos SqlConnection

    Cuando se crea un objeto conexin se inicializa en estado cerrado. En otras palabras, a pesar de su nombre, no est conectada con el almacn de datos. Si intenta ejecutar una consulta sobre un SqlConnection sin abrir primero la conexin, recibir una InvalidOperationException que indica que el mtodo necesita una conexin abierta y disponible. El estado actual de la conexin es cerrada.

    Para conectar con el almacn de datos proporcione una cadena de conexin vlida, ya sea mediante el constructor o asignando a la propiedad ConnectionString y llame al mtodo Open.

    Al llamar al mtodo Open de un objeto SqlConnection que ya est abierto se causa una InvalidOperationException. Si no est seguro del estado de la conexin compruebe su propiedad State, que se describe ms adelante en la referencia de SqlConnection. 2.3 Cerrar objetos SqlConnection

    Cerrar un objeto SqlConnection es incluso ms fcil que abrirlo. Simplemente llame al mtodo Close. Si usa agrupamiento de conexiones, que trataremos ms adelante en este captulo, la conexin fsica se devuelve al agrupamiento en lugar de cerrarla, y se puede reutilizar. Si no est usando agrupamiento de conexiones, se cierra la conexin fsica con la base de datos.

    Si se llama al mtodo Close de un objeto SqlConnection que ya est cerrado no se produce ninguna excepcin. 2.4 Hacer limpieza por donde pase

    Como ya es sabido, el marco de trabajo .NET hace recogida de basura, pero el mecanismo que sigue esta recogida hace que no se sepa cual ser el momento en que se elimine un objeto. Entonces surge una pregunta qu sucede si se crea y abre un SqlConnection en el evento de pulsacin de un botn y se sale del mtodo sin cerrarlo?.

    Cuando el recolector de basura de .NET elimina el objeto SqlConnection implcitamente llama al mtodo Close. Pero cundo se producir esta llamada?. La respuesta correcta, pero indeterminada, es luego.

  • ADO.NET 2.0

    14

    Imagine un usuario impaciente que pulsa el botn, por ejemplo, 10 veces en cinco segundos. Cada vez que se completa el evento Click el nuevo SqlConnection cae fuera de alcance. Cuando, eventualmente, el recolector de basura elimine el SqlConnection se llamar a su mtodo Close y la conexin fsica se enviar de vuelta al agrupamiento. Como el usuario pulsa el botn repetidamente antes de que el recolector de basura elimine los objetos fuera de alcance la aplicacin abre 10 conexiones separadas con la base de datos.

    Lo importante es aprender que hay que hacer limpieza por donde se pase. No confe en la recogida de basura de .NET para gestionar el estado de sus conexiones con base de datos. En el ejemplo anterior, la llamada al mtodo Close dentro del mtodo nos asegura que la aplicacin use solo una conexin fsica con la base de datos SQL Server.

    Muchas clases del modelo de objetos ADO.NET, como SqlConnection, exponen un mtodo Dispose. Por lo general, una llamada a este mtodo libera, o restablece, los recursos no administrados. Al llamar a este mtodo en un objeto SqlConnection se llama implcitamente al mtodo Close. Como ya se ha dicho, llamar a Close sobre una conexin no cerrada no provoca ninguna excepcin.

    Una forma sencilla de asegurarse de que ha limpiado sus recursos es abrir los recursos de uso breve dentro de un bloque using. En el ejemplo, podemos abrir la conexin dentro de un bloque using para asegurarnos de que se llama a Close implcitamente al final del bloque:

    private void button1_Click(object sender, EventArgs e){ string cadcon = @Data Source=.\SQLExpress;Initial Catalog=Northwind; + Integrated Security=True; using(SqlConnection conexin = new SqlConnection(cadcon)){ conexin.Open(); //Usa la conexin } } Ahora no es necesario llamar explcitamente a Close sobre el objeto SqlConnection. El bloque using

    asegura que se llamar a Dispose al final, incluso si se produce una excepcin no controlada. 2.5 Cadenas de conexin

    En los ejemplos anteriores se ha utilizado una cadena de conexin, pero an no sabemos lo que es. 2.5.1 Qu es una cadena de conexin

    Una cadena de conexin se compone de pares clave/valor separados por punto y coma. Las opciones y valores dependen del origen de datos con el que quiere conectar y de la tecnologa que est usando para conectar.

    El proveedor de datos .NET para cliente SQL es extremadamente flexible en lo que respecta a conectar con bases de datos, y proporciona una variedad de formas de crear una cadena de conexin. Puede usar palabras clave actuales como Initial Catalog o Data Source o trminos ms antiguos como Server o Database. Conectar con la instancia predeterminada de SQL Server

    Puede usar varios valores especiales para indicar que est conectando con la mquina local (local), localhost o .. Para conectar con el servidor predeterminado simplemente especifique el nombre de mquina a la que quiere acceder en Data Source:

    Data Source=.;

    Conectar con una instancia con nombre En una mquina puede haber instaladas varias instancias de SQL Server. Si quiere acceder a una

    instancia con nombre aada una barra invertida (\) y el nombre de instancia tras el nombre de mquina. El siguiente cdigo accede a una instancia llamada SQLExpress en la mquina local:

    Data Source=.\SQLExpress; El carcter de barra invertida tiene un significado especial en C#, por lo que deber usar una barra

    invertida doble (Data Source=.\\SQLExpress;) o anteceder la cadena por una arroba (@Data Source=.\SQLExpress;). Especificar un catlogo inicial

    Cualquier instancia de SQL Server puede tener instaladas mltiples bases de datos. Cuando se conecte con una instancia de SQL Server puede especificar la base de de datos por medio de la palabra clave Initial Catalog. Si quiere acceder a la base de datos Northwind aada el siguiente fragmento a su cadena de conexin:

    Initial Catalog=Northwind;

  • Escuela de Informtica del Ejrcito

    15

    Tambin puede usar la antigua palabra clave Database en lugar de Initial Catalog. Conectar con un nombre de usuario y contrasea especficos

    Muchas bases de datos permiten iniciar sesin con el origen de datos proporcionando un nombre de usuario y una contrasea en la cadena de conexin. Puede usar estas opciones para un SqlConnection por medio de las palabras clave de cadena de conexin User ID y Password. Estas palabras clave se pueden sustituir respectivamente por las antiguas UID y PWD. Conectar usando seguridad integrada

    Otra opcin de conexin es hacer que SQL Server autentique al usuario con sus credenciales de Windows en lugar de especificar un nombre de usuario y una contrasea en la cadena de conexin. Para especificar esta opcin aada el siguiente fragmento a la cadena de conexin:

    Integrated Security=True; Puede reemplazar la palabra clave Integrated Security por la antigua Trusted_Connection.

    2.5.2 Generadores de cadena de conexin La creacin de cadenas de conexin en tiempo de ejecucin puede ser difcil. Tal vez tenga problemas

    para recordar el nombre de la opcin de cadena de conexin que quiere usar. Puede que no est seguro de cmo delimitar el valor. Quizs busque ayuda para asegurar que la entrada que recibe del usuario no puede cambiar las intenciones de su cadena de conexin. ADO.NET 2.0 incluye clases generadoras de cadena de conexin para ayudarle con estos problemas. Usar un generador de cadenas de conexin

    Los generadores de cadena de conexin son fciles de usar. Puede configurar o examinar valores por medio del indexador de la clase. Una vez proporcionados los valores deseados use la propiedad ConnectionString del generador para acceder a la cadena de conexin resultante.

    En este ejemplo queremos generar una cadena de conexin basada en varias opciones de cadena de conexin usando un SqlConnectionStringBuilder, que es el generadote de cadenas de conexin para SqlConnection. Simplemente asignamos valores para las diferentes opciones por medio del indexador. Una vez generada la cadena de conexin la propiedad ConnectionString contiene el valor que necesita SqlConnection:

    SqlConnectionStringBuilder generador = new SqlConnectionStringBuilder(); generador[Data Source] = @.\SQLExpress; generador[Initial Catalog] = Northwind; generador[Integrated Security] = true; //Escribe la cadena de conexin resultante en la consola Console.WriteLine(Cadena de conexin: {0}, generador.ConnectionString); //Utiliza la cadena resultante en una conexin SqlConnection conexin = new SqlConnection(generador.ConnectionString); conexin.Open(); La cadena de conexin generada es: Data Source=.\SQLExpress;Initial Catalog=Northwind;Integrated Security=True; Pero esta cadena de conexin ya sabemos construirla, o sea, que an no hemos ganado nada.

    Cadenas de conexin e Intellisense Normalmente es difcil recordar las palabras clave correctas para utilizar en una cadena de conexin,

    sobre todo cuando se utilizan varias tecnologas de acceso a datos, cada una de ellas con sus propias opciones. Los generadores de cadena de conexin exponiendo las opciones ms usadas como propiedades. Las clases generadoras de cadena de conexin disponibles en ADO.NET 2.0 incluyen propiedades fuertemente tipadas que corresponden a muchas opciones de cadena de conexin. En el ejemplo anterior asignamos valores a las palabras clave Data Source, Initial Catalog e Integrated Security por medio del indexador. En este otro hacemos lo mismo usando propiedades de la clase generador:

    SqlConnectionStringBuilder generador = new SqlConnectionStringBuilder(); generador.DataSource = @.\SQLExpress; generador.InitialCatalog = Northwind; generador.IntegratedSecurity = true; Este cdigo genera la misma cadena de conexin que el anterior, pero es ms fcil de escribir. Adems,

    si comete un error de tipografa obtendr un error en compilacin. Si utiliza Visual Studio y tiene problemas para recordar las opciones disponibles, podr comprobarlas por medio de los mens desplegables de Intellisense

  • ADO.NET 2.0

    16

    Valores complejos de cadena de conexin Una ventaja secundaria del uso de generadores de cadena de conexin es que evitan la necesidad de

    analizar, escapar o delimitar valores. Suponga que tiene que utilizar una cadena de conexin que incluye un espacio. Alrededor del espacio hay que poner comillas sencillas, o llaves? o las dos cosas? o nada?.

    Si est creando la cadena de conexin a mano, la respuesta no es sencilla. La respuesta puede variar segn el proveedor de datos .NET que est utilizando. Si utiliza un generador de cadena de conexin no tiene que preocuparse por este asunto. Simplemente proporcione como valor de la opcin la cadena que debe emplear, y el generador se encargar de darle el formato adecuado. Inyeccin de cdigo en cadenas de conexin

    Una de las reglas ms importantes al escribir cdigo seguro es nunca confe en la entrada de usuario. Las consultas parametrizadas, que se tratarn en su momento, son tiles por muchas razones, pero una de las principales es que le protegen contra la inyeccin SQL. Puede construir una consulta parametrizada y asignar la entrada del usuario a parmetros sin tener que preocuparse de que modifique la estructura de su consulta. Cuando se construyen cadenas de conexin hay problemas similares.

    Puede decidir preguntar al usuario sus credenciales y construir una cadena de conexin en base a esta entrada:

    string cadcon = @Data Source=.\SQLExpress;Initial Catalog=Northwind; + User ID= + txtIdUsuario.Text + ; + Password= + txtContrasea.Text + ; Console.WriteLine(Cadena de conexin resultante: {0}, cadcon); A primera vista puede parecer una forma segura y lgica de hacer las cosas. Pero imagine un usuario

    malvolo que quiere cambiar la cadena de conexin. Cuando se le pida su nombre de usuario puede escribir MiNombreUsuario;Data Source=NombreOtroServidor. A falta de un nombre apropiado, llamaremos a esto inyeccin de cadena de conexin. Si esta entrada llega a nuestro cdigo, la cadena resultante ser:

    Data Source=.\SQLExpress;Initial Catalog=Northwind;User ID=MiNombreUsuario; Data Source=NombreOtroServidor;Password=contrasea; Como puede ver, la clave Data Source aparece dos veces. Qu valor tiene prioridad, el primero o el

    ltimo?.Hay alguna forma de inspeccionar la entrada del usuario para identificar problemas como ste?. Son coherentes las respuestas de un proveedor de datos a otro?. Qu puede hacer un pobre programador?.

    Afortunadamente, los generadores de cadena de conexin pueden ayudarnos. Vamos a crear una cadena de conexin en base a entrada del usuario usando un generador:

    SqlConnectionStringBuilder generador = new SqlConnectionStringBuilder(); generador.DataSource = @.\SQLExpress; generador.InitialCatalog = Northwind; generador.UserID = txtIdUsuario.Text; generador.Password = txtContrasea.Text; Si el usuario escribe la misma entrada, la cadena generada ser: Data Source=.\SQLExpress;Initial Catalog=Northwind;User ID=MiNombreUsuario; Data Source=NombreOtroServidor;Password=contrasea; Ver que el valor introducido por el usuario est entre comillas, lo que har que se intente la conexin

    con toda la cadena como nombre de usuario, por lo que fracasar. Alias de palabras clave

    Como SqlConnectionStringBuilder est creada especficamente para SQL Server reconoce los alias de palabra clave antiguos. Puede proporcionar a SqlConnectionStringBuilder las palabras clave antiguas o las actuales, y en ambos casos el resultado ser el mismo. Dilogo de cadena de conexin con generador

    No existe un control o dilogo para generar cadenas de conexin ADO.NET. Pero puede crear el suyo propio para mostrar opciones de conexin de una forma muy fcil.

    Si quiere crear un interface de usuario que muestre todas las opciones de cadenas de conexin puede lograrlo gracias al control PropertyGrid del marco de trabajo .NET. Simplemente asigne un SqlConnectionStringBuilder a la propiedad SelectedObject de PropertyGrid. La nica tarea restante es capturar el evento PropertyValueChanged del control para actualizar una caja de texto con el valor actual de la propiedad ConnectionString de SqlConnectionStringBuilder.

  • Escuela de Informtica del Ejrcito

    17

    2.5.3 Seguridad de cadenas de conexin Supongamos que quiere usar un dilogo de cadena de conexin como el que acabamos de discutir, pero

    solo quiere permitir ciertas cadenas de conexin. Por ejemplo, puede que quiera restringir la cadena de conexin a un catlogo inicial concreto en un servidor especfico, a la vez que permite cualquier valor el ID de usuario y la contrasea, pero sin atributos adicionales. Cmo puede escribir este cdigo?.

    Una posibilidad es comenzad con un SqlConnectionStringBuilder cuyas propiedades DataSource e InitialCatalog tengan los valores deseados. A continuacin puede escribir su propio dilogo, permitiendo que el usuario escriba valores para el ID y la contrasea. Entonces podra asignar estos valores a su SqlConnectionStringBuilder para evitar la inyeccin de cadena de conexin.

    En un ejemplo tan sencillo como este, esta solucin puede ser suficiente. Pero que pasa con opciones ms complejas?. Supongamos que el usuario se puede conectar al ServidorA o al ServidorB, pero una conexin con el ServidorA necesita seguridad integrada y una conexin con ServidorB utiliza un ID de usuario y una contrasea. Mientras ms compleja sea la situacin, ms complicados se vuelven el interface de usuario y la lgica de validacin. Un mtodo ms simple es validar la cadena de conexin es usar las nuevas caractersticas de seguridad de cadena de conexin de ADO.NET. Restringir el acceso a datos con la clase SqlClientPermission

    La clase SqlClientPermission deriva de la clase CodeAccessPermission del espacio de nombres System.Security. Puede usar esta clase para restringir el acceso a cadenas de conexin ya sea mediante programacin, por medio de atributos y mtodos de clases, o por medio de seguridad de acceso de cdigo.

    El siguiente ejemplo muestra cmo puede usar la clase SqlClientPermission para restringir el acceso a un nombre de servidor y catlogo inicial especficos, a la vez que se permite cualquier valor para el ID de usuario y la contrasea. El fragmento asume que existe un dilogo miDialogo que devuelve una cadena de conexin creada usando un SqlConnectionStringBuilder y un PropertyGrid, y tambin asume referencias al espacio de nombres System.Security.Permissions.

    SqlClientPermission permiso = new SqlClientPermission(PermissionState.None); permiso.add(@Data Source=.\SQLExpress;Initial Catalog=Northwind;, User ID=;Password=;, KeyRestrictionBehavior.AllowOnly); permiso.PermitOnly(); //In