Top Banner

of 109

Tutorial de SQL Server 2005 Express

Jul 09, 2015

Download

Documents

Ulises Ramirez
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

Tutorial de SQL Server 2005 ExpressEn este tutorial, aprender los fundamentos para desarrollar aplicaciones con la versin Express de SQL Server 2005. El objetivo del tutorial no es cubrir en gran detalle todos los aspectos de SQL Server 2005 Express, pero si aportar una idea general del producto y su integracin con el resto de herramientas Express (Visual Basic Express, Visual C# Express, y Visual J# Express El tutorial cubrir los siguientes puntos: Mdulo 1: Introduccin a SQL Server Express Requisitos del sistema, instalacin del producto, y descripcin de sus componentes. Integracin del producto con otras versiones Express; durante el tutorial se trabajar con la versin Express de Visual Basic; sin embargo todos los ejemplos y demostraciones usados son aplicables a Visual C#, y J#. Proceso de despliegue de aplicaciones desarrolladas con Visual Basic Express. Conceptos XCOPY, instancias de usuario no-administrador, y duplicacin de datos. Proveedores de acceso a datos disponibles. A la hora de conectar a un servidor de base de datos como SQL Server 2005 Express, el nexo de comunicacin entre el servidor y la aplicacin cliente, es el proveedor de acceso a datos; se hablar e introducir brevemente los proveedores de acceso a datos disponibles.

Mdulo 2: Creacin de bases de datos con Visual Studio Objetos bsicos del sistema. Conocer aspectos de la base de datos como su creacin tipos de datos disponibles en SQL Server 2005, crear tablas, restricciones (constraints), relaciones, y teora relativa a la creacin de ndices, y su idoneidad. Conocer como realizar consultas a las tablas de la base de datos, clusulas de las sentencias, agrupaciones, joins, etc. Tambin conocer una nueva caracterstica del producto que son las expresiones de tablas comunes (CTE). Adems aprender a hacer sentencias de insercin, actualizacin, y borrado.

Mdulo 3: Programacin de base de datos Procedimientos almacenados. Conocers almacenados en la base de datos. los fundamentos para crear procedimientos

Triggers. Introduccin al uso de triggers en SQL Server 2005 Express; veremos los triggers "tradicionales" (llamados DML, los que se activan por modificaciones de datos), y tambin veremos los nuevos triggers que se activan por cambio en el esquema de base de datos (DDL). Funciones definidas de usuario. Veremos como crear UDFs, y los tipos de funciones definidas de usuario que existen.

Mdulo 4: Conceptos avanzados Conceptos de seguridad de objetos, esquemas, y credenciales de inicio de sesin. Se introducir el nuevo paradigma de seguridad basado en esquemas. 1

Trasaccionalidad y niveles de aislamiento. Se cubrirn los niveles de aislamiento y cmo SQL Server 2005 garantiza la atomicidad, consistencia, integridad, y durabilidad de las transacciones. Soporte Nativo XML. Conocer en qu consiste el soporte nativo de XML, uso de las columnas tipo XML, indexacin, y consultas XQuery. Integracin del CLR. Conocer la nueva posibilidad de crear objetos en la base de datos usando cualquier lenguaje .NET como VB.NET, o C#.

Aunque el tutorial no est escrito para un tipo de audiencia determinada, es recomendable que el alumno tenga conceptos de desarrollo de aplicaciones cliente-servidor, y fundamentos de bases de datos que aunque durante el curso se irn cubriendo en mayor o menor profundidad, ayudarn al alumno a una rpida comprensin de las lecciones. En la introduccin del tutorial, se ver cmo instalar el producto y los diferentes proveedores de acceso a datos que se pueden utilizar. En el segundo mdulo, se ver cmo aprovechar la integracin entre las herramientas de desarrollo de Visual Basic Express con el motor relacional de SQL Server 2005 Express para crear bases de datos, tablas, vistas, y otros objetos. En el tercer mdulo, aprender conceptos bsicos sobre procedimientos almacenados, triggers, y UDFs, y para finalizar el tutorial, aprender otros conceptos relacionados con seguridad, transacciones, y niveles de aislamiento. A su vez, conocer nuevas funcionalidades del producto como soporte nativo XML, y la integracin del CLR en el motor relacional de SQL Server 2005. Recuerde que si quiere poner en prctica este curso tiene disponibles una versin sin limitaciones de Visual Basic 2005 Express, que incluye la base de datos SQL Server 2005 Express. Que disfrutes del curso! Solid Quality Learning University http://www.sqlu.com Solid Quality Learning Iberoamericana http://www.SolidQualityLearning.com Diseado, y editado por los siguientes mentores de Solid Quality Learning: http://www.SolidQualityLearning.com/aboutUs.aspx: Miguel Egea ([email protected]) MVP SQL Server Director de Servicios Corporativos Eladio Rincn ([email protected]) MVP SQL Server Director de Tecnologas de Bases de Datos Eugenio Serrano ([email protected]) MVP ASP/ASP.NET Antonio Soto ([email protected]) MCT, Director de Formacin

Agradecimientos Queremos agradecer a Alfonso Rodrguez, David Carmona, y Lus Mazario de Microsoft Ibrica su soporte y colaboracin durante las fases de diseo y desarrollo de este curso. Muchas gracias!!!

2

1.

Introduccin a SQL Server 2005 Express

Durante el mdulo, ver cuales los requisitos hardware/software necesarios para instalar SQL Server 2005 Express, y cmo realizar la instalacin del producto. Se introducir al alumno brevemente los componentes del producto, enfocado en las necesidades del desarrollador de software. A su vez se ver cmo se integra SQL Server 2005 Express con las herramientas de desarrollo de las ediciones Express. Para finalizar se presentarn los drivers de acceso a datos que se usarn para conectar a SQL Server 2005 Express.

1.1.

Instalacin de SQL Server 2005 Express y sus componentes

En esta leccin, conocer los requisitos para instalar SQL Server 2005 Express; adems, ver las diferentes opciones disponibles durante la instalacin asistida. A continuacin se le introducir los componentes instalados, explicndose su funcionalidad. Para finalizar la leccin se hablar de otros componentes disponibles con el producto como cdigo y bases de datos de ejemplo, y documentacin del producto (Libros en pantalla).

1.1.1.

Requisitos del sistema

La instalacin del SQL Server 2005 Express tiene los siguientes requerimientos: - Requisitos previos de software - RAM - Espacio en el disco duro - Procesador - Microsoft .NET Framework - SP1 de Microsoft Internet Explorer 6.0 o posterior - Mnimo: 192 MB - Recomendado: 512 MB o ms - 600 MB de espacio libre - Compatible con Pentium III o superior - Mnimo: 500 MHz - Recomendado: 1 GHz o ms - Windows Server 2003 Standard Edition, Enterprise Edition, Datacenter Edition - Windows XP Professional, Home Edition (SP2 o posterior) - Windows 2000 Professional, Server, Advanced Server, Datacenter Server (SP4 o posterior)

- Sistema operativo

1.1.2.

Proceso de instalacinComo parte de la instalacin de algn producto Express.

La instalacin de SQL Server 2005 Express se puede realizar de dos formas: 1.1.2.1.

Si se instala como parte de la instalacin de algn producto Express (por ejemplo Visual Basic Express), el proceso de instalacin le pedir si desea incluir SQL Server 2005 Express en la instalacin: en la imagen puede ver la ventana en la que se le solicita la opcin (la instalacin por defecto no incluye instalar SQL Server 2005 Express).

3

4

1.1.2.2.

Como instalacin independiente.

Si se instala de forma independiente, el proceso de instalacin requiere los siguientes pasos: El primer paso de la instalacin consiste en instalar Microsoft .NET Framework 2.0 que es uno de los requisitos de la instalacin; si ya est instalado previo al proceso de instalacin, este paso ser omitido. La actualizacin desde versiones anteriores de .NET Framework est soportada hasta la versin 1.1, en caso de haber instalado una versin posterior, deber desinstalarla antes de instalar SQL Server 2005 Express; en otras palabras, la actualizacin se puede realizar slo desde versiones soportadas de .NET Framework.

5

Ventana de condiciones de EULA; aceptar los trminos de la licencia y condiciones y pulsar Siguiente.

6

Ventana de bienvenida de instalacin de los prerrequisitos necesarios para SQL Server 2005 Express; pulsar Instalar.

7

Ventana de finalizacin de instalacin de los prerrequisitos; pulsar Siguiente.

8

Ventana de bienvenida al asistente de instalacin de SQL Server 2005 Express; pulsar Siguiente.

9

Ventana de comprobacin de requerimientos del sistema; si la comprobacin ha sido satisfactoria, todas las opciones aparecern con la opcin de verificacin en color verde, en caso de haber algn requerimiento no severo, aparecer en color amarillo; si hay algn requerimiento crtico que no se cumple, aparecer en color rojo y no podr seguirse con el proceso de instalacin. Pulsando en el botn Report, podr ver cuales son los requisitos no cumplidos para poder preparar al sistema para cumplirlos; por ejemplo, si no se cumplen los requerimientos de ASP.NET, podr salir de la instalacin, actualizar ASP.NET, y volver a realizar la instalacin. Si la comprobacin ha sido satisfactoria, pulse Siguiente.

10

Introduzca la informacin de registro, desmarque la opcin Ocultar opciones avanzadas de configuracin, y pulse Siguiente.

11

Seleccione los componentes que desea instalar; en ste caso, seleccione instalar todos los componentes y pulse Siguiente.

12

Seleccione el nombre de la instancia de SQL Server 2005 Express (por defecto SQLExpress), y pulse Siguiente.

13

Seleccione el nombre de la cuenta que arrancar el servidor de SQL Server 2005 Express (Network Service por defecto), y habilite que el servicio de SQL Server se arranque al finalizar la instalacin; a continuacin pulse Siguiente.

14

Seleccione el modo de autenticacin (por defecto autenticacin integrada de Windows), y pulse Siguiente.

15

Seleccione el collation de la instancia de SQL Server. Como es una instalacin nueva, y no se va a trabajar con bases de datos de versiones anteriores de SQL Server, se seleccionar Latin1_General, en caso de migraciones o posibilidad de trabajar con bases de datos importadas de SQL Server 2000 (o MSDE 2000), considere la opcin por defecto (SQL Collations, Dictionary-order, case insensitive, for use with 1252 Character Set); a continuacin pulse Siguiente.

16

Seleccionar la opcin de configuracin de la instancia de SQL Server sobre la posibilidad de permitir a usuarios no-administradores de crear instancias. Por defecto habilitado; durante las siguientes lecciones se hablar de ello, habiltelo y pulse Siguiente.

17

Opciones para informar a Microsoft sobre los errores no esperados sucedidos en la aplicacin, y para enviar automticamente informacin sobre las caractersticas usadas del producto; por defecto estn deshabilitadas, pero se recomienda habilitarla para mejorar el producto enviando automticamente informacin del uso que se hace del producto; a continuacin se pulsa en Siguiente.

18

Comienza el proceso de instalacin informando de las caractersticas que se van instalando.

19

Finalizacin del proceso de instalacin con estado de casa funcionalidad instalada; en caso de haber algn error durante la instalacin, aparecern botones en color Rojo indicando el error; pulsando en la casilla correspondiente de la columna Status, podr ver informacin del error producido; pulse Siguiente.

20

Informe final de la instalacin de SQL Server en el que se podr ver todas las caractersticas instaladas, y un fichero de resumen con cada paso realizado durante la instalacin. Pulse Finalizar, y ya est preparado para poder utilizar SQL Server 2005 Express.

21

1.1.3.

Componentes instalados

Para acceder a los componentes instalados en SQL Server 2005 Express, deber hacer click en Inicio, Todos los Programas, Microsoft SQL Server 2005, Herramientas de configuracin como ve en la siguiente imagen:

22

Las opciones disponibles son las siguientes: 1.1.3.1. Administrador de configuracin

Componente basado en Microsoft Management Console (MMC), con el que se puede administrar la configuracin de los servicios SQL Server, protocolos de red utilizados, y configurar el cliente nativo de acceso a SQL Server. Es una herramienta que realiza todas las modificaciones haciendo uso de las nuevas APIs de administracin SMO (sustituto de SQL-DMO). El hecho de usar tales APIs nos da la posibilidad de poder crear aplicaciones personalizadas para configurar el servidor; por ejemplo, se podra crear una aplicacin basada en SMO que implemente o extienda las funcionalidades expuestas a travs de la aplicacin MMC. La aplicacin tiene la siguiente apariencia:

23

Al igual que desde el administrador de servicios del sistema operativo, se pueden cambiar las propiedades del servicio; la gran diferencia, es que mientras las llamadas de la aplicacin MMC de los servicios realiza llamadas a las APIs del Kernel de Windows, el Administrador de Configuracin, realiza las llamadas a travs de las APIs de SMO.

24

Se pueden configurar, habilitar o deshabilitar protocolos; configurar, o modificar puertos TCP/IP como se ve en la imagen:

25

As como establecer el orden de los protocolos de Red; en el siguiente ejemplo, estn habilitados los protocolos Shared Memory, TCP/IP, y Named Pipes, mientras que el protocolo VIA est deshabilitado:

Nota: Recuerde que la mayora de estos cambios no tendrn efecto hasta que el servicio de SQL Server haya sido reiniciado.

26

1.1.3.2.

Informes de uso y errores de SQL Server

La utilidad permite modificar las opciones de configuracin relativas al feedback que se enva a Microsoft en cuanto al uso de las caractersticas del producto, e informe de errores no esperados. El nivel de detalle llega hasta el nivel de instancia, es decir, podemos decidir qu instancias envan informacin sobre los errores no esperados, o sobre el uso de las funcionalidades del producto:

27

1.1.3.3.

Configuracin de superficie de SQL Server

El aplicativo configuracin de superficie de SQL Server es un asistente que ayuda a configurar cuales son las partes de SQL Server que se encuentran expuestas a interactuacin desde el exterior. La filosofa del aplicativo es ayudar a configurar de manera sencilla y rpida los puntos de acceso al servidor. El aplicativo expone al usuario funcionalidades tales como configuracin de servicios, y configuracin de caractersticas de SQL Server; por ejemplo, CLR habilitado o no, soporte HTTP habilitado o no, endpoints configurados en el servidor, etc.

28

El aplicativo permite modificar la configuracin del servicio de SQL Server.

29

Tambin permite configurar el tipo de conexiones permitida sobre el servidor. Por ejemplo, SQL Server 2005 Express permite por defecto slo conexiones locales; esto quiere decir que no se pueden realizar conexiones desde equipos externos a menos que se configure de servidor para permitirlo. Desde la aplicacin, se podr habilitar la posibilidad de conexiones de equipos remotos, y los protocolos de conexin permitidos.

En cuanto a las opciones de configuracin de funcionalidades del motor de base de datos, se incluyen: Posibilidad de habilitar o deshabilitar la ejecucin de consultas con OPENROWSET y OPENDATASOURCE: lo que estas funciones permiten es realizar consultas a servidores remotos (servidores expuestos a travs de un origen de datos del que se provea drivers de acceso como ODBC, OLEDB, etc.) sin la necesidad de tener que crear un servidor vinculado. Habilitar el soporte del CLR: creacin de objetos de base de datos con cualquier lenguaje .NET Framework. Habilitar el soporte nativo de Servicios Web: opcin slo disponible en la versin Enterprise de SQL Server 2005 que permite exponer SQL Server 2005 sin necesidad de implementar Servicios Web expuestos por IIS. Habilitar el uso de Automatizacin OLE con sentencias T-SQL: posibilidad de realizar llamadas a objetos COM desde Transact-SQL con los procedimientos almacenados de 30

sistema sp_OACreate, sp_OAGetProperty, sp_OASetProperty, sp_OAMethod, sp_OAStop, y sp_OADestroy. Automatizacin OLE entrar en desuso debido a la integracin del CLR y su consiguiente facilidad para implementarlo mediante .NET Framework en lugar de objetos COM. Habilitar el uso del procedimiento almacenado de sistema xp_cmdshell que permite ejecutar comandos de sistema en el servidor (tales como DIR, DELETE, COPY, etc.) Habilitar el uso de endpoints de Service Broker.

1.1.3.4.

SQLCMD

SQL Server 2005 Express no incluye la herramienta SQL Server Management Studio como el resto de versiones de SQL Server 2005. Para poder conectarse a SQL Server, el producto incluye una utilidad de lnea de comando que permite conectarse a una instancia de SQL Server y realizar operaciones de manera similar a las herramientas grficas. Evidentemente, la funcionalidad que nos proveen Management Studio no puede ser alcanzada con la utilidad de lnea de comando, pero si provee lo necesario para conectarse e interactuar con la instancia. Tpicamente esta utilidad suele ser utilizada para realizar tareas administrativas bsicas. Por ejemplo, un ISV que desarrolla una aplicacin y necesita ejecutar un script contra la instancia de SQL Server; imagnese que el ISV no ha desarrollado sus propias herramientas para ejecutar consultas ad-hoc contra el servidor; en este caso, puede utilizar SQLCMD para conectarse a la instancia de SQL Server y ejecutar el script deseado. Incluso, el ISV tiene la posibilidad de crear el script con SQL Server 31

Management Studio en sus equipos de desarrollo porque Management Studio incorpora la posibilidad de ejecutar scripts en modo SQLCMD. La documentacin del SQLCMD la puede encontrar en los Libros en Pantalla en "SQL Server 2005 Express Edition", "Working with SQL Server Express", "Using the sqlcmd Utility (SQL Server Express)". La funcionalidad ms novedosa implementada en SQLCMD es la posibilidad de utilizar variables a la hora de ejecutar scripts; por ejemplo: Dado el siguiente script llamado copia.sql: BACKUP DATABASE $(db) TO DISK = "$(path)\$(db).bak" WITH INIT donde $(db) es una variable que referenciar a un nombre de base de datos, y $(path) la ruta donde se guardar la copia. Si se ejecuta desde lnea de comando SQLCMD -ic:\copia.sql -vdb="AdventureWorks" path="c:\data" lo que SQLCMD ejecutar ser: BACKUP DATABASE AdventureWorks TO DISK = "c:\data\AdventureWorks.bak" WITH INIT lo cual quera decir que con un script de copia de seguridad, se podran reutilizar con bastante facilidad distintas estrategias de copia de seguridad. Esto est muy bien, pero se limita la capacidad a la instancia en uso. Sin embargo, SQLCMD tambin permite cambiar de conexin tras haber conectado a un servidor con la palabra clave :connect; por ejemplo: desde lnea de comando, se conecta a una instancia de la siguiente manera: SQLCMD -E -S(local)\SQLEXPRESS A continuacin aparece el prompt, y puede ejecutar lo siguiente: :connect (local)\SQLEXPRESS_2 que conectara a una segunda instancia de SQL Server 2005. Otras opciones disponibles son :r para ejecutar un script, y :setvar para definir variables, por lo que el ejemplo anterior del backup se podra ejecutar de la siguiente forma: SQLCMD -E -S(local)\SQLEXPRESS :setvar db AdventureWorks :setvar path c:\data :r c:\copia.sql GO

1.1.4.

Componentes opcionales

Las bases de datos de ejemplo y el cdigo de ejemplo son un buen comienzo para conocer las nuevas funcionalidades del producto. La base de datos AdventureWorks se ha creado para sustituir a las anteriores Northwind, y Pubs que pecaban de ser bases de datos poco reales en cuanto a volumen de datos. Se ha tenido ms cuidado en el diseo relacional de la base de datos AdventureWorks, y se ha aprovechado para incluir nuevas funcionalidades como soporte XML, novedades Transact-SQL, nuevos tipos de datos, etc. La otra fuente de conocimiento a mencionar son los Libros en Pantalla (BOL): la versin incluida en SQL Server 2005 Express es una versin "reducida" de la versin completa, pero en todo momento, da acceso a la Web de Microsoft para acceder a documentacin y ayuda incluida en la versin completa de los Libros en Pantalla. A su vez, los Libros en Pantalla, incluyen la posibilidad de acceder directamente a los grupos de noticias para obtener 32

respuesta a casos concretos, y tambin realizar bsquedas en sitios de la comunidad como CodeZone, ElGuille.info, GotDotNet.com, SSUG.com, SQLIS.com, etc.

1.2.

Integracin con versiones Express

En esta leccin, conocer cmo se integran la versin Express de SQL Server con Visual Studio, y cmo ayuda la versin Express de SQL Server en el proceso de despliegue de aplicaciones de bases de datos. Se le introducir a nuevos conceptos como instancias de nombre para noadministradores, y se le ensear a desplegar aplicaciones de bases de datos con la versin Express de SQL Server 2005. Uno de los objetivos de la versin Express de SQL Server 2005, es simplificar el proceso de despliegue de aplicaciones de bases de datos; a diferencia del resto de versiones de SQL Server (Workgroup, Standard, Enterprise) en el que las bases de datos se cambian de lugar poco o casi nunca, la versin Express est pensada para aplicaciones de bases de datos que requieren en cierto modo que los ficheros de base de datos sean dinmicos. Esta movilidad de los ficheros se consigue durante la fase de despliegue. En qu ayuda al despliegue la versin Express? Los Vendedores de Software Independientes (ISVs) generalmente desarrollan aplicaciones comerciales que requieren de un instalable, y a su vez requieren instalar una base de datos; La versin Express viene a solucionar los problemas que surgan en el proceso de instalacin en este tipo de aplicaciones.

1.2.1.

Compatibilidad con versiones "mayores" de SQL Server

La versin Express de SQL Server se pone en la lnea de las versiones MSDE de anteriores versiones de SQL Server; esto quiere decir que una base de datos de SQL Server 2005 para la versin Express, es totalmente compatible con el resto de versiones de SQL Server (Workgroup, Standard, Enterprise). El proceso de migracin entre versiones es tan sencillo como hacer una restauracin de la copia de seguridad de la base de datos (comando RESTORE, o usando las herramientas grficas), o usando la opcin de adjuntar bases de datos (comando sp_attach_db, o con las herramientas grficas).

1.2.2.

Instancias de nombre para usuarios no-administradores

Uno de los problemas que tienen los ISVs que distribuyen aplicaciones con MSDE es que el usuario que realiza la instalacin de la aplicacin debe pertenecer al rol de administradores de SQL Server. Este es un requisito que en la versin Express de SQL Server 2005 se elimina con la aparicin de las instancias de usuario. El objetivo de las instancias de usuario, es acercar a SQL Server al concepto de base de datos de escritorio; es una base de datos que slo admite conexiones locales a travs del protocolo de red "named pipes", no se pueden realizar conexiones a travs de la red. El concepto de las instancias de usuario es similar al modelo de las bases de datos Access: una vez conectado al fichero de base de datos, el usuario tiene derechos administrativos sobre la base de datos, sin necesidad de la intervencin de un usuario administrador. 1.2.2.1. Cmo funciona?

En primer lugar, para habilitar el uso de instancias de usuario, en la cadena de conexin de la aplicacin cliente debers aadir la cadena "User Instance=true". De esta forma se indica a SQL Server Express, que la conexin se realizar sobre una instancia de usuario. En caso de que no existiera la instancia de usuario, SQL Server automticamente, crear la instancia de usuario; consiste en crear una nueva instancia de SQL Server para el usuario requerido, en el que: Se copiarn las bases de datos de sistema de la instancia por defecto de SQL Server 2005 Express, y 33

Se iniciar otra "copia" del servicio de SQL Server Express; el nombre de la instancia es un valor aleatorio, por ejemplo (2E67C75A-1693-4D), y se debe considerar a la nueva instancia hija de la instancia principal de SQL Server Express.

Nota: Conectndose a la instancia \SQLEXPRESS, con la vista sys.dm_os_child_instances se pueden consultar cuales son las instancias de usuario activas. La diferencia fundamental con las instancias tradicionales es que a la instancia de usuario solamente puede conectar el usuario para el que se ha creado la instancia. Adems, por diseo, slo se puede conectar mediante canalizacin por nombres, y no se puede conectar a la instancia de forma remota. Despus de crear o iniciar la instancia de SQL Server Express, automticamente, el proceso de conexin se encargar de adjuntar la base de datos que se ha especificado en la cadena de conexin a la instancia recin creada. A su vez, cuando la aplicacin cliente cierra conexin con la base de datos, la base de datos se "desadjunta" de la instancia de SQL Server. En realidad, SQL Server tiene configurado un tiempo de espera antes de desadjuntar la base de datos de la instancia porque en caso contrario, el proceso de adjuntar/ desadjuntar podra causar problemas de rendimiento en la aplicacin. Un ejemplo de cadena de conexin que deber usarse para trabajar con instancias de usuario podra ser el siguiente: conn string = "Data Source=.\\SQLExpress;" + "Integrated Security=true;" + "attachdbfilename=|DataDirectory|\\mi_bd.mdf;" + "User Instance=true;" En .NET 2.0, aparece la palabra clave |DataDirectory|, que representa un path relativo a la instalacin de la aplicacin; por ejemplo, distribuimos una aplicacin que admite personalizar la ruta de instalacin, con |DataDirectory| podemos especificar rutas relativas. A su vez, tambin se puede especificar el valor de DataDirectory de la siguiente manera: AppDomain.CurrentDomain.setData(DataDirectory,C:\ruta_por_defecto\);

1.2.3.

Consideraciones

Como la instancia de usuario es hija de la instancia SQLEXPRESS, si la instancia SQLEXPRESS no est arrancada, la instancia de usuario no arrancar. Un usuario slo puede tener una instancia de usuario. Las bases de datos de la instancia de usuario se crean en la ruta: \Documents and Settings\nombre_usuario\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS La rplica se deshabilita. La instancia de usuario no admite Autenticacin de SQL Server. Slo se admite la Autenticacin de Windows. La compatibilidad de protocolo de red con las instancias de usuario slo es posible mediante canalizaciones con nombre locales. La instancia de usuario comparte las entradas de registro de la instancia primaria. No se admiten instancias de usuario con cdigo nativo. Esta caracterstica slo se admite con ADO .NET.

34

1.2.4.

Despliegue de la aplicacin

El objetivo principal de las instancias de usuario, es disponer de un fichero de base de datos, que se utiliza en una instancia cuando el usuario necesita acceder a la base de datos. Cuando no se est usando, la base de datos se desadjunta. Qu se consigue con esto? Acercar la base de datos al concepto de base de datos de escritorio (como si fuera Access). De esta forma, el despliegue de la aplicacin relacionada con la base de datos consistir en: Copiar los binarios de la aplicacin. Copiar el fichero de base de datos.

Nota. Fjate que slo hay que copiar el fichero de base de datos; no se necesita adjuntar la base de datos a ninguna instancia de SQL Server, porque la propia aplicacin se encarga de hacerlo por nosotros. Por lo tanto, para desplegar la aplicacin deberemos incluir en la distribucin la copia de la base de datos de la aplicacin. Para ello lo podremos hacer de dos formas: Usar el concepto de XCOPY copiando el contenido del directorio \bin\release de la aplicacin generada en el directorio destino. Usar la nueva tecnologa ClickOnce, cuyo objetivo es facilitar el despliegue de la aplicacin, y a su vez, gestionar las actualizaciones; en el proceso de instalacin, adems de la realizar la propia instalacin, se podr configurar la aplicacin para actualizar automticamente la aplicacin cuando existan nuevas versiones.

1.3.

Acceso a datos

Sin lugar a dudas uno de los mbitos ms importantes de un lenguaje o entorno de programacin es su capacidad de acceso a datos. Prcticamente todas las aplicaciones conllevan la realizacin de accesos a datos. Le gustar saber que la plataforma .NET, y por lo tanto ASP.NET, ofrecen un potente modelo de acceso a fuentes de datos. Se le conoce con el nombre genrico de ADO.NET. Nota: No se deje engaar por el nombre: ADO.NET no tiene casi nada que ver con el anterior ADO utilizado en los tiempos de ActiveX y COM. S, dispone de conexiones, comandos e incluso una clase que recuerda a los Recordset, pero crame cuando le digo que es mejor que se olvide para siempre de todos ellos. Tanto la filosofa de trabajo como la tecnologa son diferentes por completo y es mejor que utilice una estrategia de "ojos limpios" para acercarse correctamente a la nueva tecnologa. Los conocimientos adquiridos en este mdulo le servirn para cualquier tipo de desarrollo con .NET, no slo para aplicaciones Web. Los conceptos explicados son vlidos tambin para cualquier versin de .NET no slo para la 2.0.

1.3.1.

Introduccin a ADO.NET

Como cualquier otro modelo de acceso a datos, ADO.NET es un conjunto de clases relacionadas entre s que estn especializadas en ofrecer toda la funcionalidad que un programador necesita para realizar acceso a datos y manejarlos una vez los ha obtenido. Las clases genricas expuestas por ADO.NET se encuentran bajo el espacio de nombres System.Data. Este espacio de nombres define clases genricas de acceso a datos que posteriormente son extendidas para ofrecer caractersticas y funciones especficas de cada proveedor. El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de datos

35

relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets su funcionalidad va mucho ms all como se ver en breve. 1.3.1.1. Arquitectura de ADO.NET

El concepto ms importante que hay que tener claro sobre ADO.NET es su modo de funcionar, que se revela claramente al analizar su arquitectura:

Figura 4.1.- Arquitectura de ADO.NET Existen dos capas fundamentales dentro de su arquitectura: la capa conectada y la desconectada 1.3.1.2. La capa conectada

La capa conectada de ADO.NET contiene objetos especializados en la conexin con los orgenes de datos. As, la clase genrica Connection se utiliza para establecer conexiones a los orgenes de datos. La clase Command se encarga de enviar comandos de toda ndole al origen de datos. Por fin la clase DataReader est especializada en leer los resultados de los comandos. La clase DataAdapter hace uso de las tres anteriores para actuar de puente entre la capa conectada y la desconectada como veremos despus. Estas clases son abstractas, es decir, no tienen una implementacin real de la que se pueda hacer uso directamente. Es en este punto en donde entran en juego los proveedores de datos. Cada origen de datos tiene un modo especial de comunicarse con los programas que los utilizan, adems de otras particularidades que se deben contemplar. Un proveedor de datos de ADO.NET es una implementacin concreta de las clases conectadas abstractas que hemos visto, que hereda de stas y que tiene en cuenta ya todas las particularidades del origen de datos en cuestin. As, por ejemplo, las clases especficas para acceder a SQL Server se llaman SqlConnection, SqlCommand, SqlDataReader y SqlDataAdapter y se encuentran bajo el espacio de nombres System.Data.SqlClient. Es decir, al contrario que en ADO clsico no hay una nica clase Connection o Command que se use en cada caso, si no que existen 36

clases especializadas para conectarse y recuperar informacin de cada tipo de origen de datos. Nota: El hecho de utilizar clases concretas para acceso a las fuentes de datos no significa que no sea posible escribir cdigo independiente del origen de datos. Todo lo contrario. La plataforma .NET ofrece facilidades de escritura de cdigo genrico basadas en el uso de herencia e implementacin de interfaces. De hecho la versin 2.0 de .NET ofrece grandes novedades especficamente en este mbito. Existen proveedores nativos, que son los que se comunican directamente con el origen de datos (por ejemplo el de SQL Server o el de Oracle), y proveedores "puente", que se utilizan para acceder a travs de ODBC u OLEDB cuando no existe un proveedor nativo para un determinado origen de datos. Nota: Estos proveedores puente, si bien muy tiles en determinadas circunstancias, ofrecen un rendimiento menor debido a la capa intermedia que estn utilizando (ODBC u OLEDB). Un programador novel puede sentir la tentacin de utilizar siempre el proveedor puente para OLEDB y as escribir cdigo compatible con diversos gestores de datos de forma muy sencilla. Se trata de un error y siempre que sea posible es mejor utilizar un proveedor nativo. La plataforma .NET proporciona "de serie" los siguientes proveedores de acceso a datos. Proveedor ODBC .NET Data Provider Espacio de nombres Descripcin Permite conectar nuestras aplicaciones a fuentes de datos a travs de ODBC. Realiza la conexin utilizando un proveedor OLEDB, al igual que el ADO clsico. Proveedor de datos para acceder a Oracle. Permite la conexin optimizada a SQL Server 7.0 o posterior, incluyenbdo la ltima versin SQL Server 2005.

System.Data.Odbc

OLE DB .NET Data Provider Oracle Client .NET Data Provider

System.Data.OleDb

System.Data.OracleClient

SQL Server .NET Data Provider

System.Data.SqlClient

Los proveedores de acceso a datos que distribuye Microsoft en ADO.NET y algunos desarrollados por otras empresas o terceros, contienen los mismos objetos, aunque los nombres de stos, sus propiedades y mtodos, pueden ser diferentes. Existen, por supuesto, proveedores para tipos de orgenes de datos de cualquier gestor de datos existente en el mercado. stos los desarrolla normalmente la empresa responsable del producto. Si bien stos optimizan el acceso a estos orgenes de datos nosotros siempre podremos realizarlo mediante ODBC u OLEDB si tenemos necesidad. En resumen: con la capa conectada de ADO.NET realizamos la conexin y comunicacin con los orgenes de datos. Cada proveedor de datos implementa su propia versin de las clases Connection, Command, DataReader y DataAdapter (entre otras). Las clases derivadas de Connection se utilizan para realizar la conexin y enviar y recibir informacin. Las clases derivadas de Command permiten ejecutar sentencias SQL y procedimientos almacenados en el gestor de datos. 37

Las clases derivadas de DataReader se emplean para obtener los posibles resultados de un comando utilizando para ello el conducto de comunicacin establecido por Connection. La capa desconectada

1.3.1.3.

Una vez que ya se han recuperado los datos desde un origen de datos la conexin a ste ya no es necesaria. Sin embargo sigue siendo necesario trabajar con los datos obtenidos de una manera flexible. Es aqu cuando la capa de datos desconectada entra en juego. Adems, en muchas ocasiones es necesario tratar con datos que no han sido obtenidos desde un origen de datos relacional con el que se requiera una conexin. A veces nicamente necesitamos un almacn de datos temporal pero que ofrezca caractersticas avanzadas de gestin y acceso a la informacin. Por otra parte las conexiones con las bases de datos son uno de los recursos ms escasos con los que contamos al desarrollar. Su mala utilizacin es la causa ms frecuente de cuellos de botella en las aplicaciones y de que stas no escalen como es debido. Esta afirmacin es especialmente importante en las aplicaciones Web en las que se pueden recibir muchas solicitudes simultneas de cualquier parte del mundo. Finalmente otro motivo por el que es importante el uso de los datos desconectado de su origen es la transferencia de informacin entre capas de una aplicacin. stas pueden encontrarse distribuidas por diferentes equipos, e incluso en diferentes lugares del mundo gracias a Internet. Por ello es necesario disponer de algn modo genrico y eficiente de poder transportar los datos entre diferentes lugares, utilizarlos en cualquiera de ellos y posteriormente tener la capacidad de conciliar los cambios realizados sobre ellos con el origen de datos del que proceden. Todo esto y mucho ms es lo que nos otorga el uso de los objetos DataSet, ncleo central de la capa desconectada de ADO.NET. Nota: Otra interesante caracterstica de los DataSet es que permiten gestionar simultneamente diversas tablas (relaciones) de datos, cada una de un origen diferente si es necesario, teniendo en cuenta las restricciones y las relaciones existentes entre ellas. Los DataSet, como cualquier otra clase no sellada de .NET, se pueden extender mediante herencia. Ello facilita una tcnica avanzada que consiste en crear tipos nuevos de DataSet especializados en la gestin de una informacin concreta (por ejemplo un conjunto de tablas relacionadas). Estas nuevas tipos clases se denominan genricamente DataSet Tipados, y permiten el acceso mucho ms cmodo a los datos que representan, verificando reglas de negocio, y validaciones de tipos de datos ms estrictas. Los objetos DataSet no dependen de proveedor de datos alguno y su funcionamiento es independiente de cmo hayan sido obtenidos los datos que contienen. Este es el concepto ms importante que debemos recordar. El proceso general de trabajo de ADO.NET para acceder a un gestor de datos (SQL Server, por ejemplo) es casi siempre el mismo: se abre una conexin (clase Connection), se lanza una consulta SQL o procedimiento almacenado mediante un objeto de la clase Command, y se almacenan en memoria los resultados dentro de un objeto DataSet, cerrando la conexin. Nota: Aunque este es el comportamiento habitual de una aplicacin de datos existen casos en los que no es recomendable almacenar en memoria (en un DataSet) todos los resultados de una consulta, bien por ser muchos registros o por contener datos muy grandes. En este tipo de casos se puede usar u objeto DataReader directamente para leer la informacin, tratarla y no almacenarla en lugar alguno. De todos modos lo ms frecuente es realizar el proceso descrito.

38

1.3.1.3.1.

Unin entre capa conectada y desconectada

La clase DataAdapter se ha incluido anteriormente en la capa conectada por que est implementada por cada proveedor de un modo diferente. En realidad es una clase que pone sus pies en ambos mundos (conectado y sin conexin) y sirve de nexo entre ellos. Un DataAdapter sabe como manejar correctamente los objetos proporcionados por su proveedor especfico (fundamentalmente los vistos: Connection, Command y DataReader) y proporciona mtodos para trasegar informacin desde el servidor a DataSets desconectados y viceversa haciendo uso de dichos objetos especficos del proveedor. As, por ejemplo, el mtodo Fill de un DataSet se utiliza para introducir los resultados de una consulta dentro de un DataSet para luego trabajar con ellos sin preocuparnos de su origen. Del mismo modo su mtodo Update se utiliza para conciliar automticamente con el origen de datos los datos modificados en un DataSet mientras no haba conexin. 1.3.1.3.2. Otras clases dependientes de DataSet

Como hemos dicho antes un DataSet podra asimilarse a un pequeo gestor de datos en memoria. Como tal un DataSet permite mantener diversas tablas as como las relaciones entre ellas, incluso forzando que se cumplan restricciones de creacin y actualizacin, como en una base de datos "real". Para ello se apoya en el uso de otras clases especializadas que son las siguientes: DataTable: representa una tabla o relacin de datos. Se puede asimilar a una tabla de un gestor de datos. Los datos obtenidos de una consulta de tipo SELECT de SQL se almacenan en un objeto de esta clase. DataColumn: ofrece informacin sobre cada uno de los campos de los registros almacenados en un DataTable, como su nombre o su tipo. DataRow: representa un registro de la tabla virtual definida por el DataTable. Contiene tantos elementos como campos tiene la tabla, cada uno del tipo definido por el objeto DataColumn correspondiente. Constraint: las clases Constraint se emplean para definir restricciones en los tipos de datos contenidos en un DataTable. Por ejemplo se puede usar un objeto de esta clase para indicar que un determinado campo debe ser nico o que se trata de una clave externa que debe ser tenida en cuenta en actualizaciones o borrados en cascada. DataRelations: define la relacin existente entre dos objetos DataTable. Normalmente se suelen utilizar un identificador comn a ambas tablas aunque pueden ser combinaciones de ms de uno de ellos. De este modo se sabe cmo obtener informacin de una tabla a partir de informacin en otra. Por ejemplo el identificador de una factura (su nmero, por ejemplo) puede servir para relacionar su registro con los registros de detalle de factura que estn contenidos en otra tabla. DataView: representa una vista concreta de un DataTable. Normalmente se trata de ordenaciones o filtros sobre los datos originales. Todas las tablas disponen de una vista por defecto (propiedad DefaultView) que ofrece los datos tal y como se han introducido en sta y es la vista que se usa habitualmente. Vinculacin de datos a controles Web

1.3.1.4.

Otra caracterstica fundamental de ASP.NET que lo convierte en una herramienta ventajosa para el desarrollo de aplicaciones Web es la capacidad de vincular datos a controles Web.

39

La mayor parte de los controles que podemos arrastrar sobre una pgina ASPX se pueden vincular a los objetos DataSet, DataTable y DataReader o a informaciones concretas contenidas en stos. Ello facilita mucho el trabajo con datos desde la interfaz de usuario ya que no hay que molestarse en generar tablas con ellos, escribir JavaScript o proporcionar complejos medios propios para permitir su edicin o navegacin si hacemos un uso adecuado de la vinculacin y los controles disponibles. Todo ello, gracias a ASP.NET y Visual Studio, equipara en muchos aspectos el desarrollo Web al clsico desarrollo de aplicaciones de escritorio donde este tipo de facilidades han estado disponibles desde hace aos. Sin embargo en una aplicacin Web donde no existe una conexin permanente disponible entre la visualizacin (navegador) y el lugar en el que se ejecuta el cdigo no es algo fcil de conseguir. El uso de un modelo consistente como ADO.NET (idntico en Web, escritorio y otros entornos) junto con las capacidades nativas de ASP.NET para abstraernos de estas dificultades (ViewState, Postback...) consiguen el "milagro". En este mdulo veremos tambin lo sencillo que resulta crear interfaces para explotar los datos desde una pgina Web.

1.3.2.

Acceso a datos manual

Tras haber aprendido un poco de teora sobre ADO.NET a continuacin explicaremos cmo se utilizan las clases de acceso datos para escribir cdigo de acceso a datos de manera manual. Si bien es un tema algo rido y adems en un gran porcentaje de los casos utilizaremos herramientas que nos faciliten la creacin automtica de cdigo, es fundamental conocer la forma de trabajar sin ayuda para entender el funcionamiento real de los objetos de datos. 1.3.2.1. Escritura manual de cdigo

En este apartado vamos a analizar cmo es el cdigo necesario para recuperar y actualizar datos con ADO.NET. Posteriormente veremos como sacar partido a las facilidades del entorno de desarrollo Visual Studio 2005 para no tener que escribir el cdigo a mano. Sin embargo es til aprender a hacerlo de esta manera para entender bien su funcionamiento. 1.3.2.1.1. Comandos de seleccin simples

La mayor parte de las consultas que se lanzan contra una base de datos suelen utilizarse para obtener un conjunto de registros para tratar. Este tipo de consultas suelen ser expresiones SQL de tipo SELECT. El siguiente fragmento de cdigo muestra los pasos necesarios para mostrar en una pgina los registros resultantes de una consulta:

40

No se trata de un cdigo optimizado (es ms bien burdo) pero nos ayudar a entender perfectamente el proceso. Los datos los obtendremos de la conocida base de datos de ejemplo Northwind (que viene con todas las versiones de SQL Server). Nota: Para poder escribir cdigo de acceso a datos en nuestro mdulo debemos agregar referencias a los espacios de nombres que contienen las clases que vamos a utilizar. Para ello usamos las dos sentencias Imports siguientes:

La primera de ellas agrega las clases genricas de acceso a datos (como DataSet) y la siguiente las especficas de SQL Server. Si no lo hacemos recibiremos un error. Lo primero que se debe hacer es instanciar un objeto que represente la conexin a la base de datos. Dado que nos estamos conectando a SQL Server esta conexin ser del tipo SqlConnection. Es lo que se hace en la primera lnea del cdigo anterior. La conexin debe realizarse con un servidor de datos y un esquema de datos concreto. Esto se indica mediante la cadena de conexin (al igual que se haca en ADO tradicional). En este caso la cadena de conexin es la tpica de SQL Server. Cada gestor de datos tiene la suya y hay que construirla de manera adecuada. El entorno de desarrollo Visual Studio 2005 nos ayuda a crearlas como veremos luego. Una vez creado el objeto con el que nos conectaremos hay que definir el comando a lanzar a la base de datos. Para ello se utiliza un objeto SqlCommand. Las propiedades bsicas que hay que establecer para ste son la consulta que se lanzar (propiedad CommandText) y la conexin que se emplear para lanzarla (propiedad Connection) que es lo que se refleja en las lneas 6 y 7. Ahora que ya sabemos cmo nos conectaremos y qu queremos obtener debemos lanzar la consulta y recoger el resultado de alguna manera. La clase Command dispone de diversos mtodos para ejecutar consultas: ExecuteReader: este mtodo lanza la consulta a la base de datos y devuelve una referencia a una instancia de la clase DataReader (SqlDataReader en el caso de SQL Server). Podemos utilizar el DataReader para recorrer los datos y procesarlos. 41

ExecuteNonQuery: ejecuta la consulta sin devolver resultado alguno. Simplemente enva la consulta al servidor y devuelve el nmero de registros afectados por sta. til para realizar consultas de insercin (INSERT), actualizacin (UPDATE) y borrado (DELETE). ExecuteScalar: lanza la consulta y devuelve un objeto con el valor del primer campo del primer registro que se obtenga de dicha consulta. Es til para lanzar consultas de agregacin como sumas (SUM), cuentas (SELECT COUNT * ....) y similares de las que slo necesitamos un valor como resultado.

En el ejemplo hemos utilizado el primer mtodo ya que requerimos que devuelva varios registros con diferentes campos. Entonces lo que hacemos es (lneas a partir de la 9): 1. Abrir la conexin. 2. Crear una variable para contener una referencia a un objeto de la clase DataReader que es el que nos permitir acceder a los resultados. Fjese en que no se puede instanciar un DataReader (la declaracin no lleva la palabra clave New). 3. Se obtiene el resultado mediante el mtodo ExecuteReader, recogindolo en la variable (dr) recin declarada. 4. Se procesan los resultados (lneas 14-18). 5. Se cierra la conexin. El objeto DataReader es asimilable a un cursor de servidor de slo lectura y hacia adelante (conocidos como de manguera de bombero o firehose). Es decir, los datos devueltos por el DataReader slo se pueden leer y no actualizar. Adems de esto slo se pueden leer en secuencia hacia adelante (no hay forma de regresar sobre lo andado). La propiedad HasRows nos indica si hay o no resultados devueltos. El mtodo Read avanza una posicin en los registros devolviendo True si quedan registros pendientes de leer. Con esta informacin es muy fcil entender las lneas 14 a 18. 1.3.2.1.2. La clusula Using

Qu ocurre si se produce un error durante el procesamiento del bucle anterior en el que se trata el DataReader? La respuesta es que la conexin, que debemos tener abierta durante el procesamiento, no se cerrar pues el cdigo no llega al final. Esto es algo muy grave ya que las conexiones que no se cierran no se pueden reutilizar y por lo tanto puede llegar un momento en que no tengamos conexiones disponibles, lo que limita enormemente la escalabilidad del sistema. Podemos evitar el problema escribiendo:

42

De este modo, con la clusula Finally nos aseguramos que siempre se va a cerrar la conexin. De todos modos escribir este cdigo es algo tedioso sobre todo si queremos que la excepcin se replique y slo metemos la clusula Finally por el hecho de cerrar la conexin. Para facilitar el trabajo VB.NET en .NET 2.0 incluye una clusula especial denominada Using que habilita la destruccin automtica de los objetos a los que se hace referencia. As el cdigo anterior quedara simplemente:

Al terminar la clusula Using (aunque haya un error por medio) se llama de manera automtica al mtodo Dispose del objeto utilizado (en este caso una conexin). Entre otras cosas este mtodo se encarga de cerrar el objeto si estaba abierto, por lo que no nos tendremos que preocupar de este aspecto. 1.3.2.1.3. Grupos de registros

Aunque los DataReader se asemejan al funcionamiento de un cursor firehose, en realidad difieren bastante de stos. Imaginemos que conectamos con la base de datos en el ejemplo anterior y, mientras estamos procesando el bucle de los registros, se interrumpe la conexin a la base de datos por el motivo que sea. En principio en el caso de un cursor firehose tradicional obtendramos un error porque se ha roto la conexin con el servidor. En el caso de un DataReader es posible que sigamos ejecutando varias vueltas ms del bucle sin problemas. Esto se debe a que, en

43

realidad, el DataReader obtiene los registros en grupos a travs de la conexin y va solicitando nuevos grupos a medida que los necesita. Es algo que hay que tener en cuenta a la hora de utilizarlos. 1.3.2.1.4. Ventajas e inconvenientes

El cdigo anterior, aunque sencillo, es un poco lioso y el uso de los DataReader est algo limitado dada su idiosincrasia (de slo lectura y hacia adelante). Este cdigo es adecuado si no necesitamos almacenar los resultados de la consulta en memoria ni regresar sobre ellos una vez procesados una primera vez. Tambin es muy til para obtener resultados con miles o millones de registros que queremos tratar secuencialmente pero no almacenar en memoria. Sin embargo para un uso cotidiano se trata de un cdigo muy poco til y complicado de utilizar salvo para cosas muy sencillas. Adems slo hemos utilizado clases de la capa conectada de ADO.NET. Todava debemos aprender a obtener los resultados dentro de un DataSet para su explotacin de manera cmoda. Hay que tender un puente entre ambos mundos (conectado y desconectado): el DataAdapter. 1.3.2.2. DataAdapter: puente entre mundos

Si lo que deseamos es poder almacena temporalmente en memoria los datos obtenidos de una consulta debemos recurrir al uso de objetos de la clase DataSet. Como sabemos se trata de un almacenamiento en memoria desvinculado por completo del origen de los datos. Si el ejemplo anterior lo modificamos para convertirlo en una funcin que nos devuelva un DataSet con los datos obtenidos a partir de la consulta, el resultado sera similar a este:

La primera parte del cdigo es como la anterior. Se crean una conexin y un comando. Lo que difiere bastante es la segunda parte. Hay varias diferencias importantes: 1. Ya no aparece en el cdigo objeto DataReader de tipo alguno. 2. No se abre ni se cierra la conexin a la base de datos. 3. Se crea un nuevo DataSet y aparece un objeto de la clase DataAdapter.

44

Un DataAdapter es una clase que conoce las particularidades de la capa conectada de un determinado proveedor y es capaz de "comunicar" informacin entre sta y la capa desconectada formada por los DataSet. El mtodo Fill de un DataAdapter se encarga e rellenar un DataSet con los datos obtenidos a partir de una consulta (o procedimiento almacenado) definida a travs de un comando. Su propiedad SelectCommand se usa para indicar qu comando se utilizar para rellenar el DataSet. Internamente el mtodo Fill emplea el objeto DataReader devuelto por ExecuteReader y rellena el DataSet con l por lo que sera factible crear un cdigo equivalente. Sin embargo es muy cmodo y nos evita problemas y el tener que "reinventar la rueda" en cada proyecto. 1.3.2.2.1. El objeto DataSet

Los objetos DataSet contienen a su vez objetos DataTable que son los que contienen realmente los datos. Para acceder a las tablas de un DataSet se utiliza su coleccin Tables. Se puede acceder a las tablas por posicin (nmeros enteros) o por nombre si lo sabemos. En un ejemplo sencillo como el anterior (y por otro lado uno de los ms comunes) se crea una nica tabla en el DataSet de nombre "Table1" y posicin 0. Las tablas contienen dos colecciones interesantes: Columns: conjunto de objetos de tipo DataColumn que ofrecen informacin sobre los campos de la tabla (nombre, tipo, longitud...). Rows: coleccin de objetos de la clase DataRow que contienen informacin concreta sobre cada campo de un registro de la base de datos.

Con esta informacin resulta muy sencillo tratar los datos de una consulta. Podemos acceder directamente a cualquier registro de la tabla usando su posicin en la coleccin de filas. Por ejemplo para acceder al quinto registro de una tabla basta con escribir: Dim dr As DataRow Dr = ds.Tables(0).Rows(4) (ntese que las colecciones comienzan a numerarse en 0, de ah que el quinto registro tenga ndice 4). Podemos acceder a cualquier campo del registro usando su posicin o bien su nombre, as: ds.Tables(0).Rows(4)("CompanyName") que devolver un objeto del tipo adecuado para el campo que representa (una cadena, un objeto de fecha, un booleano, etc...). Nota: Es muy sencillo definir objetos DataTable que dispongan de los campos que deseemos sin depender de origen alguno de datos. Emplee el mtodo Add de la coleccin Columns para crear nuevos campos, algunos de los cuales pueden ser incluso derivados mediante una frmula de los valores de otros. Esto permite definir estructuras de almacenamiento a medida en memoria sin preocuparnos de usar una base de datos para ello. 1.3.2.2.2. Ventajas del uso de objetos DataSet

Es posible cargar datos de varias tablas en un mismo DataSet, incluso aunque procedan de bases de datos diferentes, y relacionarlas en memoria. Es posible establecer relaciones entre ellas para mantener la consistencia, as como hacer un mantenimiento en memoria de los datos (altas, bajas y modificaciones). Posteriormente se puede

45

sincronizar el DataSet con el servidor usando un DataAdapter, realizando el proceso contrario al de obtencin de datos. Luego lo veremos. La principal ventaja de un DataSet es que podemos almacenarlo en donde queramos (en una variable global, en cach, incluso a disco a una base de datos) para trabajar con l sin estar conectado a una base de datos. De hecho se pueden transferir DataSet completos entre diferentes mquinas o por Internet, trabajar con ellos en remoto, almacenarlos, recuperarlos y finalmente transferirlos en cualquier momento de nuevo al origen (enteros o slo los cambios) para sincronizarlos. Es posible moverse con libertad entre los registros de una tabla y sus registros relacionados en otras tablas. Y sobre todo, se pueden vincular con elementos de la interfaz grfica para mostrar los datos automticamente. 1.3.2.3. Consultas parametrizadas

Las consultas simples como la que acabamos de utilizar en los ejemplos anteriores son muy raras. En la realidad las consultas son mucho ms complejas, suelen intervenir varias tablas y dependen de diversos parmetros que le aaden condiciones. Por ejemplo, si en la base de datos Northwind queremos obtener slo aquellos clientes de un pas determinado. Podramos escribir de nuevo la funcin DameClientes para que se pareciese a la siguiente:

Esta funcin acepta un pas como parmetro y lo nico que hace es concatenar a la consulta una nueva condicin que introduce el pas. Esto, sin duda, funcionara. Sin embargo presenta multitud de problemas seguramente no demasiado obvios para los programadores noveles. Los ms importantes son los siguientes: 1. Este cdigo es vulnerable a problemas de seguridad provocados por ataques de inyeccin de SQL. Esto puede poner en peligro fcilmente nuestra aplicacin e incluso todo nuestro sistema en casos graves. El estudio de esta problemtica se sale del mbito de este curso, pero crame cuando le digo que se trata de un gravsimo problema que debemos evitar a toda costa.

46

2. Si se solicitan 100 consultas idnticas al servidor en las que slo vara el nombre del pas por el que se filtra, ste no tiene modo de saber que son las mismas y sacar factor comn. Es decir, no se puede reutilizar el plan de consulta de la primera de ellas para las dems por lo que se debe calcular de nuevo cada vez, incidiendo en el rendimiento y la escalabilidad de la aplicacin. Obviamente en consultas ms complicadas es un problema ms importante que en esta. 3. Este cdigo es ms difcil de transportar a otros sistemas de bases de datos ya que hay que incluir los delimitadores y notaciones especficos de cada gestor. Por ejemplo en SQL Server los delimitadores de fechas son comillas simples ('), mientras que en Access son almohadillas (#) y la sentencia usada no se puede reutilizar. La forma correcta de realizar este tipo de consultas es utilizar parmetros en la consulta. Ello evita los problemas enumerados. Los objetos de tipo Command disponen de una coleccin llamada Parameters que sirve para asignar dichos parmetros. stos previamente se definen en la consulta utilizando comodines que marquen su ubicacin. Nota: Cada proveedor de datos utiliza su propia convencin para indicar la posicin de los parmetros en una consulta. En el caso de SQL Server se indican con una arroba '@' seguida de un identificador. En otros proveedores no se puede definir nombre para los parmetros, slo se marca su posicin con un caracter especial. La funcin anterior empleando parmetros sera la siguiente:

Se ha resaltado los cambios. Como vemos en lugar de concatenar cadenas se marca la posicin de las partes de la consulta que varan con un parmetro que consta de una arroba seguida de un identificador. Luego hay que declarar el parmetro aadindolo a la coleccin de parmetros. Para ello se indica su nombre y el tipo de datos que representa (en este caso un NVarChar de SQL Server, que es una cadena de longitud variable).

47

Por fin se asigna su valor concreto antes de lanzar la consulta. El proveedor de datos crea la consulta de la manera correcta, usando los delimitadores adecuados y tratando los datos del modo que sea preciso para asegurar que es correcta. Ello elimina los problemas de los que hablbamos anteriormente y permite optimizar el uso de consultas. 1.3.2.4. Altas bajas y modificaciones

Con lo que hemos visto hasta ahora ya estamos en condiciones de escribir cdigo para realizar altas, bajas y modificaciones de registros. Al fin y al cabo stas son simplemente consultas SQL del tipo adecuado (INSERT, DELETE o UPDATE) que se deben enviar al servidor. As pues, para crear un nuevo cliente podemos escribir una funcin como la siguiente:

Es un cdigo muy similar al anterior que realizaba una seleccin de datos. En este caso se ha definido una consulta de insercin con tres parmetros. En lugar de usar ExecuteReader o un DataAdapter en este caso se utiliza el mtodo ExecuteNonQuery. ste lanza la consulta (es decir, se inserta el nuevo registro) y devuelve el nmero de registros afectados por la consulta (que en el caso de una insercin siempre es 1 si se inserta correctamente o 0 si ha habido un error). Las actualizaciones y eliminaciones de registros se podran conseguir de modo similar. 1.3.2.4.1. Trabajando desconectados

El cdigo anterior funciona perfectamente pero no es la forma ptima de trabajar cuando tenemos que tratar con datos desconectados contenidos en objetos DataSet. 48

Los DataSet normalmente circulan, independientes de cualquier origen de datos, entre las diferentes capas de una aplicacin e incluso se mueven entre contextos de ejecucin y mquinas (por ejemplo a travs de un servicio Web como veremos). Hemos dicho que son como pequeas bases de datos, por lo que la forma habitual de trabajar con ellos es aadir, eliminar y modificar registros directamente sobre sus tablas, sin pensar en la ubicacin real de estos datos. As pues, para crear un nuevo registro en un DataSet debemos usar el mtodo NewRow del DataTable en la que lo queremos insertar. El nuevo registro tiene la misma estructura (el mismo "esquema") que el resto de registros y slo tendremos que rellenar sus datos. Una vez rellenados aadiremos el nuevo registro a la coleccin de filas de la tabla. As por ejemplo si tenemos almacenado un DataSet con una tabla con los datos de los clientes obtenidos con la funcin de ejemplo DameClientes, podramos agregar uno nuevo de la siguiente manera:

Es decir, se crea la nueva fila/registro, se rellenan sus campos y se aade a la coleccin de filas con el mtodo Add de sta. La actualizacin de datos es ms sencilla an ya que basta con acceder directamente al registro que nos interesa modificar y cambiar los valores de sus campos. Por ejemplo, para modificar la direccin del cliente cuyos datos estn en el quinto registro de nuestra tabla slo hay que escribir:

Por fin, para eliminar un registro slo hay que usar su mtodo Delete, as:

que borrara el quinto registro de nuestra tabla en memoria. 1.3.2.4.2. Conciliando los cambios con el origen

Es muy fcil trabajar con los Dataset en memoria de este modo. Slo hay un "pequeo" problema: los cambios se realizan en memoria pero, al no estar vinculado el DataSet con origen de datos alguno, no los veremos reflejados en la base de datos que es lo que buscamos. Debemos realizar una sincronizacin entre la representacin en memoria de los datos y su ubicacin fsica real, para lo cual debemos hacer que los cambios trasciendan a la capa conectada. Al igual que cuando los recuperamos, el trasiego en el otro sentido se realiza con la ayuda del puente que representa la clase DataAdapter. Al igual que utilizbamos la propiedad SelectCommand para indicar cmo se recuperaban los datos hacia un DataSet, ahora debemos utilizar las propiedades InsertCommand, UpdateCommand y DeleteCommand para indicar qu comandos se deben usar para agregar, modificar y eliminar los registros modificados en memoria a travs del DataSet. Una vez especificados estos comandos slo resta llamar al mtodo Update del DataAdapter para que se ocupe de sincronizar automticamente todos los cambios que hayamos realizado en las tablas en memoria. Este mtodo acepta como argumentos un

49

DataSet completo, una DataTable o incluso un DataRow si slo queremos actualizar un nico registro. 1.3.2.4.3. Definicin de los comandos

Los comandos de insercin, modificacin o borrado para el DataAdapter se definen del mismo modo que en el cdigo de ejemplo al principio de este apartado, es decir, se define la consulta apropiada y sus parmetros. En esta ocasin como los parmetros sern rellenados automticamente por el DataAdapter hay que utilizar una sobrecarga del mtodo Add de la coleccin de parmetros que incluye el nombre del campo asociado con el parmetro, as:

En este caso se define el parmetro "@Direccin", de tipo NVarChar y longitud 60 que se refiere siempre al valor del campo "Address" de la tabla. Por ejemplo, para definir la consulta de eliminacin de registros de la tabla de clientes usaramos el siguiente cdigo:

siendo CustomerID la clave primaria de la tabla. Una vez definidos los tres parmetros de alta, baja y modificacin slo resta llamar a Update para que el DataAdapter se ocupe de toda la sincronizacin. 1.3.2.4.4. Ventajas

Este modelo est lleno de ventajas aunque a primera vista pueda parecer algo engorroso. Nota: Luego veremos que podemos usar las herramientas que nos proporciona Visual Studio 2005 para definir de manera automtica los comandos de manipulacin de datos sin necesidad de pasar el trabajo de hacerlo manualmente. Para empezar podemos trabajar con los datos en total libertad sin preocuparnos de si existe conexin o no con el origen y aunque el DataSet se manipule en una ubicacin fsica a miles de kilmetros del origen y desconectado de ste o los cambios se almacenen a disco y se concilien das ms tarde. Se pueden realizar multitud de modificaciones en los datos y luego conciliarlas simultneamente en lugar de hacerlo en tiempo real de una en una. El paso de datos entre capas y funciones se simplifica. Lo habitual antes era definir funciones con tantos parmetros como datos se quisieran modificar en un registro. Por ejemplo, para insertar un registro en una tabla que tiene 20 campos se defina una funcin con 20 parmetros (muchos de ellos opcionales) o, en el mejor de los casos, se pasaba una clase creada a medida que representaba lo valores del registro. Ahora basta con pasar un DataSet, un DataTable o un dataRow que ya contiene toda la informacin que necesitamos saber sobre los registros y su tabla asociada. Lo mejor es que es posible saber mediante ciertas propiedades qu registros han cambiado (nuevos, modificados, borrados) y mover entre capas exclusivamente estos. La propiedad HasChanges de los DataSet, DataTable y DataRow nos informa de si el objeto ha sufrido cambios de algn tipo. El mtodo GetChanges de los objetos DataSet y DataTable devuelve un subconjunto de los datos que contiene exclusivamente los cambios. As, aunque en un DataSet 50

tengamos 1000 registros, si slo hemos modificado 2 slo ser necesario trasegar la informacin de estos a la hora de enviarlos a otra capa o funcin para sincronizarlos con la base de datos. El mtodo GetChanges se puede invocar sin parmetros o indicando qu tipo de cambios queremos obtener, lo que se indica con un valor de la enumeracin DataRowState: Valor Added Deleted Modified UnChanged Detached Significado Registros que no estaban originalmente Registros que se han eliminado Registros cuyos valores se han modificado Registros que no se han modificado Registros que se han desasignado de una tabla (pero no borrado con Delete)

Se puede dejar un DataSet en estado sin modificar llamando a su mtodo AceptChanges. Esto es lo que hace un DataAdapter tras haber sincronizado los cambios con el origen de datos.

1.3.3.

Acceso a datos con Visual Studio 2005

Ahora que ya hemos visto la forma de trabajo manual con ADO.NET y dominamos los fundamentos, vamos a sacar partido a todas las ventajas que nos proporciona un entorno como Visual Studio 2005 que, como veremos, nos permiten hacer casi cualquier tarea de datos sin necesidad de escribir cdigo. 1.3.3.1. Controles de datos

Aparte de la escritura manual de cdigo y el uso directo de objetos de ADO.NET, ASP.NET 2.0 proporciona un nuevo modelo de trabajo declarativo para acceso a datos que nos permite realizar tareas comunes de acceso a datos sin escribir cdigo alguno. ASP.NET 2.0 presenta dos nuevos tipos de controles Web que participan en este modelo declarativo de enlace a datos. Estos controles nos abstraen por completo de las complejidades de manejo de las clases de ADO.NET por un lado, y de las dificultades inherentes al modo de trabajo desconectado de las pginas Web. Equiparan en muchos aspectos el desarrollo Web al tradicional desarrollo de aplicaciones de escritorio. Estos controles se encuentran agrupados en el cuadro de herramientas bajo el nombre de "Datos", tal y como se ve en la figura.

51

1.3.3.1.1.

Orgenes de datos

Estos controles de datos representan conexiones con diferentes tipos de orgenes de informacin que van desde bases de datos a objetos de negocio. No disponen de apariencia visual pero se arrastran igualmente sobre los formularios Web para trabajar con ellos visualmente y poder usar sus paneles de tareas. Abstraen al programador de las complejidades relacionadas con el manejo de los datos, permitiendo de manera automtica seleccionarlos, actualizarlos, ordenarlos, paginarlos, etc. ASP.NET 2.0 ofrece los siguientes controles de origen de datos que se pueden ver en la figura anterior: Control SqlDataSource Descripcin Enlaza con cualquier base de datos para que exista un proveedor de ADO.NET. Esta especializado en trabajar con bases de datos Microsoft Access. Se enlaza con objetos de negocio y capas personalizadas de acceso a datos. Trata datos contenidos en documentos XML. Se enlaza con la jerarqua de clases expuesta por el modelo de navegacin de sitios de ASP.NET 2.0.

AccessdataSource

ObjectDataSource XmlDataSource SiteMapDataSource

ATENCIN!: El control SqlDataSource sirve para enlazar con cualquier gestor de datos relacional para la que haya proveedor ADO.NET disponible, no slo para enlazar con SQL Server. No se deje despistar por su nombre. 1.3.3.1.2. Concurrencia optimista

Durante la configuracin de un origen de datos SQL (luego lo ver en el primer vdeo de esta leccin) una de las opciones avanzadas que se presenta habla de la Concurrencia optimista. La concurrencia optimista evita la actualizacin de registros en el caso de que haya variado cualquiera de sus campos desde que se obtuvieron de la fuente de datos. Este comportamiento puede ser bueno en ciertas ocasiones, cuando queremos preservar los cambios realizados por cualquier usuario. En otras sin embargo no resulta de utilidad y s aade una gran sobrecarga al acceso a datos. 52

Se le denomina concurrencia optimista porque parte de la base de que la posibilidad de coincidencia de dos usuarios sobre el mismo registro es baja y es un caso que apenas se dar. Al caso contrario a la concurrencia optimista se le denomina concurrencia pesimista. Nota: En mi opinin debera llamarse "concurrencia realista" ya que, lo cierto es que si se analiza con detenimiento la posibilidad de conflicto en un sistema grande tiende a ser realmente pequea en la mayora de los casos. Y de todos modos el sobreescribir cierta informacin no suele ser un problema grave salvo cuando hablamos de cuestiones de dinero, facturas y similares. Cuando se establece la concurrencia optimista las consultas que genera el asistente de Visual Studio incluyen todos los campos del registro como condicin de bsqueda del mismo, por ejemplo: DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID AND [CompanyName] = @original_CompanyName AND [ContactName] = @original_ContactName AND [ContactTitle] = @original_ContactTitle AND [Address] = @original_Address AND [City] = @original_City AND [Region] = @original_Region AND [PostalCode] = @original_PostalCode AND [Country] = @original_Country AND [Phone] = @original_Phone AND [Fax] = @original_Fax mientras que en un caso de concurrencia pesimista se emplea simplemente la clave primaria del registro para localizarlo: DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID Es decisin suya qu tipo de actualizacin utilizar pero en la mayor parte de los casos usar seguramente la pesimista que, de hecho, es la que usted utiliza normalmente si escribe las funciones a mano de manera independiente. 1.3.3.1.3. Controles enlazados a datos

Se trata de controles de interfaz de usuario que, haciendo uso de los anteriores, muestran la informacin a travs de la pgina. Pueden sacar partido a todas las propiedades de los orgenes de datos y por lo tanto habilitan de manera sencilla la edicin, eliminacin, ordenacin, filtrado y paginacin de los datos entre otras cosas. Para conectar un control enlazado a un DataSource slo hay que establecer su propiedad DataSourceID indicando el nombre apropiado. As de fcil. Nota: Si usted ya conoce los controles enlazados a datos de ASP.NET 1.x como el DataGrid, el DataRepeater, etc... estos controles le resultarn ms cmodos de utilizar pues al contrario que con aquellos no hay que escribir cdigo alguno. Aunque estos controles "antiguos" no aparecen en el cuadro de herramientas siguen estando soportados y los puede seguir utilizando. Incluso si lo desea puede aadirlos al cuadro de herramientas. De todos modos se recomienda utilizar el nuevo modelo declarativo de acceso a datos. 1.3.3.1.4. Uso de los controles de datos en la prctica

La mejor forma de conocer la manera de trabajar con estos controles es vindolos actuar en la prctica. Los vdeos de esta leccin muestran un ejemplo completo de uso de los controles en el que se explotan unos datos para su visualizacin, edicin y eliminacin. Por favor, examnelo con atencin y luego trate de practicarlo por su cuenta con ejemplos similares. 53

1.3.3.2.

DataSet tipados

La clase DataSet, como cualquier otra clase no sellada de .NET, puede ser extendida mediante herencia para aadirle nuevas funcionalidades y aprovechar las ya existentes. Si creamos una nueva clase que herede de DataSet y sta la especializamos en el tratamiento de un conjunto de datos determinado que conocemos de antemano nos encontramos un DataSet especializado. Por ejemplo, podemos crear un DataSet especial que tengan en cuenta las particularidades de los datos que maneja para validarlos antes de permitir su insercin, que verifique las relaciones con otros datos o que los transforme o controle el acceso a los mismos. Nosotros slo tendramos que ocuparnos de estas tareas dejando a la clase DataSet de la que hemos heredado todos los puntos complejos que tienen que ver con la gestin de datos pura y dura. Esta es, en esencia, la idea que subyace bajo los DataSet tipados de Visual Studio 2005. Se trata de clases especializadas derivadas de DataSet que ofrecen una forma ms rpida y sencilla de acceder a los datos que albergan. Adems Visual Studio nos permite crear este tipo de DataSet de forma visual y usando asistentes. En el vdeo se ilustra la manera de conseguirlo. Los DataSet tipados parten del conocimiento preciso de la estructura de una base de datos para definir su funcionalidad. Esta es su principal diferencia con los DataSet normales puesto que stos son genricos y no saben nada acerca de los datos que albergan. Los tipados slo sirven para albergar una informacin muy concreta. Ganan en especializacin y pierden en versatilidad. Para agregar un DataSet tipado a nuestro proyecto slo hay que presionar con el botn secundario sobre la carpeta App_Code y en el dilogo que aparece elegir el icono de DataSet. La extensin del archivo generado es '.xsd' porque lo que en realidad albergan es un esquema XML que define la estructura de los datos en los que se van a especializar. Una vez agregado el DataSet aparece una superficie de diseo y un asistente como el de la figura.

Figura 4.5.- Primer paso del asistente de configuracin de un TableAdapter.

54

Este asistente nos permite configurar un objeto TableAdapter que se encargar de trasegar datos entre el DataSet tipado que estamos creando y la base de datos. Un TableAdapter es una clase que encapsula a un DataAdapter especializado en los datos que vamos a procesar con la tabla del DataSet tipado que estamos definiendo. De hecho sus mtodos son, por defecto, los mismos que los de un DataAdapter normal (Fill, Update...). Con l dispondremos de mtodos para recuperar informacin, crear nuevos registros, actualizarlos y eliminarlos, slo que los correspondientes comandos estarn creados de manera automtica o asistindonos en ello. As, por defecto, se definen un par de mtodos para obtener los datos subyacentes rellenando un DataSet que se le pase (mtodo Fill) o devolviendo directamente un DataTable (mtodo GetData). Adems el mtodo Update sirve para conciliar automticamente los cambios del un DataSet tipado con la base de datos original. No vamos a analizar desde el texto la definicin de estos objetos adaptadores pero puede conocerlo viendo el vdeo de esta leccin. Truco: Podemos ver el cdigo que se genera de manera automtica para crear el DataAdapter si hacemos doble-clic sobre l desde el examinador de objetos de Visual Studio (CTRL+ALT+J). Esto har que se abra el archivo de cdigo auto-generado por ASP.NET desde la ubicacin real de ejecucin (normalmente una ruta del estilo C:\Windows\Microsoft.NET\....). Es muy interesante echarle un vistazo a este cdigo para aprender el funcionamiento interno de los DataSet tipados. 1.3.3.2.1. Partes de un DataSet tipado

Al igual que un DataSet normal, uno tipado consta de un conjunto de tablas y relaciones entre ellas. En este caso, sin embargo, podemos acceder a las tablas y a sus campos utilizando directamente sus nombres en lugar de recorrer la coleccin de tablas, lo cual lo hace ms fcil de usar. Cada una de las tablas del DataSet lleva asociado como mnimo un TableAdapter. Entre los dos objetos (el DataTable y el o los TableAdapter relacionados) se reparten el trabajo. El DataTable tipado mantiene en memoria la informacin y el TableAdapter acta de puente con la tabla real en la base de datos. Nota: Como sabemos (y veremos en el vdeo tambin) las tablas de un DataSet no tienen porqu coincidir con tablas reales de una base de datos ya que pueden ser resultados obtenidos de una consulta compleja que involucre a varias tablas. En estos casos es ms complicada la actualizacin y se suelen usar nicamente para recuperar datos. la alternativa habitual es tratar de replicar la estructura fsica de la base de datos en la estructura en memoria del DataSet de modo que se tiene acceso estructurado a la misma informacin y gracias a las relaciones y restricciones se conserva la consistencia de los datos tambin estando desconectados. El DataSet tipado dispone de propiedades que coinciden con los nombres de los objetos que contienen. As, por ejemplo, si tenemos una tabla "Clientes" con un campo "Nombre" podemos acceder a l directamente con este cdigo: ds.Clientes(0).Nombre que nos dara el nombre del primer cliente de la tabla de clientes en el DataSet 'ds'. esta propiedad nombre adems ya sera un campo de tipo String que es el tipo adecuado para la informacin albergada, por lo que se simplifica mucho su uso. En un DataSet normal para obtener lo mismo tendramos que haber escrito: ds..Tables(0).Rows(0)("Nombre").ToString() que obviamente es mucho menos legible. La cosa no termina aqu ya que adems se definen clases especficas para representar los registros de las tablas. Por ejemplo si la tabla se llama 'Clientes' existir una clase 55

ClientesRow que dispone de propiedades con el mismo nombre y tipo que los campos correspondientes en la tabla de la base de datos y que hemos usado en la lnea de ejemplo. As, para aadir un cliente podramos escribir: Dim cliente As New Cliente cliente.Nombre = "Pepe" .... ds.Clientes.AddClientesRow(cliente) Ntese que el mtodo Add del DataTable se ha sustituido por uno con nombre especializado que nos ayuda a saber mejor por donde pisamos, pero su funcin es idntica. Para rellenar una tabla de un DataSet tipado se usa su correspondiente TableAdapter as: Dim clientes As New ClientesDS Dim ta As New ClientesTableAdapters.ClientesTableAdapter() ta.Fill(clientes.Clientes) clientes.Clientes(0).Nombre = "Pepe" .... o tambin usando el mtodo GetData para obtener la tabla directamente si slo nos interesa esa parte concreta del DataSet (que puede constar de varias tablas): Dim clientes As Clientes.ClientesDataTable Dim ta As New ClientesTableAdapters.ClientesTableAdapter() clientes = ta.GetData() clientes(0).Nombre = "Pepe" .... Para un mismo DataTable tipado se pueden definir diversos TableAdapter especializados aparte del bsico que permite llenar todos los datos: para filtrar por diversos parmetros normalmente. El uso de DataSet tipados es muy recomendable puesto que simplifica mucho el trabajo puesto que podemos realizar casi todo el trabajo utilizando asistentes y accediendo a la informacin de manera muy cmodo. Adems es un modo muy sencillo de separar la funcionalidad de la base de datos del resto del cdigo. As, si se hace necesario en el futuro, se puede exponer esta parte de manera independiente mediante un, por ejemplo, un servicio Web que utilice el DataSet tipado y sus TableAdapters para acceder a los datos desde una ubicacin remota.

56

2.

Creacin de bases de datos con Visual Studio

La mayora de aplicaciones comerciales (y principalmente las de gestin) utilizan datos que deben guardarse en algn sitio. Generalmente esta informacin se guarda en bases de datos. En ste mdulo, vers cmo crear una base de datos para SQL Server 2005 Express, y crears tablas para guardar la informacin a almacenar; aprenders sobre los tipos de datos que forman las columnas de las tablas, cmo relaciona las tablas, integridad, y cmo realizar consultas sobre las tablas.

2.1.

Objetos bsicos del sistemaCrear una base de datos

2.1.1.

Cuando se crea una base de datos, es importante comprender cmo SQL Server almacena los datos para poder calcular y especificar la cantidad de espacio en disco que hay que asignar a los archivos de datos y registros de transacciones. Aunque SQL Server automticamente incrementa el tamao asignado a los ficheros de bases de datos dinmicamente, para tener un rendimiento ptimo del sistema (evitar fragmentacin de los ficheros), se recomienda ser "precisos" a la hora de definir el tamao de la base de datos. 2.1.1.1. Ficheros de la base de datos

Todas las bases de datos tienen un archivo de datos principal (.mdf), y uno o varios archivos de registro de transacciones (.ldf). Una base de datos tambin puede tener archivos de datos secundarios (.ndf). La extensin definida para cada tipo de archivos es libre, pero como buenas prcticas se suele seguir el modelo de extensiones recomendado por Microsoft (mdf, ldf, y ndf). El proceso de creacin de la base de datos, consiste en hacer una copia de la base de datos model, que incluye las tablas del sistema. La ubicacin predeterminada para todos los archivos de datos y registros de transacciones es C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data. La base de datos puede configurarse con tres modelos de recuperacin en caso de fallo del sistema (FULL, BULK_LOGGED, y SIMPLE); evala cada modelo en base a las necesidades del sistema que ests implementando. 2.1.1.2. Creacin de base de datos desde SQL Server 2005 Management Studio Express SQL Server Management Studio Express es la herramienta de administracin incluida con SQL Server Express; la herramienta no fue incluida en la primera distribucin de SQL Server Express, y se puede descargar de forma gratuita de la siguiente url: Microsoft SQL Server Management Studio Express - Community Technology Preview (CTP) November 2005: http://www.microsoft.com/downloads/details.aspx?familyid=82afbd59-57a4-455e-a2d61d4c98d40f6e&displaylang=en

57

Para crear una base de datos desde SQL Server 2005 Management Studio, expande la lista de bases de datos, de la lista de instancias de SQL Server 2005 registradas, y selecciona la opcin "New database":

58

Debers rellenar el nombre de base de datos, nombres lgico y fsico de los archivos relacionados, y tamao de los ficheros, as como su crecimiento:

59

Y debers establecer el modo de recuperacin de la base de datos; en la versin Express al crear una base de datos por defecto se establece como recuperacin SIMPLE:

Para famializarte con la sintaxis del lenguaje T-SQL, te recomiendo que utilices la opcin de men script (en recuadro verde en las dos imgenes anteriores), que mostrar la instruccin T-SQL correspondiente a las operaciones que has ido configurando en las distintas opciones. 2.1.1.3. Consideraciones

Dependiendo de las necesidades a cubrir del sistema de base de datos a desarrollar, debers configurar los archivos de una forma u otra; por ejemplo, en grandes sistemas llegars a configurar niveles de redundancia de discos (RAID), y repartirs la informacin de las tablas en distintos ficheros. Aunque no est soportado en la versin Express, funcionalidades del producto como Particionado de datos, llegan a ser primordiales, y es un factor a considerar desde el momento de diseo del sistema. Por otro lado, para familiarizarte con SQL Server, recomendara entender las opciones de configuracin de base de datos que aparecen en la pestaa opciones, que aunque no son necesarias para comenzar a disear bases de datos SQL Server, si ayudan a comprender un poco el funcionamiento interno de SQL Server (shrink, statistics, etc.):

60

2.1.2.

Tipos de datos

Empezaremos por los tipos de datos. Las tablas tienen columnas, y las columnas se definen en base a un tipo de datos; los tipos de datos acotan el tipo y tamao de la informacin que se guardar en una columna. La importancia de la eleccin de los tipos de datos reside en el almacenamiento que ocupa; para varios cientos de filas, el tamao no es tan crucial, pero cuantas ms filas se aadan a la tabla, mayor ser la repercusin en el rendimiento de las operaciones de E/S. Como veremos, habr tipos de datos en los que habr que seleccionar el tamao, e incluso algunos tendrn la posibilidad de ofrecer tamao variable; vamos a analizar los ms significativos. 2.1.2.1. Tipos de datos numricos

Los tipos de datos numricos se utilizan para guardar valores numricos enteros, o decimales. Los dividiremos en dos grandes grupos: enteros, y decimales.

61

2.1.2.1.1.

Tipos de datos numricos enteros Precisin De -2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807) De -2^31 (-2.147.483.648) a 2^31-1 (2.147.483.647) De -2^15 (-32.768) a 2^15-1 (32.767) De 0 a 255 0,1 Almacenamiento 8 bytes

Tipo de dato bigint

int smallint tinyint bit

4 bytes 2 bytes 1 bytes 1 bit, mmino 1 bytes

Tradicionalmente el tipo de datos ms usado es el int; el tipo de datos bigint apareci en SQL Server 2000, y es la alternativa al tipo de datos int, cuando los valores son muy grandes. 2.1.2.1.2. Tipos de datos numricos decimales

Decimal, numeric. Tipo de datos numrico con precisin y escala fijas. decimal[ (p[ ,s] )] y numeric[ (p[ ,s] )] Nmeros de precisin y escala fijas. Cuando se utiliza la precisin mxima, los valores permitidos estn comprendidos entre - 10^38 +1 y 10^38 - 1. Numeric equivale funcionalmente a decimal p (precisin). El nmero total mximo de dgitos decimales que se puede almacenar, tanto a la izquierda como a la derecha del separador decimal. La precisin debe ser un valor comprendido entre 1 y la precisin mxima de 38. La precisin predeterminada es 18. s (escala). El nmero mximo de dgitos decimales que se puede almacenar a la derecha del separador decimal. La escala debe ser un valor comprendido entre 0 y p. Para especificar la escala es necesario haber especificado la precisin. Y la relacin entre precisin y almacenamiento es: Precisin 1-9 10-19 20-28 29-38 Almacenamiento 5 9 13 17

62

money, smallmoney. Tipos de datos que representan valores monetarios o de moneda. Tipo de dato money Precisin De -922,337,203,685.477,5808 a 922,337,203,685.477,5807 De - 214.748,3648 a 214.748,3647 Almacenamiento 8 bytes

smallmoney

4 bytes

float(n), single. Tipos de datos numricos y aproximados que se utilizan con datos numricos de coma flotante. Los datos de coma flotante son aproximados; por tanto, no todos los valores del intervalo del tipo de datos se pueden representar con exactitud. Tipo de dato float Precisin De -1,79E308 a -2,23E-308, 0 y de 2,23E-308 a 1,79E308 De -3,40E38 a -1,18E-38, 0 y de 1,18E-38 a 3,40E38 Almacenamiento Depende del valor de n (4 u 8 bytes) 4 bytes

real

2.1.2.2.

Tipos de datos de caracteres

Los tipos de datos caracter se puede definir de longitud fija y de longitud variable. Los de longitud fija son char(n) y su tamao lo define el valor que tenga n. Por ejemplo, una columna char(15) ocupa 15 bytes. Los de longitud variable son varchar(n), y su tamao lo define la longitud de la columna guardada; por ejemplo una columna varchar(250), que guarda el valor "columna variable" el almacenamiento que ocupa es 16 bytes. En caso de desear valores Unicode, debers anteponer al tipo de datos la letra n, siendo los tipos nchar, o nvarchar. La principal diferencia con los tipos de datos no-unicode, es que utilizan el doble de bytes. Por ejemplo, el texto "Tutorial", en una columna varchar(100) ocupara 8 bytes, mientras que siendo unicode ocupara 16 bytes. El tamao de las columnas char, varchar, nchar, nvarchar est limitado a 8000 bytes de almacenamiento; en caso de necesitar mayor longitud puedes usar el tipo de datos varchar(max) o nvarchar(max), que es nuevo en SQL Server 2005. 2.1.2.3. Tipos de datos fecha

smalldatetime, datetime. Son los tipos de datos utilizados para representar la fecha y la hora. El valor internamente se almacena como un valor integer, y dependiendo de la precisin utilizar 4 u 8 bytes. Tipo de dato smalldatetime Precisin Del 1 de enero de 1900 hasta el 6 de junio de 2079 Del 1 de enero de 1753 hasta el 31 de diciembre de 9999 Almacenamiento 4 u 8 bytes

datetime

8 bytes

El tipo de datos smalldatetime almacena las fechas y horas del da con menor precisin que datetime. El Database Engine (Motor de base de datos) almacena los valores smalldatetime 63

como dos enteros de 2 bytes. Los dos primeros bytes almacenan el nmero de das despus del 1 de enero de 1900. Los otros dos, almacenan el nmero de minutos desde medianoche. Los v