Todos 10s nombres propios de programas, sistemas operativos, equipos hardware, etc. que aparecen en este libro son marcas registradas de sus respectivas compaiiias u organizaciones.

Reservados todos 10s derechos. El contenido de esta obra esta protegido por la ley, que establece penas de prision yio multas, ademas de las correspondientes indemnizaciones por daiios y perjuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen publicamente, en todo o en parte, una obra literaria, artistica o cientifica, o su transformacion, interpretacion o ejecucion artistica fijada en cualquier tip0 de soporte o comunicada a traves de cualquier medio, sin la preceptiva autorizacion.

0 EDICIONES ANAYA MULTIMEDIA (GRUPO ANAYA, S.A.), 2002
Juan Ignacio Luca de Tena, 15. 28027 Madrid Deposit0 legal: M. 41.765 - 2002 ISBN: 84-415-1375-9 Printed in Spain Imprime: Artes Graficas Guemo, S.L. Febrero, 32. 28022 Madrid.

Agradecimientos ..................................................................................................................... 6

Introduccion

..

.......................................................................................................

18
20 20 21 21 22 24

Soluciones de acceso a datos .............................................................................................. ADONET ................................................................................................................................ Visual Studio .NET ............................................................................................................... Objetivos de este libro ......................................................................................................... Estructura del libro ............................................................................................................... Ayuda a1 lector ......................................................................................................................

Parte I Sentar las bases

................................................................................... 1. Terminologia y conceptos .............................................................................
Origenes de datos ................................................................................................................. Bases de datos ........................................................................................................................ DBMS y RDBMS .............................................................................................................. Arquitectura cliente/ servidor ........................................................................................... Arquitecturas n-tier .............................................................................................................. Servicios de acceso a datos ................................................................................................. Proveedores y controladores ............................................................................................. Lenguajes de comunicaci6n ................................................................................................

.

25

26
27 29 29 30 32 33 33 34

fndice de contenidos

Estructura de 10s datos ........................................................................................................ Entidades y atributos ..................................................................................................... Dominios y restricciones ............................................................................................... Identidad de una entidad .............................................................................................. Relaciones entre conjuntos de entidades ................................................................... Indices ................................................................................................................................ Vistas .................................................................................................................................. Procedimientos almacenados ....................................................................................... Normalizaci6n .................................................................................................................. Transacciones ................................................................................................................... XML .......................................................................................................................................... Resumen ..................................................................................................................................

36 36 37 37 38 39 40 40 41 41 43 43

2 SQL y sus dialectos

.

.......................................................................................

44
46 46 47 47 48 51 51 54 54 56 57 58 58 59 59 61 61 62 62 63 64 65 65 66 66 67 68 68 69 69

iQu6 es SQL?.......................................................................................................................... Partes de SQL ................................................................................................................... Derivados de SQL ........................................................................................................... Ejecuci6n de sentencias SQL ........................................................................................ DDL .......................................................................................................................................... Creaci6n de una base de datos ..................................................................................... Creaci6n de tablas ........................................................................................................... Modificaci6n y borrado de tablas ............................................................................... Otras operaciones de definici6n de datos ................................................................. DML .......................................................................................................................................... Inserci6n de datos ........................................................................................................... Recuperaci6n de datos ................................................................................................... Alias de tablas ............................................................................................................ Selecci6n de filas ........................................................................................................ Condicionales complejos .......................................................................................... Orden de las filas ....................................................................................................... Expresiones y funciones de resumen .................................................................... Agrupamiento ............................................................................................................. Enlaces entre tablas ................................................................................................... Consultas dentro de consultas ............................................................................... Actualizacibn de datos ................................................................................................... Eliminaci6n de datos ...................................................................................................... DCL ........................................................................................................................................... Derivados de SQL ................................................................................................................. Transact-SQL .................................................................................................................... Variables y tipos de datos ....................................................................................... Evaluaci6n de expresiones ...................................................................................... Condicionales y bucles ............................................................................................. Codificaci6n de procedimientos almacenados ................................................... PL / SQL ..............................................................................................................................

Programacidn de bases de datos con Visual Basic .NET

Variables y tipos de datos ....................................................................................... Evaluacidn de expresiones ...................................................................................... Condicionales y bucles ............................................................................................. Codificaci6n de procedimientos almacenados ................................................... Resumen ..................................................................................................................................

70 70 71 71 72

3 Origenes de datos

.

..........................................................................................

74
75 76 77 79 79 81 83 84 85 87 89 90 91 93 95 96 97 98 104 105 106 110 111 113 115 116 117 118 120 120 121 121 123 125 125 128 133

Origenes locales y remotos ................................................................................................. Microsoft Access ................................................................................................................... Definicion de las tablas .................................................................................................. Relaci6n entre las tablas ................................................................................................ Introducci6n de datos .................................................................................................... Simplificar la selecci6n de editorial ............................................................................ SQL Server .............................................................................................................................. Creaci6n de la base de datos ........................................................................................ Definici6n de las tablas .................................................................................................. Relacidn entre las tablas ................................................................................................ Introducci6n de datos .................................................................................................... Us0 de la base de datos de ejemplo ............................................................................ Definici6n de una vista .................................................................................................. Definir procedimientos almacenados ......................................................................... Ejecuci6n de procedimientos almacenados .............................................................. Oracle ....................................................................................................................................... Creaci6n de la base de datos ........................................................................................ Definicion de las tablas .................................................................................................. Introducci6n de datos .................................................................................................. Definici6n de una vista ................................................................................................ Definir funciones y procedimientos almacenados ................................................ Ejecuci6n de funciones y procedimientos ............................................................... InterBase ................................................................................................................................ Creaci6n de la base de datos ...................................................................................... Definicidn de las tablas ................................................................................................ Introduccidn de datos .................................................................................................. Definici6n de una vista ................................................................................................ Definir procedimientos almacenados ....................................................................... Ejecuci6n de procedimientos almacenados ............................................................ Microsoft Excel .................................................................................................................... Creaci6n de un nuevo libro ........................................................................................ Definici6n de la estructura .......................................................................................... Introducci6n de datos .................................................................................................. XML ........................................................................................................................................ Definici6n de la estructura de documento .............................................................. Creaci6n del documento XML ................................................................................... Directorio activo ..................................................................................................................

Acceso a1 Directorio activo ......................................................................................... Resumen ................................................................................................................................

133 134

Parte I1. ADO.NET

......................................................................................... .. 4 . Introduccion a ADO.NET ..........................................................................
Objetivos del modelo ADO.NET ..................................................................................... Representach interna en XML ...................................................................................... Ausencia de cursores de datos ........................................................................................ Cursores de lectura ....................................................................................................... Soluci6n multiprop6sito .................................................................................................... Configuraci6n de 10s clientes ........................................................................................... Resumen ................................................................................................................................

137 138
139 141 143 144 144 148 150

5 Modelo de objetos

.

.......................................................................................

152
153 154 155 156 156 159 160 161 162 163 164 165 166 167 168 168 169 170

Estructura del modelo de objetos ................................................................................... Ambitos con nombre de ADO.NET ................................................................................ Interfaces para 10s proveedores ...................................................................................... Asociaci6n de columnas y tablas ............................................................................... Acceso a filas de datos ................................................................................................. Adaptadores de datos .................................................................................................. Conexiones, comandos y transacciones ................................................................... Detalles sobre 10s proveedores ........................................................................................ Otras clases comunes y especificas ........................................................................... Clases independientes del origen de datos .................................................................. Conjuntos de datos ....................................................................................................... Tablas ................................................................................................................................ Filas ................................................................................................................................... Columnas ......................................................................................................................... Restricciones ................................................................................................................... Relaciones ........................................................................................................................ Vistas de datos ............................................................................................................... Resumen ................................................................................................................................

.. 6 Conexion al origen de datos

.

........................................................................

172
173 174 174 176 176 177 178 178

Obtencion e instalaci6n de proveedores adicionales ................................................. D6nde obtener 10s proveedores ................................................................................. Instalaci6n del proveedor ............................................................................................ Generalidades sobre la conexi6n ..................................................................................... Cadena de conexi6n ...................................................................................................... Apertura y cierre de la conexi6n ............................................................................... Propiedades informativas ........................................................................................... Cadenas de conexi6n ..........................................................................................................

Programacidn de bases de datos con V i s u a l Basic .N.ET

Selecci6n del controlador ............................................................................................ Identificacibn del servidor u origen de datos ........................................................ Base de datos inicial ..................................................................................................... Parimetros de seguridad ............................................................................................ Propiedades exclusivas ................................................................................................ En la prictica ........................................................................................................................ Conexi6n con Microsoft Access ................................................................................. Conexi6n con Microsoft Excel .................................................................................... Conexi6n con SQL Server ............................................................................................ Conexi6n con InterBase ............................................................................................... Conexi6n con Oracle 8i ................................................................................................ Conexiones ODBC mediante DSN .................................................................................. Tipos de DSN ................................................................................................................. Creaci6n de un DSN ..................................................................................................... Us0 del DSN con ADO.NET ....................................................................................... Archivos UDL ...................................................................................................................... Resumen ................................................................................................................................

178 181 181 181 183 183 183 185 186 188 189 193 194 194 196 197 199

7 Informacibn de esquema de la base de datos

.

..........................................

200
201 202 203 204 206 206 209 210 212

iQu6 es la informaci6n de esquema? ............................................................................. Origenes OLE DB ................................................................................................................ Tabla de resultados ....................................................................................................... En la practica .................................................................................................................. Otros origenes ...................................................................................................................... En la practica .................................................................................................................. Informaci6n sobre columnas ............................................................................................ En la practica .................................................................................................................. Resumen ................................................................................................................................

.. 8 Recuperacion de datos

.

................................................................................

214
215 216 217 217 219 220 222 223 226 228 228 229 230

Generalidades sobre 10s comandos ................................................................................ Asociaci6n entre comando y conexi6n ..................................................................... Definicion del comando a ejecutar ............................................................................ Ejecuci6n del comando ................................................................................................ Lectura de 10s datos ........................................................................................................... Recuperar el contenido de una tabla ........................................................................ Varios conjuntos de datos ........................................................................................... Ejecuci6n de sentencias de selecci6n ........................................................................ Sentencias con parhmetros .......................................................................................... Recuperaci6n de un solo valor ................................................................................... Manipulacidn de datos ...................................................................................................... Otras operaciones ................................................................................................................ Recuperaci6n de una vista .........................................................................................

fndice de contenidos

Ejecuci6n de un procedimiento almacenado .......................................................... Resumen ................................................................................................................................

231 233

9. Conjuntos de datos

.....................................................................................

234
235 236 237 237 238 239 241 243 244 246 250 253 253 255 256 258 260 261 264 267

Generalidades sobre conjuntos de datos ....................................................................... Tablas y relaciones ........................................................................................................ Selecci6n de datos ......................................................................................................... Generalidades sobre adaptadores de datos ................................................................. Creaci6n de un adaptador de datos ......................................................................... Obtenci6n de 10s datos ................................................................................................. Actualizaci6n de datos ................................................................................................. En la prActica ........................................................................................................................ Recuperaci6n de datos ................................................................................................. Informaci6n de esquema ............................................................................................. Manipulaci6n de 10s datos .......................................................................................... Definici6n de conjuntos de datos .................................................................................... Creaci6n de tablas. columnas y relaciones ............................................................. Insertion de datos ......................................................................................................... Consulta de estructura y contenido .......................................................................... Almacenamiento local ........................................................................................................ Escritura de esquema y datos .................................................................................... DiffGrams ........................................................................................................................ Lectura del conjunto de datos .................................................................................... Resumen ................................................................................................................................

10 Relaciones y vistas

.

.....................................................................................

270
272 274 276 277 278 278 279 281 284 286 289

Filtrado y ordenaci6n de un DataTable ......................................................................... Generalidades sobre DataView y DataViewManager ............................................... Funcionamiento de un DataView .............................................................................. Funcionamiento de un DataViewManager ............................................................. En la pr6ctica ........................................................................................................................ Multiples vistas sobre una misma tabla .................................................................. La vista por defect0 de una tabla .............................................................................. Busqueda de datos en una vista ................................................................................ Edici6n de datos en la vista ........................................................................................ Us0 de un DataViewManager .................................................................................... Resumen ................................................................................................................................

11. XML

............................................................................................................

290

XML y temas relacionados ................................................................................................ 291 Breve introducci6n a XML .......................................................................................... 292 294 Definiciones de tip0 y esquemas ............................................................................... Ambitos con nombre ........................................................................................ : ...........295

Programacidn de bases de datos con Visual Basic .NET

Mecanismos de manipulaci6n de documentos XML ............................................ Selecci6n de datos con XPath ..................................................................................... Transformaci6n con XSLT ........................................................................................... El Eimbito System.Xm1........................................................................................................ Lectura secuencial de documentos XML ................................................................. Manipulacibn de documentos XML con DOM ...................................................... Navegaci6n por el documento mediante XPath .................................................... Transformaci6n de documentos ................................................................................ XML y AD(l.NET ................................................................................................................ La clase XmlDataDocument ........................................................................................ Creaci6n del DataSet a partir del documento XML ............................................. Generaci6n del documento XML a partir del DataSet ......................................... Resumen ................................................................................................................................

296 297 297 298 298 301 305 307 309 310 311 312 314

Parte I11. Visual Studio .NET

........................................................................ 12. Capacidades de datos en Visual Studio .NET ......................................
Ediciones de Visual Studio .NET .................................................................................... Posibilidades de acceso ..................................................................................................... Productos integrados en el paquete ............................................................................... Posibilidades de disefio ..................................................................................................... Una visi6n general .............................................................................................................. Resumen ................................................................................................................................

317 318
319 321 322 322 324 325

13. Herramientas visuales de datos

...............................................................

326
328 328 331 332 333 334 336 336 340 341 343 343 346 347 350 351 352 354

El Explorador de servidores ............................................................................................ Definir una nueva conexi6n ........................................................................................ Registrar un nuevo servidor ....................................................................................... Apertura y cierre de conexiones ................................................................................ Creaci6n de nuevas bases de datos .......................................................................... Edici6n de datos .................................................................................................................. Navegar por las filas ..................................................................................................... Selecci6n de datos ......................................................................................................... Modificacibn, inserci6n y eliminaci6n ..................................................................... Agrupaci6n de 10s resultados .................................................................................... Edici6n de informacion de esquema .............................................................................. Creaci6n y modificaci6n de tablas ............................................................................ Disefio de vistas ............................................................................................................. Edici6n de procedimientos almacenados y funciones ......................................... Componentes de acceso a datos ...................................................................................... Preparaci6n de la conexi6n ......................................................................................... Definici6n de comandos ............................................................. :................................ Definici6n del adaptador de datos ...........................................................................

fndice de contenidos

Creaci6n del conjunto de datos ................................................................................. Diseiio de una sencilla interfaz .................................................................................. Creaci6n automtitica de componentes ........................................................................... El asistente de configuraci6n de adaptadores ....................................................... Comprobaci6n del adaptador de datos ................................................................... Generaci6n del conjunto de datos ............................................................................. Conjuntos de datos con tip0 ....................................................................................... Aun m6s simple ............................................................................................................. Resumen ................................................................................................................................

355 356 358 358 362 362 363 365 366

14 Componentes con vinculacih a datos

.

...................................................

368
369 370 374 376 377 378 379 379 380 380 381 385 386

Tipos de vinculaci6n .......................................................................................................... Vinculaci6n simple ........................................................................................................ Vinculaci6n con mtiltiples filas de una columna ................................................... Vinculaci6n con mtiltiples filas y columnas ........................................................... Enlace a datos en formularios Windows ...................................................................... Posici6n actual en una lista de datos ........................................................................ Control de la vinculaci6n ............................................................................................ Componentes enlazables ............................................................................................. Enlace a datos en formularios Web ................................................................................ Vinculos s610 de lectura ............................................................................................... Navegaci6n con componentes simples .................................................................... Actualizaci6n del origen .............................................................................................. Resumen ................................................................................................................................

15 Formularios de datos

.

................................................................................

388
389 390 391 391 392 393 395 396 397 401 402 404 404 405 406 408 410

El asistente para formularios Windows ........................................................................ Selecci6n del DataSet .................................................................................................... Definici6n de la conexi6n ............................................................................................ Selecci6n de 10s elementos de origen ....................................................................... Definir la relacion entre las tablas ............................................................................ Selecci6n de columnas .................................................................................................. Elegir el diseiio del formulario .................................................................................. Personalizaci6n del diseiio .......................................................................................... Antilisis del c6digo generado ..................................................................................... El asistente para formularios Web .................................................................................. Antilisis del c6digo generado ..................................................................................... Aiiadir capacidades de edici6n .................................................................................. Inserci6n de 10s enlaces de edici6n ..................................................................... Eventos y elementos de un DataGrid ................................................................. C6digo asociado a 10s eventos ............................................................................. Actualizaci6n del origen de datos ....................................................................... Resumen ................................................................................................................................

...................... ...............................................................................................Prograrnacidn de bases de datos con Visual Basic ....................... Fusi6n de 10s cambios ............. 420 421 423 429 429 430 431 431 Servidor............................................................................... 20 Tablas con columnas calculadas ..................................................................................................................................................................................... Un primer acercamiento ....................................................................................................................................................................................... Disefio del formulario Windows ..........................................NET ....................................................................................... El software cliente .......................... Interfaces genkricas .................................. Disefio de la interfaz de usuario ....... Recuperar la imagen de la base de datos ......................... Implementacih de funciones .............................................................................................................................................. Afiadir columnas a un DataTable ......................................... .............................................................. 411 412 413 414 415 418 17 Acceso a Oracle desde Visual Basic ............. Asignar una imagen desde un archivo ........ servicio y esquema .........Resoluci6n de casos concretos ..................................................................................................NET ...... Columnas binarias ............................................................................................................. Creaci6n en fase de disefio ..................................... 19......................................... Instalaci6n de Oracle9i .......................... Control de transacciones .................................................. 442 443 444 445 447 Politicas de bloqueo y actualizacih .................................. Resoluci6n de problemas de concurrencia ................ 18.............................................................................................................................. ................................................................................................................................................................................... 458 459 460 462 464 465 Afiadir una columna para la portada ................................................................................ 16.......................................................................................... Administracibn del servidor ................................. Identificacibn de servicio y esquema ......................... 21 Almacenamiento y recuperaci6n de imagenes ..................................................................................... Ejecucih del proyecto ........................................................................ 434 435 436 437 438 438 Raz6n de ser de las transacciones ........................................................... Instalacih del proveedor ................. Transacciones en la base de datos ............ ......................................................................................................... Transacciones en Visual Basic .................................................................................... ...................................................................................................NET Parte IV........ Informaci6n de retorno durante la actualizacibn .............................. Definicih del servicio ................................................................................................... En la pr6ctica .................................. 450 451 453 453 454 Columnas calculadas en la sentencia SQL ...................... Conexion genCrica ...... Creacih del objeto Transaction .......................................................................................................................................... Creacih de un nuevo Datacolumn .........................

................................................................................................................................................... 500 506 507 509 Indice alfabCtico .............................................................................................. Glosario ...................................................................................................................................................................................................... 51 1 ..................................................................................................................................................................... Us0 del lector de datos ................ FileSystemClientCommand . B....... 23.................. Us0 del adaptador de datos ........................................................ Agregar una referencia a1 ensamblado ...................................... Documentaci6n adicional ...................................................................................................................... Application Blocks para ADO.................. Atencion a1 lector ..................................................................................................................................................................................... Us0 de 10s mktodos compartidos ...................... Compilaci6n del ensamblado ................................................. FileSystemClientConnection ................................................................................................................... Ejecuci6n de un comando ........................................................... FileSystemClientDataAdapter .......................................fndice de contenidos 22 Creaci6n de proveedores ADO................... Prueba del proveedor ......... A ..................................................... 468 470 471 474 479 485 487 488 488 489 ............................................................................................................................................................................................... 492 493 495 496 496 497 498 Obtenci6n de Data Access Application Blocks ................NET Inicio del proyecto .......................................... Us0 de 10s ejemplos .NET .......................................... Contenido del CD-ROM ................... FileSystemClientDataReader ......................... Us0 de 10s mktodos SqlHelper ......................................................................................................................................................................................... .........

.

en un principio. en algun tip0 de servidor. desde el nacimiento de 10s primeros lenguajes de programaci6n hasta la actualidad. En ocasiones esa informacih se aloja localmente. lo mas importante era la posibilidad de guardar 10s datos para recuperarlos posteriormente. etc. A lo largo del tiempo. tanto internas como de cara a1 publico. Para efectuar ese trabajo es necesacio disponer de soluciones. Si bien es cierto que. &. t a m b i h ha aportado nuevas necesidades. si bien es cierto que en 10s ultimos afios el mas usado ha sido la base de datos. devolverlos a su origen debidamente actualizados. pasando a primer plano aspectos como la seguridad e integridad de 10s datos. el rendimiento en la ejecuci6n de las operaciones. Las necesidades de las aplicaciones se convierten. todas esas capacidades han de implementarse de alguna forma. .a es una exigencia basica que ya se da por asumida. han sido diversos. en trabajo adicional para el desarrollador. transferirlos hasta la aplicacion. procesarlos internamente o bien con intervenci6n del usuario y. en un soporte asociado a1 mismo ordenador en el que se ejecuta la aplicacibn. principalmente Internet. La expansion de las tecnologias WWW en las aplicaciones actuales. la necesidad de almacenar y recuperar informacion es una constante casi invariable. la posibilidad de acceder a ellos de manera simultanea desde multiples puntos. 10s mecanismos utilizados para transferir la informacih desde su origen hasta la aplicacion.Independientemente de la finalidad concreta que tenga una cierta aplicacion. A1 fin y a1 cabo. como el acceso a 10s datos a trav6s de redes publicas. o viceversa. tambi6n de manera invariable. Es precis0 conectar con el origen de 10s datos. mientras que en otras lo hace de forma remota. finalmente. o la transformation a y desde estandares como XML.

Normalmente cada una de esas soluciones est6 asociada a una determinada herramienta de desarrollo o lenguaje. En la plataforma Microsoft .NET existe una biblioteca de clases que representan 10s servicios de la propia plataforma. como DAO.NET previa conversion de sintaxis. mientras que JDBC es Litil s610 en caso de que se trabaje con el lenguaje de programaci6n Java. y plataformas que cuentan con sus propios servicios de datos. adem&. Pueden elegir el lenguaje de programaci6n que requieran sin. metodos. motores de acceso a datos que pueden usarse desde distintos lenguajes. no obstante. ADO.NET: la soluci6n de acceso a datos de Microsoft . entre 10s cuales se encuentra ADO. No es el objetivo de este libro entrar en 10s detalles especificos de cada una de ellas sino. El c6digo MSIL es independiente de procesador y sistema operativo. bases de datos que cuentan con su propio lenguaje de programaci6n. como puede imaginar. aplicaciones en las que 10s datos se alojan en un archivo en el propio ordenador.Las soluciones o mecanismos de acceso a datos han sido y. centrarnos en el estudio de ADO. puede aplicarse a C# y otros lenguajes . manteniendo exactamente las mismas clases de objetos. por ahora.NET sin diferencias. como JDBC y ADO. seguirfin siendo muchos y diversos. La plataforma Microsoft . Decimos global porque puede aplicarse tanto a casos simples. por ello.NET.NET a1 considerarse el lenguaje m6s extendido en este momento. DAO y ADO. con conexi6n permanente o no a1 origen . Cada una de estas soluciones tiene sus particularidades. por poner un ejemplo. La elecci6n de una de ellas suele limitar 10s origenes de datos a 10s que puede accederse. hasta las tipicas aplicaciones cliente / servidor.NET supone un nuevo universo de posibilidades para 10s programadores. C O ~ O el caso de 10s conocidos como archivos indexados de es COBOL. problemas. ventajas y requerimientos.NET es una solucidn global de acceso a datos diseiiada como una evoluci6n de ADO. Tenemos lenguajes que gestionan directamente sus formatos de archivo. sistema o plataforma.NET. o bien a un modelo de objetos. propiedades y eventos. s610 pueden ser usados desde lenguajes que contemplan el trabajo con objetos COM. s610 existen en Windows y. desde dBase y Access hasta cualquier RDBMS actual. si bien en este libro se ha optado por basar 10s ejemplos en Visual Basic .NET. Estos servicios pueden emplearse desde cualquier lenguaje . comprometer 10s servicios a 10s que tienen acceso o las posibilidades de compartir c6digo con otros desarrolladores. determinar el rendimiento y la escalabilidad de las aplicaciones. lo cual permite ejecutarlo en plataformas como Pocket PC. Linux o FreeBSD. La CLS representa una interoperabilidad entre lenguajes sin precedentes hasta ese momento. ADO o BDE. El cbdigo.

familiarizarse con el entorno de Visual Studio . compatibilidad y transportabilidad. N E T Standard o alguna de las ediciones de Visual Studio .NET se ha optado por un nuevo esquema de trabajo con 10s datos. Dicho entorno cuenta con elementos que. en general. asi como un menor us0 de recursos en 10s servidores. cualquier origen para el que exista un controlador OLE DB u ODBC lo que. No es &te. seleccionar conjuntos de informacibn. el entorno de Visual Studio . Professional. superior a la de otras soluciones existentes en la actualidad. Con ADO. ejecutable desde la linea de comandos. etc.NET puede.NET. la ejecuci6n de un cursor de acceso a la informacion o la representaci6n binaria de forma interna. Aunque es posible utilizar todos 10s servicios de ADO. veremos cdmo aprovechar las posibilidades del entorno de Visual Studio . basado en DBMS o no.Prograrnacidn de bases d e datos con Visual Basic .NET. Independientemente de que est4 utilizando VisuaZ Basic . en la mayoria de 10s casos. un esquema en el que se prescinde de elementos como la conexi6n continua con el servidor u origen de datos. Todos esos conocimientos se asume que el lector ya 10s tiene.NET. aplicaciones y servicios Web. lo cual nos permite centrarnos especificamente en un tema: el acceso a datos con ADO. crear autom6ticamente 10s objetos necesarios para acceder a ellos desde programa.NET o bien conocer 10s servicios bdsicos de la plataforma . s610 est6n disponibles en las ediciones superiores. facilitar de forma notable nuestro trabajo. El libro que tiene en sus manos no est6 pensado para aprender a programar con Visual Basic . aplicaciones distribuidas basadas en Internet. definirlos. En ADO. SQL Server. bases de datos Microsoft Access.NET para trabajar con documentos XML. Enterprise Developer o Enterprise Architect. significa pricticamente todos 10s origenes posibles. Como tendr6 ocasi6n de ver en este libro. ya sea local o remoto. escalabilidad. El rendimiento obtenido es. hay ciertas operaciones b6sicas que siempre tendremos a1 alcance. nos permiten establecer conexiones con origenes de datos. Una vez que nos hayamos familiarizado con ADO. un . aplicaciones en varias capas o n-tier y.NET desde Visual Basic .NET.NET para la creaci6n de aplicaciones Windows. El resultado es un increment0 en rendimiento.NET de datos. en ocasiones. como el Explorador de servidores.NET. Otras. podemos usar ADO. y sepamos c6mo usar sus clases para efectuar todas las operaciones habituales.NET. Oracle y.NET es posible acceder a practicamente cualquier origen de datos. por supuesto.NET sin m6s ayuda que un editor de textos simple y el compilador de Visual Basic . estructurado o jerArquico. por el contrario. en la prgctica. por tanto.

NET para construir aplicaciones Windows y Web. Visual Studio . Aprender6 a acceder a distintos origenes de datos. a 10s cuales recomendamos titulos como Programacidn con Visual Basic . A1 redactar este libro se ha tenido como primer punto de mira el contenido didictico. recuperar informacih. La segunda parte se centra en el estudio de ADO. si bien la mayor parte del contenido es aplicable a cualquier edicih. la del equiPO donde va a probar 10s ejemplos propuestos. por tanto. El libro esti dividido en cuatro partes: Sentar las bases.NET.NET. A diferencia de otros titulos. establecer relaciones y restricciones. de la misma editorial y de tip0 mas gen6rico. trabajar con conjuntos de datos o usar XML con .NET y Resolucidn de cusos concretos.NET. El autor ha empleado la edici6n Enterprise Architect de Visual Studio . No obstante.ADO. ADO. entre otros Microsoft Access. . nos servirii para conocer la terminologia que va a utilizarse a lo largo del libro. comparativas entre 10s objetos de ADO y ADO. 0 Disponer del software cliente y servidor de datos usado en 10s ejemplos. Para alcanzar estos objetivos es indispensable que su configuraci6n. cuente con estos elementos: 0 Tener instalado Visual Basic . por ello 10s fundamentos y conocimientos se van abordando de manera escalonada. capitulo a capitulo. manipularla y devolverla. Con este libro podra usar ADO.NET. En 10s capitulos respectivos se tratarin las bases de estas aplicaciones y. No encontrari. el mecanismo de acceso a datos empleado en Visual Basic 6. compuesta de tres capitulos. Oracle 8i e InterBase. asumiendo que 6sa sera la secuencia inicial de lectura.0 y otras herramientas previas a la aparici6n de Visual Studio .In troduccidn libro adecuado para aquellos que desconocen el lenguaje o el entorno. tan s610 necesita saber c6mo utilizar Visual Basic .NET o descripcih de procesos tomando como base 10s de ADO.NET sin necesidad de conocer previamente ningh-i otro mecanismo de acceso a datos.NET. instalarlas y configurarlas en su sistema. ni DAO ni ninguna otra soluci6n previa. incluida la citada Visual Basic . asi como unos fundamentos del lenguaje SQL y ciertas aplicaciones que pueden actuar como origenes de datos. se indicara c6mo obtenerlas. copiindolos en su sistema.NET Standard o algunas de las ediciones de Visual Studio . una vez que haya adquirido la visi6n global de 10s temas que se tratan. en algunos casos. en 6ste no se parte de que el lector conoce ADO.NET. sus clases y la forma de usarlas para conectar con un origen de datos. Contar con una unidad de CD-ROM desde la cual recuperar 10s ejemplos del disco que acompaiia a1 libro.NET o Guia pra'ctica para usuarios de Visual Studio .NET Standard.NET. muchos capitulos tambien pueden usarse a mod0 de consulta o referencia. La primera de ellas. Microsoft SQL Server 7/2000.

mediante las cuales pueden facilitarse muchas de las tareas que. se aborda la resoluci6n de un cierto caso: la ejecuci6n de un procedimiento almacenado en SQL Server. Sede Web de la editorial Anaya Multimedia . se han efectuado manualmente mediante la escritura de c6digo. Internet Figura 1. en la cuarta parte. Por dltimo. B. encontrarQuna serie de capitulos en 10s que.Programacidn de bases de datos con Visual Basic .NET. de forma especifica y mediante un ejemplo.1. en la parte anterior. Tambi6n se estudian 10s componentes con vinculaci6n a datos que simplifican la construcci6n de interfaces de usuario.son algunos de 10s temas estudiados.NET En la tercera parte se tratan las herramientas visuales de datos de Visual Studio . la creaci6n de una columna calculada en un conjunto de datos o el almacenamiento y recuperaci6n de imQgenes.

Si desea ponerse en contact0 con el autor para plantear exclusivamente alguna cuesti6n relativa a este libro.com. en http://www.com. asi como a las secciones de Complementos y Fe de erratas. Desde la Web de la editorial. puede hacerlo a traves de la Web Torre de Babe2.AnayaMultimedia. el lector puede recurrir tanto a la editorial como directamente a1 autor. en http: //www. .lntroduccidn En caso de encontrar algun problema con este libro o el CD-ROM que le acompaiia.fcharte.puede acceder a la secci6n Atencion al cliente para acceder a1 soporte tbcnico.

n .

para que pueda leer c6modamente 10s demis capitulos de este libro.NET. ningiin conocimiento relativo a1 trabajo con datos. conocidos como ADO. conceptos y tdrminos. puede recurrir a textos que traten con mayor profundidad la teoria del tratamiento de bases de datos.NET. compilaci6n. No se asume. expresi6n condicional. etc. en general. campo que tambien cuenta con sus propios conceptos y terminologia especifica. Posteriormente. documentos XML y. bucle. el autor asume que ya se conocen 10s terminos habituales en cualquier lenguaje de programach: variable. sentencia. tema sobre el que encontrard libros monogrdficos. Origenes de datos Los servicios de acceso a datos . cualquier origen de datos. A pesar de no ser dste un titulo dedicado a 10s fundamentos de tratamiento de datos. no exclusivamente sobre lo . en este capitulo se abordan 10s elementos que podrian considerarse bisicos: ique es un DBMS o el lenguaje SQL?. jcdmo se estructuran 10s datos en filas y columnas? o iqu6 es XML? son algunos de 10s contenidos de este capitulo. dependiendo de su inter& y necesidades.NET para trabajar con bases de datos. pueden ser usados para operar sobre origenes de datos diversos. El objetivo no es otro que facilitarle 10s conocimientos indispensables. por el contrario. Como programadores.Este libro estA dirigido a desarrolladores que necesitan utilizar 10s servicios de ADO.

ALlO. del que va a e traerse o en el que se va a introducir informacibn. estruct ra ni naturaleza.NET. utilizando para ello diversos proveedores de acceso .1. la prim ra cuando se quiera dar un sentido general y la segunda a1 hacer referencia concr ta a un DBMS. I l-----l r I Figura 1. Terminologia y conceptos que se conoce como bases de datos. una hoja de cdculo Microsoft Excel. el Direct rio Activo de Windows 0. En el texto encontrar6 ambas expresiones. ADO. Utilizando el paradigma del origen de datos. cualquier recurso para el que exista un pr veedor de datos . es el recurso. por tanto.1. en general.NET es realmente un mecanismo de acceso a datos unive sal. un documento XML. ya sea local o remoto. El origen d e datos. sin asumir su localizacibn. Un origen de datos puede ser una base de dat SQL Server. teniendo un sentido mucho m amplio que el de base de datos. Esto tiene como ventaja fundamental el ahorro de trabajo para el desarrollado a1 no tener que recurrir a sistemas diferentes dependiendo de 10s datos que se pr tendan manipular o recuperar.NET actua como intermediario entre las aplicaciones y 10s posibles origenes de datos.

fundamental para poder operar sobre ellos. no es la configuraci6n miis adecuada para construir un acceso multiusuario. En el tercer capitulo se entrarii a estudiar con mayor detalle la naturaleza de 10s origenes de datos.NET.NET usando ADO. ocupdndose de su almacenamiento y recuperaci6n de 10s archivos en que se encuentran. facilitando el acceso a ella desde diferentes puestos. aplicaciones cuyo objetivo no es s610 almacenar y recuperar datos. limitiindose a solicitar a1 servidor las operaciones que quiere efectuar.NET pueden utilizarse desde una aplicacion con interfaz de usuario. Aunque una base de datos de escritorio o local puede colocarse en una unidad compartida de red. Por otra parte. . es decir. Es el caso de Microsoft Access. Una base de datos puede definirse como uno o mds archivos en 10s que se almacenan 10s datos y toda la informaci6n que describe su estructura. son bases de datos locales. S El origen de datos por excelencia es la base d e datos.NET Los servicios de ADO. raz6n por la cual estas bases de datos cuentan con una interfaz de usuario bastante completa y amigable. Las primeras estiin dirigidas principalmente a usuarios con ciertos conocimientos que le permiten crear y mantener sus estructuras de informacibn. Las bases de datos pueden ser de distintas categorias. un componente que se ejecuta en un servidor. En general. es posible recurrir a ADO. describiendo basicamente aquellos m6s conocidos a 10s que podemos acceder desde Visual Basic . Tambien se caracterizan por no contar con un middleware que permita tener el software en una msquina y 10s datos en otra distinta. siendo el tip0 mds habitual el de las bases de datos relacionales.NET desde cualquier punto de una aplicacion que se ejecute en un sistema donde este disponible la plataforma . dBase o Paradox. las bases de datos tambikn se dividen en dos clases: bases de datos de escritorio y servidores de bases de datos. De esta forma las aplicaciones no tienen que conocer la estructura de dichos archivos.NET. Tambikn suele conocerse como servidor d e datos a1 ordenador en el que se ejecuta dicha aplicaci6n. Se llama servidor de datos a una aplicaci6n que se encarga de manipular fisicamente 10s datos.Programacion de bases de datos con Visual Basic . M y RDBMS S Los servidores de bases de datos son sistemas de administraci6n de informaci6n o DBMS. un servicio Windows o Web. En este caso resultan mucho miis eficientes y seguros 10s servidores de bases de datos.

SGBD.1. Aunque en un principio surgieron DBMS de distintos tipos. ejecutando el software que denomin6bamo antes servidor de datos. deberia estar instalado en su m6quina. estand instalado dicho software en una mAquina que reside en un centro de proceso d datos. Ese software cliente e especifico para cada servidor de datos existente. Algunos ejemplos de RDBMS son 10s ya mencionados SQ Server. por tanto. dBase y Paradox. las bases de datos se han utilizado en sistemas que se ajustaban una arquitectura conocida como clientelservidor. En ella 10s datos residen en u ordenador que actua como servidor. La diferencia estA en que cada maquina accederia a sus datos directamente. Tambien se conoce a 10s DBMS por sus siglas en nuestro idioma. asi como asegurar su integridad verificando restricciones utilizando transacciones. Desde su ordenador. por poner un caso. como si 10s archivos se encontrasen en ella. llamados asi porque 10s datos se estructuran con ciertas relaciones entr ellos. Arq uitectu ra clienteiservidor Durante aiios. a pesar de la posibilidad indicada antes de colocar 10s archivos de datos en una unidad compartida de red. no pueden utilizarse en una arquitectura clientelservidor real. ubicado en otra planta del mismo edificio. se comun caria con ese servidor mediante el software cliente de SQL Server que. 10s m6s extendidos y conocidos son 10 RDBMS. desde ordenadores remotos. mientras que en una arquitectura cliente/servidor real el . teniendo que dispo ner del software cliente que corresponda en cada caso. Supongamos que estd utilizando SQL Server como servidor de datos. como 10s citados Access. aunque su us0 es menos habitual. simplificando la recuperaci6n y el tratamiento y evitando la repetici6n inne cesaria de informaci6n. Los usuarios. temas que se tratar6n de inmediato. Las bases de datos de escritorio. Terrninologia y conceptos sin0 tambien facilitar la manipulaci6n de 6stos de la forma m6s eficiente y segura Un servidor de datos debe elaborar la informaci6n que va a devolver a1 cliente partir de 10s datos recuperados del sistema de archivos. 16gicame te. usando para ellos diferen tes estructuras fisicas. Dicho software cliente no serviria par comunicar con un servidor Oracle o DB2. Oracle. segun la estructur con la que se almacenaba la informacibn. DB2 o InterBase. se sirven de u software cliente para comunicarse con el servidor de datos. no son servidores de datos y.

Concretamente aparece un servidor de datos.NET cliente nunca accede directamente a 10s datos. y varios clientes. Cliente 1 Cliente 2 Cliente 3 Router 1 Servidor de datos Figura 1.2. Aunque en dicha imagen no se ha representado. Configuracion clientelservidor de acceso a una base de datos . sin0 que delega ese trabajo en el servidor. en la superior. ~ En la figura 1.Programacidn de bases de datos con Visual Basic . se supone que tanto clientes como servidor tienen sus respectivos paquetes de software instalados. en la parte inferior.2 puede ver representada una tipica configuracibn cliente / servidor.

Un sistema distribuido en tres capas En este modelo 10s clientes no tienen acceso direct0 a 10s datos. La figura 1.3 es una representaci6n visual de este modelo. Terrninologi'a y conceptos Partiendo del modelo cliente / servidor. 1 Cliente I Cliente 2 Cliente 3 aplicaciones Servidor de datos Figura 1. trabajo que que da en manos de 10s componentes que se ejecutan en el servidor de aplicaciones .3. sino que entre ellos se interpone un nuevo servidor: e de aplicaciones. siendo el m i s habitual el three-tier o de tres capas. han surgido otros conocidos gen6ricamente como n-tier.1 . . En dicho modelo 10s clientes no se comunican directamente con el servidor de datos. descrito brevemente en el punto anterior.

creando aplicaciones segun las caracteristicas. Por ejemplo un componente para poder operar sobre las hojas Excel. De esta forma. no necesitamos otros servicios segun el tip0 de datos con 10s que vayamos a trabajar. etc. Gracias a esa necesidad de 10s usuarios tenemos trabajo 10s desarrolladores. por una parte. a su vez. interconectados no en redes de la propia empresa sino a travks de Internet. adem&. Como se indicaba anteriormente. Para que nuestros programas puedan trabajar con 10s archivos donde reside la informacidn. con ADO. En cuanto a nosotros respecta. ya sea nativa en un ordenador. esa posibilidad pondria en peligro la propia seguridad de 10s datos. La ventaja principal es que resulta mas f6cil llegar a clientes heterogheos y dispersos. adem&. es una soluci6n global para el acceso a la informacibn. en la mayoria de 10s casos el usuario necesitar6 una soluci6n a medida de sus necesidades. tarea que en el modelo cliente / servidor recaia en la aplicaci6n del cliente. lo que normalmente se conoce como reglas de negocio. Aparte de complejo para aquellos que no tienen conocimientos de bases de datos y del lenguaje SQL. Aunque ciertos tipos de informacion son accesibles para el usuario mediante aplicaciones especializadas. otro para comunicarse con bases de datos. ADO. no obstante.NET.NET.NET para acceder a 10s origenes de datos. por ejemplo. el cliente queda relegado a una simple interfaz de usuario. Aqui es donde entra en escena ADO. la unica diferencia seria que la aplicaci6n estaria dividida en dos apartados: la interfaz del usuario. un tercero para leer y escribir documentos XML. que 10s usuarios utilizasen el software de administraci6n para operar directamente sobre un servidor de datos como SQL Server u Oracle. bases de datos locales y remotas. y 10s componentes que se ejecutarian en el servidor de aplicaciones y accederian a 10s datos. No seria logico. por otra. alojan la 16gica de proceso de la informacibn. necesitaremos diversas herramientas. entre ellas uno o varios servicios de acceso a datos.NET podemos tanto operar sobre archivos XML. Nosotros contamos con 10s servicios de ADO. documentos Excel. nombre con el que se denomina gen6ricamente a 10s servicios de acceso a datos de la plataforma Microsoft . utilizando para ello un modelo de objetos y componentes que tendra ocasi6n de conocer en un capitulo posterior.Programacidn de bases de datos con Visual Basic . etc. en lugar de otra general. precisa de otros .NET.NET Dichos componentes.NET. por ejemplo Microsoft Excel para las hojas de calculo o Paradox para las bases de datos propias de Paradox. conocimientos y necesidades de nuestros clientes. ADO. un documento en un navegador Web o desde un dispositivo m6vil.

En el primer caso. comunicindose directamente con el software cliente de esas dos bases de datos sin intermediario alguno. Visual Basic .NET que. Suponga que quiere. con el servidor.NET: uno para SQL Serve y otro capaz de emplear cualquier controlador OLE DB. y por ello hay que recurrir a las soluciones genericas. como una serie de definiciones de clases alojadas en un Ambit0 con nombre o namespace clases que pueden usarse para acceder a un determinado origen de datos.NET especifico. y mediante ODBC a IBM DB2 o InterBase En estos casos empleariamos un m6dulo o componente de software adicional a proveedor OLE DB u ODBC: el controlador especifico del origen a1 que va a acce derse. que facilitan la comunicaci6n con 10 origenes de datos y ejecuci6n de ciertas operaciones. po tanto. El pro veedor de datos para SQL Server y el de Oracle son especificos. Terminologi'a y conceptos elementos para poder efectuar su trabajo. mediante una infraestructura de red. empleari el controlado ODBC adecuado. Hay disponibles dos m6s que instalar6 posteriormente.NET incorpora por defect0 dos proveedores de datos . Ni que decir tiene que el acceso mediante proveedores genkricos implica m6 carga de proceso y.NET especificos para estos tipos de datos. En alguna ocasiones. En la figura 1. desde el punto de vista del desarrollador. un menor rendimiento en la aplicaci6n. Los proveedores . recuperar datos de una hoja de cilculo Excel o comunicarse con una base de datos IBM DB2 o InterBase.1 . puesto que existe un proveedo . a1 menos no por el mo mento. En e segundo. Un proveedor ADO. el proveedor genkrico ODBC de . Mediante un contro lador OLE DB se puede acceder a Excel. uno para Oracle y otro dirigido a1 us0 de un contro lador ODBC. por el contrario. desde una aplicaci6n propia. por el contrario. puede ser la h i c a via para poder llegar a una cierta in formaci6n. Utilizamos. el cliente tan s610 precisa el software cliente de SQL Server y ya puede comunicarse.NET aparecen. por tanto. entre ellos 10s proveedores y 10s controladores.NET es una implementacibn especifica de una serie de com ponentes que facilitan el acceso a un determinado origen de datos.4 puede ver representados dos supuestos en 10s que un cliente necesita acceder a dos origenes de datos diferentes: una base de datos SQL Serve y una base de datos IBM DB2. a su vez. son de tip0 genkrico diseiiados para aprovechar todos 10s controladores que ya hay disponibles de esos dos tipos. L Aparte de 10s componentes ADO.NET. per0 si un controla dor ODBC que sabe c6mo hablar con el software cliente de DB2. en ocasiones tambikn necesi taremos conocer algun lenguaje especifico segun la naturaleza del origen de datos . sin embargo. Los proveedores OLE DB y ODBC. No hay proveedores . no existe ese proveedor especifico.

4. por ejemplo. I IBMDB2 Figura 1. creado hace algo m6s de veinte afios y conocido originalmente como SEQUEL. Acceso a d o s origenes de datos diferentes El lenguaje de consulta de datos por excelencia entre 10s RDBMS es SQL. Realmente SQL se compone de varios sub-lenguajes. podria efectuarse una seleccidn de datos en un documento XML. Aplicacion cliente 0. El primer0 de ellos se utiliza para definir las estructuras de 10s datos que se manipulan con el . principalmente DDL y DML.Programacidn de bases de datos con Visual Basic .NET Mediante XPath.

- - _ _ _ La informaci6n almacenada en una base de datos pertenece generalmente a objetos reales que es posible identificar fdcilmente. aunque sus valores Sean diferentes. una editorial. Los RDBMS introducen la informaci6n en tablas. un autor. Esos objetos cuentan con una serie de propiedades. independiente de cud1 sea este. aunque el titulo de cada uno sea distinto a1 igual que el ISBN o el numero de pdginas. cada fabricante de un product0 RDBMS cuenta con su propio derivado de SQL para efectuar esas tareas. por ejemplo. En un RDBMS ese conjunto de atributos seria una tabla. posteriormente en otros capitulos nos ocuparemos del resto de origenes de datos. Terrninologia y conceptos I segundo. que pueden ser consideradas como conjuntos de entidades cada una de las cuales tiene una serie de atributos. la mayoria de 10s RDBMS tambien emplean SQL para otros fines como la implementacion de procedimientos almacenados. etc. A1 trabajar con bases de datos de escritorio es habitual llamar carnpo a cada atributo y registvo a cada entidad. ~ - ~ ~ . Toda la informacih de ese objeto formaria una entidad. un ISBN y un numero de pdginas. Los atributos de una entidad se reparten en una fila. un precio. En la figura 1. todos 10s libros tienen un titulo. Los atributos almacenan datos en un cierto dominio y. cada una con identicos atributos per0 diferentes valores. .5 puede ver un conjunto de entidades formado por tres entidades. Es decir. un numero de piiginas. Ademiis de para manipular la informacih. ocupando cada atributo una colurnna. una editorial. A1 conjunto de varias filas. mientras que cada dato seria un atributo de la entidad. Ciriiendonos ya a las bases de datos relacionales. cada entidad seria una fila y cada atributo una colurnna.1. un libro tiene un titulo. un ISBN. cada una de las cuales cuenta con cuatro atributos. en algunas ocasiones. En realidad. es a lo que se conoce como conjunto d e entidades. Los puntos siguientes son un recorrido rdpido por 10s conceptos mds importantes relativos a la estructura de la informaci6n en un RDBMS. Conocer el lenguaje SQL es fundamental para poder trabajar con bases de datos. Tambibn encontrarii en el capitulo siguiente una breve introduccih a dichos lenguajes. Observe que todas las entidades que pertenecen a un conjunto tienen 10s mismos atributos. mientras que Oracle utiliza PL/SQL. SQL Server. encontramos una serie de terminos y conceptos que tambien es precis0 conocer. con estructura de tabla bidimensional. sirven para establecer relaciones con otras entidades. por ello en el siguiente capitulo podrd encontrar una introduccih a DDL y DML. cuentan con el lenguaje T-SQL. Por ejemplo.

utilizindose como atributo de identidad de cada una de las entidades. tendr6 un dominio que limite la introducci6n a 13 caracteres ajustados a un cierto formato. evitar que se introduzca en una tabla informaci6n relativa a un elemento que no existe en otra.5. asegurando asi la integridad de la informaci6n. por ejemplo. A1 tiempo. el atributo P a g i n a s contaria con un dominio que tan s610 permitiese la introducci6n de valores numericos comprendidos entre 100 y 2000. cuando se definen asociados a columnas en un RDBMS. y que permite identificarlas de manera unica.Atributo Titulo Atributo Editorial Atributo ISBN Atributo Pdginas Conjunto de entidades Figura 1. reglas que pueden ser mucho m i s complejas que un dominio.5. Los dominios. El atributo ISBN del ejemplo mostrado en la figura 1. En realidad. impiden la introducci6n de valores incorrectos en la base de datos. Ademis. Que las entidades tengan un atributo de identidad es algo indispensable en 10s RDBMS. Es el clisico cddigo que se asocia a las filas. las entidades suelen contar con un atributo a1 que se aplica una restricci6n que le obliga a contener un valor unico entre el conjunto de entidades. Una restriccidn se define como el conjunto de reglas de validaci6n de un cierto atributo. normalmente un numero consecutivo generado por la propia base de datos. Conjunto de tres entidades con cuatro atributos cada una D O . ldentidad de una Por norma. por ejemplo. De manera aniloga. Mediante una restricci6n es posible. * 10s A conjunto de valores que puede tomar un atributo es a lo que se llama domi1 nio. las reglas de normalizacion comentadas brevemente m i s adelante exigen la existencia de ese atributo de identidad. por poner un ejemplo. . ya que facilita el establecimiento de relaciones entre distintos conjuntos de entidades y hace posible la integridad referencial mediante restricciones de claves externas. 10s dominios son un tip0 de restricci6n. se evita que la aplicaci6n tenga que estar comprobando continuamente la validez de 10s valores introducidos por 10s usuarios.

6.5. En el caso de que las entidades no dispongan de un atributo de este tip0 se afiadiria un atributo artificial que permitiese la identificacihn.NET 1 1 1 e4-115-1351-1 84-415-1392-9 84-415-1376-7 672 656 65h Figura 1. Relacion entre dos conjuntos de entidades El atributo Editorial de la primera entidad que hay en el primer conjunto indica que la editorial es la numero 1. Las relaciones entre tablas pueden ser de diversos tipos. mientras que actua como clave externa en la entidad correspondiente a cada libro. estableciendo asi una relaci6n con la primera entidad del segundo conjunto. Es lo que ocurre en el caso de la figura 1. conjuntos de enti Los conjuntos de entidades que conforman una base de datos. Mediante una restricci6n de integridad referencial se evitaria que el usuario pudiese introducir en una entidad de la tabla de libros un c6digo de editorial que no existiese en la segunda tabla. sin0 un numero que la identifica.ILf 1. en forma de tablas.7). Estas claves tambi6n suelen conocerse como PK y FK. Terrninologia y conceptos En el ejemplo mostrado en la figura 1. otra restricci6n podria impedir la eliminaci6n de una editorial del segundo conjunto mientras existiesen en el primer0 entidades que hicieran referencia a ella. que conocer6 b6sicamente en un punto posterior. por el .NET Visual S t u d i o . que en el conjunto de entidades de la figura 1. siendo las mAs habituales las conocidas como uno-a-uno y uno-a-muchos. De manera anAloga. por ejemplo. en el que cada fila de la tabla de libros apunta a una sola fila de la tabla de editoriales. En la figura 1. el atributo I S B N podria actuar como identidad de cada entidad ya que es irrepetible. E V i s u a l CB . No tiene sentido. vlsuai B ~ S ~NC T . persiguen evitar la repetici6n de datos en las tablas a fin de ahorrar espacio. Si invirti6semos la relaci6n (v6ase figura 1.6.5 se repita el nombre de la editorial en cada entidad. En el primer caso a cada entidad del primer conjunto le corresponde s610 una entidad del segundo. generalmente guardan ciertas relaciones entre ellos. Las reglas de normalizaci6n de las bases de datos relacionales. El numero 1 es el atributo identidad o clave primaria de cada entidad editorial. Ese numero es el atributo identidad de las entidades del segundo conjunto. Observe que el segundo atributo de cada libro ahora no es el nombre de la editorial.6 se pueden ver dos conjuntos de entidades: uno relativos a libros y otro a editoriales.

Cada vez que se inserta. modifica o elimina una tabla de la cual depende uno o varios indices.NET 1 1 1 84-415-1351-1 84-415-1392-9 84-415-1376-7 672 656 656 Figura 1. Relacion de tip0 uno-a-muchos Al hablar de relaciones suele usarse con cierta frecuencia el termino maestrodetalle. Un indice es una lista de claves con una estructura tal que el servidor puede realizar busquedas de forma muy ripida en ella. el proceso de recuperaci6n de datos puede verse afectado de manera considerable. Un mecanismo comun para acelerar esa operaci6n son 10s indices. en este ejemplo concreto tres.Programacidn de bases de datos con Visual Basic . . un indice tambi6n puede ser utilizado para establecer el orden en el que se almacenarin las filas en una tabla. nos encontrariamos con el segundo caso. Hace referencia a un tip0 de relacion en la que una tabla actua como maestra o primaria y otra como tabla de detalle o secundaria.NET contrario. incluso.NET V i s u a l C # .7. Anaya M u l t i m e d i a O'ReiLly V i s u a l 5ds1c .NET V i s u a l S t u d i o . Las claves pueden estar formadas por el contenido de una o varias columnas de una tabla. millones de filas. por cada fila de la editorial de tablas tendriamos multiples filas de la tabla de libros que le corresponden. de principio a fin. Es ficil deducir que cuintos m i s indices existan m i s tiempo seri necesario para efectuar cualquiera de esas operaciones. Ademis de acelerar la busqueda de informacih. A1 trabajar con tablas de tamafio considerable. seria precis0 recorrer la tabla de libros completa. con muchos miles 0. Es 16gico si tenemos en cuenta que para. encontrar todos 10s libros de una editorial. dando lugar a una relacion uno-a-muchos. el servidor tiene que actualizar no s610 la tabla de datos sin0 tambi6n todos 10s indices que existan a fin de que Sean consistentes con la informaci6n actual. por ejemplo.

-----_ ~ -~ . real o creado a prop6sit0.___I____ _ _ _ _ I _ ___- ^____l___l_ll _______I__ _ _ _ _ ~ - I ~ ~ A1 operar sobre un RDBMS del tipo Oracle. Esto es especialmente cierto en aquellos casos en 10s que la informaci6n manipulada se aloja en dos o mas tablas y. Sybase o InterBase. Otra norma comun del proceso de normalizacih es evitar la duplicidad de datos.6 normalizando la base de datos.NET En capitulos posteriores podri conocer 10s fundamentos de la definici6n de procedimientos almacenados en algun RDBMS. persiguiendo la menor repeticion de informaci6n y la mayor flexibilidad. no solo recuperaci6n de datos. con menos atributos.5 y que hemos solucionado en la figura 1. el atributo identidad es un dato.Prograrnacidn de bases de datos con Visual Basic .- _ I El proceso de normalizacion de una base de datos se compone de varios pasos que se apoyan en un conjunto de reglas formales relativamente estrictas. las tablas normalizadas suelen ser mas pequefias. que las tablas no normalizadas. De lo que se trata. que nunca se repite entre las entidades. En una base de datos normalizada lo habitual es que exista un mayor numero de tablas que en otra que no lo esta. Otra regla indica que todos 10s atributos que se empleen para establecer relaciones entre tablas deben ser claves o formar parte de un indice para acelerar su proceso. bisicamente. Aunque seguramente 10s dos aspectos mas importantes del proceso de normalizaci6n Sean kstos. podria generarse una inconsistencia entre 10s datos. ---. . TaI y como antes se indicaba. existen otros que tambikn deberian considerarse para conseguir el objetivo de un disefio racionalizado y 16gico. _ _ ~ _ _ _ _ _ _ _ _______-__-. asi como su ejecuci6n desde una aplicaci6n propia a travks de ADO.-- I _ I _ ___I I - -~ -___- . En consecuencia. todas las actuaciones que impliquen manipulacih de la informacih. en forma de consultas dificiles de expresar por parte del programador o usuario y de ejecutar por parte del RDBMS.NET. Es lo que ocurria en el ejemplo representado en la figura 1. tanto dentro de una misma tabla como entre las tablas que componen la base de datos. Dos de Ias reglas fundamentaIes de este proceso son: Cada entidad debe contar siempre con un atributo identidad que actue como clave primaria y unica.- --. tienen lugar en el Qmbito de una transacctdn. por tanto. SQL Server. es de racionalizar tanto el contenido de las tablas como las relaciones existentes entre ellas. DB2. Es importante que no existan relaciones demasiado complejas entre tablas que provoque dificultades a la hora de recuperar informacion. 10s que podriamos considerar servtdores de datos. facilitando de esa manera la identificacih inequivoca de cada una de las filas de una tabla.

generalmente no tendremos que preocuparnos de iniciar y finalizar las transacciones de forma explicita. Simplemente ha desaparecido o quiz5 est6 en el limbo. de tal manera que o se efectcia o se rechaza completa. entre otros datos. como veremos en su momento. ya que hay un mecanismo que se encarga de hacer ese trabajo por nosotros. introducir6 datos sobre operaciones bancarias. finalizando tambi6n la transaccion. . una vez concluida. tales como restricciones. ejecuci6n de desencadenadores. Para que este sistema sea realmente util es necesario que el sistema de transacciones del RDBMS cumpla con las propiedades conocidas como ACID: 0 La atornicidnd de la transacci6n hace que todas las operaciones que comprende Sean vistas por el RDBMS como una sola. no se perder5 a pesar de 10s problemas posteriores que pudiesen encontrarse. an5logamente. por ejemplo el cajero de una oficina. La confirmacidn de una transacci6n implica su finalizaci6n. etc. Terrninologia y conceptos Suponga que crea una aplicaci6n para una entidad bancaria en la que el usuario. Que una transacci6n tenga entre sus propiedades el aislamiento implica que las operaciones intermedias que se efectuen. cuando va a sumarlo a la cuenta del proveedor. Las transacciones se confirman o se rechazan. el cajero introduce 10s dos c6digos de cuenta y el importe a transferir.1. Asi se consigue una independencia total en el trabajo de multiples transacciones concurrentes. no existiendo la posibilidad de que el trabajo quede a medias. momento en el que dichos cambios se confirman. Mediante la consistencia se garantiza el cumplimiento de las reglas que lleven asociadas las operaciones introducidas en la transaccibn. iQu6 ha ocurrido con la operacibn? En ese momento ya no est5 el dinero en la cuenta del cliente. S610 cuando se han finalizado 10s cambios en todas las tablas afectadas se termina la transacci6n. Con ADO. En el supuesto anterior de la transferencia bancaria. 0 0 Por ciltimo tenemos la durabilidad o persistencia. esa situaci6n no deberia darse nunca. la transaccih dejaria en su estado original todos 10s datos afectados. las realizadas en esta transaccion no Sean visibles en otras hasta que se confirme. De rechazarse. Obviamente. asi como la conversi6n en definitivos de 10s cambios provisionales que se hubiesen efectuado. la propiedad que da la garantia de que la transaccibn. h a asegura que 10s datos que se manipulen no son escritos de manera inmediata en la base de datos.NET. A1 iniciar las operaciones sobre la base de datos la aplicaci6n deberia iniciar una transacci6n. per0 tampoco en la del proveedor. de la cual se recuperaria posteriormente. se produce un fallo en el sistema. antes de finalizar la transacci6n. sino en un espacio temporal. A1 pulsar un bot6n su aplicaci6n deduce el importe de la cuenta del cliente y. si se produjese un fallo en el punto indicado la transacci6n no se finalizaria y quedaria en un espacio conocido como limbo. no son visibles para nosotros y. Atendiendo a un cliente que quiere efectuar una transferencia desde su cuenta a la de un proveedor.

como es el caso de HTML. facilitando asi la comunicaci6n entre aplicaciones y sistemas sin importar el tip0 de procesador. sistema operativo o lenguaje de programaci6n empleados.NET se almacenan internamente en dicho formato. ademds. que se ocupa no de 10s datos en si sin0 de su representaci6n visual. ya que se trata de un lenguaje que en 10s ultimos afios ha encontrado aplicaci6n en prscticamente todos 10s campos de la informAtica. En la plataforma . tambi6n se pueden definir esquemas XSD para asegurar que la estructura de 10s documentos es correcta.NET no s610 podremos operar sobre documentos XML sin0 que. Es muy fdcil. aunque tambien se abordar6 el us0 de origenes de datos locales como documentos XML. A pesar de su naturaleza.Programacidn de bases de datos con Visual Basic . Como veremos posteriormente. A1 finalizar el primer0 de este trio de capitulos introductorios ya conoce una parte del vocabulario que usaremos en el resto del libro. no obstante. Tambi6n en 10s capitulos siguientes tendr5 oportunidad de conocer SQL y aprender a definir bases de datos y sus distintos elementos en ciertos sistemas RDBMS. De la misma forma.NET existen servicios especificos para trabajar con documentos XML. . XML es un lenguaje que se centra en la definici6n de la estructura de 10s datos. En la mayoria de ejemplos que se propondrdn posteriormente trabajaremos sobre una arquitectura cliente/servidor o de tres capas. asi como conceptos fundamentales que puede ampliar recurriendo a otras fuentes especificas. El beneficio es que XML se almacena y transfiere a trav6s de redes no en un formato binario. A1 trabajar con ADO.NET XML Seguramente ya sepa qu6 es XML y c u d es su finalidad. no para la presentaci6n de esos datos. en contraposici6n a otros. como venia siendo habitual en cualquier medio para el almacenamiento de datos. como si fuesen origenes de datos locales. tambien podemos actuar sobre ellos mediante ADO. En XML es posible definir marcas propias segun se precise.NET. 10s conjuntos de datos en ADO. definir una hoja de estilo XSL y aplicarla a un documento XML para obtener una representach visual de la informaci6n. sin0 como texto simple. facilitando asi la creaci6n de estructuras de informaci6n a medida. XML es un formato para el almacenamiento de datos con definici6n implicita.

' . . .. ..... .'... I .. .. .. :? 7. .-...x_l. .. . ..

por ejemplo. desde la definition de su estructura hasta la manipulaci6n de 10s datos propiamente dichos. realmente todos aquellos que contemplan la definici6n de procedirnientos alrnacenados. Si necesita conocer a fondo este lenguaje siempre tiene la posibilidad de recurrir a un texto especifico o la referencia del lenguaje de su RDBMS en particular. contemplan el us0 del lenguaje SQL para efectuar cualquier tarea sobre la informacion.NET. cuenta con componentes capaces de generar las sentencias SQL necesarias para actuar sobre las bases de datos. Tambien se facilita. o sea puramente. lo cierto es que conocer el lenguaje SQL resultar6 totalmente imprescindible. Actualmente todos 10s DBMS. Algunos RDBMS. como veri en su momento. una breve introduccih a dos derivados de SQL: Transact-SQL y PL/SQL. a1 final del capitulo. ADO. utilizan tambien SQL como base para un lenguaje propi0 de tip0 procedimental. del desarrollador que del administrador de bases de datos.A pesar de que nuestro papel en la empresa este m6s cerca. per0 ser6n muchos 10s casos en que dichas sentencias deban facilitarse desde la aplicacion que estemos creando. seleccionar un conjunto de datos o modificar informaci6n ya existente en la base de datos. facilitando una explicaci6n de sus estructuras b6sicas que le permitan. . crear una tabla. incluidos aquellos que no son servidores como es el caso de Access o dBase. Obviamente no se intenta abordar la sintaxis completa de SQL y todas sus posibilidades. El objetivo de este capitulo es acercarle a1 lenguaje SQL.

A diferencia de 10s lenguajes de programacibn que estard acostumbrado a usar. eliminar o crear un indice. y asumiendo que existe un DBA que se ocupa del RDBMS. compuesto de varios sub-lenguajes. o casi. actualizaci6n y eliminacih. facilitando la gestion de usuarios y el otorgamiento o denegaci6n de 10s permisos necesarios para operar sobre cada elemento de la base de datos. en principio. entre 10s cuales destacariamos 10s tres siguientes: 0 DML: Es la parte m6s conocida del lenguaje SQL. Existe. etc. 10s programadores tan s61o tendrian que conocer DML para efectuar su trabajo. un conjunto de SQL que podriamos calificar de rninirno comtin denominador. a1 ser idbntico. en realidad. El lenguaje SQL est6. de tal manera que el desarrollador s610 precisaria conocer el subconjunto DML de SQL para poder ejecutar consultas y manipular 10s datos segun las necesidades de 10s usuarios de las apli- . SQL es un lenguaje para consulta de datos. como las estructuras de control. donde cada dato se procesa de manera individual. La realidad. deberian quedar en manos del administrador del RDBMS de la empresa a la que se dirija la aplicacidn. es que cada RDBMS incorpora sus mejoras o extensiones particulares a1 SQL esthdar. en SQL no existen ciertos elementos. dando asi lugar a implementaciones especificas e incompatibles con las del resto de fabricantes. 0 0 DCL: Mucho menos conocido que 10s dos anteriores. sino la informacih de su estructura.2. Con las sentencias DDL pueden definirse las columnas de una tabla y sus atributos. este lenguaje se compone de sentencias especificas para garantizar la seguridad de acceso a 10s datos. DDL: Con las sentencias DDL no se manipulan 10s datos propiamente dichos. deberiamos poder w a r exactamente la misma sintaxis independientemente del RDBMS concreto que vayamos a utilizar. Tedricamente. la definici6n de las estructuras de la base de datos. por lo que no es un lenguaje que pueda ser utilizado para crear procedimientos. en todos 10s RDBMS existentes. a1 formar parte de 41 todas las sentencias de manipulaci6n de datos: extracci6n de informacibn. SQL es un est6ndar ANSI. asi como 10s temas relativos a la seguridad. Su finalidad b6sica es facilitar la manipulaci6n de datos como si fuesen conjuntos. en contraposici6n a1 tratamiento que se e f e c t ~ a desde 10s lenguajes de programacidn. sin embargo. no obstante. lo cual significa que existe una especificaci6n creada por dicha institucih y que. S Q L y sus dialectos Como su propio nombre indica. Tebricamente.

SQL. sin embargo. Si bien. y T-SQL (tambien conocido como Transact-SQL). pues dichos elementos no existen en esos productos. deberi recurrir a la herramienta especifica de la base de datos que pretenda emplear en sus desarrollos. Por esa raz6n. Estas operaciones se implementan en forma de desencadenadores y procedimientos almacenados. en el editor de Visual Basic . A partir del punto siguiente va a ir conociendo multiples sentencias SQL para selecci6n de datos. no es un lenguaje procedimental y. Estas sentencias no puede introducirlas. no disponen de un lenguaje similar a PL/SQL o T-SQL para la implernentacion de procedimientos almacenados. en contraposicion a la Iogica discreta.NET caciones. puesto que su entorno de trabajo es el interior de un RDBMS. evaluar expresiones condicionales o definir una ejecucidn reiterada. para la que estan pensados PL/SQL y T-SQL. lo que no es totalmente necesario para comprender la sintaxis de SQL. aportando 10s elementos necesarios para definir procedimientos. Una de ellas es la ejecuci6n de una cierta 16gica de proceso que asegure la integridad de 10s datos 0. estos lenguajes tienen una sintaxis basada en la de SQL. como se ha dicho antes. recuperar y manipular la informacidn. Dos de 10s lenguajes derivados de SQL m i s conocidos son PL/SQL. Access y Paradox. siempre dirigida al tratamiento de datos. con un completo lenguaje de programacion que permite crear verdaderas aplicaciones.r Programacidn de bases de datos con Visual Basic . . por tanto. necesitaremos aprender uno u otro dependiendo del RDBMS que utilice nuestra empresa. sin mis. Lbgicamente. tambien encontrari una r6pida introducci6n a algunas de las sentencias de DDL y DCL. propio de las bases de datos Oracle. eliminaci6n y definici6n de algunas estructuras. en un principio. con el paso del tiempo se han ido confiando a estos sistemas de tratamiento de datos otras tareas adicionales. Por regla general. En 10s puntos siguientes. Las bases de escritorio.NET y esperar a que funcionen. no puede ser utilizado para dar soluci6n a estas necesidades.simplemente. modificacibn. siendo precis0 un lenguaje de programaci6n para efectuar dicha implementacibn. no obstante. Si cuentan. como dBase. cada fabricante de RDBMS incorpora en su product0 un lenguaje propio para desempefiar esas tareas. que podemos encontrar en SQL Server o Sybase. la finalidad de 10s RDBMS era bisicamente la de almacenar. Si quiere ir comprobando 10s ejemplos propuestos. segun las sentencias SQL facilitadas desde algun tip0 de aplicaci6n o por el usuario. haga m i s f6cil su tratamiento por parte de las aplicaciones.

para ello. es muy variable.1. Desde Microsoft Access es posible definir consultas mediante asistentes. el Interactive SQL de InterBase (v6ase figura 2. no entraremos en este momento en detalles sobre c6mo usar una herramienta u otra.4).S Q L y sus dialectos Puede usar una base de datos de escritorio. por ejemplo Microsoft Access (v6ase figura 2. Esta puede ser el Analizador de consultas SQL de SQL Server (v6ase figura 2.2).1). En cualquier caso. per0 tambien pueden escribirse de forma manual Debe tener en cuenta que la compatibilidad de las distintas implementaciones SQL en cada RDBMS respecto al estandar SQL. Antes de poder manipular datos mediante DML.2. es necesario que dichos datos existan ya en la base de datos y. es precis0 definir las estructuras que 10s . en el pr6ximo capitulo conocera algunas de ellas. Esto implica que algunas sentencias SQL puedan necesitar ligeros cambios segun la base de datos sobre la que vaya a ejecutarse. Figura 2. ya que permiten la ejecucion de un subconjunto del lenguaje SQL. sino que nos centraremos en la sintaxis de SQL. o bien la utilidad de SQL interactivo del RDBMS con que cuente. normalmente se toma como referencia SQL-92 y SQL3.3) o bien el SQL*Plus Worksheet de Oracle 8i (v6ase figura 2. sin mbs.

El Analizador de consultas de SQL Server facilita la ejecuclon de se tencia SQL sobre este RDBMS.NET albergarh. el lenguaje de definicih de datos. mostrando 10s resultados en la parte inferior de la ventana . Estas estructuras conforman lo que se conoce habitualmente como el catulogo del RDBMS.Prograrnacidn de bases de datos con V i s u a l Basic .2. Figura 2. Aunque con un nombre diferente y sobre otro RDBMS.3. el Interactive SQL de InterBase es una herramienta similar a la de SQL Server . Por esta raz6n comenzaremos introducihdonos en DDL. Conexmes 1 Figura 2.

. ALTER: Con este comando es posible modificar algunas de las estructuras de una base de datos. DROP: Acepta las mismas palabras clave que el comando CREATE. eliminar o modificar. per0 no modificarse. tablas. por supuesto. solo parte de ellas. por ejemplo. La utilidad SQL*Plus de Oracle es posiblemente la mas rudimentaria. Las vistas. S Q L y sus dialectos Figura 2. modificar y eliminar todos esos elementos.2.4. indices. No acepta todas las palabras clave de 10s dos comandos anteriores. desencadenadores. crear las tablas definiendo las columnas que t e n d r h . crear indices y vistas y. al estar practicamente basada en texto sin elementos de interfaz que faciliten las operaciones basicas Mediante DDL es posible crear una base de datos. TABLE: Tabla. procedimientos almacenados y vistas. Dependiendo del caso aceptar6 m6s o menos par&metros adicionales. Dependiendo del elemento que se pretenda crear. pueden crearse y eliminarse. si bien la finalidad es eliminar el elemento indicado en lugar de crearlo. segun la palabra clave que se indique a continuacih. tras el comando ird una de las palabras clave siguientes: DATABASE: Base de datos. Los comandos DDL son tres: CREATE: Se utiliza para crear bases de datos.

y estamos conectados a ella. tambien es posible utilizar 10s comandos DROP ALTER con DATABASE para eliminar una base de datos o modificar alguno de sus parametros. asistente que va dirigido a1 DBA. Dependiendo del RDBMS empleado. espacio de almacenamiento. el siguiente paso 16gico es crear las tablas que alojar6n 10s datos. segun el RDBMS con que trabajemos. S La creaci6n de una nueva base de datos es un proceso relativamente complejo. PROCEDURE: Procedimiento almacenado. usuarios con que cuenta y otra serie de reglas adicionales. INDEX: indice. a1 ser precis0 definir su contenido y estructura. Por ello pr6cticamente todos 10s RDBMS incorporan un asistente para efectuar este trabajo. La sintaxis general para la definici6n de una nueva tabla en una base de datos es la siguiente: . o bien ser una especificacion de nombre de archivo en si mismo. caso en el cual existir6n opciones adicionales para indicar la localizacih y nombre fisico de 10s archivos donde ser6 alojada.NET 0 0 VIEW: Vista. Como desarrolladores. Una vez que ya tenemos la base de datos creada. definiendo 10s atributos de cada una de dichas columnas. en ocasiones. del RDBMS sobre el que est4 trabaj6ndose. permisos de acceso. 0 0 Los pardmetros adicionales dependerhn del comando y. tan s610 necesitariamos emplear la sintaxis siguiente en caso de que fuese imprescindible crear la base de datos desde nuestra propia aplicacih. TRIGGER: Desencadenador.d a t o s El nombre de la base de datos puede ser un nombre 16gic0. asi como la creaci6n de claves primarias.Programacio'n de bases de datos con Visual Basic . A1 tiempo. tambi4n es posible establecer las restricciones para cada una de las columnas. La sintaxis bdsica para crear una nueva base de datos seria &a: CREATE DATABASE n o r n b r e _ b a s e _ d e .

en su lugar. TIME: Una hora. per0 lo mas importante es el nombre que deseamos dar a la tabla y la lista con la definicih de las columnas. un sin6nimo para VARCHAR2. FLOAT:Un numero en punto flotante. por lo que una columna que tenga esta restriccih podria tomar perfectamente uno de esos valores. kste se encuentra en desuso y. : 0 VARCHAR (N) : Una cadena de hasta N caracteres. ~ ~ . 0 En SQL Server no existe el tip0 DATE y. En realidad VARCHAR es. S Q L y sus dialectos CREATE TABLE nornbre-tabla ( rmnlbre c o l u m n a t i p o o p c i o r l e s . PRIMARY KEY: Establece la columna a la que acompafia como clave primaria o principal de la tabla. un tip0 que determinara la clase de informacion que puede contener y opciones adicionales. . Los tipos de datos suelen ser especificos de cada DBMS. garantiza que 10s valores incluidos en esta columna seran tinicos. normalmente de 16 bits. como atributo de identidad de cada fila. si bien existe un conjunto basico definido en el estandar ANSI que mas o menos es compatible en todos 10s sistemas. Algunas de las opciones posibles son: NOT NULL:Indica que la columna no puede quedar sin valor. I Pueden existir pariimetros adicionales.2. con longitud variable. es decir. Lo mismo ocurre con el tip0 INTEGER. CHAR (N) Una cadena de N caracteres con longitud fija. se utiliza normalmente VARCHARZ. cada una de las cuales tendrii un nombre. nonibre c o l u m n a tip0 o p c i o n e s . y de manera opcional. a pesar de que existe el tipo estilndar VARCHAR. 0 DATE:Una fecha. Hay que tener en cuenta que una cadena de caracteres vacia o un cero no es igual a NULL. en su lugar. 0 SMALLINT:Un numero entero de menor tamafio que el anterior. pueden aplicarse restricciones y definir claves. Algunos de esos tipos son: INTEGER: Un numero entero. se utiliza el tip0 DATETIME para alojar fecha y hora. a1 ser en dicho RDBMS el tip0 NUMBER el mas empleado para tipos numkricos. en Oracle 8i. En Oracle.dicho de otra manera. 0 UNIQUE: Esta restricci6n impide que en la columna asociada puedan existir dos valores identicos 0. que en Oracle es un sin6nimo de NUMBER ( 3 8 ) ... normalmente de 32 bits. Tras el tip0 de cada columna.

que hace referencia a una clave primaria de otra tabla. llamada Editorial en esta tabla. Las opciones PRIMARY KEY y FOREIGN KEY pueden tanto seguir a una columna como disponerse a1 final de la lista de columnas. Autor VARCHAR(501.NET Esto suele conllevar el hecho de que 10s valores de dicha columna deban ser unicos. la ejecucion de una sentencia como la anterior provocaria un error. dicha tabla deberd existir y la columna IDEditorial seria su clave primaria. El us0 de VARCHAR tambien ahorra espacio en la base de datos. dependiendo del DBMS que emplee. En algunos DBMS. 0 FOREIGN KEY:Define una colurnna como clave externa. donde col seria la referencia a la tabla y columna externa. identificando a cada una de las filas que pudieran existir en la tabla. caso en el cual se indicaria entre parhtesis. De no contar con ellos. para crear una tabla puede necesitar ciertos permisos o privilegios. Para 10s RDBMS. aunque con un mdximo. hay que aiiadir el apartado REFERENCES ( col). ademas. Aunque parezca redundante aiiadir una columna como identidad de cada fila. como puede verse. en realidad estd ahorrdndose espacio y se mejora el rendimiento. Se ha utilizado una colurnna INTEGER como clave unica en lugar de la columna 1S BN que. encontramos la definici6n de una clave externa. . debera preceder el nombre de la nueva tabla con el esquema donde quiera crearla si es que dicho esquema no es el asumido por defecto. ISBN CHHR(13I UNIQUE. el nombre de la columna o columnas que actuarian como clave primaria o clave externa. que hace referencia a la columna IDEditorial de la tabla Editoriales. sin embargo. alberga valores unicos. en contraposici6n a ISBN que siempre tendra 13 caracteres. a1 ocupar tan s610 el espacio necesario para almacenar cada valor en lugar de asignar el mdximo posible. Lbgicamente. Debe tener en cuenta que.Programacion de bases de datos con V i s u a l Basic . A continuacibn tiene un ejemplo de creaci6n de una tabla simple: CREATE TABLE Libros ( IDLibro INTEGER PRIMARY KEY. FOREIGN KEY (Editorial1 REFERENCES Editoriales ( IDEditorial) ) Tenemos una columna que actua como clave principal. En este ultimo caso. detras de KEY. Por ultimo. Titulo VARCHAR(30) NOT NULL. resulta mucho mas fdcil gestionar una clave que es un numero que una cadena de 13 caracteres. Las columnas T i t ul o y Auto r tienen una longitud variable.

Si deseamos eliminar una tabla completa. En este caso el comando CREATE TABLE nombre iria seguido no de una lista de columnas. Las modificaciones a una tabla pueden ser de distintos tipos. Para crear un indice utilizaria la siguiente sintaxis: CREATE INDEX NombreIndice ON NombreTabla(Co1umna) . En cualquier caso.2 . no tenemos m& que usar la sintaxis mostrada en el ejemplo siguiente: DROP TABLE Libros Aunque las tablas son el centro de cualquier base de datos. t a m b i h existen otros elementos de us0 comun. desde aiiadir o eliminar una columna o una restriccibn hasta modificar la definicih original de la columna para cambiar el tipo. tras la cual dispondremos la palabra ADD. o DROP si queremos eliminarlo. algo que es obvio si la columna se elimina. sino de una consulta SQL que recuperaria de otra tabla o tablas 10s datos con 10s que se generaria la nueva tabla. la sentencia la iniciaremos con ALTER TABLE N o m b r e T a b l a . ALTER. a la hora de crear una tabla en una base de datos. para modificarlo. entre ellos 10s indices y las vistas. Por ejemplo: ALTER TABLE Libros DROP COLUMN ISBN ALTER TABLE ADD ISBN VARCHAR(13) ALTER TABLE Libros ALTER COLIJMN Titulo VARCHAR(35) Hay que tener en cuenta que la modificacion del tip0 de una columna puede irnplicar una perdida de datos. consiste en hacerlo a partir de 10s datos que ya existen en otra tabla. a1 ser fisicamente las que alojan la informacih. S Q L y sus dialectos Otra posibilidad. para aiiadir un nuevo elemento. tipos y opciones. corno en el ejemplo anterior.

a las que se asocia un nombre.Nombre.Titulo FROM Editorial.que trataremos en un punto posterior. a1 que llamar6 NombreIndice. apareciendo a 10s ojos de 10s usuarios como si fuesen tablas. ldgicamente. partiendo de las hipotgticas tablas Editoriales y Libros que se han empleado en ejemplos anteriores.NET El nombre de la tabla y la columna determinan la informaci6n a partir de la cual el DBMS generar6 el nuevo indice. Con la siguiente sentencia SQL generariamos un indice que aceleraria dichas btisquedas. es posible indicar si el orden del indice ser6 ascendente o descendente. Aunque con ciertas limitaciones. conocer la sentencia DML SELECT. En el ejemplo siguiente se crea una vista que facilita todas las editoriales con 10s libros que tienen publicados. Tras el nombre de la tabla y columna. La creaci6n de un indice tiene sentido sobre aquellas columnas que van a emplearse con cierta frecuencia en las consultas para buscar u ordenar. podriamos definirlas como consultas SQL predefinidas. S610 puede aparecer una de ellas. per0 es de esperar que en la mayoria de las ocasiones la busqueda se efecttie a partir del ISBN. Las vistas se definen una vez. cuyo objetivo es facilitar la vida a 10s usuarios y programadores. respectivamente. I I En cuanto a las vistas. con las cl5usulas ASC y DESC. La sintaxis para definir una nueva vista es &a: C R E A T E V I E W NombreVista AS Consulta Para componer la consulta necesitaremos. por ejemplo evitando que tengan que componer complejas consultas con relaciones entre multiples tablas para obtener 10s datos que precisan. El indice es en si una estructura ordenada que acelera tareas como las busquedas o la obtenci6n de 10s datos con un cierto orden.IDEditorial=Libros. Libros. es posible definir como vista pr6cticamente cualquier consulta. C R E A T E I N D E X I n d I S B N ON Libros ( I S B N ) Un indice puede eliminarse con la sentencia DROP INDEX NombreIndice y.Programacio'n de bases de datos con V i s u a l Basic . Libros WHERE Editorial. tambien modificarse mediante el comando ALTER. de manera opcional.Editorial . C R E A T E V I E W LibrosEditorial A S SELECT Editorial. y posteriormente pueden ser usadas tantas veces como se necesite. normalmente es trabajo del administrador o DBA. La tabla Libros que hemos utilizado en 10s ejemplos anteriores dispone de una columna que actua como clave principal. en algunos DBMS.

I S W H E R E E d i t o r 1a 1 . La consulta asociada a una vista puede modificarse con la sentencia ALTER VIEW. L i b r c . J i t o r i a l A S S E L E r T E d i t .> r i a l . se incluya el ISBN. la eliminaci6n de una vista es tan simple como ejecutar la sentencia DROP VIEW NombreVista. Asimismo. Nota Segun se indicaba al inicio de este punto. 10s mismos comandos CREATE. borrados. UPDATE: Con este comando es posible cambiar la informacih alojada en una o m i s filas. Si con DDL definimos las estructuras para el almacenamiento de 10s datos. seria una tabla temporal con dos columnas. N s r n l n r e . suele hacerse us0 del lenguaje especifico del RDBMS para efectuar la implernentacion de una cierta Iogica. consecuentemente. Se utiliza para ejecutar consultas La de recuperacih de datos. ISBN FROM E d i t o r i a l .2. procedimientos almacenados y otros elementos. ALTER y DROP pueden utilizarse tambien para crear desencadenadores. y tantas filas como combinaciones de editoriales y libros existan en las tablas. . L i b r o s . en estos casos. una con el nombre de la editorial y otra con el titulo del libro. Las posibilidades y sintaxis.1DEd I t~c i a 1=Lib r o s EIJ i t~ r i a 1 r o . cuatro 10s comandos DML que necesitaremos para poder llevarlas a cabo: 0 SELECT: sentencia DML por excelencia. varian en mayor medida de un DBMS a otro. a1 ejecutar esta vista. 0 0 DELETE: Se utiliza para eliminar una 0 m6s filas. Para crear un desencadenador o procedimiento almacenado. etc. dedicado a DDL. por ejemplo: ALTER VIEW L i b r o s E . Aqui hemos modificado la vista anterior para que. en lugar del titulo de 10s libros. Las operaciones fundamentales de manipulacih de datos son cuatro y. I N S E R T : Su finalidad es insertar nuevas filas en una tabla. modificaciones. . efectuando consultas para recuperar datos. por ejemplo. con DML podremos manipular 10s datos propiamente dichos. S Q L y sus dialectos El resultado.

en principio ser6 la unica opci6n disponible a menos que las tablas de datos sobre las que se trabaje tengan ya informaci6n previamente. incluso. podemos afectar a varias 0. __ __ ___ I _ -- Si creamos una aplicaci6n para que 10s usuarios puedan trabajar sobre una base de datos. Por ejemplo: INSERT I N T O Libros ( I D L i b r c . valor . entre parhtesis. La sintaxis de la sentencia I N S E R T es la siguiente: INSERT INTO NornbreTabla VALlJES ( v a l o r . y entre parhtesis. sin0 sobre conjuntos de filas y columnas.Programacidn de bases de datos con Visual Basic . como puede ser Visual Basic.) Tras la palabra VALUES. utilizariamos una sentencia asi: INSERT I N T O L i b r o s V A L I J E S (1. Suponiendo que quisiksemos afiadir una fila a la tabla L i b r o s creada como ejemplo en un paso anterior. asi como a ver algunos ejemplos de su uso. la tabla completa. De hecho.1 ? 5 1 .NET'.4 1 5 . y que contaba con cinco columnas. 3 ) En caso de que desee introducir datos en menos columnas de las que existen en la tabla.NET A diferencia de lo que ocurre con las sentencias de un lenguaje de programaci6n tipico. por supuesto. ' n 4 . En el caso de que se viole alguna restriccibn. estas sentencias DML no actuan sobre un solo elemento.1 ' . ( 1 . en el mismo orden y del mismo tipo. deberia especificar las columnas de destino detr6s del nombre de la tabla. inadvertidamente. Es importante tenerlo en cuenta a la hora. Los valores numericos se introducen tal cual. como que un valor no sea unico en una columna que debe serlo o que se entregue como una clave externa un valor que no se encuentre en la tabla de destino. por ejemplo. puesto que. '84-415-1351-1') ISBN) V A L l J E S El resto de las columnas de esa fila quedarian con el valor NULL. de utilizar una sentencia DELETE para eliminar una fila. una operaci6n biisica es la inserci6n de nuevos datos. la inserci6n no se efectuari y generari un error.. . ' F r a n c i s c o Charte O j e d a ' . ademhs. mientras que las secuencias de caracteres normalmente se delimitan entre comillas simples. . se facilitarin tantos valores como columnas existan en la tabla indicada y. que sus restricciones no lo impidan. ' P r o g r a m a c i h n con V i s u a l Basic . En 10s puntos siguientes va a conocer la sintaxis b6sica de cada una de las cuatro sentencias indicadas. siempre..

S Q L y sus dialectos Como se apuntaba anteriormente. agruparlas. pudiendo usar el alias en toda la consulta. Esto puede hacer algo farragosa la codificaci6n de consultas complejas. Para ello no tenemos m i s que poner dicho alias tras el nombre original de la tabla. todas las filas con todas las columnas. es necesario hacer referencia alas columnas utilizando la notaci6nNombreTabla. A u t o r FROM L i b r o s Esta consulta retornaria el titulo y autor de todas las filas existentes en la tabla L i b r o s .Editoria1 . asi como algunas diferencias de implementaci6n segun el RDBMS. a continuaci6n de la palabra FROM. _ I ~ I ~ _ _ _ _ I _ . en la siguiente consulta se asocia el alias L a la tabla L i b r o s : SELECT L. La sintaxis m6s sencilla de esta sentencia es la siguiente: SELECT C o l u m n a l . T i t u l o . la sentencia SELECT nos permite asociar un alias a cada una de las tablas participantes en la consulta. sin necesidad de especificar el nombre de cada una. Afortunadamente..Por ejemplo: SELECT T i t u l o . Posiblemente tambien sea la que con m6s opciones y variantes cuenta. Colurnrla2. la sentencia S E L E C T es la m i s conocida de SQL y es que.2. ademis. es decir. aunque tambien es posible recuperar un dato concreto como resultado de la evaluaci6n de una expresi6n. L . _ _ . podemos sustituir la lista que sigue a la palabra S E L E C T por un asterisco: SELECT * FROM L i b r o s En este caso se obtendria la totalidad de la tabla L i b r o s . Usualmente esto no es necesario. especialmente. . FROM L i b r o s L L. Si queremos obtener todas las columnas de la tabla.~ ~ _ _ _ I _ _ I _ _ _ _ CI I _ _ _ - __ Como va a ver en 10s puntos siguientes. se limitan las filas mediante condiciones. repitiendo el nombre completo de la tabla una y otra vez. cuando se usa m6s de una tabla para generar la consulta. etc.ISBN. FROM T a b l a El conjunto de datos devuelto se compondri de las columnas seleccionadas en todas las filas de la tabla indicada tras FROM. no en vano.. compuesto de multiples filas y columnas. por ello se seleccionan s610 las columnas que se precisan en cada caso y. Tambikn es posible establecer el orden en que se facilitan las filas recuperadas. efectuar consultas sobre consultas. Por ejemplo. N o m b r e C o l u m n a . es generalmente la m6s utilizada. a la hora de establecer condiciones y. Lo habitual es que el resultado de una sentencia SELECT sea un conjunto de datos.

nos debe resultar relativamente fdcil comprenderla ya que est6 basada en la evaluaci6n de expresiones condicionales. sin0 que contienen valores. en 10s que se compara si el valor de una columna es igual. Aparte de la cl6usula FROM. con operadores relacionales como =. no tenemos porqu6 usar la notaci6n L .unica obligatoria y con la cual se indican las tablas de las que va a recuperarse la informacibn. en este caso Bill Gates. hubiera bastado con facilitar directamente el nombre de la columna. a diferencia de columna. podemos indicar 10s nombres de cada una de ellas tras la palabra SELECT.j La condici6n se asemejard bastante a 10s condicionales que estamos acostumbrados a utilizar en Visual Basic.NET En este caso concreto no tiene mucho sentido ya que. encargada de aplicar uno o m6s condicionales basdndose en 10s cuales se filtrardn las filas a devolver. Condicionalcs complcjos Ademds de condicionales relativamente simples. y segundo porque. en la cldusula . Titulo FROM LIBROS WHERE Editorial=S AND Precio<bO En el primer caso obtendriamos la lista de libros escritos por un cierto autor. Para seleccionar un determinado conjunto de filas no es posible utilizar una tkcnica similar. < y > y operadores 16gicos como AND. por tanto. la sentencia S E L E C T puede contar. a1 participar una sola tabla en la consulta. Una de ellas es la cldusula WHERE.. primer0 porque las filas no tienen nombres. Por ello la soluci6n tiene que ser totalmente diferente pero. OR y NOT. Titulo FROM Libros WHERE Autor='Bill Gates' . mayor o menor que otro valor dado. mientras que en el segundo la lista se compondria de todos 10s libros de la editorial con el c6digo 3 cuyo precio no sea superior a 60 euros. ya que el numero de columnas con que cuenta una tabla suele ser pequeiio y. I S BN para seleccionar la columna ISBN. con varias mds.Prograrnacidn de bases de datos con Visual Basic . Seleccicin de Eilas Indicar en la consulta qu6 columnas deseamos incluir en el conjunto de resultados es bastante sencillo. una tabla puede alojar miles o incluso millones de filas.. opcionalmente. Encontrard una mayor aplicaci6n al us0 de 10s alias de tablas en 10s puntos siguientes. Por ejemplo: SELECT I S B N . SELECT I S B N . Esto permite una gran flexibilidad a la hora de seleccionar conjuntos de datos. como programadores. La sintaxis de la consulta seria la siguiente: SELECT C o l u r n n a s FROM Tablas WHERE C o n d i c i j i .

sin necesidad de especificar el titulo completo. Con el operador LIKE podemos efectuar comparaciones no absolutas entre 10s valores de una columna y un valor dado 0. 'Tit 1 1o 1 FROM Libros WHERE A u t o r I N ('Bill Gates'. Por ejemplo. Sirve como ejemplo la mostrada a continuacion: S E L E C T 1S BN . evit6ndonos asi la construccion de tres condicionales con el operador = unidos mediante AND. ' P a u l Allen'. Mediante el operador IN es posible crear una expresion que serd cierta en caso de que el valor de la columna indicada a la izquierda contenga uno de 10s valores delimitados entre parhtesis. Por ejemplo: SELECT ISBN. 'Steven J o b s ' ) En esta consulta se seleccionan todos 10s titulos escritos por 10s tres autores indicados entre parhtesis. AND Precio BETWEEN 3 0 AND 5 0 AND T i t u l o L I K E 'Visual%' 'Steven Jobs') . a la derecha del operador. T i t u l o FROM L i b r o s WHERE A u t o r I N ( ' B i l l Gdtes'. T i t u l o FROM L i b r o s WHERE P r e c i o BE. S Q L y sus dialectos WHERE pueden emplearse elementos adicionales que nos permiten crear condicio- nales realmente complejas. dando lugar a consultas mucho mds elaboradas. mucho m6s flexibles. 'Paul A l l e n ' .TWEEN 3 0 AND 5 0 No olvide que todas estas expresiones simples pueden combinarse. mediante el cual es posible especificar un rango de valores en el cual deberd encontrarse una cierta columna para ser incluida en el conjunto de resultados. Por ultimo tenemos BETWEEN. A 10s operadores relacionales cldsicos hay que aiiadir otros. LIKE y BETWEEN. si queremos obtener todos aquellos libros cuyo precio se encuentre entre 30 y 50 euros podemos utilizar una consulta como la siguiente: SELECT ISBN. Por ejemplo: SELECT ISBN. Tras el operador L I K E debemos facilitar. entre comillas simples. como I N . T i t u l o FROM L i b r o s WHERE T i t u l o LIKE ' V i s u a l % ' En este caso obtendriamos la lista de todos aquellos libros cuyo titulo comience con Visual. facilita la busqueda de un cierto patron entre 10s valores de una columna. dicho de otra forma. mediante 10s operadores logicos. el patron a buscar.2.

Dicho valor se obtendria como resultado de la consulta. podemos utilizar las funciones de agregaci6n. Por ejemplo: SELECT Titulo. adem&. segun deseemos un orden descendente o ascendente. En caso de que Sean varias. siempre hemos seleccionado como resultados una serie de columnas existentes en las tablas. costasen entre 30 y 50 euros y. escritos por Bill Gates. las filas recuperadas con la sentencia S E L E C T no aparecerian en un orden concreto. y funciones de resumen o agregacidn. Por ejemplo: SELECT * FROM L i b r o s ORDER BY T i t u l o Con esta consulta obtendriamos una lista completa de todas las filas que hay en la tabla Libros ordenadas alfabeticamente por el contenido de la columna Titul o . Hasta ahora. Precio * 1. un aspect0 que podemos alterar f6cilmente mediante la cl6usula O R D E R BY. sin0 sobre todas las columnas recuperadas a partir de la consulta.NET El conjunto de datos obtenido estaria formado por todos aquellos libros que. Podemos alterar el orden mediante las palabras DESC y ASC. Tambien existe la posibilidad de introducir expresiones. Es posible que este no sea el orden que m6s nos interese. aparte de las columnas que nos interesen.Programacidn de bases de datos con Visual Basic . Si lo que necesitamos no es operar sobre una cierta columna de una fila. es decir. como en este caso. Paul Allen o Steven Jobs. . en las consultas mostradas como ejemplo en 10s puntos anteriores. S En principio. Lo unico que tenemos que facilitar a O R D E R BY es el nombre de la columna que actuar6 como referencia para la ordenacih. usando como operando el valor de una o varias columnas. separariamos el nombre de cada una de ellas mediante comas. de la A a la Z . SUM ( ) : Suma 10s valores de la columna indicada de todas las filas del conjunto. Para obtener. aunque lo usual es que se devuelvan en el mismo orden en que aparecen en la tabla. tan s610 tenemos que incluir la expresih apropiada como si de una columna m6s se tratase. su titulo comenzase con la palabra V i s u a l .04 FROM L i b r o s Con esta consulta se obtendria una lista de titulos de libros y una segunda columna que tendria el precio m6s un 4 por ciento. Las de us0 m6s corriente son: 0 0 COUNT ( ) : Cuenta el numero de filas obtenidas como resultado. El orden seria de menor a mayor. per0 no afectaria en absoluto a1 contenido de la tabla Libros. datos obtenidos a partir de algun ciilculo u operacih.

S Q L y sus dialectos AVG ( ) : Efectua una media sobre 10s valores de la columna indicada de todas las filas del conjunto. por ejemplo una lista de editoriales y 10s libros correspondientes a cada una. Por ejemplo: S E L E C T Editorial. la informacih de un pedido y las lineas asociadas. 6sta puede ir seguida del nombre de una o m6s columnas. como en el punto previo. que es ejecutado en el RDBMS y devuelto a la aplicacih. MINiPrecio). Un resultado asi. de tal forma que las filas de la consulta se agrupan segun 10s valores de ellas. No es extrafio. MINiPrecio). Enlnc En todos 10s ejemplos previos se ha operado exclusivamente sobre una tabla de la base de datos. sin embargo. cada fila contendria el numero de titulos de esa editorial. Tras la cl6usula FROM puede aparecer cualquier numero de tablas. sin0 una fila por editorial. Cuando en una sentencia SELECT aparece una o m6s funciones de agregacibn. Las funciones de agregaci6n encuentran su mayor utilidad cuando se emplean de manera combinada con la clausula de agrupamiento de la sentencia SELECT: GROUP BY. M I N ( ) : Halla el valor minimo de la columna indicada entre todas las filas del conjunto. asi como el precio del libro mas barato y el del m6s caro. puesto que no se ha aiiadido una cliusula WHERE. MAXiPrecio) FROM L i b r o s El resultado obtenido seria una sola fila conteniendo el numero total de filas de la tabla Libros. Para poder asociar 10s datos de las distintas tablas. que sea precis0 recuperar columnas de dos o m6s tablas. El siguiente es un ejemplo de us0 de estas funciones: SELECT COUNTiPrecio). etc.2. puede ahorrarnos muchas sentencias de programa Visual Basic. Ademas. MAX ( ) : Halla el valor maxim0 de la columna indicada entre todas las filas del conjunto. MAXiPrecio) FROM Libros G R O U P BY Editorial En este caso no se obtendria una sola fila de resultados. segun se Vera en el punto siguiente. asi como 10s precios minimo y mdximo de 10s titulos de esa editorial. y tras SELECT todas las columnas que se necesiten de esas tablas. COUNT(Precio). y componer adecuadamente cada fila del conjunto de datos re- . las unicas columnas adicionales que pueden incluirse son las utilizadas para efectuar agrupamientos.

La consulta podria ser la siguiente: SELECT E. L.Nombre. utilizando exactamente la misma tecnica. Con este fin se utilizan las claves primarias y externas que se definieron previamente. Precio FROM Libros WHERE Precio > (SELECT AVGiPrecio) FROM Libros) El resultado de la subconsulta no tiene que aplicarse necesariamente a un condicional. Libros L WHERE E. agrupamientos y el orden que nos interese. Todo lo visto en 10s puntos previos puede ser aplicado tambien cuando se opera sobre multiples tablas. ._ _ _ ~ co ~ _ _ I _ _ I _~ _ _ I I _ ~~ - Las sentencias SELECT pueden anidarse.Programacidn de bases de datos con Visual Basic . a 10s datos resultantes de un enlace entre varias tablas tambien podemos aplicar condicionales. dando lugar a lo que se conoce como subconsultas. momento en que se devuelven 10s resultados. Podrian aiiadirse enlaces a varias tablas. el que aparece en primer lugar en la sentencia. se entrega a la consulta del nivel exterior para que efectue el proceso apropiado. utilizarla como resultado para ejecutar otra consulta. SELECT C o l u m n a s FROM Tabla WHERE Cond i c i on (SELECT Columnas FROM Tabla) Suponga que desea obtener una lista de todos aquellos libros cuyo precio es superior a la media. es preciso crear un vinculo entre las distintas tablas. pudiendo utilizarse directamente como origen de datos para la consulta superior. En lugar de utilizar una variable intermedia y ejecutar dos consultas. a continuacih. Como puede suponer. m6s de dos.Editorial Obtendriamos un conjunto de datos resultante de una relaci6n uno-a-muchos. que tardar6 m6s tiempo en elaborarla. es decir. obteniendose un conjunto de resultados que. por cada editorial aparecerian todos 10s titulos con que cuenta. . Primero se ejecuta la consulta que est6 en el nivel m6s interior (aparece despues en la sentencia completa). en lugar de devolverse directamente. enlaz6ndolas mediante un condicional en el apartado WHERE. si bien a medida que se incluyen m6s relaciones la consulta va complichdose tanto para nosotros como para el RDBMS. Suponga que desea obtener una lista con el nombre de cada editorial y 10s titu10s que le corresponden. resulta mucho m i s efectivo utilizar una sentencia como la siguiente: SELECT Titulo.NET sultante.IDEditorial=L.Titulo FROM Editorial E. Este proceso se repite las veces que sea preciso hasta llegar a1 SELECT m6s exterior. iC6mo se expresaria esa consulta? Primero es necesario obtener la media del precio y.

Aunque en ocasiones resulte la unica via posible para obtener un cierto resultado. en otras pueden sustituirse por condicionales mas o menos simples en una sola consulta. Ese identificador se utiliza para recuperar el titulo.1 3 5 1 . 10s datos pueden consultarse tantas veces como se precise e. P r . con la sintaxis siguiente: 1J P DATE N o r r i h r e T a b 1a S E T Columna=Valor. La ejecuci6n de la sentencia siguiente. P r e c h . . No es aconsejable abusar de la anidacion de consultas.1 ' .. 0 4 FROM (SELECT T i t u l o . Hay que tener en cuenta que. Una vez insertados en una tabla..4 1 5 . de no facilitar una cliusula WHERE con un condicional. la sentencia de actualizacih afectari a la tabla completa. con el fin de obtener el identificador de una cierta editorial. es usado por otro S E L E C T para obtener el titulo y un c6lculo sobre el precio. por ejemplo. es posible modificarlos si es necesario. asignaria el valor 30 a1 precio de todos 10s libros existentes en la tabla L i b r o s : U P D A T E Libros SET P r e c i o = 3 0 Lo habitual es que todas las sentencias de actualizacih Sean siempre condicionales: IJPDATE L i b r o s SET P r e c i o = 3 0 WHERE I S B N = ' 8 4 . a su vez.. C o l u m n a = V a l o r . E d i t o r i a l FROM L i b r o s WHERE E d i t r ) r i a l = ( S E L E C T I d E d i t o r i a l FROM E d i t o r i a l e E WHERE. precio y editorial de todos 10s libros de esa editorial. S Q L y sus dialectos Por ejemplo: S E L E C T T i t u l o .2. En este caso la sentencia a utilizar ser6 UPDATE. resultado que.e c i o * l . N o m h r e = ' A n d y a M i i l t i r n e d i a ' ) En este caso se ejecuta primer0 la sentencia S E L E C T I d E d i t o r i a l . igualmente.

podriamos usar las siguientes sentencias DCL: GRANT SELECT. se eliminari todo su contenido. si no se aplica condicional alguno 1 la eliminacidn afectar6 a toda la tabla. por ejemplo. especialmente porque las tareas para las que se utiliza recaen siempre en un DBA. por ejemplo. De esta forma el DBMS asegura la integridad referencial. La sintaxis de la sentencia DELETE es la que sigue: DELETE FROM Tabla A igual que ocurre con la sentencia UPDATE. El destinatario del otorgamiento o la denegacidn es un perfil o una cuenta de usuario. intenta borrarse una fila a la que se hace referencia desde otro punto. que se borre una cierta editorial si en la tabla de libros hay filas que hacen referencia a ella.Programacidn de bases de datos con Visual Basic . mientras que con la segunda se deniega. ya que no tienen que indicarse columnas a1 no ser posible el borrado de estas individualmente. sino el de las filas completas. Con la primera se otorga un cierto permiso. per0 no la modificacidn ni el borrado. Las dos sentencias m6s conocidas de este grupo son GRANT y REVOKE. con sentencias del tipo CREATE U S E R y CREATE ROLE. por lo que hay que tener un especial cuidado a1 utilizar esta sentencia. ya sea de la misma tabla o bien de una externa.NET La eliminacidn de filas de una tabla seguramente sea la operacidn m6s simple. sobre la tabla Libros a un usuario llamado Operador. la sentencia podria ser la mostrada a continuacidn: DELETE Libros WHERE ISBN='R4-415-1351-1' Como se indicaba a1 inicio del capitulo. si bien la sintaxis suele diferir entre distintos DBMS. segun 10s casos. Tambien debe tenerse en cuenta que es posible encontrar problemas si. por ejemplo la insercidn o borrado de una tabla o la modificacidn de ciertas columnas. DCL resulta mucho menos conocido para 10s desarrolladores que DML y DDL. Estos perfiles y cuentas tambien pueden crearse mediante DCL. es decir. encargado de gestionar 10s usuarios que pueden acceder a la base de datos y otorgarles o denegarles la operacidn sobre sus tablas. Los permisos pueden ser globales o muy concretos. evitando. INSERT ON L i h r o s T O Operador . Suponiendo que quisiera eliminar la fila correspondiente a un cierto libro. Suponiendo que estuvi4semos trabajando con SQL Server y dese6semos permitir la seleccidn e insercidn.

procedimientos almacenados o funciones. cada fabricante de DBMS ha creado su propio lenguaje que. ha evolucionado de manera distinta en . con el fin de aliviar la carga de trabajo de 10s clientes y. SQL tiene sus limitaciones 0. conllevaria una carga mucho mayor para nuestras aplicaciones. Por esta raz6n. como ha podido ver desde el inicio de este capitulo. y PL / SQL. facilitando su mantenimiento. evaluacidn de expresiones condicionales y repetici6n de sentencias. con el tiempo. quiz2 10s m6s representativos. A pesar de todo. no estaba pensado originalmente para las necesidades que han surgido con posterioridad. est6 orientad0 a1 trabajo con conjuntos de datos. a1 tiempo. en forma de desencadenadores y procedimientos almacenados. conocido originalmente como T-SQL y utilizado por Sybase y SQL Server. centralizar las reglas de negocio en un servidor. Efectuar un trabajo similar desde Visual Basic. Con ellos es posible crear bloques de codigo. Una de esas necesidades es la incorporaci6n en el propio DBMS de parte de la 16gica de proceso de 10s datos.NET como lo haria una aplicacion Visual Basic. capaces de procesar datos y tomar decisiones actuan sobre el contenido de la base de datos. Sybase y SQL Server cuentan con un lenguaje llamado Transact-SQL que. procesando 10s datos de manera individual. por lo que en 10s puntos siguientes lo unico que se pretende es facilitar un acercamiento muy superficial a ellos. Provenientes de una misma raiz. No podemos utilizarlos para crear una interfaz de usuario en una aplicacion estandar. El codigo escrito en lenguajes como Transact-SQL y PL/SQL se ejecuta en el interior de una base de datos. aiiade posibilidades como el trabajo con variables.2. empleado en Oracle. Dos de esos lenguajes. facilitando la selecci6n y modificaci6n de manera flexible y potente. puede encontrarlos en su libreria habitual. no directamente sobre el sistema operativo o la plataforma . S Q L y sus dialectos REVOKE U P D A T E . partiendo de la sintaxis y naturaleza de SQL. son Transact-SQL. simplemente. llameseles desencadenadores. DELETE ON L i b r o s FROM O p e r a d o r El lenguaje SQL. Tanto Transact-SQL como PL / SQL son lenguajes lo suficientemente complejos como para escribir varios libros especificos sobre ellos.

.Prograrnacion de bases de datos con Visual Basic . en el primer caso. el resultado de una expresi6n 0. La versi6n de la que nos ocupamos en este apartado es la implementada en SQL Server. el resultado de la ejecuci6n de una consulta. Dicho valor puede ser un valor constante. Dos tipos especialmente interesantes son table y curs or. va ganando cuota de mercado en lugar de perderla. en el segundo. fechas (datetime y smalldatetime). La sintaxis para declarar una variable es la siguiente: DECLARE @ I d e n t if icador T i p o Observe que el identificador va precedido del simbolo @. money y float.nvarchar y ntext) y secuencias de datos binarios (binary. A continuaci6n tiene un par de ejemplos: DECLARE P N u r n L i b r o s i n t SELECT @ N u r n L i b r o s = 5 . Este lenguaje es aplicable tambien a MSDE. el RDBMS de Microsoft que acompaiia a las ediciones superiores de Visual Studio . cadenas de caracteres Unicode (nchar. como hariamos en Visual Basic.NET cada DBMS. o el recorrido secuencial. evaluando expresiones y efectuando operaciones. permitiendo el almacenamiento de un conjunto de resultados. decimal.NET y que.incluso. Para poder procesar 10s datos. entre otros). varchar y text). en contraposici6n a otros productos como DB2 u Oracle. otra variable. bigint. es precis0 contar con un medio de almacenamiento temporal con el que no cuenta SQL. En Transact-SQL podemos definir variables de distintos tipos. que utilizaremos tambikn a1 efectuar una asignaci6n a la variable o recuperar su valor. En realidad MSDE es el nticleo de SQL Server per0 con menos capacidad de conexiones y proceso.varbinary e image). la soluci6n debases de datos de Microsoft para pequeiias instalaciones que no requieren la potencia de SQL Server. fila a fila. de un conjunto de datos.. Declarada la variable.. SELECT @ N u r n L i b r o s = COUNT(1SBN) FROM L i b r o s En la primera asignaci6n damos a NumLibros el valor 5. smallint. tenemos a nuestra disposici6n tipos numericos enteros y con parte decimal de distintas precisiones (int. ya que &te opera siempre sobre datos almacenados en una tabla de la base de datos. cadenas de caracteres ASCII (char. mientras que en la segunda contamos el numero de filas que hay en la tabla Libros y guardamos el resultado en la variable. En cuanto a1 tiPO. la asignaci6n de un valor se efectua mediante la sentencia SELECT.

C O N T I NUE y BREAK. * y /.1. por defecto. a1 inicio. en esencia.1. E L S E y W H I L E afectan. INTEGER y demhs tipos indicados anteriormente como estandar en SQL. W H I L E . Las sentencias para codificar este tip0 de 16gica son I F . -. E L S E . de las hornhimas en Visual Basic. dependiendo del resultado. Tabla 2. Operadores relacionales de Transact-SQL < lgualdad Menor que Menor o igual que <= !< > No menor que Mayor que Mayor o igual que >= !> <> No mayor que Desigualdad El resultado de la expresi6n puede almacenarse en una variable. asignarse como contenido de una colurnna de una tabla o ser utilizado en otra expresi6n o sentencia condicional. Tenemos 10s cuatro operadores aritmeticos bfisicos. ademfis del operador 8 para obtener el resto de divisi6n entera.2 . . a1 final. Para componer expresiones. o bien controlar 10s ciclos de un bucle. SQL y sus dialectos Las variables tambien pueden ser de 10s tipos VARCHAR. y END. Los relacionales son 10s mostrados en la tabla 2. Transact-SQL cuenta prficticamente con 10s mismos operadores aritmeticos y relacionales que encontramos en Visual Basic. I F . La forma de utilizarlas no difiere. +. delimitaremos entonces el bloque mediante las palabras B E G I N . s610 a la sentencia que les siga. sin0 m~ltiples sentencias que se vean afeclas tadas. CS Las expresiones condicionales pueden utilizarse para ejecutar o no una sentencia. En caso de que nos interese que no sea una.

De no hacerlo. Mediante PL / SQL es posible declarar variables. es decir. pueden ser ejecutados a demanda de la aplicaci6n con el fin de obtener resultados mucho mds elaborados que 10s que podrian tenerse con las consultas mds complejas. Podria. es posible facilitar un pariirnetro. desde Visual Basic. bloques de c6digo que. mientras que en caso contrario se totalizan 10s titulos de la editorial indicada. operar sobre ellas. El lenguaje PL/SQL es a Oracle lo que Transact-SQL a SQL Server. devolvihdose el resultado mediante la sentencia RETURN. el lenguaje mediante el cual pueden codificarse procedimientos almacenados. lo cierto es que sus posibilidades son b6sicamente las mismas. Obviamente. el procedimiento devuelve el nGmero total de titulos que hay en la tabla. por ejemplo. como va a ver brevemente en 10s puntos siguientes. es la posibilidad de crear procedimientos almacenados. que retornen uno o varios conjuntos de resultados 0. concretamente el c6digo de una editorial. llamando NumTitulos. desencadenadores y funciones. etc. codificar condicionales y bucles. Para crear un procedimiento almacenado se utiliza la sentencia CREATE PROCEDURE. se declararian 10s pardmetros necesarios para invocar a1 procedimiento. Las sentencias de implementaci6n se introducirian en un bloque B E G I N / END. A1 ejecutarse este procedimiento almacenado. se obtendria como resultado un nGmero. evaluar expresiones. El siguiente c6digo seria un procedimiento almacenado muy basic0 per0 que cuenta con algunos elementos importantes: CREATE PROCEDURE NumTitulos @Editorial INTEGER = NULL AS BEGIN LF @Editorial IS NULL RETURN (SELECT COUNT(ISBN1 FROM Libros) ELSE RETURN (SELECT COUNT(1SBN) FROM Libros WHERE Editorial = @Editorial) END A1 invocar a este procedimiento. Vamos a seguir exactamente el . que se encarguen de efectuar sobre la base de datos las operaciones adecuadas.NET Codificacicin dc proccdi icntos alinaccna Una de las razones fundamentales de la existencia de Transact-SQL.Programacidn de bases de datos con Visual Basic . segGn se apuntaba anteriormente. crearse un procedimiento almacenado a1 que facilitando una serie de pardmetros se encargase de insertarlos en sus respectivas tablas. y de manera opcional. es distinta. almacen6ndose con un nombre en la base de datos. Aunque la sintaxis. Antes de &ta. tras la cual dispondriamos el nombre del procedimiento y la palabra AS.incluso. es posible crear procedimientos mucho mds complejos.

bdsicamente son 10s que pueden emplearse en cualquier columna de una tabla Oracle. . como en el ejemplo anterior. DOUBLE PRECISION y FLOAT). con la palabra DECLARE. BEGIN N u r n L i b r o s := 5. a continuaci6n. y. respectivamente. mientras que la segunda ir6 delimitada entre las palabras BEGIN y END. es un elemento habitual de PL/SQL para indicar el final de las sentencias. POSITIVE. con la cldusula INTO de la sentencia SELECT. Los valores se asignan a las variables mediante el operador := o bien. en caso de que el valor a asignar se obtenga de una consulta. PL/SQL divide el c6digo en dos secciones bien diferenciadas: una para declaraciones y otra para implementacih. S Q L y sus dialectos mismo esquema del punto dedicado a Transact-SQL. Las variables. Tenemos numeros enteros (NATURAL. . constantes y / o variables. efectuamos dos asignaciones. per0 con la sintaxis de PL/SQL. En lugar de una sentencia DECLARE para la declaracih de cada una de las variables. La primera asigna una constante y. . 6sta se compondria de operandos. y decimales (DECIMAL. Evaluacicin de exmesiones En lugar de un valor constante. una variable puede recibir el resultado de la evaluacih de una expresih. END: Primer0 declaramos la variable NumLibros. por tanto. y operadores aritmeticos y / o relacionales.. se declararian tras la palabra DECLARE y antes de que se inicie el bloque de c6digo ejecutable con la palabra BEGIN. como en Transact-SQL. Observe el punto y coma a1 final de la declaracih. SIGNTYPE). se utiliza el operador :=. prdcticamente con 10s mismos ejemplos.Por ejemplo: DECLARE NumLibros INTEGER. En la segunda el valor se recupera mediante una consulta. SELECT COUNT(1SBN) I N T O N u m L i b r o s FROM L i b r o s .. precisamente. por ello. caracteres (CHAR) y cadenas de caracteres (VARCHAR y STRING).. fechas (DATE) y algunos tipos mds especificos como ROWID o BFILE. La sintaxis de declaraci6n es asi de simple: I d e n t i f i c a d o r Tipo.2 .. que actLian cOmO punteros a una fila en una tabla o un archivo. de tip0 INTEGER. La primera se inicia. En cuanto a 10s tipos de datos posibles.

El primero se asemeja bastante a1 tipico bucle por contador de Visual Basic. Cod ifica c iin de pro ced irn ie n t o s a Ir a c e n ad os i n PL / SQL es aplicable a la implementacih de desencadenadores. Los primeros son equivalentes a 10s indicados en la secci6n de Transact-SQL. La expresi6n a evaluar o condicional ir6 tras la palabra IF. <. WHILE C o n d i c i h n LOOP S e n t e n cia s . Los aritmkticos =. por supuesto. prhcticamente idkntica a la que existe en Visual Basic. mientras que las sentencias a ejecutar si dicha expresi6n es cierta se pondrian tras la palabra THEN. La N y M del primer bucle se sustituirian por 10s valores extremos del bucle. mientras que el segundo es un bucle condicional corriente. => y ! =. END IF. OR y NOT. ELSIF C o n d i c i 6 n THEN s e n t encia s . -. procedimientos almacenados. En cuanto a 10s bucles. funciones. un E L S E o bien un E L S I F en caso de que necesitemos evaluar expresiones adicionales: I F C o r l d i c i h n THEN s e n tencia s . . o bien emplearse directamente en un condicional o sentencia similar. mientras que el ultimo comprueba la desigualdad entre dos operandos. podemos usar dos tipos: F O R y WHILE. En el segundo caso tan s610 tendria que sustituir Condicion por la expresi6n condicional a evaluar en cada ciclo del bucle. <=. ELSE sentencias. Si deseamos ejecutar una o varias sentencias dependiendo de que una cierta expresi6n sea cierta o no. Utilizando estos operadores. bloques . M LOOP END LOOP. por ejemplo 1y 10. sin delimitar el bloque en forma alguna puesto que el final vendr6 marcado por un E N D I F. para un us0 posterior. a 10s que habria que afiadir el operador * * que efectua la potenciaci6n. Los operadores 16gicos son AND. La sintaxis de ambos es la siguiente: FOR C o n t a d o r IN N S e n t e n c i a s. Puede ser s610 una o multiples sentencias. >. valores que irA tomando Contador mientras se ejecutan las sentencias que hay en el interior del bucle. . la composici6n de expresiones se efectua de la manera habitual y puede almacenarse el resultado. bloques de c6digo andnimos y. * y /.Los operadores aritmkticos son 10s habituales +. END LOOP. utilizaremos la sentencia I F/THEN/ELSE.

Ha aprendido. especificado mediante la palabra clave DEFAULT.0 THEN S E L E C T C O U N ' I ' ( 1 S B N ) I N T O N FROM L i b r o s . a utilizar sentencias DDL para definir estructuras de datos bdsicas. Estos pueden tener un valor por defecto. Como ha podido ver en este capitulo. en general. i b r o s WHERE E d i t o r i a l = I D E d i t o r i a l . END. Nuestro objetivo era introducirle en ese campo. BEGIN I F I D E d i t o r i a l =. En caso de que necesitemos devolver un resultado tenemos dos opciones: definir un pardmetro de salida en la lista de argumentos del procedimiento 0. A continuaci6n se dispone la palabra Is. no obstante. en PL / SQL lo hariamos asi: CREATF FUNCTION N u m T i t u l r r s ( r L I E d l t o r l a 1 I N I N T F (>EK D E F A U L T 0 ) RE? U R N NIJMBEK N NUMBER. en su lugar.2. de lo contrario se de retorna el numero total de titulos. el lenguaje SQL. Si facilitamos un c6digo de editorial se obtiene el n ~ m e r o titulos con que cuenta. Suponiendo que desedsemos codificar el mismo procedimiento almacenado N u m T i t ul o s usado como ejemplo anteriormente. implementarlo como funcidn. el bloque de declaraciones de variables (sin el apartado DECLARE ya que AS actua como punto de partida de dicho bloque) y el c6digo entre 10s habituales B E G I N y END. antes de la palabra 1s. DML para manipular esos datos y DCL para otorgar y denegar privilegios a 10s usuarios. El funcionamiento y resultado de la ejecuci6n de esta funci6n seria como el descrito antes para el procedimiento almacenado Transact-SQL. cambiando PROCEDURE por F U N C T I O N e indicando a1 final de la cabecera. aunque apenas araiiando el mundo de posibilidades existentes en el. como las tablas. . opcionalmente y entre parhtesis. el tip0 a devolver mediante RETURN . La creacion de un procedimiento almacenado se inicia con CREATE PROCEDURE seguido del nombre del procedimiento y. S Q L y sus dialectos de c6digo que podemos ejecutar a demanda desde las herramientas de administraci6n o bien desde aplicaciones externas. ELSE S E L E C T COUNT ( I S B N ) I N T O N FROM L . END I F . en particular. y 10s derivados de cada RDBMS. RETTJRN N . suponen un extenso campo de estudio y aplicaci6n sobre el tratamiento de datos en sistemas como SQL Server u Oracle. la lista de pardmetros que recibird el procedimiento.

Parte de 10s conocimientos que ha adquirido en este capitulo le s e r h utiles en el prbximo. t a m b i h se han descrito algunas de las caracteristicas de Transact-SQL y PL/SQL. a1 introducirnos en ADO. en 10s posteriores. donde 10s pondrii en prtictica a1 usar algunas herramientas de DBMS. y.NET Aunque muy brevemente. por supuesto. SQL Server y Oracle respectivamente. dos de 10s m i s extendidos en el mercado. dos de 10s lenguajes mAs importantes para programaci6n de bases de datos a1 ser 10s productos asociados.Programacidn de bases de datos con V i s u a l Basic .NET. .

.... .'.

NET. siempre hablando respecto a la aplicaci6n. en este capitulo va a conocer algunas de las herramientas y aplicaciones que le permitirdn crear y configurar dichos origenes de datos. aprenderd a utilizar Microsoft Access. No entramos. entonces. documentos XML o bien hojas de cdlculo Microsoft Excel. de escritorio y RDBMS. Recurra a la documentaci6n de cada producto. InterBase y Excel con el fin de preparar algunas bases de datos y documentos. Oracle. Tras algunos conceptos adicionales. Las indicaciones dadas serdn las suficientes para cada necesidad.En el primer capitulo. si le interesa profundizar en alguna de esas aplicaciones. puede ser local o bien rernoto. Un origen de datos. en mayores detalles. como las bases de datos. SQL Server. Para poder trabajar desde Visual Basic con ADO. se citaron algunos de 10s origenes a 10s que puede accederse mediante ADO. Por ello. conocimos lo que era un origen de datos y. o a bibliografia adicional. dedicado a terminologia y conceptos generales. Hablamos de origen de . en 10s capitulos posteriores. Tambi6n conocer6 algunas bases sobre XML y el Directorio activo. a mod0 de enumeracibn. asi como introducir en ellos algunos datos de partida.NET. es indispensable contar con 10s origenes de datos que van a utilizarse. componente o servicio que va a acceder a 61.

. conjuntamente con la aplicacih. Seleccione la opci6n Base de datos de Access en blanco y pulse el b o t h Aceptar. por ejemplo una base de datos alojada en un servidor y gestionada por un RDBMS.1. en el que se asume que utilizar6 las herramientas indicadas desde el mismo ordenador en que esta instalado el servidor y se encuentran 10s datos aunque. el ordenador del usuario final. o bien utiliza una aplicaci6n desarrollada con VBA que se ejecuta directamente dentro de Access. las operaciones indicadas pudieran efectuarse t a m b i h remotamente.NET podemos necesitar recuperar la informacion que el usuario gestiona habitualmente utilizando Access 0. con un software cliente dependiente del RDBMS que se emplee. incluso. utilizando la interfaz de esta aplicacibn. Origenes de datos datos local cuando tanto la informaci6n como el middleware preciso para acceder a 41 se encuentran en el mismo ordenador.NET. que forma parte de la suite Microsoft Office. En ocasiones. es necesario tener instalado el software cliente del RDBMS y configurados 10s parametros de comunicaci6n entre 61 y el servidor. La que va a describirse a continuaci6n la encontrar6 en la carpeta Ejemplos del CD-ROM con el nombre Libros . 10s necesarios para crear una base de datos y editar su contenido. por ejemplo. a1 trabajar con documentos XML tratindolos como si fuesen conjuntos de datos. por el contrario. Cuando el origen de datos es remoto. que la informaci6n este en el mismo equipo donde se ejecuta ADO.incluso. se comunicara con ese software cliente que. a su vez. En cualquier caso. En otras. especialmente en instalaciones en las que el propio usuario opera sobre la informacibn.NET no implica que pueda manipularse sin mds. en este apartado vamos a conocer algunos elementos de esta aplicacibn. no esta conectado a otros equipos en red. el acceso a esa informacih local puede efectuarse directamente desde ADO. se encontrard con un cuadro de diilogo similar a1 de la figura 3. Es el caso tipico en configuraciones monousuario. o el controlador que corresponda. Introduzca el camino y nombre de la base de datos a crear. Es lo que ocurre. en el que el ordenador aloja programas y datos e. ADO. se comunicar6 con el servidor a trav6s de la infraestructura de red correspondiente. en la practica. en este caso suponemos que la versi6n es la 2000. Comience por iniciar Microsoft Access. Estos son aspectos que quedan fuera del Bmbito de este capitulo. precisdndose ese intermediario en forma de controlador. Este producto.NET. crear una aplicaci6n que se encargue de actuar como interfaz para ese usuario a fin de que no tenga que aprender a usar Access. sin necesidad de intermediario alguno.mdb.3 . siempre es preciso contar en el ordenador donde se ejecuta la aplicacibn. Un caso asi se encuentra a1 operar sobre una base de datos Microsoft Access o dBase que est6 en el mismo ordenador. Desde una aplicaci6n Visual Studio . L6gicamente. es uno de 10s gestores de bases de datos mas populares del mercado.

Ventana de trabajo sobre la base de datos .2. Figura 3. .. mientras que a la derecha se enumeran las opciones que en ese momento hay disponibles en la categoria seleccionada. ~ .Prograrnacidn de bases de datos con Visual Basic. En el margen izquierdo aparecen una serie de botones que dan acceso a las distintas categorias de elementos que pueden existir en una base de datos Access.1. creando la base de datos. Crearnos una base de datos Access en blanco . ~ .. .~ .2." ~ ~ ~ . . encontrarh una ventana similar a la de la figura 3." ~ __ Dado el paso anterior.. . .NET I I I Y I I Figura 3. . .

que seran &stas: . respectivamente. Definimos la estructura de la primera tabla A1 cerrar la ventana apareceri un pequeiio cuadro de diilogo en el que debe introducirse el nombre de la tabla. en la que deber5 introducir el nombre y tip0 de cada una de las columnas de la tabla que va a crearse. Seleccione de nuevo la opcion Crear una tabla en vista DiseAo a fin de definir las columnas de la tabla Libros.2. generindose para ella un indice en el que no se permitirin duplicados. Seleccione el elemento Autonumerico de la lista de tipos de datos y pulse el b o t h Clave principal que hay en la parte superior. como se aprecia en la figura 3.3. con una especie de cuadricula. Apareceri una nueva ventana. Comenzaremos con las columnas de la tabla Editoriales.3 . De esta forma la columna obtendri automiticamente un valor numeric0 incrementado para cada fila y que. sirviendo para introducir el nombre y direcci6n de la editorial.3. actuari como clave primaria. Las columnas y sus atributos serin 10s siguientes: 0 IDEditorial: SerA el identificador de cada editorial. la primera que aparece en la lista de la secci6n Tablas. simplemente haciendo doble clic sobre ella. Figura 3. ademis. tras lo cual volveri a la ventana de la figura 3. Nombre y Direccion: Dejaremos estas columnas con su tipo y atributos por defecto. Origenes de datos Seleccione la opci6n Crear una tabla en vista DiseAo.

En cierta manera. 0 Con esto finalizamos la creaci6n de la segunda tabla con que constar6 nuestra base de datos. Accederd a otra ventana. es ahora introducir alguna informaci6n en las tablas. sin soltarlo.4. Ajuste el Tamaiio del campo a 13 caracteres. mu6vase hasta la columna IdEditorial de la tabla Editoriales. Situe el punto del rat6n sobre la columna Editorial de la tabla Libros. damos el valor Si a1 apartado Requerido. pulse sobre el b o t h Relaciones que hay en la paleta principal. Precio:Seleccionamos el tip0 Moneda como tip0 de dato. Active las opciones Exigir integridad referencial y Actualizar en cascada 10s campos relacionados. de tipo Autonumerico y clave primaria de la tabla. afiadihdolas y despues cerrando el cuadro de diilogo.5) mostrando mdltiples opciones. en la parte inferior. Siempre partiendo del cuadro .2. se abrird un nuevo cuadro de didlogo (v6ase figura 3.Programacidn de bases de datos con Visual Basic . similar a la de la figura 3. algo altamente improbable. en la que aparecen representadas las dos tablas.NET 0 IDLibro: Identificador de cada libro. lntroduccion de datos El siguiente paso Idgico. ci ntre las tabias Estd claro que las dos tablas que hemos creado en el punto anterior guardan una relaci6n. 0 Titulo: Queda con 10s atributos por defect0 ofrecidos por Access. Pulse el b o t h Crear. Una vez libere el b o t h del rat6n. I S B N : El tip0 sera Texto.2. Encontrdndose en el cuadro de didlogo de la figura 3. actualizar automiticamente las referencias desde la tabla Libros en caso de que se modifique el identificador de una editorial. en la parte inferior. y d6 el valor S i a la opcion Requerido. por otra parte. la columna Editorial de la tabla Libros alojar6 el identificador de una entrada de la tabla Editoriales. Seleccione las dos creadas. Se abrird un primer cuadro de didlogo del que podrd elegir las tablas a aiiadir a la relacidn. en el que ya aparecerdn las dos tablas recien creadas. volviendo de nuevo a1 cuadro de didlogo de la figura 3. Editorial: Seleccionamos el tip0 Numeric0 de la lista desplegable y. Asi consigue dos objetivos: impedir que en la tabla Libros pueda introducirse un identificador que no exista en la tabla Editoriales y. Cerramos la ventana y llamamos Libros a la tabla. la tabla Edi tori a1e s actuard como primaria en una relacidn maestro / detalle o uno-amuchos respecto a la tabla Libros. 0 Autor: Lo dejamos con el tip0 Texto per0 ajustando el Tamaiio del campo a 30 caracteres. Concretamente. una vez creadas las estructuras de la base de datos.pulse el b o t h principal del ratdn y.

Opciones de la reiacion entre las dos tablas La primera columna.6 puede ver c6mo se introducen varias editoriales. La relacion entre las dos tablas una vez establecida Figura 3. Tan s610 hay que ir escribiendo el nombre y direcci6n de cada una de ellas. en el momento en que comencemos a escribir el nombre de una editorial se establecer6 automaticamente su cbdigo. haga doble clic sobre la tabla Editoriales. Origenes de datos de diAlogo mostrado en la figura 3. para abrir la cuadricula de introduccion de datos. Figura 3. No es necesario introducir dato alguno en ella.2. o bien selecci6nela y pulse Intro. evitando asi un posible fallo humano de asignaci6n a dos o mas editoriales del mismo c6digo. En la figura 3.3 . aparece con el texto (Autonumerico) en su interior.4. IDEditorial.5. pulsando la tecla .

introduciendo 10s datos de algunos libros que tenga a mano. En este momento tenemos algunas editoriales en la tabla E d i t o r i a1e s. totalmente imprescindible para trabajar con la tabla L i b r o s . aparece un mensaje de error como el de la figura 3.7. creando l . Figura 3. Introducidos 10s datos. Edicion del contenido de la tabla E d i t o r i a l e s Pruebe a hacer ahora lo mismo en la tabla L i b r o s . cerramos la ventana para retornar a1 cuadro de didogo de tareas. Figura 3. Compruebe que si introduce un c6digo de editorial que no exista.6. Esto es la integridad referencial.Access asegura la integridad referencial impidiendonos introducir libros de editoriales inexistentes Aunque el objetivo que nos marcamos aqui no es otro que tener una base de datos Access con alguna informacih ~ t i para utilizarla desde ADO.7.Programacidn de bases de datos con Visual Basic .NET Tab para ir avanzando de una columna a la siguiente y de una fila a otra.NET. por no haberse creado previamente en la tabla E d i t o r i a l e s .

abriendo asi de nuevo la ventana de disefio de la tabla.8 para cada uno de 10s apartados. lo cierto es que para nosotros mismos no resulta demasiado c6modo tener que introducir el codigo de cada editorial de manera manual. abrir dicha lista y elegirlo. a1 ir a introducir 10s datos de un libro.8. tome la base de datos que se faciiita en el CD-ROM. Podemos simplificar esta operacion de forma muy simple. Seleccione la tabla L i b r o s . escribiendo dicho c6digo que o tenemos que recordar o bien comprobar en la tabla E d i t oriales.2. en la parte inferior. observarii que la columna E d i t o r i a l tiene asociada una lista desplegable.9. Seleccione 10s valores que se aprecian en la figura 3. especialmente si son muchas las editoriales existentes y no resulta f6cil recordar el identificador de cada una de ellas. Configuramos la columna con un control de busqueda lntroduzca algunos datos en las tablas para tener inforrnacion con la que trabajar en capitulos posteriores 0. Puede escribir el c6digo de la editorial 0.si lo prefiere. Ahora.si lo prefiere. . Figura 3.aplicaciones para el usuario. en el cuadro de diiilogo de la figura 3. en la que existen algunas entradas. Opcionalmente puede establecer el ancho de la columna y otros par6metros. En ella encontrar6 opciones que permiten asignar a esta columna un control de busqueda. Seleccione la columna E d i t o r i a l y. y pulse sobre el b o t h Diseiio. No cabe duda de que resulta mucho miis c6modo. como se hace en la figura 3. abra la p6gina Blisqueda.

a diferencia de kste. Como se indic6 en el capitulo previo. Visual Basic . Para operar sobre MSDE. no dispone de las herramientas de administracih que vamos a usar en 10s puntos siguientes. valida durante 120 dias.NET cuenta con un proveedor ADO. para programar procedimientos almacenados y desencadenadores. en caso de que no disponga de SQL Server. TransactSQL. En este ejemplo se utiliza la version 2000 del producto operando sobre un sistema Windows XP Professional. MSDE es el motor de SQL Server pero. indices.Programacidn de bases de datos con Visual Basic . en http: //www. ofreciendo el mejor rendimiento posible. un servidor disponible en varias ediciones en el que es posible utilizar un lenguaje.com/spain/servidores/ sql/productinfo/evaluate. . Es una buena opcion si desea probar este producto.microsoft. I Puede solicitar una version de evaluacion de Microsoft SQL Server. aparte de poder definirse tablas. vistas. asp. SQL Server es un completo RDBMS. etc.NET nativo para trabajar con SQL Server.NET Figura 3 lualmente A diferencia de Microsoft Access. tendria que usar el propio Microsoft Access como interf'az de usuario.

En la primera p6gina (figura 3. lnterfaz del Administrador corporativo Haga clic con el b o t h secundario del rat6n sobre la carpeta Bases de datos y elija Crear nueva base de datos.3 . en cuyo interior encontramos m ~ l t i ples carpetas con distintos objetos. Se encontrar6 con una interfaz similar a la de la figura 3. Libros. El unico elemento disponible en la carpeta Grupo de SQL Server es el servidor (local).y deje el resto de opciones como est6n. en la que debemos introducir el nombre interno de la base y 10s datos de 10s archivos en 10s que se almacenar6 fisicamente. Se abrir6 la pigina Propiedades de la base de datos. Bases de Seriiuos de bansformaom de dabs dabs Sernoor de bansforma Admwrebaoon Dudtcaoon Seguridad Serriow compatb Meta Data Servioos de compabbibdad Meta Data Serbicer Serwes Figura 3. . abra la lista del menu Programas y localice el grupo Microsoft SQL Server. tambien podriamos abrir el Analizador de consultas SQL e introducir las sentencias SQL de creacion de la base y las tablas. Aunque en este caso vamos a utilizar un asistente para efectuar el proceso de creacion de la base de datos. seleccionando la opci6n Administrador corporativo.11) facilite el nombre de la base de datos. Origenes de datos Suponiendo que vamos a operar sobre el mismo servidor en el que se encuentra instalado SQL Server.10.10.

si lo desea. - A diferencia de lo que ocurri6 con Access. lntroducimos el nombre Iogico d e la base d e datos Las otras dos paginas del asistente se utilizan para configurar 10s archivos de trabajo de la base de datos. Es decir. En este momento la base de datos ya est6 creada y aparece en la carpeta Bases de datos del servidor SQL Server. Haga clic con el boton secundario del rat6n sobre el elemento Tablas y seleccione la opci6n Nueva tabla.Prograrnacidn d e bases d e datos con V i s u a l Basic . . Esta puede contar con uno o mas archivos para datos. Tendremos. no estd vacia. que definir las estructuras de datos que necesitamos. Abra la carpeta Bases de datos y tambien la base de datos Libros. a configurar en la pigina Registro d e transacciones. no obstante. diversas funciones y usuarios. Estos archivos tienen un tamafio inicial. Puede. si bien se ha modificado el camino en el que residirbn. ni va a experimentar un volumen de transacciones importante.12. El proceso es similar a1 descrito previamente para Access dado que la interfaz de usuario es parecida. Dado que nuestra base de datos no va a contener una gran cantidad de informacion. y uno o mas archivos de registro de transacciones.11. como se ha hecho en la figura 3. que justo tras la creacion de la base de datos nos encontrabamos con un recipiente vacio. Hemos dado el primer paso. la base de datos SQL Server r e c i h creada cuenta con una serie de tablas de sistema. dejaremos 10s padmetros por defecto para ambos archivos. _ I ---. que se configuran en la p6gina Archivos de datos. En este caso se ha aceptado el nombre por defecto. pueden crecer automaticamente y contar con un limite.NET Figura 3. comenzando por las tablas donde se alojara la informaci6n. modificar el camino y nombre de 10s archivos.

pulse el b o t h Establecer clave principal. En definitiva.12. actuando como atributo identidad de cada fila y clave primaria. Desactive la opci6n Permitir valores nulos. despliegue la lista adjunta a1 apartado ldentidad para seleccionar el valor S i (no disponible para duplicacion): Por ultimo. obligando asi a introducir siempre el ISBN del libro. en la parte inferior. dejando el resto de parametros con sus valores por defecto. . tenemos un campo autoincrementado que actua como identificador unico.13) aparece el valor inicial que tomara esta colurnna. En este caso las columnas y sus atributos ser6n: 0 I D L i b r o : Tendra 10s mismos atributos que la columna I D E d i t o r i a l de la tabla anterior. Observe que en la parte inferior (vkase figura 3. ISBN: Elegimos el tip0 c h a r y le damos 13 caracteres de longitud. Nombre y D i r e c c i o n : Seleccione el tipo v a r c h a r de la lista Tip0 de datos. que es lo que nos interesa en este momento. En este caso el tip0 v a r c h a r no aporta beneficio alguno ya que un ISBN siempre tiene esa longitud. asi como el increment0 que se aplicara a cada fila sucesiva. Seleccione de nuevo la opci6n Nueva tabla para proceder con la creacidn de la tabla L i b r o s . Los atributos de la colurnna IDEdi t o r i a l le convierte en el atributo de identidad de cada fila. Opciones de 10s archivos de datos Debera introducir inforrnacion para las tres columnas siguientes: I D E d i t o r i a l : Seleccione el tipo i n t de la lista de datos y. Titulo y A u t o r : Seleccione el tipo v a r c h a r y deje la longitud por defecto.Figura 3.

Contendr6 el identificador de la editorial.Active la opci6n Actualizar en cascada 10s .14 (puede volver a ella.Programacidn de bases de datos con Visual Basic . para lo cual estableceremos despu6s la relaci6n adecuada. En este momento tenemos definidos todos 10s atributos de la tabla Libros. abrihdose inicialmente la p6gina Relaciones.en el panel derecho del Administrador corporativo. Se crea autom6ticamente un nombre para esta relaci6n. Relacion entre las tablas Encontrandose a6n en la ventana mostrada en la figura 3.14. a la izquierda. En la parte inferior seleccione la columna I DEdi torial de la tabla Editoriales. en caso de haberla cerrado. per0 no cierre aun la ventana. tal y como se aprecia en la figura 3. que es Libros.13. Se abrir6 el cuadro de diilogo Propiedades con todas las propiedades de la tabla. haciendo clic con el b o t h secundario del ratdn sobre la tabla Libros. y la columna Editorial de la tabla que est6 crekdose. Precio: Elija el tip0 de dato money. Pulse el b o t h Nueva que hay debajo de la lista combinada Relacion seleccionada. Creacion de la tabla E d i t o r i a l e s 0 Editorial: Su tipo ser6 int y desactivamos la opci6n Permitir valores nu10s. procediendo asi a la creaci6n de una nueva relaci6n. y seleccionando luego la opci6n Diseiiar tabla) pulse el b o t h Administrar relaciones.NET 1 Figura 3.

campos relacionados. a excepci6n del borrado en cascada. Ahora puede cerrar la ventana en la que estaba definiendo la tabla Libros asigndndole dicho nombre. Definimos la relacion existente entre las dos tablas . A1 hacer clic sobre el b o t h Cerrar se establecerd la relaci6n entre las dos tablas. Enumeracion de las columnas de la tabla L i b r o s y sus atributos Figura 3.15. El resto de las opciones de integridad referencial estan marcadas por defecto.15.14. Figura 3. tal como puede verse en la figura 3.

a medida que vaya pasando de una fila a otra SQL Server se encargar5 de darle un valor consecutivo y unico que actuari como clave principal.16. Deje en blanco la columna IDEditorial. y mostrar6 el resultado en una cuadricula. la herramienta de administraci6n de SQL Server no est6 pensada para facilitar la introducci6n de datos por parte del usuario porque se supone que &te usara alguna aplicaci6n a medida para efectuar su trabajo. a 4 901 Grayson Sbret II Figura 3. haga clic con el boton secundario del raton y elija la opci6n Abrir tabla>Devolver todas las filas. per0 sin las comodidades de poder contar. tras haber completado la creacion de las dos tablas. -- _I___ ~ -_^_ __. en este momento est5 vacia. por ejemplo.___ _____ __I__ __ I _ ---__ _ _ _ ~ . dejando que el administrador vaya generando las instrucciones SQL necesarias para que SQL Server inserte 10s datos. por ahora. lntroducimos 10s datos de vartas editoriales .Tambien podriamos haber definido la relacion posteriormente. En ese momento SQL Server generar5 una consulta para recuperar las filas existentes de la tabla.16. como se hace en la figura 3. En esa misma cuadricula puede introducir 10s datos. ya sea volviendo al cuadro de dialogo de diseAo o bien creando un diagrama visual de la estructura de la base de datos. I I Con este paso hemos finalizado. Seleccione de la carpeta Tablas la tabla Editoriales._ _ _-_-_ _ _ _ ~ ~ A diferencia de Microsoft Access. con un control de busqueda para las editoriales y otras ayudas. la definici6n de estructuras en la base de datos. Podemos introducir datos en las tablas que acabamos de crear.

17. finalmente. no basta con abrirla como haria en Microsoft Access. en la carpeta de ejemplo correspondiente a este capitulo encontrard 10s archivos M D F y L D F que componen la base de datos.17) y la operaci6n de inserci6n no se Ilevard a cabo. teniendo en cuenta que el c6digo de editorial deberd ser uno de 10s previamente definidos en la tabla E d i t o r i a1e s . de introducirse un c6digo inexistente obtendremos un mensaje de error (vkase figura 3. sin embargo. Abra el Administrador corporativo de SQL Server. facilite el nombre con el que desea adjuntarla en su sistema y la cuenta del usuario que figurard como propietario. abriendo el cuadro de didlogo que puede verse en la figura 3. Como ocurria con Access. Error producido al introducir un codigo de editorial inexistente Aunque puede definir la estructura de la base de datos e introducir informaci6n en ella. Para utilizarla. lmportamos una base de datos en SQL Server A partir de dicho momento puede utilizar la base de datos como si la hubiese creado en su sistema. . Elija la opci6n Todas las tareas>Adjuntar bases de datos. siguiendo las indicaciones dadas en 10s puntos previos. pulse el bot6n Comprobar y. Introduzca el camino y nombre de la base de datos.De manera an6loga puede introducir 10s datos de algunos libros.18. MOF de la b a r de datosque r va a a M a s PBDDUsualBasicNET~~mplos Cap-03 bbms-Data MDF I- I 1I Nombres ongnaksde lo5 arch UxmM adud de los achvos Figura 3. Figura 3. el proceso es algo m6s complejo. abra el servidor local y haga clic con el b o t h secundario del raton sobre la carpeta Bases de datos.18.

19. como la de la figura 3. inicialmente vacias. el ultimo que aparece en la barra de botones. Una de esas posibilidades es la definici6n de vistas. - . El us0 de las vistas ahorra a las aplicaciones y usuarios la composici6n de consultas mds o menos complejas para poder obtener 10s datos que necesitan. Apareceri una ventana con varias secciones. estableciendo una relaci6n entre ambas tablas. Haga clic con el b o t h secundario del rat6n sobre la carpeta Vistas de la base de datos y luego seleccione del menu emergente la opci6n Nueva vista.- r _ _ _ _ ~- 1 - 7 * L - gi b Figura 3. Haga clic sobre el b o t h Agregar tabla. para abrir el cuadro de didlogo Agregar tabla. posibilidades algunas inexistentes en Microsoft Access. aunque simple. lniciamos la creacion de una nueva vista i.r12 2.NET vista Como se apuntaba anteriormente. Los pasos a dar son 10s indicados a continuacih: 1.19. objetos que se almacenan en la base de datos y ejecutan a demanda de las aplicaciones cuando 6stas las abren como si se tratasen de tablas. SQL Server es un RDBMS con todas las posibilidades que tienen estas aplicaciones. nos serviri para conocer 10s pasos que habriamos de dar en cualquier caso. Vamos a definir una vista que.Programacidn de bases de datos con Visual Basic . Seleccione las tablas . Dicha vista devolverd las editoriales y 10s titulos que les corresponden.

por ejemplo que el precio est6 en un cierto rango. de m6s baratos a m6s caros. Utilice el panel que aparece debajo del diagrama para establecer criterios de busqueda u ordenacion. T a m b i h puede introducir condiciones de busqueda.20. en la parte inferior. en la tabla E d i t o r i a l e s . identificado con un signo de admiracion.21. Aparecen las dos tablas. Pulse el b o t h Ejecutar. 5. por ejemplo. y una consulta SQL en la parte central 1 ' 1 I> FROM dbo EditonalesINNER IOIN dbo Lbror ON dbo Editoriales IDEditorml = dbo Libros Editorid * 1. Puede. como se ve en la figura 3. . es decir. y T i t u l o y P r e c i o . en este momento. Puede modificar 10s criterios y el orden segun le interese. Origenes de datos E d i t o r i a l e s y L i b r o s y pulse el b o t h Agregar. De esta manera las selecciona como columnas para el resultado final. Aiiadimos las tablas a la vista 3. para probar la vista y obtener. en la tabla L i b r o s . el resultado.20. Pulse el b o t h Cerrar para volver a la ventana anterior que. Figura 3. Observe c6mo esas columnas aparecen en el panel que hay debajo del diagrama y t a m b i h en la consulta SQL. con su relacion. mostrar6 el aspect0 de la figura 3. Haga clic con el boton principal del rat6n sobre las casillas que aparecen a la izquierda de las columnas Nombre. En la base de datos de ejemplo no existen criterios y el orden es el obtenido por defecto. 4. desplegar la lista de la columna Orden asociada a la P r e c i o para que 10s datos se ordenen ascendentemente por el precio.3 .

veri aparecer una ventana de propiedades con el c6digo Transact-SQL utilizado para crear la vista.75AND 40 WHERE (dbo Libros Pieao EFliVEEN dbo Libros ON dbo Edtormles IDEdibrial = dbo Libros Editwial 10 75AND 401 Anaya Mulbmedia Inboducaon a la wogramaoon User Interface Desqn for Programmers Anaya Mulbmedia Programaaon con Ddph 6 y Kylix Anaya Mdbmedia Programauon con Visual Basic NET Anaya Mdbmeda Programaaon con Visual C 7 NET Anaya Mulbmeda Programaaon con Visual Studio NET McGrawHiM Manud del miucvocesadw 80386 Figura 3. Salga de la ventana de composicidn y despues guarde la vista con el nombre L i b r o s E d i t o r i a l . . sin embargo. haciendo clic sobre ella con el b o t h secundario del rat6n y seleccionando la opci6n Abrir vista>Devolver todas las filas. todos 10s elementos creados en la base de datos SQL Server han sido generados mediante asistentes que se han encargado de producir las sentencias SQL adecuadas. Si hace doble clic sobre ella. desde el propio Administrador corporativo de SQL Server. Puede ejecutar la vista en cualquier momento. enviindolas a1 servidor para su ejecuci6n. ya que un procedimiento almacenado es. no tendremos m i s remedio que escribir el cbdigo.NET > BEWEEN 10. n S Hasta ahora. un bloque de c6digo con un nombre. A1 crear un procedimiento almacenado. en si. Cornprobarnos el resultado de ejecutar la vista 6. en el panel derecho del Administrador corporativo.Programacidn de bases de datos con Visual Basic .21.

A continuacih puede hacer clic en Aceptar para cerrar el cuadro de didlogo y crear efectivamente el procedimiento almacenado. Libros L WHERE E. Origenes de datos Seleccione la carpeta Procedimientos almacenados de la base de datos.. introducir la 16gica a ejecutar que. por ejemplo el nombre de editorial y el numero de titulos de cada una de las editoriales que existan...Editoria1 . cuyo objetivo es devolver como resultado el numero de titulos de la editorial cuyo c6digo se entrega como pardmetro 0. e introduzca el cddigo siguiente en la ventana: CREATE PROCEDURE NurnTitulosEditorial AS BEGIN SELECT E.. Debemos facilitar el nombre y. lntroducimos el codigo del procedimiento almacenado Tras escribir el d d i g o .. Vamos a crear otro que retorne un conjunto de datos. Se trata del procedimiento almacenado propuesto como ejemplo en el capitulo previo..11/11 ... Este procedimiento almacenado devuelve como resultado un valor Linico.... Siga 10s pasos que se han indicado antes.. i Figura 3...........Titulo) NurnTitulos FROM Editoriales E.. En cualquier momento puede hacer doble clic sobre este para volver a abrir la ventana y editar el c6digo..... .22.. en este caso un numero entero. Se encontrard con un cuadro de didlogo en el que aparece la cabecera para el nuevo procedimiento..... i.Nombre..... serd la que puede ver en la figura 3.-1.. COUNT(L. eligiendo la opci6n Nuevo procedimiento almacenado. por defecto..3 .22. -alairt& " " " I . .... en este caso..IDEditoria1 = L.. T ~ O REATE PROCEDURE NurnTtdulos OEdtonal INTEGER '-1 IL_ WHERE EdRonal OEdRonal It .. el numero total de titulos de todas las editoriales. pulse el b o t h Comprobar la sintaxis para asegurarse de que no ha introducido ningun error..... abra el menu emergente y elija la opci6n Nuevo procedimiento almacenado. por supuesto.

y no otro. Por ejemplo. El identificador NumTi tulos que se ha puesto tras COUNT ( ) ser6 el nombre de esa columna. el segundo que hemos creado.23. el numero de titulos. es aprender a utilizarlos desde Visual Basic . devolviendo el resultado. en la que puede ver. El procedimiento almacenado NumTitulosEditorial devuelve un conjunto de resultados obtenido mediante una consulta . a fin de comprobar que el resultado que generan es el que esperamos. seleccionando dicha opci6n del menu Herramientas del Administrador corporativo. bastaria con introducir la sentencia EXECUTE NumTitulosEditorial y pulsar el bot6n Ejecutar consulta o la tecla F5. el conjunto de resultados obtenido.tras la que debe entregarse el nombre del procedimiento almacenado y.Nombre END Lo que hacemos es ejecutar una consulta. en la que se agrupan las filas por editorial y se obtiene el numero de titulos. Aunque nuestro objetivo.NET G R O U P BY E. Un procedimiento almacenado se ejecuta mediante la sentencia EXECUTE.NET. 10s parametros apropiados. en el conjunto de resultados. 2 Apress HcGraw-Bill 1 3 Figura 3. Para hacerlo deberemos recurrir a1 Analizador de consultas SQL.Programacion de bases de datos con Visual Basic . Es lo que se ha hecho en la figura 3. para ejecutar el procedimiento almacenado NumTitulosEditorial. en la parte inferior. en caso que sea necesario. deberiamos ejecutarlos en este mismo momento.23. a1 crear 10s procedimientos almacenados del punto anterior.

obtendra el numero de titulos con que cuenta esta. s610 puede ejecutarse en Windows. y que. . lo cual le otorga ventaja sobre un product0 que. per0 actualmente el numero uno de 10s RDBMS sigue siendo Oracle. desde sistemas personales con Windows o Linux hasta grandes sistemas. Si tras NumTitulos se pone el c6digo de una editorial. Vera que en la parte inferior aparece un mensaje indicando que se ha ejecutado con &xito. No es de extrafiar si se tiene en cuenta que es uno de 10s RDBMS m6s antiguos. usando a continuaci6n la sentencia PRINT para mostrar el contenido en el panel de mensajes. como se ha visto. adem&. como SQL Server. Origenes d e datos Si ejecuta el procedimiento almacenado NumTi tulos siguiendo el mismo mktodo.3 .24. en la parte inferior. Para ejecutar el procedimiento NumTitulos y obtener el resultado tenemos que recurrir a una variable intermedia SQL Server es un RDBMS de Microsoft en continua expansibn. Para poder comprobar este procedimiento tendremos que recoger el valor devuelto en una variable. como se ha hecho en la figura 3.24. previamente declarada. tan s610 un numero entero. per0 el procedimiento NumTitulos no devuelve conjunto de resultados alguno. En caso contrario se indicara el numero total de titulos que hay en la tabla L i b r o s . El Analizador de consultas SQL recoge 10s valores devueltos por consultas y 10s muestra. especialmente desde la aparici6n de las versiones 7 y 2000. Figura 3. esta disponible para multiples plataformas.per0 no se muestra conjunto de resultados alguno. y por tanto con mas experiencia.

lnicio del Asistente de configuracion d e bases d e datos Oracle . modificar la configuraci6n de las ya existentes y eliminar bases de datos. es gratuito. que podriamos utilizar. Se pondri en marcha el Asistente de configuracion de bases de datos Oracle. en distintas versiones y ediciones. h t m l . Si en su sistema es uno distinto t6ngalo en cuenta por 10s cambios que pudieran ser necesarios. va cambiando en las tiltimas versiones del producto. Puede obtenerse el RDBMSdeOracledesdehttp: / / o t n . o r a c l e . per0 vamos a crear otra para que conozca el proceso a seguir. asumiendo que el directorio raiz de Oracle es OraHome81.25. y seleccione la opci6n Database Administration>Database Configuration Assistant. per0 no precisamente ficil de instalar o administrar.NET Oracle siempre ha tenido fama de ser un producto robusto. c o m / s o f t w a r e / c o n t e n t . mediante el cual. fiable y muy escalable. Esto. proceder a la descarga e instalaci6n siguiendo 10s pasos indicados. I I Cuando se instala Oracle se crea una base de datos de ejemplo. por suerte. podemos crear nuevas bases de datos.NET Enterprise Server. en el menu del b o t h Inicio.7) sobre un servidor Windows .Prograrnacidn de bases de datos con V i s u a l Basic . como la 8i y 9i. En 10s puntos siguientes va a utilizarse Oracle8i Release 3 (versi6n 8.1. Tan s6lo tiene que registrarse en OTN. segLin se puede ver en la figura 3. usualmente llamada o r a c l e . Abra la carpeta Oracle . Bienvenido al Asistente de Confguracih de Bases de Datos Oracle Este asistente le lsermite crear. e Crear una base de datos r Cambiar la confguraci6n de una base de datos r Borrar una base de d a b s Figora 3. confgurar o borrar una base de datos Seleccione el procedimiento que desea realizar con este asistente.OraHome81 de la lista de programas.25.

almacenado en el CD-ROM del producto. Origenes de datos Pulse el b o t h Siguiente dejando seleccionada la opci6n Crear una base de datos. asi como el SID o identificador 16gico. el siguiente paso serfi la definici6n de las tablas que la formarh. lo cual siempre es m6s lento. Deje seleccionada la opci6n Copiar 10s ficheros de base de datos existentes del CD y pulse el b o t h Siguiente una vez m6s. como en 10s casos previos. IC S Una vez tenemos la base de datos creada y en marcha. como se ve en la figura 3. La base de datos OracleEi se identiftca inequivocamente mediante un Nombre de Base de Datos Global.26.27) en la que se indica el identificador de la base y 10s datos de las cuentas asociadas. Para este ejemplo. tras lo cual se pone en marcha el proceso de creaci6n propiamente dicho (v6ase figura 3. Deje marcada la primera opci6n y pulse de nuevo el b o t h Siguiente. El primer0 se suele componer del nombre de la base de datos mAs un dominio. lntroducimos la inforrnacion de identificacion de la nueva base de datos No tenemos mfis que pulsar el b o t h Terminar y responder afirmativamente a la pregunta de si desea iniciar la creaci6n de la base de datos. o bien creando dichas estructuras a partir de cero.OraHome8l de nuevo de la lista de programas y seleccione la opci6n Database AdministratiowDBA . En el siguiente cuadro de di5logo debe introducir el nombre global para la base de datos. formando asi un identificador Gnico.28). mientras que el segundo es un identificador simple.3. Act0 seguido aparecer6 una pequefia ventana (v6ase figura 3. normalmente con elformato "nombre dommio" lntroduzca el Nombre de Rase de Datos Global que desee asignar a esta base de datos La base de datos esta referenciada por al menos una instancia de OracleEt identiflcada inequivocamente desde cualquier otra instancia de este ordenador mediante un identiftcador del sistema Oracle (SID) Se ha introducido un SID recomendado que puede aceptar 0 cambiar por otro valor SID: 1II bro s Figura 3. Oracle puede crear una base de datos nueva copiando las estructuras bfisicas de un modelo ya existente. En el paso siguiente podrfi elegir entre una base de datos Tipica y otra Personalizada. llamaremos libros a la base de datos.26. Abra la carpeta Oracle . Este puede tardar un cierto tiempo y finalizar6 con un mensaje de confirmacihn.

en el Brbol que hay en el panel izquierdo no aparece nuestra base de datos. o bien seleccionar una de las que aparecen en el archivo tnsnames ora de Oracle. Haga clic sobre la base de datos para desplegar su contenido. . procedimientos. tablas. Seleccione esta segunda opcidn y marque la base de datos Libros. elija el nodo Table. Transcurrido un momento. deje seleccionada la primera opcidn y pulse Intro. En el cuadro de di6logo que aparece. conteniendo en su interior objetos tales como esquemas. Aparecer6 un cuadro de diglogo con dos opciones: afiadir una base de datos manualmente. Se va a clear una base de datos Oracle El nombre de la base de datos sera llbros El identlficador del sistema para la base de datos sera libros La clave para la cuenta INTERNALser6 . Despliegue la rama Schema y.haciendo clic a continuacidn sobre el b o t h OK. la que hemos creado en el punto anterior. Haga clic sobre .29. Proceso de creacion de la base de datos Como ver6. iniciando sesi6n como administrador de la base de datos (SYSDBA) utilizando la cuenta SYSTEM. para la cuenta SYS sera change-on-install y para la cuenta SYSTEM sera manager Figura 3. deberia encontrarse con una interfaz como la de la figura 3.28. preguntando si desea iniciarlo en mod0 est6ndar o conectando con un servidor de administracidn.NET Studio para iniciar el Oracle DBA Studio. lnformacion sobre la base de datos que va a crearse Figura 3. facilitando sus datos. etc. En el panel izquierdo aparecen las bases de datos disponibles. por lo que tendremos que afiadirla.Prograrnacidn de bases de d a f o s con Visual Basic . Seleccione la opcidn File>Add Database to Tree. dentro de ella. En ese momento la base de datos aparecer6 como un nuevo nodo del Brbol.27.

and Oracle8 objects I SecurIly. clirkthe Quick Tour bunon Figura 3. indexes. compuesto de nada menos que trece pasos. Introduzca el nombre de la tabla. and rollback segments I Replication. including tablespaces. lo habitual es que se creen 10s usuarios que van a tener acceso a ella y se utilice una de esas cuentas para operar. lnterfaz de usuario del Oracle DBA Studio Aunque para este ejemplo. and privileges I Storage. 1. y seleccione el esquema del que formari parte. CORBA and EJB components and their permissions To learn more ahout DB4 Studin. shutdown. Origenes de datos 61 con el b o t h secundario del rat6n y elija la opci6n Create Using Wizard para poner en marcha el asistente de creaci6n de tablas. I DBA Studio combines multiple database tools in one application Use DBA Studio to administer b Instances. per0 puede desplegar .3. including namespaces.29. asumi6ndose que pulsari el b o t h Siguiente a medida que vaya ley6ndolos para ir de una ventana a la siguiente. Se pone en marcha el asistente para creaci6n de tablas. and initialization I Schemas.including rnultimaster and snapshot replication I OracleBlJVM (JServer). datafiles.including startup. y por inmediatez. Por defect0 aparece el esquema SYSTEM porque es la cuenta con la que hemos iniciado sesibn. vamos a usar la cuenta SYSTEM para conectar con la base de datos. En 10s puntos siguientes se detallan uno a uno. roles.including user accounts. including tables. en este caso EDITORIALES.

concretamente las de permitir o no valores nulos y duplicaci6n de valores. Active la opci6n Yes. Introduzca 10s datos de las columnas siguientes. marque las opciones No.NET la lista Wich Schema do you want the table to be part of? y elegir cualquiera de las creadas como ejemplo en la base de datos.J x Add 1 Remwe) J. En la ventana siguiente podemos establecer una clave primaria para la tabla. I want to create a primary key y haga clic en la columna Order de IDEDITORIAL. aunque podria conseguir el mismo efecto por medio de un desencadenador y una secuencia.Cancelar Awda ) __ 4 @tarlor Siguiente 9 Termlnar 1 Figura 3. mientras que a la derecha se reflejan 10s atributos de la columna elegida en cada momento. En Oracle no hay un tip0 similar a1 autoincrementado de SQL Server y Microsoft Access. pulsando el b o t h Add para ir aiiadihdolas a la lista. Definicion de las columnas de la tabla EDITORIALES 3 . please enter f . inicialmente vacia. 0 IDEDITORIAL: Asignele el tip0 NUMBER estableciendo 32 como tamafio. con las columnas. 2. it cannot be Null y Yes. a continuaci6n. . A la izquierda aparece una lista. NOMBRE y DIRECCION: Selecci6n el tip0 VARCHAR2 introduciendo 50 en el apartado Size. 0 I Columns Definftion Columns defined Pmpetttesof col Column Name Column Datatype I1 A size Scale Does this column have a defaultvalue7I so. En la columna de la izquierda seleccione la columna IDEDITORIAL y. A continuaci6n encontrari las opciones necesarias para definir algunas restricciones. 4. El segundo paso consiste en la definici6n de las columnas que tendri la tabla.Programacidn de bases de datos con V i s u a l Basic . por ejemplo el conocido esquema SCOTT. it must be . convirtihdola en la finica partkipante de la clave principal.30.

pulsamos directamente el bot6n Siguiente. Otro paso que nos saltaremos serfi el sexto. Por lo tanto. En la parte inferior aparecen algunos ejemplos. the column has a Check Condition. algo que en el caso de la tabla EDITORIALES no es aplicable. Figura 3.31. a1 igual que EDITORIAL y PRECIO. Utilizando el mismo asistente. La ventana de este paso se emplea para introducir opciones especificas sobre almacenamiento. Restricciones de comprobacion para las columnas 7. ISBN Ser6 de tipo CHAR con una . per0 con 10s tipos de datos de Oracle. A continuacibn podria establecer restricciones similares para las otras columnas. por ejemplo. e introducir la restricci6n a la derecha tras activar la opci6n Yes. no tenemos m6s que elegir una columna.32). 6. ser5 de tipo NUMBER.31. vamos ahora a crear la tabla LIBROS. Dado que hemos dejado en algunos apartados 10s valores por defecto. 5. Basta con pulsar el b o t h Terminar para proceder a la creaci6n de la tabla. ya que no vamos a aplicar restricciones adicionales de comprobaci6n a ninguna de las columnas de esta tabla.3 . La columna IDLIBRO. Como se aprecia en la figura 3. El paso 5 de 13 permite definir claves externas. a la izquierda.h a contarfi con las mismas columnas que ya definimos previamente en SQL Server o Access. Origenes de datos Unique a la derecha. el asistente pasa directamente a1 paso 13 y nos muestra la sentencia SQL que se utilizarfi para crear la tabla (v4ase figura 3. Dejaremos la configuraci6n por defecto y pasaremos a la siguiente. aunque en este caso las dejaremos con sus valores por defecto.

Defina la columna IDLIBRO como clave primaria y apliquele las restricciones necesarias para evitar que se introduzcan valores duplicados o que quede con un valor nulo.NET longitud de 13 caracteres y las demhs columnas serhn de tipo VARCHAR y 50 caracteres como limite. En el paso cinco deberh establecer la relaci6n entre la columna EDITORIAL de esta tabla e IDEDITORIAL de la tabla EDITORIALES.32.Programacidn de bases de datos con Visual Basic . tal y como se muestra en la figura 3. UNIQU TABLESPACE 'SYSTEM' 'I Figura 3.33. Name UBROS Schema SCOl? S "NOMBRE" VARCMRZ(50) NOT NUL1"DIRECCION"VARCWZ(50 NULL CONSTMINT" PRIMARY KEYCIDEDITORW).33. Asi se asegura la integridad referencial entre ambas.me column is 8 Figura 3. Definimos las restricciones de integridad referencial . Tambikn puede aplicar las mismas restricciones a la columna ISBN. Resumen de la creacion de la tabla Foreign Constraint constraints on column EDITORW Column Name EDiTORlM Column Dataiype NUMBER(3Z) - @ Yes.

Utilizando 10s botones que tiene a la izquierda puede acceder a1 c6digo SQL que se va generando a medida que introduce datos. "EDITORIAC' NUMBER(32) NOT NULL. "ISBN' CHAR(13) NOT NULL. Dichas sentencias se ejecutaran en el momento en que pulse el b o t h Apply. En este momento ya tenemos definidas las estructuras que necesitamos.35. haga clic sobre ella con el b o t h secundario del rat6n y elija la opci6n Table Data Editor. en el que se comunica que se ha dado un c6digo de editorial inexistente.2).l__ _ I -. como en la figura 3. revisar la sentencia SQL y. crear la tabla. en funcionamiento. a1 visto anteriormente para SQL Server.34.__-l__ll_.RY EYC'IDLIBRO")."EDITORIALESCIDEDITORIAC')) TABLESPACE "SYSTEM I t ' Figura 3. "AUTOR" VARCHARZ(SO). teniendo en cuenta que debe facilitar un identificador unico para cada fila y. incluido el identificador puesto que no hemos preparado ningun mecanismo que lo genere autom6ticamente. Seleccione la tabla EDITORIALES en el panel derecho del Oracle DBA Studio. "PRECIV NUMBER(5. si bien resulta algo m6s rudimentario ya que 10s cambios no van confirmandose a medida que se pasa de una fila a otra. UNIQUE( "ISBN).36. introducir el c6digo de cada editorial definida en la tabla anterior.Ahora puede pulsar directamente el boton Terminar para ir a1 ultimo paso del asistente. A continuaci6n haga lo mismo con la tabla L I B R O S . Summaw Name Schema LIBROS SCOTT SQL generated ll__. Resurnen de la creacion de la tabla LIBROS El mecanismo de edici6n de datos de Oracle se asemeja."TITULO VARCHAR2(50) NOT NULL.l_____lll__ _ __. .~ l _ _ l _ _ ^ _ ~ _ _ l ~ REATE TABLE "SCO~. Cualquier error de restricci6n provocarA un mensaje de error similar a1 de la figura 3. ademas. Puede ir introduciendo 10s datos de las editoriales.. sin0 que van generando una o m6s sentencias SQL que no se ejecutan hasta que lo confirmamos explicitamente. Inicialmente aparece una rejilla vacia. pulsando otra vez el b o t h Terminar. CONSTRAINT"" PRlMP. VNlQUE('IDLIBRr3"). FOREIGN KEYrEDITORIAC') REFEREMCES "SCOlT.~'LIBROS'('IDLIBRO"NUblBER(32) NOT NULL.

.claw padre no encontrada Figura 3. en el panel izquierdo del Oracle DBA Studio. La segunda ventana mostrarA en el panel izquierdo una lista de las tablas disponibles.36.. y seleccione la opci6n Create Using Wizard.DlRECClON . l'planta ci ~- Anaya Multimedia Juan lgnacio Luca de Tena. y seleccione el esquema SCOTT para alojarla. LIBROSEDITORIAL.Programacion de bases de datos con Visual Basic .37 puede ver c6mo se ha incluido .NET I I: i__. En la primera ventana introduzca el nombre de la vista que vamos a crear.35. a fin de que seleccionemos aquellas que deseamos incluir en la vista. 1 5 Figura 3. lntroducimos una serie de filas en la tabla EDITORIALES 4 ORA*02291 resmccion de lntegrldad (SCOTT SYS-CO01276)nolada. Error provocado al violarse una de las restricciones _ I ~ ~ _ - ^ I ( ~ - ~ - I ~ ~-~ - - -- Como hicikramos en la base de datos SQL Server. junto con sus columnas. vamos a definir una vista simple que nos permita obtener una lista de todas las editoriales junto con 10s titu10s que le corresponden. En la figura 3._ __I_- lDEDllORlAL # NORIBRE McGraw-Hill _ _ . Seleccione la carpeta View. En este caso el asistente se compone de 10s siguientes cinco pasos: 1. . Pulse el b o t h Siguiente. 2. EdiRcio Valrealty..

Pulse entonces el b o t h Siguiente. LIBROS . vailable Columns Selected Columns @ SCOTT LIBROS PRECIO @ SCOTT LIBROS TITULO - I Figura 3. y funciones. La pendtima operaci6n ser6 definir las condiciones de selecci6n de 10s datos. . Pulse el b o t h Siguiente. Seleccionamos las columnas a incluir en la vista 3 . en el panel derecho. Para ejecutar la vista. el titulo y el precio de cada libro. en sustitucih de 10s nombres de las columnas originales. Como a1 crear las tablas. TambiI5n puede alterar el orden de las columnas arrastrando y soltando. que pueden tomar par6metros per0 no devolverlos. El paso siguiente nos permite introducir un nombre para cada columna de la vista. que . con el objetivo de filtrar las filas y obtener s610 las que cumplan ciertas condiciones. seleccihela. 5. en la cl6usula WHERE. Deber6 encontrarse con una ventana como la de la figura 3. Haga clic en I5ste con el b o t h secundario del rat6n y cambie a la vista SQL para poder completar la condici6n SCOTT. haga clic sobre ella con el b o t h secundario del rat6n y elija la opci6n View Contents. el ultimo paso es simplemente de confirmacidn.37. Origenes de datos el nombre de la editorial. EDITORIALES IDEDITORIAL = SCOTT. Definir funciones y procedimientos almacenados Como vimos en el capitulo anterior. y ver el resultado. en Oracle podemos crear procedimientos almacenados. puede modificarla para afiadir criterios adicionales de seleccibn. 4. En I51 podemos ver la sentencia SQL con la que va a generarse la vista.39. Ldgicamente. EDITORIAL. Arrastre desde el panel de la izquierda la columna IDEDITORIAL hasta el de la derecha.3 . No tenemos m6s que pulsar el b o t h Terminar para crearla.

Resurnen de la creacion de la vista Editorial Lpress .39. Comencemos definiendo la funcibn propuesta como ejemplo a1 final del capitulo previo. I __ Can ce Ia r I _ Ayuda __ - .5__ 24 . __ _ _ I Figura 3.Anaya Multimedia (Anaya Multimedia IAnaya Multimedia (Anaya Multimedia jAnaya Multimedia jAnaya Multimedia {Anaya Multimedia IAnaya Multimedia 'Anaya Multimedia IAnaya Multimedia Anaya Multimedia jAnayaMultimedia Anaya Multimedia C.Programacidn de bases de datos con Visual Basic . I SQL Server 2000 Guia practica para usuarios JBuilder 7 Programacion con Visual CX NET Programacion convisual Studio NET Programacion conVisual Basic NET Guia practica para usuarios deVisual Basic NET Guia practica para usuarios de Visual Studio NET Programacion con Delphi 6 y Kyllx Guia practica para USuariOS de Delphi 6 Manual avanzado Excel 2002 Guia practica para usuarios de Excel 2002 Guiapractica para usuarios de Kyllx lntroduccion a la programaclon 1075 1075 39 40 39 10 75 1 0 52 i I 37 26 1052 21 04 L _ 1052 10 2 .NET si pueden devolver valores como resultado. Tituln Cl. SCOTT LIBROS j \VHERE (SCOTT EDITOPIALES IDEDITORIAL= SCOTTLIBROS E WTH RE4D ONLY I 1 .rr ~ 4 Interraw Design lor Frngrammers Preriu 31 C._ 04 I -. Summary Name LIBROSPOREDITORIAL Schema SCOTT r ModifyView Definition This wll override the view deflnltion specifled in the prevlous pages Of the wizard -i l _ _ _ _ K E z E VIEW SCOTT "LIBROSPOREDITORIAL A5 8 seldit SCOTTEDITORIALES NOMBRE as Editurlal .Anterior - I 1 a ( r ) Figura 3. . SCOTTLIBRI TITULO as Titilo SCOTT LIBROS PRECIO as Prerio' froin SCOTT EDIT~RIALES. Apareceri un cuadro de didogo en el que tiene que dar tres pasos: . Resultado de ejecutar la vista Localice la carpeta Functions y haga clic sobre ella con el b o t h secundario del ratbn. seleccionando la opci6n Create.38.

lo cual es perfectamente posible. exceptuando la cabecera CREATE FUNCTION NUMTITULOS que ya se da por asumida. dejaremos la pareja de parentesis con el pardmetro de entrada y el resto del c6digo. tendremos que utilizar un par6metro de salida. Pulsando el b o t h Compile podr6 saber si la funcion es v6lida 0. asign6ndole el valor a devolver en lugar de utilizar la sentencia RETURN. como en este caso. De no ser asi.3 . Origenes de datos 1. y corrija cualquier error que pudiera existir en el c6digo. 3. NUMTITULOS en este caso. haga doble clic sobre la funcibn. sin0 un conjunto de datos resultante de una consulta. BEGIA I F IDEdltOrlaI = 0 THEN *ELECT COUNT(1SBN) I N T U N FFnM Llbros: EL E ELECT COUNT(1SBN) IITTIJ N GO21 Llbros IUHERE EdlcOr1al = IDEditonal: ElII I F : FETLIPIJ N: Figura 3. Introducir en la parte superior el nombre de la funcidn.40. contiene errores.40. 2. Es decir. en este caso SCOTT. Seleccione la carpeta FunctionsSCOTT para localizarla y compruebe que en la columna de la derecha aparece la indicaci6n Valid. itorla IN INTEGER IIEFALlLT 0) N NIIXEEF. Seleccionar el esquema donde se alojar6 la funcih.por el contrario. A1 pulsar el b o t h OK se compilar6 el c6digo y crear6 la funci6n. Crearnos la funcion NUMTITULOS Esta funci6n devuelve un resultado unico. como hicieramos en el segundo pro- . Si lo que pretendemos devolver no es un valor unico. de tip0 OUT. Escribir el c6digo de la funci6n en el apartado Source. Si queremos crear un procedimiento almacenado que haga lo mismo. para abrir la ventana mostrada en la figura 3.

.S L WHERE E. SCOTT.Prograrnacion de bases de datos con Visual basic . ver5 c6mo utilizar. y codificar el procedimiento almacenado de tal manera que emplee ese tip0 para devolver el resultado.NOMBRE.IDEDITORIAL = L. A continuacion definiremos el procedimiento almacenado. una referencia a un cursor. Localice la carpeta Package en el panel izquierdo del Oracle DBA Studio. en el punto siguiente. como se aprecia en la figura 3. COUNT(L. a1 intentar introducirla en un procedimiento almacenado obtenemos un error de compilaci6n. podemos ejecutarla en SQL*Plus y obtenemos el resultado esperado.TITULO) NUMTITULOS FROM SCOTT.RS) IS BEGIN OPEN Resultado FOR SELECT E. elegimos SCOTT como esquema y escribimos el c6digo siguiente: (Resultado OUT LIBROSPKG. En PL / SQL no puede ejecutarse una consulta y esperar que vuelva automtiticamente a1 proceso que ejecute el procedimiento almacenado. COUNT(L. END. Introduzca LIBROSPKG como nombre. ya que en PL/SQL no podemos. ejecutar algo asi: CREATE PROCEDURE NUMTITULOSEDITORIAL IS BEGIN SELECT E.LIBR0.NOMBRE. como si ocurre con Transact-SQL. y esperar que el proceso que invoque al procedimiento haga con dl lo que le interese.diante la sentencia OPEN. sin mtis. por una parte.EDITORIAL GROUP BY E. a1 que llamaremos rs. END.NOMBRE.EDITORIALES E. Observe c6mo se indica que existe un pardmetro de salida. la definici6n del tipo.NET cedimiento almacenado escrito con Transact-SQL. Introducimos el nombre del procedimiento. La soluci6n pasa por recoger el resultado de la consulta en una variable.NOMBKE. cuyo tip0 es el definido previamente en el paquete LIBROSPKG. SCOTT. elija SCOTT como esquema de destino e introduzca.41. NUMTITULOSEDITORIAL. A1 cerrar la ventana habr6 finalizado la creaci6n del procedimiento almacenado que. la definici6n del nuevo tipo. Para esto es necesario dar dos pasos: crear un paquete PL/SQL en el que se defina un nuevo tipo de dato asociado a REF CURSOR.EDITORIAL G R O I J P BY E. El paquete contendrti s610 esto. seleccionando la opcion Create de la carpeta Procedure.IDEDITOKIAL = L.Fijese tambidn en c6mo se inserta el resultado de la consulta SQL en la variable Resultado me.TITUL0) NTJMTITULOS FROM SCOTT.EDITORIALES E. abra el men6 emergente y seleccione la opci6n Create. A pesar de que la consulta estd expresada correctamente.LIBROS L WHERE E. el tema se complica algo mds.

I I _ _ .3 .I I - En este momento contamos con una funci6n y un procedimiento almacenado que.~ . No sabemos. El resultado. .41. no bastarii con llamarlo mediante la sentencia EXECUTE. en vez de abrir una secci6n DECLARE seguida de un bloque BEGIN/ END. Es precis0 pasar un parbmetro.42. guardar el resultado y despues mostrarlo en el panel inferior. Comencemos ejecutando la funci6n NUMTITULOS. para lo cual tendremos que declarar una variable. como funcionan ni si el resultad0 obtenido es el que se cspera. ya que no han generado errores a1 guardarse en la base de datos. Para ejecutar el procedimiento almacenado NUMTITULOSEDITORIAL hemos de tener en cuenta que. para ello tendremos que ejecutarlos. Origenes de datos Figura 3. aparecen como vblidos. sin embargo. Con este fin tendremos que recurrir a la herramienta SQL*Plus Worksheet. como se aprecia en la parte inferior. a diferencia de lo que ocurria en Transact-SQL.. Por lo tanto declararemos una variable de tip0 REFCURSOR. concretamente una variable capaz de guardar una referencia a un cursor. que en este caso Serb LIBRos. Deberb introducir el nombre de usuario. entreghdola como par5metro al I . en principio. es el ntimero de titulos devuelto por la funci6n._ _ . clave de acceso y nombre del servicio con el que va a conectar. seleccionbndola del grupo Database Administration de la lista de programas de Oracle. en la que hemos usado la palabra clave VARIABLE para declarar la variable. Esto es lo que hemos hecho en la figura 3. Definicion del paquete con el tipo de dato rs ~ _ _ _ _ _ _ _ ~ ^ _ ~ .

el procedimiento almacenado que hemos creado como ejemplo es simplemente eso. puesto que no se efectua ningun proceso especial de la inforrnacion.Programacidn de bases de datos con Visual Basic . per0 no por ello ser5 siempre el product0 mhs adecuado. ya que en la practica. En un capitulo posterior veremos c6mo acceder a estos datos desde una aplicaci6n escrita con Visual Basic.43. segun se apuntaba anteriormente.42. Ejecucion de la funcion N U M T I T U L O S en SQL*Plus Worksheet En realidad. Procedimiento P L m L terminado correctamente. utilizando 10s servicios de ADO. un ejemplo.NET procedimiento almacenado. Figura 3. . I I Inter Base Oracle es un RDBMS disponible en multiples sistemas operativos.NET. Despuks. resultaria mucho mas facil crear una vista que generase el mismo resultado. no tenemos m6s que imprimir dicha variable para poder ver el resultado. como se aprecia en la figura 3.

Linux y Solares. De ser asi. aparte de Oracle. Una tiene una licencia de software libre. de pequefio tamafio. para varios sistemas operativos. InterBase es un RDBMS ligero. Recuperamos la referencia al cursor devuelto por el procedirniento almacenado InterBase es un producto adquirido por Borland hace aiios a la empresa AsthonTate. indistintamente. en Windows.3 . y f6cil de instalar. podemos evitar gran parte de la complejidad de Oracle optando por un producto de menor nivel. entre ellas el conocido Delphi.43. Actualmente existen dos versiones de InterBase independientes. Como todos 10s RDBMS. Figura 3. sin coste per0 sin soporte alguno ni garantia por parte . C++ Builder y Kylix. Existen muchos otros RDBMS multiplataforma. Ambos pueden instalarse. Tras diversos vaivenes. distribuir y configurar. InterBase actualmente es el RDBMS de Borland y es ampliamente utilizado por aquellos que emplean las herramientas de desarrollo de dicha empresa. por ejemplo el popular MySQL o InterBase. Origenes d e datos especialmente si nuestras necesidades de almacenamiento y gesti6n de datos no son las de una gran empresa. la misma que cre6 dBase. cuenta con una parte que a c t ~ como servidor y otra que es el software a instalar en 10s cliena tes para comunicarse con ese servidor. A pesar de sus posibilidades.

html. De no ser asi.com/products/downloads/download~interbase. En 10s puntos siguientes se utilizar6 la versi6n 6. pulse el primer b o t h que aparece en la parte superior. en el panel izquierdo. Aspect0 de la herramienta IBConsole recien puesta en marcha Habitualmente IBConsole se utiliza en el mismo ordenador donde se ha instalado InterBase y. La primera es InterBase 6.5 instalada sobre un sistema Windows XI' Professional.44.5. deberi encontrarse con una interfaz como la de la figura 3.44. tan s610 tiene que pulsar sobre el sistema operativo que desea. y la otra es el product0 comercial que vende esta empresa. IBCorrsole onsole Yiew sewn Database Iools Help ctwn Login Register Un Register Diagnose Conn Pioperties Desciiption Login to the relected sewer Register a new InteiBase Server Unregirter an InterBase Server Diagnose a connection to a serve1 Mew Server properties Add Certificate Add a license certificate Ifserver' Local Server 6 objeck latec Figura 3. en versiones previas a la 6. Esta incorpora una herramienta.Programacidn de bases de datos con Visual Basic . el que est6 m6s a la izquierda.0. ese servidor aparece ya como Local Server. haga doble clic en el derecho sobre la opcion Login para iniciar sesi6n. llamada IBConsole.5. Abra el grupo de programas InterBase y seleccione la o. Teniendo seleccionado el servidor.0 y la segunda InterBase 6. descargarla e instalarla.pcion IBConsole. Puede obtener la primera de http : / / mers . tenian que efectuarse necesariamente mediante sentencias SQL.NET de Borland. Aparecerfi un pequefio cuadro .borland. que simplifica la mayoria de las operaciones que. Esta seri el punto de partida para las operaciones descritas en 10s puntos siguientes. para registrar el servidor local o un servidor remoto en caso de que este usando IBConsole desde una m6quina diferente. a1 iniciarse. Si desea probar InterBase 6. puede obtener una edici6n trial de http://www. com.

El alias o nombre con el que se conocera la base de datos internamente.45 puede ver 10s valores introducidos. La carpeta Databases esta inicialmente vacia ya que no hemos creado base de datos alguna.46) a la izquierda las diferentes categorias de elementos. u archivos. -Server Local Serve~ Fle(sL Figura 3. 0 El tamaiio inicial del archivo. En nuestro caso sera un solo archivo llamado Libros . A1 pulsar el b o t h OK se procedera a crear la base de datos y. podr6 desplegar el contenido de Local Server y ver que hay diferentes carpetas: Databases. de inmediato. en el que residir6 la base de datos. en IBConsole. Vamos a introducir el valor 2 5 0. expresado en paginas. Certificates. etc. gdb. I. Si no ha creado una cuenta especifica para su trabajo. Aparecera un cuadro de dialog0 en el que debe introducir tres datos: El camino y nombre del archivo. mientras que a la derecha se enumeran las acciones posibles en ese instante. .de dialog0 en el que debe introducir el nombre de usuario y la clave. por lo que podemos proceder con la definici6n de las tablas. Haga clic con el b o t h secundario del rat6n sobre dicha carpeta y elija la opci6n Create database. Una vez se haya iniciado sesibn.45. puede utilizar la cuenta SYSDBA con la clave por defect0 masterkey. En la figura 3. Parametros de creacion de la base de datos En este momento ya tenemos a nuestra disposici6n una base de datos vacia. Users. esta se abrir6 en IBConsole mostrando (vease figura 3.

46. T i t u l o VARCHAR(501. D l p Show database propeilie~ Display databare statistics Shutdown the database Perloim a database sweep Recover limbo tiansadions View Database Metadata Restart a database 4 Views & fx Shied Procedures External F u n c l i ~ r Generators Exceptions Blob Filters Dalabare Restart Drop Database Databare Backup Connected Users Rertore Databare % @ Drop the curtent database Backup an InterBafe dalabare 3 d V w a 1st of useif cuirently connected to the server Hertoce an InterBare database Roles a 9 + Backup Cert. por lo que tendremos que escribir las sentencias DDL y ejecutarlas. Si todo va bien.I Programacidn de bases de datos con V i s u a l Basic . I S B N CHAR(13) NOT NULL U N I Q U E . Editorial I N T E G E R . la tabla aparecer6 en IBConsole y el c6digo SQL desapareceri. como en SQL Server u Oracle.47. y pulsamos el b o t h de ejecuci6n. que puede observar en la figura 3. . que puede abrir pulsando el b o t h que tiene ese nombre en IBConsole. Observe c6mo se establece la relaci6n entre ambas tablas con FOREIGN KEY. Autor VARCHAR(50).e g . A continuaci6n escribimos la sentencia siguiente para crear la tabla L i b r o s . . C R E A T E T A B L E Libros I D L i b r o I N T E t i E R NOT NTJLL P R I M A R Y K E Y .ve. Para definir la estructura de las tablas tendremos que recurrir a la herramienta Interactive SQL de Interbase. Para utilizarla no tiene mas que copiarla a su sistema y usar la opcion Register en lugar de Create Database en IBConsole. gdb en la carpeta de ejemplos correspondiente a este capitulo. Aspect0 de IBConsole tras crear la base de datos L i b r o s Encontrara el archivoLibros . Introducimos en Interactive SQL la sentencia CREATE TABLE de la tabla E d i t o r i a1e s. No hay disponibles asistentes.laater seiver Log % & Urm dimension Figura 3.NET - @ - * InterBaaeServers tction Disconnect Properties DatabaseStalirtcs Domainr Tables Indexer Shutdown Sweep Tiansaction Reco View Metadata Dcrcrrplion Disconnect fmm Ihe curient database LocalSe.

existe la posibilidad de crear una secuencia. En InterBase no existe un tip0 de dato con increment0 automatico. No obstante. llamada generador en el caso de InterBase. 2 ) . Al igual que en Oracle. para abrir la ventana de propie- . FOREIGN K E Y (Editorial) R E F E R E N C E S Editoriales(IDEditoria1) I hentrkakd3 AutoMy'oN Figura 3. y utilizarla en un desencadenador para dar valores unicos a una columna. en este ejemplo nos limitaremos a usar el tip0 I N T E G E R dejando que sea el usuario el que introduzca el codigo de las editoriales y libros. Origenes de datos Precio DECIMAL ( 6 . Creacion de la tabla Editoriales desde Interactive SQL Tras ejecutar las dos sentencias puede cerrar la ventana de Interactive SQL. Vera que las tablas aparecen en la carpeta Tables de IBConsole. no obstante.3 . Volvemos a IBConsole para proceder a la introducci6n de datos en nuestras tablas. Abriendo su menti emergente podri efectuar diversas tareas.47. Haga doble clic sobre la tabla Editoriales. como extraer el c6digo DDL o acceder a su ventana de propiedades.

sin olvidar asignar a cada una de ellas un c6digo cinico. Error generado al introducir un codigo de editorial inexistente ~ _ I _ _ I A1 igual que para definir las tablas. En ella puede.Titulo.IDEditoria1 = L.NET dades. Algo similar ocurrird si da a dos libros el mismo identificador.Editoria1 . L. introducir 10s datos de las editoriales. infringiendo otra de las restricciones. y luego seleccione la pdgina Data. Erecio FROM Editoriales E. Libros L WHERE E. i Piopeillas Meladala Peirnisslons Data 1 I IDependenclesI 901 Grayson Stieet P 3 Apress . l L ’ I Figura 3. L.48.Programacidn de bases de datos con Visual Basic . tendremos que recurrir a la herramienta Interactive SQL para crear la vista L i b r o s E d i t o r i a l .49. CREATE VIEW LibrosEditorial AS SELECT E.49. Introduzca el c6digo siguiente y pulse el b o t h de ejecuci6n. b i + - r C Comnt h Relresh Figura 3.48. como se aprecia en la figura 3. Recuerde que puede utilizar la base de datos del CD-ROM que acompafia a1 libro. Desde IBConsole podemos acceder al contenido de las tablas y editarlo Siguiendo el mismo procedimiento.Nombre. proceda a insertar algunas entradas en la tabla L i b r o s . Si introduce un c6digo de editorial inexistente obtendrd un mensaje de error como el de la figura 3.

haga doble clic sobre la vista. tambien puede ejecutar la vista desde Interactive SQL con una Sentencia cOmO SELECT * FROM L i b r o s E d i t o r i a l . La sintaxis para definir procedimientos almacenados en InterBase es ligeramente diferente a la de Transact-SQL o PL/SQL. puede afiadir condiciones adicionales. Los procedimientos almacenados de InterBase pueden devolver valores.La vista es exactamente igual a la definida en 10s puntos previos usando TransactSQL y PL/SQL. en realidad varios si bien tan s610 uno de ellos.50. Los parimetros de entrada se declaran entre parkntesis. como seria de esperar a1 tratarse de un product0 RDBMS de otro fabricante. El conjunto de datos resultante aparecera en la parte inferior de la ventana. y abra la p6gina Data para ver el resultado. Ejecucion de la vista desde IBConsole En lugar de volver a IBConsole. Seri similar a1 mostrado en la figura 3. en la carpeta Views. 1 ProDertlesI Metadata I Permissions Data I DeDendenciesI ~PRECIO Use! Interlace Design loi Programmers I SOL Server 2000 Guia practica para usuarios JBuilder 7 ProgramacionconVisual CU NET Programacton conVisual Sludio NET ProgiarnaciClnconVisual Basic NET Guia praclica para U S U ~ ~ I Ode Visual Basic NET S Guia precticaparaUSUMIO~deVirudStu~o NET Programacdn con Delphi 6 y Kylix Guia pdctica paia usuaiios de Delphi 6 Manual avanzado Excel 2002 Guia pdctoa paia usuarios de Excel 2002 Cluia pidctica para usuarios de Kylix Inlroducci6n a la progiarnacion Manual del microproceradot 80386 31 1075 1075 39 40 39 1075 1052 37 26 1052 21 04 1052 1052 24 04 40 Figura 3. actua como verdadero valor de retorno. Como ya sabe.50. y no pueden tener valores por defecto. si asi lo desea. para filtrar 10s datos y obtener s610 parte de las filas. . Para ver el resultado vuelva a IBConsole. con el nombre RETVAL. detris del nombre del procedimiento almacenado.

por #. introduciendo 10s valores extraidos en ellas mediante INTO.Editoria1 GROUP BY E. La ultima sentencia devuelve este parsmetro a su estado por defecto. se crearia de forma muy similar. Esta hace posible la devoluci6n del resultado desde el procedimiento almacenado a1 c6digo que lo invoque. END# SET TERM . da por terminada la ejecuci6n y. COUNT(L. a1 encontrarlo. Para solucionar este problema. Esto es tambien cierto en Oracle.Nombre. El segundo procedimiento almacenado. El problema es que la herramienta Interactive SQL identifica ese mismo carficter como final de sentencia. # La primera sentencia cambia el carficter de fin . de tal forma que cuando Interactive SQL encuentre el . por otro carscter.Nornbre INTO :Nornbre. N u m T i t u l o s E d i t o r i a l . CREATE PROCEDURE NumTitulosEditorial RETURNS (Nombre VARCHARISO). es necesario utilizar la orden S E T TERM a fin de cambiar el finalizador . SUSPEND. debe facilitar el numero total de titulos o 10s de una cierta editorial en caso de facilitarse su c6digo. dependiendo del valor de C o d E d i t o r i a l . Observe que tras la ejecuci6n de un S E L E C T u otro.Titulo) FROM Editoriales E. se usa una sentencia llamada SUSPEND. restituyhdolo a1 terminar. En este caso se declaran como valores de retorno tantas variables como columnas sigan a la clfiusula SELECT. NumTitulos INTEGER) AS BEGIN FOR SELECT E. Introduzca el cddigo siguiente en la herramienta Interactive SQL y ejecutelo. de tal forma que. ELSE SELECT COIJNT (ISBN) FROM Libros WHERE Editorial = :CodEditorid1 INTO :RETVAL.Programacidn de bases de datos con V i s u a l Basic . :NumTitulos DO SUSPEND. SET TERM # . Libros L WHERE E.NET Cada una de las sentencias de un procedimiento almacenado InterBase debe finalizar con un punto y coma. consecuentemente. CREATE PROCEDURE NurnTitulos(CodEditoria1 INTEGER) RETURNS (RETVAL INTEGER) AS BEGIN IF [CodEditorial = 0 ) THEN SELECT COUNT (ISBN) FROM Libros INTO : RETVAL.IDEditoria1 = L. el procedimiento almacenado no se crea apropiadamente. . Comencemos definiendo el procedimiento N u m T i t u l o s que. SET TERM # . que hay tras el primer S E L E C T no crea que el procedimiento almacenado finaliza ahi. como en 10s casos anteriores.

mostrando en la parte inferior 10s resultados. De forma similar podria crear otros m& sofisticados. bucles y otras operaciones sobre las tablas de la base de datos. SQL Server e InterBase comparten el hecho de ser sistemas relacionales de gesti6n de datos. Figura 3. aparte de condicionales simples y consultas. incluyendo. guardando algunas similitudes con Microsoft Access que. Origenes de datos END# SEI’ TERM . no un RDBMS. # Con esto ya tenemos creados nuestros dos procedimientos almacenados.51 puede ver la ejecuci6n del procedimiento NumTitulosEdit o r i a l . En la figura 3.3.51. o bien RDBMS. Solo tiene que introducir una sentencia S E L E C T * FROM seguida del nombre del procedimiento almacenado y. tam- . en el caso de N u m T i t u l o s . incluyendo 10s parAmetros necesarios. Como comprobaci6n. Estos son idhticos a 10s obtenidos en 10s ejemplos de SQL Server y Oracle. Ejecucion del procedimiento almacenado NumTitulosEditorial Oracle. puede ejecutar 10s procedimientos almacenados recikn creados desde la propia herramienta Interactive SQL. a pesar de ser un sistema de datos de escritorio.

similares a 10s escritos en las bases de datos de ejemplo. siendo empleada por todo tip0 de usuarios para gestionar sus datos. incluso. a lo largo de varias filas y / o columnas. Esta herramienta estructura la informaci6n en libros. datos en documentos XML e.bi6n se usa para almacenar informacion estructurada y utiliza el lenguaje SQL. Desde ADO. mostrando la interfaz una apariencia similar a la que aparece en la figura 3. Los pasos. Con el objetivo de preparar este nuevo libro para introducir 10s datos que nos interesan. No toda la informacion con la que tiene que trabajar una aplicaci6n est6 siempre estructurada como hemos visto en 10s puntos anteriores. por lo que vamos a preparar una hoja de c6lculo Excel que utilizaremos como origen de datos en capitulos posteriores. tanto o mas que Access. Ya tiene creado el equivalente a una base de datos vacia. es a lo que se llama rungo.NET. informacion jerarquica como la que gestiona el Directorio activo de Windows 2000 y Windows . efectuar c6lculos sobre ellos. xls a1 libro. Microsoft Excel es una aplicacion muy extendida. identificindose cada columna con una letra y cada fila con un numero. est6n formadas por celdillas. identificada por la letra de columna y nLimero de fila.52. xls tal y como quedaria al final del proceso que va a describirse en 10s puntos siguientes. son 10s que se describen a continuacion: . representaciones graficas. El libro tiene un nombre por defecto. Observe que el area central tiene el aspect0 de una cuadricula. en algunas ocasiones pueden ser datos mas o menos organizados en documentos. Apareceri el tipico cuadro de dialogo para guardar archivos. muy sencillos. L i b r o 1. por ejemplo D5. H o J a 2 y H o J a3.NET es posible acceder a estos documentos como si de bases de datos se tratasen. A un conjunto de multiples filas adyacentes. a las que puede acceder utilizando las pestanas que aparecen en la parte inferior de la ventana. cada uno de 10s cuales se compone de paginas que. a su vez. etc. Haga clic sobre el b o t h que muestra el icono de un disquete. por ejemplo hojas de c6lculo Excel. i A1 iniciar Microsoft Excel se encontrar6 ya con un nuevo libro en blanco. Nota En la carpeta de ejemplos de este capitulo encontrara el archivo L i b r o s . vamos a hacer algunos cambios en su estructura. D6 el nombre L i b r o s . El cruce de cada columna con cada fila es una celdilla.y cuenta inicialmente con tres paginas llamadas Hoj a l .

Muevase a la colurnna de la derecha. Siguiendo la misma linea. pulsando Intro a1 final. Lldmela Editoriales. y escriba el texto IDEditorial. Verd que aparece un cursor que le permite modificar su nombre. escriba a continuacih en las celdillas A1 a F1 de la hoja Libros 10s titulos IDLibro. . pulsando el b o t h Aceptar. Apariencia de Microsoft Excel al iniciarse Haga clic con el b o t h secundario del rat6n sobre la pestafia Hoja3.53. y luego seleccione la opci6n Eliminar. en realidad ya deberia estar alli si no lo movi6 antes. Autor. .52. mJa7 Hop1 ( .Isto ZFOjz 7 - ___ Figura 3. a la celdilla BI.3 . a1 aviso de que el borrado serd permanente. Desplace el cursor de la hoja Editoriales hasta la celdilla A?. en la parte inferior del libro. Responda afirmativamente. De esta manera ha definido las tres columnas con que contard cada fila correspondiente a una editorial. Titulo. En este momento el libro deberia tener el aspect0 que puede verse en la figura 3. ISBN. Repita el paso anterior con la Hoja2 llamdndola Libros. y escriba Nombre. Editorial y Precio. Origenes de datos 4 5 67 1 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ?m. Repita la operaci6n escribiendo Direction en C1. Haga doble clic sobre la pestafia Hojal .

NET Completados estos pasos. Excel no es un RDBMS y la mayoria de estos aspectos no se contemplan. no tenemos mds que utilizar las teclas del cursor para situarnos en la celdilla . claves. sin mds. a1 contar con caracteristicas como el autocompletado. Usando exactamente el mismo m4todo escribiriamos la informacih de cada fila. El libro Excel tras introducir 10s titulos de las columnas correspondientes a la hoja Editoriales Intr Microsoft Excel es una aplicacidn para usuario final y. En el punto anterior. El tip0 de cada una de las columnas. las relaciones. sin embargo. etc. no hemos indicado en punto alguno el tip0 de 10s datos. a1 escribir 10s titulos de las columnas. tenemos un libro Excel con una estructura similar a las tablas creadas previamente en Oracle o Access. Como habra observado. 6 7 Figura 3.53. ya hemos introducido varios datos en cada una de las hojas del libro. etc. la creacidn automatics de secuencias. aunque esos datos fuesen 10s titulos o nombres de las propias columnas. por ejemplo.NET a partir del contenido que tengan las celdillas. no es un libro sobre Excel. h t e . la introduccih de datos resulta muy sencilla.Prograrnacidn de bases de datos con Visual Basic . por ello. por lo cual obviaremos toda esa funcionalidad y nos limitaremos a introducir 10s datos. sera deducido por ADO.

nos limitaremos a guardar el libro dejindolo preparado para su us0 en un capitulo posterior. para no extendernos en un campo que no es especificamente el que m6s nos interesa.54. Haga doble clic para dejar que sea el propio Excel quien efectue el ajuste.54 puede ver el aspect0 de la hoja Libros tras introducir una serie de datos. indicandole que puede pulsar el boton principal del raton y arrastrar para modificar el ancho de la columna. situe el punter0 del raton entre la division de dos columnas en la fila de encabezado. funcionaria como una vista dinimica de 10s datos existentes en el libro. a partir de 10s datos introducidos. C 1 IDLibro ISBN 2 1 1 853115 94 1 3 2 84415 1136 5 4 3 84415 13243 5 4 84415 1392 9 6 5 84415 1376 7 7 6 84415 1351 1 8 7 81415 1290 6 9 8 81 415 12914 10 9 84415 1261 2 11 10 84 415 1255 8 12 11 84415 1230 2 13 12 84415 1202 7 14 13 84 415 1132 2 15 14 81415 11454 16 15 84 7615 234 5 17 D E F : n Tilulo User Interface Design for Programmers SQL Server 2000 Guia practica para usuarios JBuilder 7 Programaclon con Visual C# NET Programacion con Visual Studio IlET Programacion con Visual Rasic NET Guia practica para usuarios de Visual Basic NET Guia practica para usuarios de Visual Studio PIET Programacion con Delphi 6 Kvlix Guia practlca para usuarios de Delphi 6 Manual a*. Usando las opciones de Excel podriamos. buscar autom6ticamente el nombre de la editorial a partir del c6digo que hay en la hoja Li bros. En la figura 3. En ese momento el cursor cambiara de apariencia. creando referencias en una nueva hoja que. en la prActica.3 . lntroducirnos varias filas de datos en la hoja Libros de Excel Para ajustar automaticamente el ancho de cada columna al apropiado para mostrar su contenido. Origenes de datos adecuada en cada caso.anzado Excel 2002 Guia practica para usuarios de Excel 2002 Guia practica para usuarios de Kylix lntroduccion a la programacion Manual del microprocesador 80386 Autor Editorial Precio 3 31 Joel Spolsky 1 1075 Francisco Charte 1 1075 Francisco Charte 1 35 Francisco Charte 1 40 Francisco CharteiJorge Serrano 1 39 Francisco Charte 1 10 75 Francisco Charte 1 10 52 Francisco Charte 1 37 26 Francisco Charte 1 10 52 Francisco Charte 1 21 04 Francisco Charte 1 10 52 Francisco ChattelM Jesus Luque 1 1052 Francisco Charte 1 24 04 Francisco Charte 2 40 Chris H Pappas&William H Murray Ill - Figura 3. . por ejemplo entre las columnasA y B. No obstante.

En 10s dos puntos siguientes. _ I _ _ _ _ I _ _ _ I ~ _ _ _ _ - ~ _~~ . como su propio nombre indica. usando marcas especificas para la definici6n de tipos y elementos que deben existir en el documento. Guardar 10s datos en formato XML y recuperarlos posteriormente. el lenguaje XML se caracteriza. etc._ __ _ _~ .NET Los libros de Excel se almacenan en un formato especifico creado por Microsoft para este producto. de la carpeta Datos. En la superficie de trabajo aparecerii una indicacion comuniciindonos que podemos arrastrar y soltar componentes para comenzar a disefiar. lo cierto es que el intercambio de informaci6n con otras aplicaciones y sistemas es limitado. seleccione Esquema XML. tambien conocidos como esquemas XSD. nos centraremos tan s610 en la aportaci6n de algunos fundamentos sobre XML.-__I La estructura de 10s documentos XML se define mediante esquemas XML. por tanto. . Realmente. irii actualiz6ndose. Partiendo de un proyecto vacio. por ser extensible. como veremos en su momento. Vamos a emplearlas para crear el esquema XSD del documento XML que crearemos posteriormente. lo que significa que podemos crear nuestras propias marcas segun las necesidades de cada caso. como se muestra en la figura 3. es muy simple. Lo mismo ocurre con la representaci6n interna de 10s datos de todos 10s RDBMS.Programacidn de bases de datos con Visual Basic ..55. precisamente. _. a medida que lo disefiemos visualmente.NET tenemos a nuestro alcance herramientas mucho miis sofisticadas. Tome del Cuadro de herramientas un complexType e insertelo en . lenguajes. A pesar de que existen filtros en algunas aplicaciones para poder utilizar su contenido. Para crear un esquema XSD. independientemente de que el origen de datos sea un RDBMS. Observe que en la parte inferior aparecen dos botones: Esquema y XML. no necesitamos miis que un editor simple de texto.NET utiliza XML como formato de representaci6n interna de 10s conjuntos de datos. sistema operativo. Si pulsa este ultimo verii la definici6n textual del esquema que.. un libro Excel o cualquier otro posible. como podria ser el Bloc de notas. ADO. con el objetivo de facilitar el intercambio de informaci6n salvando las barreras en que se convierten en ocasiones las diferencias de plataforma. Introduzca en la parte inferior el nombre del archivo donde se alojarii el esquema. No obstante.^ ~ _ _ ____ . Libros x s d en este caso. abra el cuadro de diiilogo Agregar nuevo elemento y. como usuarios de Visual Studio . herramientas que pueden ahorrarnos la edici6n manual de este tip0 de archivos. formato que tambien emplea a la hora de transferir la informaci6n entre miiquinas. sin excepcibn. El lenguaje XML naci6. a1 igual que para editar cualquier documento XML. tanto fisicamente en disco como en memoria a1 transferir 10s datos desde el servidor a 10s clientes. un esquema XSD es un documento XML que sigue unas reglas preestablecidas por el W3C. Basado en SGML.

XML Nombre - - ___ ILibros xsd Cancelar I Ayuda 1 Figura 3. I Arc%wo para crearun esquemi para documento. Definicion del tipo complejo Editorial Aiiada un nuevo tip0 complejo. en la columna izquierda. Introduzca en la parte superior el nombre que va a darle a1 nuevo tipo.56 puede ver c6mo se han definido las tres columnas necesarias para registrar las editoriales.3 . 1lamBndole L i b r o .56. AAadimos al proyecto un esquema XML Cuadro de herraKeEtas IwuemaXML B K -_-A - 4 Punter0 element attribute attributeGroup compbxType simpleType a E group Z El any anyAttrlbute facet D clave I % Relation . tomando como referencia el libro Excel del punto anterior o cualquiera de las bases de datos creadas a mod0 de ejemplo.A continuaci6n vaya introduciendo. Origenes de datos cualquier punto del Brea central. y defina el nombre y tip0 de cada una de las columnas. el nombre de cada columna de datos.55. .. indicando a la derecha su tipo. en este caso Editorial. En el detalle de la figura 3. IDEditorial Nombre Direccion integer string string I I I I Figura 3. I/ Categorias: Plantillas: Archivo XSLT Anstente para formulanos .. AparecerB un recuadro con dos columnas.

org/2001/XMLSchema"> < x s :complexType n a m e = " E d i t o r i a l " > <xs : s e q u e n c e > <xs: e l e m e n t n a m e = " I D E i S i t o r i a l " t y p e = " x s : i n t e g e r " / > < x s : e l e m e n t name="Nombre" t y p e = " x s : s t r i n g " / > < x s : element n a m e = " D i r e c c i o n " t y p e = " x s : s t r i n g " / > </xs: s e q u e n c e > </xs:complexType> < x s : complexType n a m e = " L i b r o " > < x s :s e q u e n c e > <xs: e l e m e r l t n a m e = " I D L i b r o " t y p e = " x s : i n t e g e r " / > < x s : e l e m e n t name="ISBN" t y p e = " x s : s t r i n g " / > < x s : e l e m e n t narne="TItulo" t y p e = " x s : s t r i n g " / > <xs: e l e m e n t n a r n e = " A u t o r " t y p e = " x s : s t r i n g " / > < x s :e l e m e n t n a m e = " E d i t o r i a l " t y p e = " x s : i n t e g e r " / > <xs: e l e m e n t n a m e = " P r e c i o " t y p e = " x s : d e c i m a l " / > < / x s :s e q u e n c e > </xs:complexType> < x s :e l e m e r i t n a m e = " L i b r o s " > <xs : c o m p l e x T y p e > < x s :s e q u e n c e > <x s : e 1eme n t name = " E d i t o r i a 1e s " t yp e= " E d i t o r i a 1" / > <x s : e 1eme n t II a m e = " L i b r o s " t y p e = " L i b r o " / > </xs: s e q u e n c e > < / x s :c o m p l e x T y p e > </xs :element> </xs:schema> Guarde el documento L i b r o s xsd. El primer0 de ellos seria de tip0 E d i t o r i a l y el segundo de tipo L i b r o . c) r g / L i bro s . 0 " e n c o d i ng= " u t f.8 " ?> < x s :s c h e m a i d = " L i b r o s " targetNamespace="http: //tempuri. a partir de 10s cuales se pueden crear otros o bien declararse variables que. contando siempre con un elemento de primer nivel L i b r o s que contendria a E d i t o r i a l e s y L i b r o s . mientras que 10s subelementos indicados serian las tablas que habria en su interior.57. x s d xmlns:mstns="http://tempuri . esquema que. alojado en un archivo independiente. s = " ht t p : / / t e m p u r i . en el entorno XML. a1 que llamaremos L i b r o s . . x s d " x m l n s : x s = " h t t p : / /www. serviri para establecer la estructura de 10s documentos XML que actuarian como bases de datos. se conocen como elementos. xsd" e 1eme rl t Fo rmDe f a u 1t = " q u a I i t i ed " xml r. o r g / l i b r o s . Visualmente el esquema quedaria como puede apreciarse en la figura 3. E d i t o r i a l y L i b r o son tipos de datos. Nuestro elemento L i b r o s estar5 compuesto de dos subelementos: E d i t o r i a l e s y L i b r o s . El c6digo del esquema es el siguiente: < ? xml v e r s i o rI= " 1 . De esta forma. . el elemento L i b r o s hace las veces debases de datos.NET El ultimo paso ser6 la inserci6n en la superficie de un e l e m e n t .Programacidn de bases de datos con Visual Basic . La diferencia entre un c o m p l e x T y p e y un e l e m e n t es la misma que existe entre la definici6n de una estructura de datos y la declaraci6n de una variable. o r g / L i b r o s .w3.

quema XML I Libros Edtoriales Libror 4 Funtem E element A attribute b # (Libros) Editorial Libra attributeGroup E complexType + 1 Libros Libro Casesensitive IsDataSet Locale abstract block COrnplexType default (Fredetermmado) (Predetermmado) (Fredetermmado) (Predetermmado) (Fredetermmado) 4 x 5 COmpleXType > (Predetermmado) (Predetermmado) (Colecclo") $ % 0 5lmpleType I 3 G group any Edtoriales )a. etc. nombre de la editorial. ISBN del libro.xrd* t Debug q%. El documento contendria un elemento raiz llamado L i b r o s que. anyAttribute F facet Editorial D & clave Relation final fixed form id key name Libros (Fredetetmmado) nillable rubsttutionGrat type (Libros) ntllo del Fortapapeles Varlos Figura 3. Abra de nuevo el cuadro de diAlogo Agregar nuevo elemento y.-ll-__X -____I_- I I estructura es bastante fAcil. tales como identificadores. crear un documento XML que se ajustase a su --- "-- - ___x - -__^( I X I - ____ ---___. introduciendo en la parte . compuestos cada uno de ellos de las columnas que contendrian 10s datos reales.NET Nota En este ejemplo el esquema XSD utiliza el espacio de nombres h t t p : / / tempuri .usado habitualmente durante pruebas. Jadro de herramtentas 4 X .57. @* Libros. org/.3 . Origenes d e datos Irchivo Edtcion ter Proyecto Generar pepurar Ezquema nerramientas VeEtana Ayuda J--l-G X Q . seleccione de la carpeta Datos el elemento Archivo XML. a su vez. tendria dentro 10s elementos E d i t o r i a l e s y L i b r o s . habria que sustituirdicho espacio por la referencia correcta donde se encuentre el esquema. Aspect0 visual del esquema XML en el entorno de Visual Studio . En la practica. en esta ocasibn. - -_________ Partiendo del esquema anterior.

bajo la anterior.O" encoding="utf-t?" ?> Esta linea indica simplemente que el archivo es un documento XML. el editor de Visual Studio . por ejemplo L i b r o s .Murray. comunicando el conjunto de caracteres en que se encuentra codificado.NET se encarga de actualizar el documento XML para que siempre est6 sincronizado.NET con un documento compuesto de una sola linea: <?xml version="l . es mucho m i s ficil pulsar el b o t h Datos que aparece en la parte inferior del editor. asi como la marca de cierre </Libras>. <Libros xmlns="http: //tempuri. como si fuese el inicio de la base de datos. o r g / L i b r o s .Pappas&amp.58. Tambi6n podemos editar directamente el documento. xml. referencia a1 esquema que hemos creado en el punto anterior.Programacio'n de bases de datos con V i s u a l Basic . En el margen izquierdo seleccionamos el elemento a editar. mientras que a la derecha vamos afiadiendo las filas de datos. A1 pulsar Abrir se encontrarii en el editor de Visual Studio . En el editor apareceri. <?xml version="l. ademis. A medida que vamos editando visualmente 10s datos de cada editorial y libro. xml que puede ver completo a continuacih. Aunque podriamos ir introduciendo 10s datos manualmente.NET inferior el nombre del archivo.NET se encarga de ir introduciendo de forma automitica las etiquetas de cierre y. el recurso ideal para el intercambio de informacih. es compatible con todos 10s sistemas operativos. ofrece listas de posibles etiquetas y parimetros. A1 hacerlo nos encontramos con una interfaz como la de la figura 3.William H.org/Libros . por tanto.o r g / L i bros xsd. Acceda a la ventana Propiedades y despliegue la lista que hay adjunta a la propiedad targetschema. viendo posteriormente 10s datos en forma de tabla. x s d " > < / L i b r o s > Ya tenemos la marca <Libras> que actua como raiz de todo. Es. plataformas hardware y Ienguajes de programaci6n. Seleccione el elemento http: //tempuri. la linea siguiente: .xsd"> <Libras> <I DLib r o > l 5 < / IDLibro> ?ISBN>84-7615-234-5</ISBN> <TItulo>Manual d e l microprocesador 80386</TItulo> <Autor>Chris H. el documento L i b r o s . IIIC/Autor> <Editorial>2</Editorial> <Precio>40</Precio> </Libras: <Libras> <IDLibro>l4</IDLibro> <ISBN>84-415-1145-4</ISBN> <TItulo>Introduccihn a la prograrnacihn</TItulo> . en la que podemos introducir 10s datos como si de una tabla de una base de datos se tratase. 0" encoding="utf-8" ? > < L i b r o s xmlns="http: //tempuri. Visual Studio . Lo interesante es que la informacih.

04</Precio> </Libras> <Libras> <IDLibro>l3</IDLibro> <ISBN>84-415-1132-2</ISEN> <TItulo>Guia prictica para usuarios d e Kylix</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0.52</Precio> </Libras> <Libras> <IDLibro>7</IDLibro> <ISBN>84-415-1290-6</SSBN> . Origenes de datos <Auto r>Franc i s co Chart e < / Autor> <Editorial>l</Editorial> <Precio>24.04</Precio> </Libras> <Libras> <IDLibro?lO</IDLibro> <ISBN>84-415-1255-8</ISBN> CTItulo>Guia prictica para usuarios de Delphi G</TItulo> iAutor>Francisco Charte</Autor> <Editorial>l</Editorial> CPrecio>l0.52</Precio> </Libras> <Libras> <IDLibro>g</IDLibro> CISBN>84-415-1261-2</SSBN> <TItulo>Programacihn con Delphi 6 y Kylix</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>37.3.NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0.52</Precio> </Libras> <Lib ro s > <IDLibro>ll</IDLibro> <ISBN>84-415-1230-2</ISBN> <TI t ul o>Manua 1 a v a n z a d o Exce 1 2 00 2</TI tulo> <Auto r> Franc i sco Chart e < / Au t o r > <Editorial>l</Editorial> <Precio>21. <ISBN>84-415-1202-7</ISBN> <TItulo>Guia prdctica para usuarios d e Excel 2002</TItulo> <Autor>Francisco Charte/M.52</Precio> </Libras> <Lib rc s> <IDLibro>l2</IDLibro.JesGs Luque</Autor> <Editorial>l</Editorial> <Frecio>l0.26</Precio> </Libras> <Libras> <IDLibro>8</1DLibro> <ISBN>84-415-1291-4</ISBN> <TItulo>Guia pr2ctica para usuarios de Visua Studio .

NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0.NET</TItulo> <Auto r > Franc i sco C ti a r t e < / Au t o r> <Editorial>l</Editorial> <Precio>39</Precio> </Libras> <Libras> <IDLibro>3</IDLibro> <ISBN>84-415-1324-4</ISBN> <TItulo>Guia prdctica para usuarios JBuilder 7</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0.NET</TItulo> <Autor>Francisco Charte/Jorge Serrano</Autor> <Editorial>l</Editorial> <Precio>40c/Precio> </Libras> <Libras> <IDLibro>4c/IDLibro> <ISBN>84-415-1392-9</ISBN> <TItulo>Programaci6n con Visual C # .75</Precio> </Libras> <Libras> <IDLibro>l</IDLibro> <ISBN>1-893115-94-1</ISBN> <TItulo>User Interface Design for Programmers</TItulo> <Autor>Joel Spolsky</Autor> <Editorial>3</Editorial> <Precio>3i</Precio> </Libras> <Libras> <IDLibro>2</IDLibro> <ISBN>84-415-1136-5</1SBN> <TItulo>SQL Server 2000</TItulo> <Autor>Francisco Charte</Autor> <Editorial>i</Editorial> <Precio>l0.Prograrnacidn de bases de datos con V i s u a l Basic .75</Precio> </Libras> <Editoriales> <IDEditorial>l</IDEditorial> .NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial’ <Precia>39</Precio> </Libras> <Libras> <I DLibro>5</ IDLibro> <ISBN>S4-415-1376-7</ISBN> <TItulo>Programacihn con Visual Studio .75</Precio> </Libras> <Libros> <IDLibro>b</IDLibro> <ISBN>84-415-1351-1</ISBN> <TItulo>Programacihn c o n Visual Basic .NET <TItulo>Guia prictica para usuarlos d e Visual Basic .

Origenes de datos <Nombre>Anaya M u l t i m e d i a < / N o r n b r e > < D i r e c c i o n > J u a n I g n a c i o Luca d e Terla.52 1 1 2 24.04 10.52 21.3 .26 10.conteniendo el esquema y el documento XML desarrollados .75 10. 1 a p 1a r t a < / D i r e c c i on > </Editoriales> <Editoriales> < IDEdi t o r i a 1 > 3 < / I DEdi t o r i a 1> <Nombre>Apress</Nombre> < D i r e c c i o rl> 9 0 1 G r a y s o n St r e e t < / D i r e c c i n rl> </Editoridles> c/Libros> &rchvo EdKi6n \Ler Froyecto senex pepwar XML He%rarmentas Ventana Aygda j LlbrOS.Pappas&William 1 1 1 1 Francisco Charteilorge 5 1 1 1 1 1 1 1 10.7 18 1 9 10 111 12 13 1 I 14 .NE 7 84-415-1351-1 Prograrnacion con Visual Basic .75 10. 1 5 < / D i r e c c i o r i > </Editoriales> < E d i t o r .15 Y 84-4151136 5 SQL Server 2000 84 415-1324-4 Guia practica para usuarm JBuilder 84-415-1392-9 Programacioncon Visual CX .75 39 40 39 10.i a 1e s > <IDEditorial>2</IDEditorial~ <Nornbre>McGraw-Hill</Nombre> l < D i r e c c i o ri>E d i f i c i o Va 1r e a 1t y .NET 84-415-1376 Programacioncon Visual Studio .NET 84 415 1290-6 Guia practica para usuarios de Visua 84 415-1291-4 Guia practica para usuarios de Visua 84-415-1261-2 Programacioncon Delphi 6 y Kylix 84-4 1255-8 Guia practica para usuarios de Delp 1584-4151230 2 Manual avanzado Excel 2002 84 415 1202 7 Guia practica para usuarios de Excel 84 415-1132-2 Guia practica para usuarioz de Kylix 84-415-1 145-4 Introduccion a la programacidn 84-7615-234-5 Manual del microprocerador 80386 Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte/M.52 10.lesu Francisco Charte Francisco Charte Chris H. como ejemplo en este punto.nml* I 1 1 x 2 3 4 I 5 6 .58. Introduccion de datos en el documento XML En la carpeta de ejemplosde este capitulo encontrara 10s arChivosLibros .04 40 Figura 3. .xsd y L i b r o s xml.52 37.

59. en ocasiones. grupos o perfiles. usuarios y otros elementos. Mediante operaciones de raton. incluso. diferentes sistemas y todo ello distribuido geogrdficamente en distintas localizaciones que. existen redes heterogheas. . M i c r o s o f t . tambien para 10s desarrolladores de aplicaciones.Programacidn de bases de datos con Visual Basic . seleccionando elementos y accediendo a sus respectivos menus de opciones. Puede encontrar mas information sobre este servicio en h t t p : / / M S D N . e s . mientras que a la derecha se muestran 10s objetos que existen en el contenedor seleccionado en ese momento. 10s administradores pueden organizar la informacih de forma mucho mAs coherente y organizada. Estas contienen mdquinas. alojan unidades organizativas. sin importar el servicio de directorio subyacente del sistema con que funcionen las mdquinas. similar a la que puede verse en la figura 3. bastante aceptado. etc. se encuentran en distintos paises. tales como impresoras o medios de almacenamiento. En la posicih m6s alta se encuentran 10s bosques. para acceder a estos servicios de directorio llamado LDAP. puede efectuarse cualquier operacidn de gesti6n. . especialmente de un tamaiio medio a grande. en lugar de relacional al estilo que hemos conocido en 10s puntos previos. como el servicio de directorio de Windows NT o el de Novel1 Netware. En el panel izquierdo aparece la jerarquia de contenedores. cuentas de usuario. Microsoft incluy6 en Windows 2000 Server el Directorio activo (DA para abreviar) o Active Directory. dispositivos independientes o asociados a un ordenador. Gestionar 10s recursos de la infraestructura informdtica de este tip0 de empresas supone un desafio para 10s administradores y. Las redes se componen de ordenadores. simplificando la localizaci6n de 10s recursos y su gesti6n remota. en este caso perteneciente a un dominio llamado es t e l a r n e t .NET rio En la mayoria de empresas actuales. formados For drboles jerdrquicos de dominios que. Gracias a DA. Con el objetivo de simplificar la gestion de recursos en distintos tipos de directorio. a su vez. Mediante DA es posible acceder a recursos de cualquier punto de la red. Generalmente cada sistema cuenta con un servicio de directorio propio que facilita la administracion de estos recursos. Existe un protocolo. La information se almacena en el DA con estructura jergrquica. queda fuera del ambito de este capitulo entrar en 10s detalles sobre el funcionamiento y 10s esquemas del DA. Los administradores de sistemas acceden a1 DA mediante una interfaz de usuario tipica. Por su complejidad.

Origenes de datos dS d v s l t a Avvda Builtin 0Computers lc3J Domain Controllerr Users i. Con ese objetivo se utilizan 10s servicios ADSI. Ya que la mayoria de desarrolladores de datos estin habituados a emplear algun servicio de acceso a datos. Un metodo alternativo. Herramienta de administracion del Directorio activo Como desarrolladores. especialmente simple desde Visual Basic .59. por lo que podemos usar ADO. RDBMS y no RDBMS. .NET para acceder a1 DA y.NET.NET podemos configurar una cadena de conexi6n con cualquier controlador OLE DB. y aunque muy vagamente. Por el camino. Resumen A lo largo de este capitulo ha creado msltiples bases de datos y documentos. recursos que nos servirin como origenes de datos para 10s ejemplos a desarrollar en capitulos posteriores. en lugar de llamar directamente a 10s servicios ADSI. una forma de simplificar el acceso a1 DA desde las aplicaciones consiste en utilizar el controlador OLE DB para DA. Gracias a ellos es posible efectuar todas las operaciones disponibles con ADSI per0 sin tener que llamar directamente a las funciones de esta interfaz. D i r e c t o r y S e r v i c e s . localizar un recurso en el que est4 interesado el usuario. lo que m i s nos interesari es el acceso a1 DA desde aplicaciones propias. es usar 10s componentes D i r e c t o r y E n t r y y D i r e c t o r y S e a r c h e r del imbito S y s t e m . tambien habr6 adquirido cierta familiaridad con algunos de 10s productos.&J EarySoft Administracion Demono 0 I 1 I II 77 Figura 3.3 . Desde ADO. por ejemplo. una interfaz de programacih compuesta de msltiples funciones a las que puede invocarse desde cualquier lenguaje.

como la estructura de ADO.NET y sus componentes principales. nos servirdn de base para 10s siguientes capitulos. Oracle o Excel. El objetivo principal. .NET que van a usarse como servidores o productores iniciales de 10s datos. A ello est6n dedicados 10s dos capitulos que encontrar6 a continuacion de 4ste. mAs a116 de esa familiarizacion con SQL Server. ha sido definir la estructura e introducir 10s datos que. no obstante. crear vistas y ejecutar algunos de esos elementos para obtener unos resultados visibles de manera inmediata. Ha aprendido a definir estructuras de tablas en distintas bases de datos. deberemos conocer tambikn otros elementos. codificar procedimientos almacenados en 10s lenguajes de varias de ellas.Prograrnacidn de bases de datos con Visual Basic . tal y como se ha comentado. Antes.

.

gracias a la existencia de diversos controladores OLE DB. Nuestro objetivo. ser6 m6s sencillo percibir la arquitectura de ADO. ADO.NET. ADO.NET est6n pensados para simplificar el acceso a datos.NET. en este capitulo.ollo disponibles.NET desde un punto de vista bastante teorico.NET se hace referencia a todos 10s servicios de acceso a datos disponibles en la plataforma Microsoft . Sus componentes se encuentran repartidos por varios imbitos con nombre que. sin perder por ello flexibilidad y eficacia. servicios que podemos usar desde cualquiera de 10s lenguajes de programacion capaces de producir c6digo MSIL. relativamente alto. tendr6 ocasion de conocer en el proximo capitulo. en su mayor parte. ofrece acceso a origenes de datos de todo tip0 y facilita a1 desarrollador las operaciones m6s habituales. entre ellos Visual Basic. obteniendo 10s conocimientos necesarios para que. Desde este nivel. muy asentado en el sector. comprendamos ficilmente su funcionamiento y raz6n de ser.Con la denominacion generica ADO. . es obtener una vision general de ADO. disponible en la pr5ctica totalidad de las versiones de Windows y usado por casi todas las herramientas de desarr. Microsoft cuenta desde hace aiios con un mecanismo de acceso a datos. Los elementos de ADO. a medida que conozcamos estos servicios en 10s siguientes capitulos.

Menor us0 de recursos en el servidor. donde se obtiene el mayor beneficio. ADO.4. sin necesidad de pasar por el puente OLE DB-ODBC que afiade una capa mas y reduce la velocidad con que se efectuan las transacciones. Partiendo de unas interfaces genericas. trabajando el resto del tiempo sin consumir ningun recurso del servidor. Introduccidn a ADO. el modelo de objetos es mucho mas simple y fticil de usar. Tal y como se indicaba en la introduccibn.NET. Esto significa que la conexi6n se mantiene s610 el tiempo necesario para ejecutar un comando. internamente. a1 poder entregar y recoger datos en un formato entendido por todos 10s sistemas operativos y lenguajes. 0 0 Mejor rendimiento. Esto simplifica la interoperabilidad con otras aplicaciones. Dichos objetivos se han llegado a alcanzar y podrian resumirse en 10s siguientes puntos: 0 Modelo de objetos mas simple y racional. La transferencia de 10s datos se efectua en formato XML e.NET es superior a1 obtenido con otros mecanismos de acceso a datos. asi como acceso direct0 a controladores ODBC. lo cierto es que la integraci6n total con este formato se alcanza en ADO. incluidos aquellos no desarrollados por Microsoft. pudiendo atender a un numero de clientes muy superior sin problemas y sin necesidad de ampliar 10s recursos. 10s conjuntos de datos se representan como documentos XML.NET. El rendimiento en general de las operaciones efectuadas mediante ADO. opera usando un modelo de conjuntos de datos desconectados y comandos. ADO. in- 0 . y aprovechando las caracteristicas de orientaci6n a objetos con que cuentan todos 10s lenguajes . Uno de 10s grandes problemas actuales de 10s RDBMS es la capacidad que tienen para atender solicitudes de conexi6n por parte de 10s clientes. El resultado es que 4ste se hace mucho mas escalable. Soluci6n global de acceso a datos.NET es una soluci6n global de acceso a datos. el cambio evolutivo de uno a otro. ademas. Representacion y transporte en formato XML. era precis0 alcanzar unos objetivos que le hiciesen superior a ADO y.NET Para proponer un nuevo modelo de acceso a datos. afiadiendo nuevas clases de objetos y componentes. ya sea de recuperacion o manipulaci6n de datos. Es el unico mecanismo que necesitaremos. a1 hacer posible el trabajo con la mayoria de origenes de datos existentes y. Tambien resulta mas sencillo extender este modelo. puesto que cada uno de ellos abre una o miis conexiones y su numero se encuentra limitado fisicamente por 10s recursos de la maquina. ser un servicio disponible para todos 10s lenguajes .NET. en este caso ADO. por tanto. en parte gracias a la existencia de proveedores nativos para trabajar sobre SQL Server y Oracle.NET no utiliza cursores en el servidor y. por parte de 10s desarrolladores. mereciese la pena. A pesar de que las ultimas actualizaciones de ADO permitian guardar 10s recordsets en formato XML. con una curva de aprendizaje m6s suave respecto a ADO.NET. a1 mismo tiempo.

destacado con un tamaiio algo mayor. con Borland Kylix funcionando en Linux. El conjunto de datos se crea en el cliente. siendo su estructura totalmente independiente del origen de datos. entregando el conjunto de datos en formato XML. A partir de ese momento. 2. el que estii m i s a la izquierda.NET alojado en un cornponente. La figura 4. y se comunica con el RDBMS. El primer cliente. Una vez que el servidor de aplicaciones envia a1 de datos el comando de recuperaci6n de datos. 4. podria ser una aplicaci6n Windows tipica. utiliza ADO. Creaci6n en memoria del conjunto de datos. Un componente que se ejecuta en un servidor de aplicaciones. Excel o un documento XML. Los cambios en ocasiones son para mejor y. : . 3 . puede enviar 10s conjuntos de datos a clientes remotos incluso si son aplicaciones que se ejecutan en otro sistema operativo distinto a Windows. Ejecuci6n de un comando que recupera informaci6n de dicho origen. Esto significa que el conjunto de datos seria exactamente el mismo sin importar que 10s datos hayan sido recuperados de SQL Server. la transferencia de la informaci6n alojada en el conjunto de datos se efectua siempre en formato XML. ejecutiindose en una miquina Unix. i6 rn Aunque ADO.NET dependientemente de que nuestra aplicaci6n vaya a ejecutarse s610 en un ordenador de manera aislada o en una configuraci6n distribuida con servidores de datos y aplicaciones. Cierre de la conexi6n. utilizando una conexi6n unidireccional y s610 de lectura especialmente apropiada para la elaboraci6n de informes y tareas similares. tenemos un conjunto de datos ADO.Programacidn de bases de datos con Visual Basic .1 representa una configuracih hipot6tica en la que el equipo central. funcionando con Windows. donde estii ejecutdndose la aplicacibn.NET cuenta con un mecanismo para lectura directa de datos desde el servidor a1 cliente. y 6ste 10s devuelve al rimero. el segundo un cliente web sobre cualquier sistema y el tercero una aplicaci6n escrita. 10s siguientes: 1.NET para acceder a un RDBMS.NET con las del sistema de acceso a datos que estemos empleando actualmente. seguramente lo serii si comparamos las caracteristicas de ADO. por ejemplo. en 6sta concretamente. pongamos por caso Oracle. por regla general. Oracle. Se establece una conexi6n con el origen de datos. es el servidor de aplicaciones que. ste se comunica mediante protocolos estiindar con diferentes tipos de clientes. lo miis habitual sera trabajar con conjuntos de datos en el cliente. Los pasos para obtener un conjunto de datos o Data S e t son.

conocera algunos detalles sobre 10s DiffGrams.4. modificar y eliminar informacih. En el noveno capitulo. La transferencia de 10s conjuntos de datos en formato XML abre las puertas a la interoperabilidad con clientes heterogeneos Los conjuntos de datos son estructuras dinAmicas. lntvoduccidn a ADO. Estos sirven para resolver posteriormente con el origen de datos. Es posible insertar. generando 10s comandos apropiados de inserci6n actualizacih o eliminacidn. .NET Servidor de aplicaciones t XML I I Internet/lntranet Cliente Windows Cliente ligero (web) Cliente Linux Figura 4.1. operaciones que se registran temporalmente en forma de DiffGrarns. dedicado al estudio de 10s conjuntos de datos.

Si todas las acciones se efectuan sobre un conjunto de datos sin conexibn. por tanto. ni siquiera es posible en una red donde la conexi6n no est6 garantizada. especialmente en aplicaciones que no se ejecutan en una intranet corporativa sin0 a trav6s de Internet y abierta a todos 10s potenciales usuarios. El us0 de cursores. consumir recurso alguno en el servidor.1. algo habitual en la mayoria de motores de acceso a datos actuales. se efectua de manera inmediata en el cliente. con conexidn continua con el servidor de datos. ic6mo se actualiza la informaci6n en el servidor? En el modelo cliente servidor. reduciendo el us0 de recursos en 10s servidores de datos. las aplicaciones establecian una conexi6n con el servidor y 6ste creaba un cursor que facilitaba el acceso a 10s datos por parte del cliente. entre ellos la memoria. seguramente se preguntari c6mo va a poder efectuar su trabajo sin poder crear un cursor. s610 durante el tiempo preciso para ejecutar un comando y obtener el correspondiente resultado. siguiendo un cierto esquema de comportamiento. han modificado de manera significativa las necesidades y. su numero era facilmente predecible segun el tamafio y necesidades de la empresa. especialmente. Tradicionalmente. y la configuracibn de funcionamiento de esas aplicaciones. La conexi6n con el servidor de datos es transitoria. ademas. ADO. Si cada uno de ellos abriese una conexi6n con nuestro servidor y crease su propio cursor de datos. en ocasiones. Este. Mantener una conexi6n continua con el servidor de datos no es lo m6s apropiado y. sin posibilidades de acceso direct0 a un RDBMS y que dependen de componentes alojados en un servidor de aplicaciones segun la configuracibn esbozada en la figura 4. evitando el acceso por parte de otros usuarios. como el desplazamiento por las filas. Si esta acostumbrado a utilizar este elemento en sus aplicaciones. tenian sentido especialmente en 10s escenarios cliente / servidor en el que 10s clientes conectaban directamente con el RDBMS y.Programacidn de bases de datos con Visual Basic . las aplicaciones que emplean 10s clientes suelen ser meras interfaces de usuario.NET. Este se transfiere a1 servidor de aplicaciones o cliente. sin tener que enviar una solicitud a1 servidor y esperar la respuesta ni. La extensi6n de las tecnologias de Internet y. Las acciones tipicas sobre el cursor. es preciso buscar nuevas soluciones. Tampoco es fticil anticipar el numero de clientes que existiran. mediante operaciones simples.NET no emplea cursores en el servidor. posiblemente nos vi6ramos obligados a incrementar constantemente 10s recursos de la mtiquina. y a partir de ese momento se opera sobre un conjunto de datos sin conexi6n. Ademas. Frente a estos nuevos problemas. las aplicaciones que se ejecutan en un cliente Web y 10s servicios Web. El cursor se encargaba de bloquear 10s datos que estaban en edic i h .NET Se indicaba en un punto previo que ADO. segun . por supuesto. la inserci6n o edici6n de datos.NET ofrece soluciones como el trabajo sin conexi6n continua y 10s conjuntos de datos sin conexi6n. solicitaba la fila anterior o siguiente. dependiendo de ddnde est6 ejecutkdose ADO.

La existencia de estos lectores de datos hace posible la recuperaci6n de informaci6n sin necesidad de transferir todo el conjunto de datos completo desde el servidor a1 cliente en un solo paso. enviandose a1 servidor cuando es necesario consolidar la informacibn.NET respecto a otros mecanismos de acceso a datos. En el octavo capitulo conocera 10s componentes DataReader y aprenderii a utilizarlos en aplicaciones propias. Introduccidn a ADO.NET un vestigio del ~ S de cursores: O 10s lectores de datos o DataReader. obtenigndose un cursor ligero que s610 permite la lectura y. reduciendo asi el us0 de memoria en el cliente. Los servicios de ADO. ademas. el proceso dure el menor tiempo posible. utilicen o no Internet como medio de comunicaci6n. desde las mas sencillas de tip0 monousuario hasta aquellas que deben operar con conexi6n esporadica a1 servidor. Estos se usan para ejecutar s610 sentencias de consulta. en la misma miquina.NET se generan comandos de actualizaci6n de forma dinarnica. en la que el recuadro representaria a1 ordena- . que no tiene necesidad de almacenar todos 10s datos a1 poder procesarlos fila a fila.4 .2. ADO. Esto demuestra la flexibilidad y versatilidad de ADO. aunque se mantenga la conexi6n abierta con el servidor. -- ~ ___--- _~ - _- . proveedores y controladores dan como resultado diferentes soluciones que pueden aplicarse a multiples escenarios. era el propio cursor el que se encargaba de ir bloqueando y gestionando 10s conflictos entre clientes. facilitando tan s610 el avance de una fila a la siguiente hasta llegar a1 final. es unidireccional. aun queda en ADO. de tal forma que. En ADO. mucho mas limitados en cuanto a posibilidades se refiere. realizar unos cilculos o tareas similares.NET dan cabida a las necesidades de todo tip0 de aplicaciones.NET se adapta mejor a las configuraciones distribuidas. Las distintas combinaciones de componentes ADO. En resumen. Los lectores de datos son utiles en casos en 10s que va a recuperarse un conjunto de datos con el objetivo de preparar un informe.NET. En caso de conflicto.-- A pesar de lo dicho. se obtiene una enumeraci6n de 10s problemas que es precis0 gestionar en el cliente. y que no precisan la consolidaci6n con un servidor.NET decia antes. Es el modelo representado esquemtiticamente en la figura 4. almacenamiento local de la informacidn. entre 10s cuales se encontrarian las siguientes configuraciones: 0 Monousuario: Aplicaciones con necesidades bisicas de tratamiento de datos. a1 tiempo que ofrece una alternativa a1 us0 de cursores en configuraciones cliente/ servidor.

La primera opci6n es la mas eficiente y simple. 0 Cliente/Servidor: La configuracih m6s utilizada en la Gltima decada del pasado siglo. El adaptador de datos se comunica con el proveedor y hace posible la independencia de 10s conjuntos de datos. La aplicacih utilizaria un conjunto de datos ADO. varios elementos mas. como se aprecia en la figura 4. con un product0 estandar.NET. Representacion esquematica de una configuracion monousuario Los conjuntos de datos o DataSet pueden guardarse y recuperarse localmente con una llamada a un metodo. mientras que la segunda habilitaria la posibilidad de tratar la informaci6n desde fuera de la aplicacion cliente. siendo la alternativa mas simple y rapida para el tratamiento de datos en aplicaciones sencillas. que queda en manos de un servidor.3. ya que no se precisa ninguna otra aplicacih externa como seria Excel.Prograrnacidn de bases de datos con V i s u a l Basic . a1 separar su representach de la . separando la interfaz de usuario y logica de aplicacih. o bien emplear una base de datos de escritorio o un documento Excel como deposit0 de la informacih. que se ejecutarian en el ordenador del cliente conjuntamente con ADO. en formato XML. En esta disposici6n aparecen en escena. del almacenamiento de datos. como el adaptador y el proveedor de datos y / o controlador.NET dor del cliente y 10s elementos que hay en su interior 10s diversos componentes. I------- t t I Ordenador del cliente (configuracion monousuario) Figura 4. segun 10s casos.2.NET que podria guardar directamente.

lntroduccion a ADO.4. reduciendo la carga del RDBMS. 1 1 0 \ Configuracion cliente/servidor Figura 4. tipica de las redes internas de las empresas. Esquerna de una configuracion cliente/servidor tipica 0 Cliente / Servidor con conexi6n espor6dica: Similar a la anterior. Y a.NET utiliza el mecanismo antes explicad0 de ejecucion de comandos y creacion de conjuntos de datos locales en el cliente. seria posible una conexion continua con el servidor de datos.3. ADO. precisando una consolidation .NET que utiliza el origen de datos nativo. se caracteriza porque el cliente en ocasiones tiene la necesidad de trabajar con 10s datos sin contar con una conexion con el servidor. A pesar de que en esta configuracion.

La aplicaci6n cliente se sirve de un conjunto de datos que almacena localmente.4. La configuraci6n seria la de la figura 4. se usan 10s mismos elementos cliente / servidor indicados antes para ejecutar 10s comandos de actualizaci6n apropiados.NET posterior. La configuracion con conexion esporadica es similar a la cliente/servidor . en formato XML. cuando la conexi6n es posible. por ejemplo. V 1 v) c 0 U m configuracion cliente/servidor con conexion esporadica Figura 4.Programacidn de bases de datos con Visual Basic . en el mismo ordenador. por ejemplo tomando pedidos de clientes que despu6s es necesario transferir a la base de datos para su proceso. Cuando la conexi6n con el servidor estA disponible.4. Eso es lo que ocurre. cuando se trabaja con un ordenador portfitil durante un viaje.

per0 es posible afiadir capas adicionales segun las necesidades de la empresa.NET.5. no existiri Visual Studio . Hay que tener en cuenta. Las aplicaciones distribuidas solucionan este problema. ya que la actualizaci6n de 10s algoritmos de proceso de la informaci6n se encuentran codificados en la aplicaci6n que ejecuta cada ordenador cliente. obteniendose un cliente Zigero ejecutable en cualquier navegador.NET.NET o bien servicios Web.NET necesarios para comunicarse con el RDBMS y efectuar todas las operaciones de manipulaci6n de datos. 0 Web: En realidad es una variante del modelo anterior. basada en formularios Windows. lbgicamente. sin embargo.4.NET 0 Distribuida: Cuando las empresas tienen un cierto tamafio.NET. al ser mas facilmente accesibles a traves de redes en las cuales existen cortafuegos.NET se instalan tambien automiticamente 10s MDAC. van a instalarse en miquinas clientes en las que. usando el formato XML. a1 finalizar la fase de desarrollo y depuracibn. lo cual implica que cualquier cambio conlleve una actualizaci6n a1 nivel de toda la empresa. . Los elementos ADO. que las aplicaciones. La informaci6n se transfiere a y desde el cliente. adaptadores y conjuntos de datos. Bisicamente se sustituye en el cliente la aplicaci6n nativa. controladores en caso de ser necesarios. Es el modelo representado en la figura 4. Mientras desarrollamos una aplicaci6n de acceso a datos con Visual Studio . Estos cuentan con algunas ventajas. Los componentes que se ejecutan en el servidor de aplicaciones pueden ser componentes . concretamente la versi6n 2. por una aplicaci6n tip0 ASP. Introduccidn a ADO. empleando siempre 10s mismos elementos bisicos: proveedores ADO. convertido en una simple interfaz de usuario. comprobando su funcionamiento en una miquina de desarrollo.NET asi como su distribuci6n serian idhticos. ADO. Como puede ver. a1 aislar la 16gica de proceso de datos en un servidor de aplicaciones que actua como intermediario entre clientes y RDBMS.NET. por ser el m i s habitual. el mantenimiento de aplicaciones que siguen el modelo cliente / servidor se convierte en un problema.6. En el aparecen en el servidor de aplicaciones 10s componentes ADO. nunca tendremos problemas con 10s componentes porque a1 instalar Visual Studio .NET solventari nuestras necesidades en todos 10s casos. En este caso se habla de un modelo en tres capas o three-tier.

5.5. . o bien 10s componentes de un servidor de aplicaciones.3. Configuracion de una aplicacion distribuida en tres capas En cualquier ordenador donde vayan a utilizarse 10s servicios de ADO.NET. en la figura 4. ya sea un cliente.6 o posterior de 10s componentes MDAC.NET Configuracion distribuida Figura 4. en 10s esquemas de las figuras 4. para lo cual existe un archivo redistribuible que.2 y 4.Programacidn de bases de datos con Visual Basic . debe instalarse la versi6n 2.

en la tercera parte. siempre existe la posibilidad de recuperar esa informaci6n de un archivo de configuraci6n. es posible combinar con la instalacion de nuestra propia aplicacidn. Lbgicamente.NET. tras conocer en el quinto 10s Ambitos. que 10s conjuntos de datos se transfieren y almacenan en formato XML y que es posible utilizar ADO. Otro factor que hay que tener en cuenta son las referencias a servidores y caminos de archivos. facilitando asi el cambio de un servidor a otro sin necesidad de tocar la aplicacibn.NET no utiliza cursores ni conexiones continuas con el servidor para efectuar su trabajo.NET.NET incluso. Todos 10s ejemplos se basan en el us0 direct0 de ADO. Durante la fase de desarrollo habitualmente se utilizarin servidores de datos de pruebas. de una manera tebrica.NET. .4. simplemente editando un archivo de texto. Este breve capitulo nos ha servido para obtener. a1 instalar la aplicaci6n debe pasar a utilizarse. de tal forma que el usuario no tenga que preocuparse de obtener e instalar dichos componentes. va a conocer en el pr6ximo capitulo. ese servidor de explotaci6n. precisamente. En lugar de introducir directamente las referencias en el c6digo o 10s componentes.NET. A partir del sexto capitulo.NET. en su mayor parte. Ahora ya sabe que ADO. pasaremos.NET en cualquier configurac%n. interfaces y clases m6s importantes de ADO. un modelo compuesto por interfaces y componentes que. desde la mas sencilla hasta la m i s compleja. Una vez conozca perfectamente c6mo funciona y c6mo utilizar ADO.NET puede ahorrarnos una parte importante del trabajo. comenzar6 a usar todos esos elementos para conectar con un origen de datos y ejecutar diversos comandos. no aquellos que estin dando servicio a las aplicaciones en explotaci6n. a estudiar c6mo Visual Studio . una idea general sobre las posibilidades y funcionalidad del modelo de acceso a datos ADO. Introduccidn a ADO. sin ayuda de 10s asistentes. disefiadores y elementos de Visual Studio .

.

Nuestro objetivo. Sus elementos podrian clasificarse en dos categorias: dependientes e independientes del origen de datos. En la primera entrarian todas las clases especificas para cada origen de datos concreto.NET.NET. El modelo de objetos ADO. como pueden ser OleDbDataAdapter y SqlDataAdapter para OLE DB y SQL Server.NET. informacion fundamental para. recuperar informacih. en este capitulo. per0 recuerde que todos 10s detalles sobre Bmbitos.NET.Aunque mantenihdonos aun en el campo te6rico iniciado en el capitulo previo. ejecutar comandos. es introducir 10s elementos de mayor inter& y esbozar un esquema general del modelo de objetos ADO. etc. en 6ste vamos a ir conociendo 10s Bmbitos con nombre que componen ADO.NET existe una referencia de toda la biblioteca de clases . clases y sus miembros se encuentran en la informaci6n de referencia de Visual Studio . ir utiliz6ndolos para conectar con un origen de datos.NET est6 construido de forma coherente y facilitando la posterior extensibn. en la que encontrara la lista de elementos relacionados con ADO. respectivamente.NET y las interfaces y clases que podemos encontrar en ellos. Recuerde que en la ayuda electrhica de Visual Studio . gracias a la herencia y la implementaci6n de interfaces. en 10s capitulos siguientes. La segunda se compone de .

Esto ha facilitado. Data. funciones y estructuras de este. que Microsoft aiiada ripidamente proveedores de datos especificos para ODBC y Oracle a 10s ofrecidos inicialmente con Visual Studio . dBase. asi como las interfaces que deben implementar las clases que son dependientes. La instalaci6n por defect0 de la plataforma . Excel o un archivo XML.Data.NET para SQL Server y OLE DB. . y entender 10s comandos. e incluso nosotros mismos. alberga clases especificas para operar sobre un determinado origen de datos. Los elementos independientes del origen de datos son de us0 general. Modelo de objetos clases que no tienen dependencias respecto a1 origen de datos. ya que cuentan con similares mktodos y propiedades aunque la implementacibn. a 10s cuales habria que aiiadir uno o mBs por cada proveedor adicional que pudieramos instalar despues. El conjunto de datos siempre serd el mismo. terceros fabricantes. por el contrario. Oracle. independientemente de que conectemos con SQL Server. Common: Contiene clases que facilitan la implementaci6n de las interfaces existentes en System.5.NET que permite utilizar cualquier controlador OLE DB para conectar con un origen de datos. Las clases con dependencias. Asi. SqlClient: Como el anterior. tienen una estructura que permite una ampliaci6n fbcil. por ejemplo. De igual manera. implementan interfaces comunes a pesar de sus diferencias. Las operaciones disponibles son siempre las mismas. podemos crear proveedores especificos para nuestros origenes de datos. System. Data: Aloja las clases independientes del origen de datos. difiere de un componente a otro.NET. en este caso SQL Server. como es 16gico. por poner un ejemplo. 0 System. asi como otras compartidas por todos 10s proveedores.OleDb: Corresponde a1 proveedor ADO. Data por parte de 10s distintos proveedores de datos. como la citada DataSet.NET aporta cinco Bmbitos con nombre o namespaces relacionados con ADO. Estos cinco Bmbitos son: s ys tem. 0 System. es posible tratar de manera homogenea un adaptador de datos de SQL Server o de Oracle. las clases de us0 generico. En 61 se encuentran implementaciones especificas de clases para comunicarse mediante OLE DB. Aquellos componentes que necesitan comunicarse con el origen de datos. Dada la independencia del origen de datos. Data. lo cual nos facilitarB el trabajo a1 no tener que recurrir a distintos caminos segun el origen de datos empleado. que representa un conjunto de datos en una aplicaci6n sin importar de d6nde se haya extraido. como DataSet o DataRelation. El mayor exponente es la clase DataSet. no necesitan ser extendidas para usos especificos. sin importar el origen de datos del que se haya obtenido o a1 que se vaya a enviar.

debe implementar.NET. Esto es posible gracias a la existencia de unas interfaces genericas. Data. Instalando 10s dos proveedores adicionales que Microsoft ha publicado hasta el momento para ADO. Data. por tanto. Microsoft. Data . . Las interfaces de System. tendra que en aAadir una referencia en la carpeta Referencias del proyecto al ensamblado correspondiente.NET es un mecanismo de acceso a datos extensible. conteniendo 10s elementos que son necesarios para poder acceder a cualquier origen de datos para el que haya disponible un controlador OLE DB. Como se ver6 en 10s puntos siguientes. Data. En un capitulo posterior se indicara de donde puede obtener estos controladores y como instalarlos y usarlos. contiene implementaciones especificas de clases que facilitan la conexi6n y comunicaci6n con este RDBMS. ya sea directa o indirectamente. Para poder utilizar estos dos ~ltirnos. Sqlcliente o Sys tem. caso de que 10s necesite. A1 igual que System. SqlTypes: Relacionado con el anterior. Common.Prograrnacidn de bases de datos con Visual Basic .Oracleclient: Correspondiente a1 proveedor nativo para acceso a bases de datos Oracle. roveedores Como se comentaba anteriormente. debe estar preparado para operar con proveedores que no conoce de antemano.NET. Data. El nucleo de ADO.NET System. contando con algunas implementaciones por defect0 alojadas como clases en el Ambito system. pudiendo crearse nuevos proveedores que faciliten el trabajo con otros origenes de datos.OleDb. como es habitual en todas las interfaces. Las primeras inician su nombre. a 10s anteriores habria que sumar 10s dos 6mbitos siguientes: System. Data pueden dividirse en dos grupos: aquellas que aplicables a cualquier origen de datos. con el prefijo I.Odbc: Este dmbito corresponde a1 proveedor ODBC nativo de ADO. Data. ADO. sea o no una base de datos relacional. que todo proveedor de datos. Data. y las especificas para bases de datos relacionales.NET. predefinidas en el Ambito system. mientras que las segundas emplean el prefijo I Db. en este 6mbito encontramos definiciones de tipos de datos especificos para trabajar con SQL Server. las del segundo grupo suelen estar derivadas de las del primero.

Los origenes de datos de tip0 RDBMS son capaces de facilitar un cursor. en el caso de ADO. implementada en la clase Da taColumnMapping Co 11e ction. En el ambito Sys tern. Common encontramos la clase DataColumnMapping. DataSetTable: Referencia a la tabla que le corresponde en el DataSet. Data. actua como colecci6n de enlaces entre columnas origen y locales. tarea de la que se encarga la interfaz ITableMapping. La primera contiene el nombre de la colurnna en el DataSet. 0 ColumnMappings: Colecci6n con las asociaciones de columnas de esta tabla. en el Bmbito System. es preciso establecer una correspondencia entre las columnas del origen de datos y las existentes en dicho conjunto local. La interfaz IColumnMappingColl e ction. asi como sus miembros mds destacables. por 16gica tienen que existir varios DataColumnMapping. implementada en la clase ColumnMapp ing y todas las implementaciones especificas derivadas de ksta. que se limita a implementar las dos propiedades y ofrecer un constructor.1 puede ver la relaci6n existente entre las interfaces y clases indicadas. en este caso las propiedades DataSetColumny SourceColumn. Modelo de objetos l l _ _ ~ _ _ l A1 crear un conjunto de datos local. Esas dependencias se representan mediante la interfaz IColumnMapping. tambikn existe una interfaz ITableMappingCollection con su correspondiente implementaci6n en DataTabl eCol1 e ction. Cualquier proveedor puede utilizar esta clase como base para crear las suyas propias en caso de que fuese necesario. Cualquier clase que implemente IColumnMapping estd obligada a implementar estas dos propiedades. Para facilitar dicha operacidn. IColumnMapping es una interfaz compuesta tan s610 de dos propiedades publicas: DataSetColumn y Sourcecolumn. Las columnas no existen en un DataSet de manera aislada. si bien una asociaci6n entre columnas de origen y locales no requiere un trabajo adicional.5. Data. Common existe una implementaci6n de la interfaz ITableMapping en la clase DataTableMapping. un motor software que el cliente puede utilizar.el conjunto de datos local. por lo tanto. en el ordenador en el que se ejecuta la aplicaci6n cliente. En la figura 5. Dado que un conjunto de datos suele estar formado por multiples columnas.NET. sin0 que se agrupan en tablas representadas por objetos DataTable. establecer tambien una correspondencia entre las tablas del origen de datos y las que existir6n en el DataSet. Es preciso. Esta cuenta tan s610 con tres propiedades: 0 SourceTable: Referencia a la tabla del origen de datos. y la segunda el nombre que recibe en el origen de datos. para acceder a . De manera andloga a lo que ocurre con las columnas.

NET filas de datos de manera unidireccional y con el unico prop6sito de leer datos.1. antes es necesario recuperar esa fila. cuyo objetivo es recuperar el valor de una determinada columna en el formato especificado. Elementos relacionados con la asociacion de columnas entre conjuntos de datos locales y origenes de datos La interfaz I Da t a R e c o r d define las propiedades y metodos necesarios para acceder a 10s datos alojados en las columnas de una fila de datos.Programacidn de bases de datos con V i s u a l Basic . Cada proveedor facilitara una clase cuyo objetivo es facilitar la comunicaci6n con el cursor del servidor. G e t F l o a t ( ) y G e t S t r i n g ( ) . System. con mas de una veintena de metodos del tipo G e t B o o l e a n ( ). accediendo individualmente a cada una de ellas con la propiedad I tern. Podemos saber el numero de columnas existentes mediante la propiedad Fie l d C o u n t . asi como tener la posibilidad de avanzar a la siguiente hasta llegar a1 final de las filas facilitadas. finalidad de I D a t a Record. nunca de modificarlos. clase que se conoce habitualmente como Reader o bien lector de datos. entre 10s cuales estan 10s siguientes: 0 RecordsAf f e c t e d : Propiedad que contiene el numero de filas existentes. Read ( ) : Metodo que lee la siguiente fila. asimismo. Dichas clases deben implementar las interfaces I Data Record e I Data Reader. Para poder operar sobre las columnas de una fila de datos. Esta interfaz cuenta.Data. 0 . Este es el objetivo de 10s miembros de la interfaz I D a t a R e a d e r .Data IColurnnMapping IColurnnMappinqCollection ColumnMapping DataSetColumn ColumnMappingCollection SourceColumn System. G e t B y t e ( ) .Common Arnbito con nornbre Figura 5.

sin tener que conocer su implementacih especifica. S q l D a t a R e a d e r . Estas dos interfaces se encuentran implementadas en las clases D a t a R e a d e r de cada proveedor. cuenta con una seriedem6todosGetSqlByte ( ) . por ejemplo. a usar laS ClaSeSDataReader de 10s proveedores para acceder a un origen de datos y recuperar inforrnacion.N e x t R e s u l t ( ) : Accede a1 siguiente conjunto de resultados en caso de exis- tir varios. La figura 5.Od bc Figura 5. C l o s e ( ) : Cierra el lector. en la practica.Data IDa taRecord IDa t a R e a d e r Fieldcount Itern GetXXX ( ) OdbcDataReader Read ( ) NextResult ( ) Close ( ) Microsoft.que facilitan la recuperacih de columnas con tipos de datos exclusivos de SQL Server. O r a c l e D a t a R e a d e r y O d b c D a t a R e a d e r . Conociendo 10s miembros de las interfaces podremos trabajar con cualquier proveedor. por ejemplo S q l D a t a R e a d e r . Cada una de ellas facilita una implementacih especifica de 10s miembros citados. siendo necesario emplear clases que las implementen.Data .Data. Cada proveedor de datos implementa una clase DataReader que implementa 10s miembros de las interfaces I D a t a R e c o r d e I D a t a R e a d e r En el Octavo CapitUlO aprendera. O l e D b D a t a R e a d e r . G e t O r a c l e N u m b e r ( ) y G e t O r a c l e S t r i n g ( ) .. definidas en el Eimbito S y s t e m . las interfaces no pueden ser utilizadas directamente desde un programa propio para operar sobre 10s datos.SalClient SqlDataReader System.etc.Data. GetSqlString().OleDb OleDbDataReader System. . mientras que el proveedor de Oracle dispone de m6todos tipo G e t O r a c l e B i n a r y ( ) . ajustados a 10s tipos de este RDBMS.2 representa la relaci6n entre las interfaces I D a t a R e c o r d e I D a t a R e a d e r . y las clases D a t a R e a d e r de cada proveedor. Svstem. afiadiendo a1 tiempo otros exclusivos en caso de ser necesario.GetSqlDouble(). Como ya sabe. D a t a .2.

I Da taAdap te r es una interfaz gene'rica. Entre sus propiedades y metodos m6s importantes estBn: 0 F i l l ( ) : Es el metodo encargado de recuperar filas del origen de datos incluyendolas en el Data S et local. mientras que DbDa taAdap te r es una clase derivada de Da taAdap te r y. Inse rtCommand. por tanto. 0 Update ( ) : Complementario a1 anterior. ADO. Un adaptador de datos es el nexo de uni6n entre un origen de datos y un DataSet.Programacidn de bases de datos con Visual Basic . Para efectuar esa operation se necesita un adaptador de datos. hereda la implementaci6n de IDataAdapter.NET no emplea cursores de servidor para tratar la informaci6n si exceptuamos 10s cursores unidireccionales s610 de lectura representados por las clases DataReader. el eslab6n que se encarga de adaptar la informaci6n de las dependencias propias del origen a1 caricter independiente del conjunto de datos local. La interfaz IDataAdap te r no es implementada directamente por clases especificas de 10s proveedores de datos. OleDbDataAdapter. IDbDa taAdap te r. OracleDataAdapter y OdbcDataAdapter. que despues cada proveedor hereda y puede personalizar segun precise. sino por las clases Da taAdap te r y DbDa ta Adapter que existen en el Bmbito System. especifica para 10s origenes que son bases de datos relacionales. gedrica. . y generar 10s comandos necesarios para enviar las modificaciones del Data S et de vuelta a1 origen de datos. Existe una interfaz derivada. presumiblemente. DataAdapter implementa la interfaz I Da taAdapter. efectuaria las operaciones necesarias en el origen de datos para transferir las acciones de edici6n que haya sufrido el DataSet. insercibn.En su lugar. Los miembros de la interfaz I Da taAdap te r tienen dos objetivos: recuperar filas del origen de datos convirtiendolas en filas del DataSet. Datacommon. encontramos una clase en cada proveedor: SqlDataAdapter.NET Como se explic6 en el capitulo anterior. diferirBn de un proveedor a otro. siempre que es precisa una navegaci6n mBs compleja o la edici6n de 10s datos. I DbDataAdapter afiade a 10s miembros de su interfaz base cuatro propiedades: SelectCommand. De esta forma se ofrece una implementaci6n por defecto. Insertcommand. si bien todos ellos implementan una interfaz comun: IDataAdap te r. actualizaci6n y borrado de filas en SQL. Updatecommand y Deletecommand. a1 tiempo que ofrecen una implementaci6n especifica de las propiedades Select Command. cada proveedor de datos cuenta con su propio adaptador especifico. por una parte. Como seria de esperar.e implementando la interfaz IDbDataAdapter. aplicable tanto a origenes de tip0 RDBMS como a 10s que no lo son. Estas clases cuentan con la implementaci6n por defecto de 10s metodos Fill y Update facilitada por DataAdapter y DbAdapter. Upda teCommand y DeleteCommand que. cuya finalidad es alojar las sentencias de seleccibn. Derivadas de DbDataAdapter. lo que se hace es ejecutar un comando y obtener un conjunto de datos local o DataSet.

OracleDbDataAdapter o bien OdbcDataAdapter sin cambiar m6s que el 6mbito de System.3 se ha representado la relaci6n existente entre las interfaces IDataAdapter e IDbDataAdapter respecto a las clases DataAdapter.perteneciente a1 proveedor SqlClient. una codificaci6n independiente del . Modelo de objetos En la figura 5. la definici6n de comandos y control de las transacciones. DbDataAdapter y SqlDataAdapter.Data.. SqlClient a1 que corresponda. si es que desea.Common P L t SqlDataAdapter Svstem. Svstem. Esta ukima implementa la interfaz IDbDataAdapter -- . a su vez. base de DbDataAdapter que. La interfaz IDataAdapter es implementada por la dase DataAdapter. es base de SqlDataAdapter.Data.5. ~ _ _ _ _ I _ _ ___ L O proveedores de datos que acceden a origenes de tip0 RDBMS o bases de ~ datos de escritorio.3.Data IDa taAdapter Fill ( ) Update ( ) I D b D a taAdapter SelectCommand Insertcommand Updatecommand Deletecommand DataAdapter DbDataAdapter System. la mayor parte de ellos. deben facilitar operaciones adicionales como es la conexi6n con la base de datos. per0 con el fin de facilitar.SalClient ~ Figura 5. Estas operaciones son especificas y diferentes en cada proveedor. Data.6sta podria ser sustituida por OleDbDataAdapter.

Todas ellas son referencias a la interfaz IDbCommand. el nombre de una vista o procedimiento almacenado. que la descarta. IDbCommand cuenta con una serie de metodos cuya funci6n es ejecutar el comando. existen las interfaces IDbConnection. Common.Prograrnacidn de bases de datos con Visual Basic . Un comando siempre se obtiene a partir de una conexi6n.a diferencia de la mayoria de las enunciadas en 10s puntos previos. De la interfaz IDbConnection habria que destacar 10s miembros Connectionstring. Close ( ) . tan s610 hay tres miembros en esta interfaz: IsolationLevel. y Rollback ( ) . Ninguna de estas tres interfaces cuenta con una implernentacion por defect0 en el dmbito System. etc.NET y su funcionamiento. Createcommand ( ) y BeginTransaction ( ) . la primera contiene 10s miembros relacionados con la conexi6n a la base de datos. Cada proveedor se compone de una serie de clases que implementan determinadas interfaces definidas en System. IDbCommand e IDbTransaction. Tambien las transacciones estan asociadas a una conexi6n de base de datos. Open ( ) .. InsertCommand. Oracle u Odbc. Por lo demAs. como IDbCommand. una XXXCommand y una XXXTransaction.4 resume algunos de 10s miembros de las tres interfaces.NET proveedor. La figura 5. que puede ser el nombre de una tabla. que determina el nivel de aislamiento de la transacci6n. como ocurre con las tratadas en el . Data. OleDb. conteniendo una referencia de tip0 IDbConnection. Como puede suponer. directamente. En cada uno de ellos debe existir una clase XXXConnection. Data. que contiene la cadena de conexi6n a la base de datos. En el punto anterior se indico que la interfaz IDbDataAdapter contaba con cuatro propiedades: S e 1e ct Command. donde XXX seria el prefijo del proveedor: S q l . asi como las clases que las implementan en 10s Bmbitos de cada uno de 10s proveedores. ya se habra hecho una cierta idea sobre la composici6n de un proveedor de datos . una sentencia SQL. ~- S Tras leer 10s puntos anteriores. Son 10s proveedores. dependiendo del valor dado a CommandType. que la confirma.Finalmente. cierra la conexidn. crea un nuevo comando asociado a esta conexi6n e inicia una transaccibn. respectivamente. Upda t eCommand y Deletecommand. utiliza esa cadena para abrir la conexibn. Commit ( ) . Las propiedades CommandType y CommandText de la interfaz establecen el tip0 de comando y el texto. ya sea obteniendo un lector de datos o sin recuperar resultado alguno. ya sea directamente. la segunda tiene que ver con 10s comandos y la tercera con las transacciones. 10s responsables de implementarlas. La relaci6n entre esta y el comando la fija la propiedad Connection de IDbCommand. por ello la interfaz IDbTransaction tiene una propiedad Connection. en la que se definen 10s miembros que debe tener un comando que va a ejecutarse sobre una base de datos.

OleDb ( 4 ) Microsoft. Common existen otras clases de us0 comun entre 10s proveedores.Data IDbConnec tion IDbCommand II Connectionstring open 0 Close ( ) Createcommand ( ) BeginTransaction ( ) CommandType CommandText ExecuteReader ( ) ExecuteNonQuery ( ) ID b T r . Crear un DataSet a partir de un comando. o indirectamente. IDbCommand. 01e Db en el de OLE DB. Data. Cada proveedor cuenta con implementaciones especificas de las interfaces IDbConnection.Data. 0 Estas clases se denominan siempre Connection.0dbc Figura 5. Modelo d e objetos punto anterior a Gste. precedidas de la denominaci6n del proveedor: S ql en el de SQL Server.SqlClient ( 3 ) System. Svstem. Conociendo 10s miembros de las interfaces IDbConnection.5.4. a1 heredar la implementacih de las clases que encontramos en System. Leer de un cursor unidireccional directamente desde el origen de datos. respectivamente. IDbCommand e IDbTransaction Todo proveedor de datos debe constar. Aparte de las ya mencionadas. de las clases necesarias para: 0 Establecer una conexidn con el origen de datos. Data. Command. como minimo. DataReader y Da taAdap te r.d n s a ct i o n IsolationLevel Commit ( ) Rollback ( ) J bqlConnection OleDbConnection OracleConnecticn OdbcConnectior' hqlConunand OleDbCommand Oraclecommand OdbcCornmand bq1. Common.Data. podremos usar las clases especificas de cualquier proveedor. Definir y ejecutar comandos. tratadas en 10s apartados previos. Todas ellas sirven como clases .ransaction OleDbTransaction OracleTransaction OdbcTransaction . IDataReader e IDataAdapter.Data. 0ra c1e en el proveedor de Oracle y Odbc en el proveedor para ODBC. c 1 I 1 (1) System. en el Bmbito s y s tern.Data.OracleC1ient (2) System.

y cada una de las columnas puede tener activas ciertas restricciones. inexistentes en 10s demas proveedores. ademas.La clase DataSet es relativamente compleja. Getupdatecommand ( ) y GetDeleteCommand ( ) . Otros mdtodos. Data. pueden existir relaciones. Una vez que esa informaci6n se encuentra en nuestra aplicacih. para lo cual disponen de 10s mdtodos GetInsertCommand ( ) . cada una de ellas perteneciente a 10s cuatro proveedores que ya conoce.ParameterCollection y Error. de tal forma que una misma llamada. cada proveedor aporta sus clases exclusivas. Su finalidad es generar las sentencias necesarias para insertar. una tercera para OLE DB y una mas para ODBC. Common. personalizadas para cada proveedor de datos concreto. otra para Oracle. se componen de columnas. actualizar y eliminar informaci6n del origen de datos. internamente cada una de ellas funciona de manera distinta. por ejemplo. a su vez. en cierta medida. RowUpdatedEventArgs y RowUpdatingEventArgs. OracleCommandBuilder y OdbcCommandBuilder.NET base de otras. Algo similar ocurre con las clases Parameter. ya que es posiblemente la mas importante de las eXiStenteS en System. De este conjunto de clases practicamente la unica que hemos mencionado ha sido DataSet. Entre esas tablas. en su lugar encontramos la clase OracleException. aunque su implementacih no es obligatoria. sin embargo. editarla y volver a almacenarla. generaria una sentencia distinta segitn que el origen de datos sea SQL Server. Por ultimo. tambidn existen en la mayoria de proveedores. DBDataPermissionAttribute. por ejemplo a Get InsertCommand ( ) . a1 fin y a1 cabo. Oracle o un controlador OLE DB u ODBC. Cada uno de esos . Su USO. no obstante. Las clases SqlCommandBuilder. Data. como es logico. OleDbCommandBuilder. CIases independientes del origen de datos Hasta ahora nos hemos centrado en el estudio de 10s elementos relacionados con 10s proveedores de datos ya que. basicamente son iddnticas de cara a1 programador aunque. pUeSt0 que un conjunto de datos esti formado por una o mas tablas que. a pesar de no contar con una interfaz gendrica ni derivar de una clase comitn definida en system. si bien esta ultima no existe en el proveedor de Oracle y. para operar sobre ella utilizaremos un conjunto de clases que son totalmente independientes del origen de datos. sino que tenemos una unica clase Da taS et. Estas clases son DbDataPermission. ellos son 10s que permiten a las aplicaciones acceder a la informacibn. actualizacih o borrado especifico para el proveedor en el que estemos trabajando.Programacidn de bases de datos con Visual Basic . enfocadas a aprovechar las caracteristicas propias de un cierto origen de datos. lo cual es 16gic0. Lo que se obtiene es un comando de insercih. una clase DataSet para SQL Server. recuperarla. resulta mucho menos habitual puesto que. No existe. limita o hace mas dificil una posible transicion futura a otro producto de almacenamiento de datos.

mientras que esta propiedad permite tanto obtenerlo como cambiarlo. 0 Relations: Si el conjunto de datos cuenta con varias tablas. obtenerse a partir de un origen de datos mediante el correspondiente adaptador de datos. ya sea de insercibn. se representa con una clase disponible en el 6mbito System. cada una de las cuales esta representada por un objeto DataTable. Su us0 en la practica. Este nombre normalmente se establece en el momento de la creacion del objeto DataSet. no obstante. Estos son: DataSetName: Cada conjunto de datos cuenta con un nombre que le identifica. en 10s puntos siguientes se abordan con algo m6s de profundidad. relaci6n o restriccion. Ya que estas clases son de us0 final. por tanto. Esta propiedad es una referencia a un objet0 DataRelationCollection que aloja todas esas referencias. entre ellas necesariamente existirAn relaciones. Las operaciones se efectuan en las filas y columnas de cada tabla. una clase en torno a la que existen muchas otras de las que depende. el componente Data s e t es un elemento fundamental de ADO. no tendremos que conocer despuks implementaciones especificas por proveedor. Un DataSet puede crearse mediante codigo 0. Modelo de objetos elementos. 0 Tables: En el capitulo dedicado a SQL aprendi6 a componer sentencias SQL en las que se relacionaban varias tablas con el fin de obtener un conjunto de datos combinado. Mediante la propiedad Tables es posible acceder a las tablas de datos. Estos 0 .NET. En el noveno capitulo conocer6 con detalle la forma de trabajar con la clase Data S e t y otras relacionadas con ella. modificaci6n o eliminaci6n.NET. afectando al conjunto de datos. tabla. Como se indica en la propia ayuda de Visual Studio . facilit6ndolo como par6metro a1 constructor. puede estar compuesto de varias tablas. la columna. El conjunto de datos. La propiedad Tables es una referencia a una colecci6n DataTableCollection en la que se encuentran todas las tablas que forman el DataSet. lo que resulta mucho m6s corriente. vista o procedimiento almacenado tiene un identificador Linico. se dejar6 para m6s adelante. de igual forma que una tabla.5. Haschanges ( ) : Devuelve True en caso de que haya alg6n cambio en el conjunto de datos. Data. a fin de que las conozcamos lo suficiente como para POder usarlas en 10s ejemplos de posteriores capitulos. por ahora nos limitaremos a mencionar sus miembros m6s relevantes.

PrimaryKey: Identifica la columna o columnas que actdan como clave primaria de la tabla. Tambi6n dispone de m6todos para aceptar y rechazar cambios. Cada tabla se identifica con un nombre que se almacena en la propiedad TableName de la clase DataTable.NET cambios se almacenan provisionalmente separados de 10svalores del conjunto de datos original. propagando asi la aceptaci6n de todos 10s cambios que hubiese pendientes en el conjunto de datos. qu4 restricciones existen. Esta cuenta con 10s miembros necesarios para poder acceder a las filas de datos. llaman a1 mismo metodo de cada una de las filas. basicamente. La relaci6n entre una tabla y su conjunto de datos queda reflejada en la propiedad DataSet del DataTable. 0 0 . 0 Columns: Colecci6n de todas las columnas de la tabla. esta representada por un objeto de la clase DataTable. Cada una de las tablas. representada cada una de ellas por un objeto de la clase DataRow. Re] ectchanges ( ) : Su funcionamiento es similar a1 del metodo anterior. Algunas de las propiedades mas relevantes de DataTable son: 0 ROWS: Da acceso a la colecci6n de filas de datos que componen la tabla. Acceptchanges ( ) : Provoca una llamada en cascada a1 m6todo hom6nimo de cada una de las tablas referenciadas en la propiedad Tables que. per0 en este caso deshaciendo 10s cambios en lugar de aceptandolos. a su vez. Writexml ( ) /ReadXml ( ) : Guardan y recuperan el conjunto de datos localmente en formato XML. a las que se tiene acceso mediante la propiedad Tables segun acaba de verse. etc. Un conjunto de datos o DataSet consta.Prograrnacidn de bases d e datos con V i s u a l Basic . afiadir nuevas filas. de tablas y relaciones. WriteXmlSchema ( ) /ReadXmlSchema ( ) : Sirnilares a 10s anteriores. Cada columna se representa con un objeto de tipo Datacolumn.NET encontrar5 10s detalles relativos a 10s parametros que acepta cada una de esas versiones y su comportamiento. no a 10s datos en si. permitiendose posteriormente su aceptaci6n o rechazo. saber qu6 columnas componen cada fila. etc. recuperar aquellas que cumplen un cierto criterio. En la documentaci6n electronica de Visual Studio . per0 afectando tan s610 a1 esquema XML de 10s datos. Constraints: Referencia a un objeto Constraintcollection que contiene todas las restricciones de esta tabla. ya sea en un archivo o flujo de datos previamente preparado. La mayoria de estos metodos cuentan con multiples versiones sobrecargadas.

obteniendo s610 aquellas que se ajustan a un cierto criterio. por ejemplo. Esta informaci6n puede utilizarse para. se representan mediante objetos DataRow alojados en la colecci6n Rows. produciendose el primer0 en el momento en que va a efectuarse la acci6n y el segundo una vez que se ha completado. en un determinado estado. ha sido aiiadida o eliminada. Las operaciones bisicas que podemos llevar a cab0 sobre la fila. Utilizando el metodo Select ( ) es posible filtrar las filas de la tabla. obtener todas las filas hija de una dada en una relaci6n maestro/ detalle entre dos tablas. tal y como se ha indicado en el punto anterior. DataTable dispone de multiples eventos. Eliminar una fila. y que provocan el cambio de su propiedad Rows t a t e. A1 igual que otras muchas clases. 0 Modificaci6n del contenido de una fila. a una fila de datos propiamente dicha. Cada fila se encontrar6. Fi las Las filas de datos de una tabla. pudiendose modificar su contenido o eliminarse. permanece sin cambios. respecto a1 estado original de la colecci6n de filas a la que pertenece. con Acceptchanges ( ) . el cambio en una fila o la eliminaci6n de una fila. por ejemplo RowDeleting y RowDeleted. Con ellos se notifica el cambio del contenido de una columna. o descartarse. que es la propiedad por defecto. Una vez tengamos una referencia a un DataRow. Todos estos eventos tienen una forma en gerundio y otra en pasado. acceder a 10s existentes y eliminarlos. Modelo de objetos ChildRelations / ParentRelations: Cada una de ellas contiene una referencia a un objeto DataRelationCollection.5. es posible aiiadir nuevos elementos. Mediante la propiedad Rows se tiene acceso a las filas de datos actuales. . mediante la cual es posible acceder a cada columna de la fila. Como en toda colecci6n. ya sea mediante su nombre o con el indice de posici6n que ocupa en la fila. La clase cuenta con una propiedad llamada ~tem. utilizariamos 10s miembros de dicha clase para manipular su contenido. Los cambios efectuados pueden aceptarse. indicando si se ha modificado. Si queremos aiiadir filas se emplea el metodo NewRow ( ) del propio objeto DataTable. Basta con llamar a su metodo Delete ( ) . Tomando como base la propiedad Rows del DataTable. son las enumeradas a continuacibn: 0 Afiadir una fila. h e se aloja en la propiedad s610 de lectura Rows tate. que contiene una referencia a una colecci6n. no tenemos m6s que usar el habitual metodo Add ( ) de cualquier colecci6n para aiiadir una nueva fila. Este acceso permite tanto leer el valor actual como cambiarlo. llamando a Re] ectChanges ( ) . en el primer caso con las relaciones hijo de la tabla y en el segundo con las relaciones padre.

Todos estos atributos son accesibles mediante 10s miembros de la clase Da ta Co 1umn. y el metodo GetColumnsInError ( ) . etc.Programacidn de bases de datos con Visual Basic . antes de iniciar las modificaciones deberiamos llamar a1 metodo BeginEdit ( ) del DataRow. Esto. Algunas de esas propiedades son: ColumnName: Nombre de la columna. se iran ejecutando automaticamente todas las comprobaciones y restricciones que haya definidas en el conjunto de datos. Cuando hayamos terminado de manipular la fila. que nos permite saber si existen o no errores. que devuelve un arreglo con todas las columnas que tienen errores. Cada una de las columnas existentes en un DataRow cuenta con una serie de atributos que definen. en caSO afirmativo puede accederse a ellos utilizando 10s valores de la enurneracion DataRowVersion. 0 MaxLength: Longitud maxima si la columna contiene una cadena de texto. De esta clase nos interesarin basicamente una docena de sus propiedades. una o mas columnas queden en estado de error. inhibiendo tanto las comprobaciones como la generaci6n de 10s eventos de cambio. ademas. por ejemplo el valor por defecto. Tambi4n puede utilizarse el m6todo CancelEdi t ( ) para devolver la fila a su situaci6n inicial. Sera en ese momento cuando se ejecuten todas las restricciones y produzcan 10s eventos. las filas de una tabla pueden contar con multiples versiones de valor que almacenan. tras una modificaci6n.NET A medida que se modifican 10s valores de las columnas de una fila. si 10s valores que contendra deben ser 6nicos o no. confirmaremos todos 10s cambios con una llamada a EndEdi t ( ) . el valor por defecto si es que existe. dichos cambios tienen interdependencias que pudieran causar estados invalidos. puede no ser lo mas adecuado. Nota A medida que van editandose. el que tenia anterior a1 cambio y el posterior. ya que el resto de 10s miembros son heredados de las clases ascendientes y no tienen que ver directamente con el trabajo con datos. El metodo Hasversion ( ) permite saber si un cierto DataRow tiene 0 no multiples versiones del valor. . La clase DataRow dispone de la propiedad HasErrors. DataType: Tip0 de dato de la columna. el tip0 de informaci6n que puede contener. por ejemplo. en ocasiones. especialmente si van a hacerse muchos cambios que tienen restricciones y. pudiendo obtenerse la descripci6n del error. De ser asi. Las restricciones y tipos de datos de las columnas pueden dar lugar a que.

son m5s complejas.que es su Valor por defecto. si en un DataSet existen multiples DataTable es precis0 definir la relaci6n que guardan entre ellos. es decir. es base de las clases ForeignKeyConstraint y Uniquecons t raint. A1 crearse relacionan una columna de una tabla con una columna de otra tabla. Las restricciones de clave externa. aiiadida a la coleccion Constraints de la tabla. no obstante. AllowDBNull: Indica si puede dejarse un valor nulo en la columna.que establece qu6 debe hacerse cuando se modifique o elimine. en objetos DataRow. correspondientes a la clase ForeignKeyConstraint. La clase Uniqueconstraint. y que se definen al nivel de cada tabla. Con este fin se utiliza la clase .llamada Constraints. 0 Como puede ver. esta clase dispone de dos propiedades. estando definida cada una de ellas mediante 10s miembros de una clase derivada de Constraint. que representan 10s dos tipos de restriccih m5s habituales. Segun se indicaba anteriormente. UpdateRule y DeleteRule._- Una de las propiedades de DataTable. Esta. Dichos valores. clase abstracta en la que se define la propiedad ConstraintName que albergar5 el nombre de la restriction. Crear un objeto Uniqueconstraints y afiadirlo a la citada coleccion es exactamente igual que dar el valor True a la propiedad Unique del DataColumn que representa a la columna cuyos valores tienen que ser unicos.5 . no se comprueban a menos que la propiedad EnforceConstraints de la clase DataSet sea True. 10s miembros de DataRow definen las caracteristicas a 10s que tendran que ajustarse 10s valores de una cierta columna. asegura que 10s valores que tiene una cierta columna Sean siempre unicos en todas las filas. respectivamente. Adem5s. Unique: Determina si 10s valores de la columna deben ser unicos entre todas las filas de la tabla. se almacenan en las filas. impidiendo la inconsistencia de sus valores. Modelo de objetos 0 0 Defaultvalue:Valor por defecto para la columna.es la encargada de contener la coleccion de restricciones a aplicar a la tabla. Las restricciones existentes en un conjunto de datos. el valor de una columna en la tabla maestra que tienen dependencias en la tabla de detalle. __ . AutoIncrement: Especifica si la columna contiene un valor que se incrementar5 autombticamente.

Parentcolumns. cretindose un objeto a partir de ella por cada relacion que exista en el conjunto de datos.5 puede ver un esquema de bloques en el que se representa un DataSet con dos DataTable. se aplica una restricci6n Uniqueconstraint a la columna indicada de la tabla maestra. garantizando la integridad de la informacion. Usando 10s mktodos Find ( ) y FindRows ( ) de DataView es posible encontrar la fila o filas que coinciden con el valor clave que se indique. Por otra parte. Un objeto DataTable facilita en su propiedad Rows todas las filas que contiene la tabla del origen de datos a1 que estti asociado. tambien se crea una restriccion ForeignKeyConstraint aplicada a la columna de la tabla de detalle. partiendo de ese objeto DataTable es posible crear vistas de datos mtis elaborados gracias a la clase Dataview. a fin de que no pueda repetirse su valor ya que. se evitar6 cualquier actuaci6n sobre ellas que pudiera infringirla. Por una parte. facilitando a1 constructor 10s partimetros apropiados. relacionados mediante un DataRelation. ya que dispone de las propiedades y mktodos apropiadas para ello. En la figura 5. ofreciendo una vista por defecto. asi como editar 10s valores de las existentes accediendo a ellas mediante la propiedad I tem. .Mediante un objeto DataView las operaciones de busqueda. Las propiedades de DataRelation suelen establecerse en el momento de la creacion del objeto. Tambidn pueden usarse 10s mktodos AddNew ( ) y Delete ( ) para adadir y eliminar filas. Datacolumn y Constraint. Para ello se entrega el nombre de la tabla maestra y la columna o columnas que actuan como clave principal. La primera contendrti una cadena de caracteres con las condiciones de filtrado de filas. busctindolo en la columna por la que estti ordentindose. sirvikndose de las propiedades RowFil ter. ChildTable y Chi IdColumns. Los criterios de filtrado y el orden pueden fijarse durante la creacion del DataView o bien posteriormente. tendriamos un conflict0 porque no se sabria a quk fila de la tabla maestra corresponden las de la tabla de detalle.NET DataRelation. Una vez se ha establecido una relacion entre las tablas. A1 crear una relacion 6sta genera implicitamente dos restricciones que se aplican a las tablas participantes en dicha relacion. Teniendo las filas ordenadas. RowStateFilter y Sort. ordenaci6n y manipulacion de 10s datos resultan mds sencillas. respectivamente. operaciones como la busqueda resultan mucho mds f6ciles. impidiendo asi que se introduzcan valores inexistentes en la tabla maestra. conteniendo cada uno de ellos sus DataRow. asi como el nombre de la tabla de detalle y el de la columna o columnas que actuarian como clave externa. No obstante. la segunda aplica un filtro basado en el estado de las filas y la tercera determina las columnas sobre la base de las cuales se ordenartin las filas de la tabla. Estos valores tambikn pueden ser establecidos con las propiedades ParentTable.Programacidn de bases de datos con V i s u a l Basic . accesibles mediante las propiedades comentadas en todos 10s puntos anteriores. de ocurrir esto.

A1 finalizar la lectura de este capitulo posiblemente se sienta confundido abrumado. compuesta cada una de ellas de filas. Esto no debe preocuparle. propiedades y mktodos que se han introducido de forma rdpida y exclusiv mente teorica. U n conjunto de datos formado por dos tablas relacionadas entre si.5. cl ses. columnas y restricciones Nada impide crear multiples objetos D a t a V i e w sobre el mismo D a t a T a b l obtenikndose diferentes vistas de 10s mismos datos segun el orden y criterios d selecci6n que interesen. ya que toda esa informaci6 . No se trata de que sepa qu6 clases ha en que dmbito se encuentra o qu6 miembros cuentan. lo que no es extrafio teniendo en cuenta la cantidad de interfaces. Modelo de objetos II DataTable II DataSet DataTable Figura 5.5.

que ird afianzando a medida que siga leyendo. El objetivo del capitulo era familiarizarle con todos 10s elementos mencionados. profundizar en el estudio de cada interfaz o clase en particular.Prograrnacidn de bases de datos con Visual Basic . nos servird para. .NET. a fin de que le resulten familiares y tenga una idea aproximada de c u d es su funci6n y relaci6n con 10s demds. en capitulos siguientes.NET la puede encontrar rdpidamente en la referencia de la ayuda de Visual Studio . ponikdolas ya en prdctica mediante el desarrollo de algunos ejemplos simples per0 demostrativos. Este conocimiento.

.

poniendo ese conocimiento en practica a1 escribir pequeiios programas que abran y cierren dicha conexi6n. y tambikn la sintaxis de las cadenas de conexi6n de ciertos proveedores. .NET tenemos a nuestra disposici6n dos proveedores de datos: SqlClient y O l e D b . en este sexto capitulo. siempre que sea posible es preferible el us0 de proveedores de datos nativos y especificos para cada origen. Acceder a un cierto origen de datos mediante el proveedor OleDb y un controlador OLE DB supone. lo cual implica mayor us0 de recursos y menor rendimiento. tema sobre el que volveremos despuks. Tras instalar Visual Studio . Por ello. como 10s de OLE DB y ODBC. seguramente le habran resultado arduos de leer. mientras que con el segundo es posible emplear cualquier controlador OLE DB instalado en el sistema. a1 menos en una cierta proporci6n. para poder abordar con un minimo de familiaridad el desarrollo de 10s proyectos que van a proponerse a partir de ahora. es conocer todo lo necesario para poder conectar con distintos origenes de datos. como es facil deducir. una capa mas de cbdigo. Nuestro objetivo. fundarnentalmente tebricos. Aprender6 a usar las diferentes clases Connection. comenzando con este capitulo. una por proveedor. per0 la teoria es necesaria. El primer0 es especifico para SQL Server.Los dos capitulos previos.

A partir de este momento ya podemos usar el nuevo proveedor. por lo que el proceso es realmente sencillo. puede limitarse a ir pulsando el b o t h Next > hasta llegar a1 ultimo paso (v6ase figura 6.msi y el del segundo odbc-net .NET Data Provider y Microsoft . Localice el archivo que contiene el proveedor.3 megabytes. El archivo de instalacion del primer0 es oracle-net . Despliegue la secci6n del menu que aparece a la izquierda el apartado Downloads y seleccione la opci6n Developer Downloads. A continuaci6n se indica d6nde puede obtener estos controladores y c6mo instalarlos en su sistema. Vaya a la sede M S D N Library de Microsoft introduciendo este URL http: //msdn. conteniendo el c6digo del proveedor. por ejemplo en ODBC .parar operar directamente sobre bases de datos Oracle y usar controladores ODBC. por ejemplo. y haga doble clic sobre el.microsoft. . por ejemplo oracle net. asi como un nuevo grupo a la carpeta Programas con la documentaci6n exclusiva del proveedor instalado. Obtenga el archivo y repita el paso con el proveedor ODBC. mientras que el proveedor ODBC no llega al megabyte.1. El proveedor de ADO.NET Data Provider for Oracle. respectivamente.2) donde hariamos clic sobre Install.msi. Abra el nodo . y transferirlos a nuestro ordenador. en este momento 10s que acaban de indicarse. aparecer6 un documento facilitando diversa informaci6n y un enlace para obtener el archivo de instalaci6n del proveedor.msi.NET para Oracle ocupa 1. En la figura 6. b6sicamente. con el enlace en la parte superior derecha. A1 seleccionar uno de 10s nodos.com/library/ en su cliente Web habitual. ~~~~~ Microsoft facilita 10s proveedores de datos en archivos MSI autoinstalables. mostra%dose un asistente compuesto de varias piginas en las que.6 . El primer paso seri localizar 10s proveedores adicionales que haya publicado Microsoft.NET Framework y alli encontrari 10s proveedores. Conexidn a1 origen de datos Tras la presentacidn de Visual Studio . Durante la instalaci6n se aiiadir6 a1 menos un nuevo ensamblado a1 GAC.NET Microsoft ha liberado dos proveedores m6s: Oracleclient y Odbc. puede ver el documento del proveedor para Oracle. algo que haremos en 10s puntos posteriores utilizando 10s dos indicados antes y que se asume que habri obtenido e instalado en su sistema. En el panel de la izquierda habr6 aparecido una lista jerirquica con distintos nodos. La instalacion se pondr6 en marcha.

The MrcroraftC NET Framework Data Provider for Oracle IS an add on S n e (bytes]: component to the Microsoft NET Frameworkthat provides access to an ~ ~ ~ i ~ ~ d ~ Last “Pdated: Oracle database using the Oracle Call Interface (OCI) as provided by Oracle Client software Oracle St Release 3 (8 1 7) Client or later must be supported: 1.ber 0 ~ ~% .NET para Oracle .1. Obtenemos 10s proveedores de datos NET adicionales custom s e t u p select the way you want k a t u r s to be mrtakd a& on the m s n +he bee below to h a w the way fea’ares d be mstdkd 1- Miuosoftaade ..351 07J17J2002 N O Wel~ome Downloads to CDmpOnentDeYelopment I Data Access and Databases 3 1 installed for this o r w i d e r to funaion &Download NET Framework 0 0 0 0 0 0 NET show Terrarium and Adive Sewer Pages NET Show LIVE’ From the ODBC NET Data Provider NET Show NET Dwr Win< NET Show Inside the C Figura 6.Programacidn de bases de datos con Visual Basic . .NET F F Microsoft .NET Data Provider for Oracle 0 MSDN subscr.M€TDataFravdef Figura 6 2 Instalacion del proveedor ADO.

la mayoria de las clases implementadas por 10s proveedores tienen una clase base comun o bien implementan una misma interfaz. Conexidn a1 origen de datos Tal como ya se indicara en el capitulo anterior. En cualquier caso. Tambien es posible facilitarla en el momento de la creacion del objeto.. entregdndola como pardmetro a1 constructor.~ _ _ _ _ _ _ ~ ~ _ _ I ^ _ l_^-. nada nos impide almacenar la referencia devuelta por el constructor de una de las clases Connection en una variable de tip0 IDbConnection.. conociendo tan so10 10s miembros de esta interfaz.-_l__l_^___l_---------- Una vez hayamos obtenido una referencia a un objeto Connection. Component I 7 I D b Connec tion Sqlconnection Figura 6. esta cadena determinarii el servidor con el que se comunicard el proveedor. entraremos en m i s detalles sobre la composicion de la cadena de conexion. ~ ~ x I ~ _ _ _ . y la interfaz que determina la lista minima de miembros con que deben contar 1as clases de conexion es IDbConnection.3.3.Esto nos permitird codificar de manera generica 10s pasos de la conexion. en 10s que vamos a conectar con diversos origenes de datos. .6 . en el dmbito de ciertos proveedores. En puntos posteriores. En este caso se da lo segundo. no es posible crear objetos a partir de una interfaz. como es el caso de OleDb y Odbc. tambien del controlador con el que vaya a conectarse. la base de datos o archivo a abrir. como ya sabe. 10s pardmetros de seguridad a emplear. el primer paso serd establecer la cadena de conexion asigndndola a la propiedad Connectionstring. Aunque. Las clases Connection de 10s distintos proveedores implementan la interfaz IDbConnection .La relacion entre esta interfaz y el conjunto de clases que la implementan es la mostrada esquemiiticamente en la figura 6. etc. La estructura de la cadena de conexion depende directamente del proveedor que vayamos a utilizar y.

afectan a1 estado de la conexibn. es necesario llamar a1 m6todo Open ( ) . es posible llamar a1 m6todo Open ( ) para abrirla. podrian liberarse si dicha conexi6n va a permanecer inactiva la mayor parte del tiemPO. Debe tener en cuenta que esta llamada es necesaria. Por regla general. Executing: Se est6 ejecutando un comando. 0 Broken: Se ha perdido la conexi6n tras haber llamado satisfactoriamente a Open ( ) . la conexi6n no se estableceri automsticamente a1 intentar ejecutar el primer0 de 10s comandos sobre la conexi6n. Tras abrir la conexion. cuyos posibles valores son: Closed: La conexi6n est6 cerrada. En realidad 10s dos unicos estados que podemos encontrar actualmente en la propiedad Connectionstate son Open y Closed. en ocasiones. I _ ___ ___ __ _ I I _- __ ___ I _ __ ___ I - _l____l_ ___I__ I__ ______ -~ Tras preparar la cadena de conexibn.connectionstrings.Prograrnaridn de bases de datos con Visual Basic . aunque definidos.ya que el resto. ejecutar 10s comandos necesarios y.NET Existe una sede Web. y justo antes de efectuar cualquier otra operaci6n sobre el origen de datos. no tienen us0 en esta versi6n de la biblioteca de clases . El estado actual de la conexi6n podemos conocerlo consultando la propiedad Connectionstate. llamada CONNECTIONSTRINGS. corn. Connecting: Se est6 conectando con el origen de datos Open: La conexi6n est6 abierta. Mantener una conexi6n con el origen de datos significa estar consumiendo una serie de recursos que. con el comando Open ( ) . se conecta con una base de datos o archivo que dependera de 10s parametros facilitados en la cadena de . Fetching: Se est6n recuperando datos desde el origen. en la que puede encontrar inforrnacion rapida sobre las cadenas de conexion para acceder a 10s origenes de datos mas usuales mediante OLE DB y ODBC. aparte de otras operaciones. Las llamadas a 10s m6todos Open ( ) y Close ( ) . a continuaci6n. provocando una transici6n de un estado a otro. cerrarla con el m6todo Close ( ) . El URL de dicha sede es http: //www. quedando a partir de ese momento disponible para la ejecuci6n de comandos.NET. En ese momento se utilizar6n 10s par6metros de Connectionstring para comunicarse con el origen de datos y abrir la conexibn.

caso por caso. Una cadena de conexi6n se compone de pares de propiedades y valores. normalmente. Los proveedores Sqlclient y Oracleclient son especificos de un RDBMS. Veamos. utilizando para ello el objeto Connection de cualquiera de 10s cuatro proveedores mencionados. hasta cierto punto. A1 usar uno de estos dos proveedores. Los otros dos miembros de la interfaz IDbConnection. Puede cambiarde una base de datos a otra. sin necesidad de cerrar la conexion y volver a abrirla. algo totalmente imprescindible. Estas dos propiedades son s610 de lectura. c6mo compondriamos una cadena de conexi6n. mediante el metodo ChangeDatabase ( ) . como se ha dicho. por el contrario. en el caso de Database. son especificos. simplificar6n nuestro trabajo. proveedores que se comunican utilizando directamente el API o conjunto de funciones del software cliente de SQL Server y Oracle. son proveedores mucho mtis genericos. Conexidn a1 origen de datos conexion. Aparte de Connectionstring y State. deberia seguir la cadena de conexibn. OleDb y Odbc. se facilitan en la cadena de conexibn. aunque existen ciertas coincidencias entre ellos que. respectivamente. es necesario indicar en la cadena de conexi6n qu4 controlador es el que va a utilizarse. en ConnectionTimeout. en cada caso.y el tiempo mdximo de espera antes de cancelar un intento de conexih. en la prdctica. pensados para aprovechar todos 10s controladores OLE DB y ODBC que hay actualmente disponibles y que. Createcommand y BeginTransaction. En este momento conocemos el procedimiento que habriamos de seguir para conectar con un origen de datos.6. aunque la base de datos tambi4n puede especificarse mediante el metodo ChangeDatabase. Los distintos pares de la cadena se separan entre si utilizando puntos y coma. per0 aun no sabemos cutil es la sintaxis que. En el caso de OLE DB . en la interfaz IDbConnection existen dos m6s cuyo unico objetivo es facilitar el nombre de la base de datos que estti utiliztindose. Las propiedades posibles dependen de cada proveedor. facilitan el acceso a cualquier origen de datos. algo innecesario con Sqlclient y Oracleclient porque. no nos interesan en este momento ya que no tienen que ver con el establecimiento de la conexion propiamente dicha. Estos son datos que. en el formato propiedad=valor.

mientras que con ODBC la propiedad se llama D r i v e r .1 se enumeran 10s proveedores OLE DB que pueden encontrarse habitualmente en cualquier sistema Windows. Tambien existen controladores con nombres abreviados. indicando el nombre del fabricante.4 . O r a c l e .Prograrnacidn de bases de datos con Visual Basic . 0. J e t .OLEDB. Debe tener en cuenta que la identificacion de 10s controladores OLE DB diferira segun el fabricante que 10s facilite. El controlador para Oracle ofrecido por Microsoft se Ilamamsdaora. En la tabla 6. Tabla 6. Proveedores OLE DB Microsoft Data Shaping Service for OLE DB Microsoft OLE DB Persistence Provider Microsoft OLE DB Provider for Internet Publishing Microsoft OLE DB Provider for Microsoft Active Directory Service Microsoft OLE DB Provider for Microsoft Indexing Service Microsoft OLE DB Provider for Microsoft Jet Microsoft OLE DB Provider for ODBC Microsoft OLE DB Provider for Oracle Microsoft OLE DB Provider for SQL Server Microsoft OLE DB Simple Provider MSDataShape MS Pers is t MSDAIPP. El nombre del controlador OLE DB para acceder a una base de datos Access. etc. O r a c l e . indicandose el nombre con el que se conoce a1 proveedor y el identificador que habria que utilizar con la propiedad P r o v i d e r en la cadena de conexion. 4 .NET el controlador se asigna a la propiedad P r o v i d e r . es M i c r o s o f t . por ejemplo s q l o l e d b para identificar a1 controlador OLE DB para SQL Server o m s d a o r a para identificar a1 de Oracle. por ejemplo. identificacion del controlador. O L E D B .DS0 ADSDSOObj ect MSIDXS Microsoft.1. etc. el de Oracle O r a O L E D B . mientras que el ofrecido por la propia empresa Oracle se identifica como O r a O L E D B . sera necesario usar un nombre u otro.Jet. version. o MS DASQL MSDAORA SQLOLEDB MSDAOSP . Segun el que tengarnos instalado en el sistema. El nombre de 10s controladores OLE DB suele estar compuesto de varias partes.

.1 rw'> 1d .oft Acces:. Observe que se han utilizado unas llaves para delimitar a 10s identificadores. corn / h o m s p a g e s / K e rl N 0I-t h / O D B C V e rlii . l a d o r ODBC p a r a S Q I . Si en lugar de un objeto O l e D b C o n n e c t i o n hubiesemos creado un OdbcConn e c t i o n . 4 . ' C o n t r o l a d o r ODBC p a r a Access Ci) r l O d b c .J c t . .. como Visual Studio . principalmente controladores. Conexion a1 origen de datos Los nombres de 10s controladores ODBC suelen ser mucho mfis descriptivos que 10s anteriores. . DB Ljara Access/Excel n O l e ~ h . ' Controlador ' OLK. para facilitar el acceso a sus productos.mdb) . respectivamente. puede ver varios ejemplos de selection de controlador.h t m puede encontrar una lista de productos relacionados con OLE DB. desarrollados por terceros fabricantes. llaves que hay que incluir en la cadena de conexion.NET. Para utilizar el controlador para Access u Oracle. A continuacion.. C n n t r o l a d o r O L E DB d e M i c r o s o f t p a r a O r a c l e e c t i a r . O L E D B . . r i r l g = "Prc\liitr=rr~s'~aora. l r r = M i c r o r r ' f t . ~ o n n e c t i r ~rr i~ S t = " D r i v e r = { S Q L S e r v e r ] ng .. En: h t t p :/ / 1. S e r v e r C o n r ~ O d h c . m d b ) } y { M i c r o s o f t ODBC f o r O r a c l e } . y en: h t t F) : / / o u rwci r 1d . . para servirnos de un controlador ODBC. ci.rn/ tiornepat~ s / Ken N o r t h / r e ~ i ) 1e r i b V e n . Connect i o n St r i r g = n l ~ "Ijriver=iI'licrcr:. ya que ademfis del controlador son precisos parfimetros adicionales antes de poder llamar a Open ( ) para establecer la conexion. 0 . por continuar con 10s mismos ejemplos propuestos. existen otros.6. C o n n e c t i o n S t r i n g = " P r o v i . S i . Tenga en cuenta que estas cadenas de conexion no son vhlidas. OLE: DB par-a SQL S e r v e r e c t i o n s t r i r i g = "t'r-ovirrier=sql~)le~Jb . Driver (*. ccrmpus e r ve . suponiendo que ConnOleDb tiene una referencia a un objeto O l e D b C o n n e c t i o n . usariamos 10s identificadores { Mi c r o s o f t A c c e s s D r i v e r ( * . el formato de la cadena de conexi6n seria similar al mostrado en 10s ejemplos siguientes: ' C o r l t r c . c ompii s e r v e . Nota Ademas de 10s controladores OLE DB y ODBC que se instalan por defect0 con Windows y ciertos productos. H TM ~ una lista similar relacionada con ODBC..

NET _ _ _ _ l l l __--__~~- ____ ___-_~ -- --^___- ^ I l ~ _ l l _ _ _ _ _ I _ _ - - ~ -- El siguiente paso.Programacion de bases de datos con V i s u a l Basic . La primera existe en OleDb. Los proveedores OleDb y Sqlclient admiten en la cadena de conexi6n la propiedad I ni tia1 Cat a1og.. para poder conectar con un determinado origen de datos es precis0 identificarse adecuadamente ya sea directa o indirectamente. o el proveedor Oracleclient. la propiedad Data Source contendra el nombre de la m6quina en que est6 ejecut6ndose el servidor de datos. es un equipo llamado Dimension. ser6 un determinado servidor en el que se encuentra ejecutrindose el RDBMS o bien un nombre de archivo.. anteponiendo Provider=sqloledb... ..._... . no basta con conocer el nombre del ordenador en el que est6 ejecut6ndose el servidor._____ . es identificar el origen de datos que. A causa de ello. el ordenador en el que esta instalado Visual Studio . per0 a1 trabajar con un RDBMS.__... mientras que la segunda aparece en Odbc y tambien SqlClient y Oracleclient.. dependiendo del proveedor. . como Oracle o SQL Server.. AdemAs.. .. la propiedad a usar es Database. el dato a facilitar es el camino y nombre completos del archivo.. Si la cadena de conexi6n que estamos estableciendo es de un objeto Sqlclient u Oracleclient. _.. en ocasiones.... Si utilizamos el proveedor Odbc.. es precis0 que indiquemos sobre cu61 de las bases de datos existentes en 41 deseamos trabajar.. En caso de usar 10s proveedores OLE DB u ODBC para acceder a un origen de datos no RDBMS._ . I ..a la que se asignaria el nombre de la base de datos. el parametro Server del proveedor ODBC se sustitira por Dbq.. como puede ser una base de datos Access o una hoja de c6lculo Excel. SqlClient y Oracleclient. por ejemplo: .. El nombre de la propiedad es Data Source o Server. por poner un ejemplo._I Para acceder a una base de datos Access o una hoja de c6lculo Excel basta con conocer el nombre del archivo en que se encuentra. En ocasiones. En el caso del proveedor ODBC. ._II_.. mientras que SQL Server est6 ejecut6ndose en otro con el nombre Inspiron. . y desde el que se ejecutan las aplicaciones. el primer0 si vamos a usar Sqlclient u Oracleclient. En mi caso..__... La cadena de conexi6n de un objeto SqlConnection seria la siguiente: Data S o u r c e = i n s p i r o n Lo mismo valdria para el proveedor OLE DB. .NET. La seguridad es . . tan s610 hay que cambiar Data Source por Server..

User I D y Password. mientras que en el segundo se deja que sea el sistema. D a t a Source= i r s p i rorl" i ' P r o v e e d o r Oracle Con nor a c 1e .o bien un controlador SQL Server mediante OLE DB. esta propiedad puede tomar 10s valores yes o no. Init i a 1 Cat a 1o g= L ib ro s " & - ' Proveedor SylClient ConnSql. En el primer caso se entregan de manera explicita un nombre de usuario y una clave. La propiedad Integrated Security determinarh qu6 metodo va a utilizarse.equivalente a yes. Como acaba de decirse. Conexio'n a1 origen de dafos un aspect0 especialmente importante en 10s sistemas RDBMS. la identificacion ante el origen de datos puede ser directa o indirecta. de Odbc. depositos de informaci6n de las empresas y que deben estar resguardados de acciones. User ID=scott. una vez mhs. una cadena de conexi6n completa podria quedar como alguna de las siguientes: ' Curltrolador OLE DB para S Q L Server ConnOleDb. en el que dichas propiedades se llaman U I D y PWD. . Al usar el proveedor Sqlclient. Fassword=tiger" ' Controlador ODBC para Access ConnOdbc. accidentales o intencionadas. Integrated Security=SSPI. Con r e ct i on St r ing = l "Data Source=ek400. El nombre de usuario o esquema y la clave se facilitan siempre en las mismas propiedades. hay que exceptuar Odbc. " & "DBQ=C:\ PBddVisualBasicNET\Ej e r n p l o s \ C a p p 0 3 \ L i b r o s .6. En el primer caso se utilizar6 la seguridad integrada del sistema para identificarnos. en el que previamente hemos iniciado sesion. Presente en tres de 10s cuatro proveedores. mdb" El valor asignado a la propiedad User ID en la cadena de conexion del proveedor Oracleclient determina el esquema inicial de trabajo al conectar con la base de datos. mientras que en el segundo habr6 que entregar un nombre de usuario y clave. ConnectionString = "Frovider=sqloledb. Con esto. r n d b ) . es habitual la asignacion a la propiedad Integrated Security del valor SSPI. ConnectionString = "Driver={Microsoft Access Driver ( * . el que presente nuestras credenciales ante el servidor de datos." " Da t a Source= i rl s p i ro rl . y la revelacion de datos confidenciales a terceros. ConnectionString = " I n t eg rated Secu r i t y= SS PI .en todos 10s proveedores con excepcih.

por ejemplo Argumen tException si hay un parametro incorrect0 en la cadena de conexion. estos primeros ejemplos van a crearse como aplicaciones de consola. Por simplicidad. el proceso para conectar con algunos de 10s origenes de datos creados en un capitulo previo.NET - ~ " - " ~ l l _ IxI____I__--I________I " . En 10s puntos siguientes va a tratarse. tambi6n existen propiedades que son exclusivas de un cierto proveedor o controlador. ~- ss Vamos a comenzar por uno de 10s casos m6s simples. seria el siguiente: Imports Systern. se encuentre instalado Microsoft Access.. Simplemente genere una aplicaci6n de consola vacia. utilizando el asistente Aplicacion de consola. S610 con esto ya estariamos en disposici6n de conectar con el origen de datos. Si la cadena de conexi6n tiene el formato correct0 y.OleDb . Para poder conocer las propiedades exclusivas de cada proveedor o controlador tendr6 que consultar su documentaci6n. Estas propiedades se introducen en la cadena de conexi6n siguiendo exactamente el mismo procedimiento. paso a paso. basta con la instalaci6n de 10s MDAC. adem&. que son las de us0 m6s habitual y general entre proveedores y controladores. llamando a1 m6todo Open ( ) inmediatamente despu6s de la asignaci6n. y va a ejecutarse este ejemplo. en este caso. Para ello no es necesario que en el ordenador donde est6 la base de datos. El resultado no sera muy espectacular.Data. que es lo que perseguimos. tras revisar 10s distintos par6metros que pueden formar parte de una cadena de conexih. se han propuesto varias asignaciones distintas para la propiedad Connectionstring de varios objetos Connection. Cualquier incidencia que impida la conexi6n provocara una exception.Programacion de bases de datos con Visual Basic . el estado del servidor y otros par6metros permiten conectar con el origen de datos. la configuraci6n de red.NET que conecte con la base de datos Access que habiamos creado en el tercer capitulo. comprobando esa conexi6n y cerrindola finalmente.NET. y a continuaci6n introduzca el c6digo indicado que. especificando el nombre de la propiedad y el valor separados por un signo =. escribiendo un pequefio ejemplo en Visual Basic .~ AdemAs de todas las anteriores. per0 es el primer paso en el tratamiento de datos con ADO. la propiedad State deberia cambiar de Closed a Open. A1 final del punto anterior.

"Data Source-\PBddVisualBasicNET\Capp03\Libros. Conexidn a1 origen de datos Module Module1 Sub M a i n ( ) .0.C Else ' End I f Catch ' sole. si en su sistema el archivo est6 en otro punto deber6 modificar el valor de Data Source.WriteLine ("CunnectionString='" & ConnOleDb.4. asi como el nombre cornpleto de kste.W r 1 t e Li rl e ( Co n r l e c t 10nT I rneo u t = I 1 & C o nn0 1P Db . recogiendo asi cualquier excepci6n que pudiera generarse a1 llamar a1 metodo Open ( ) . Tras crear un objeto OleDbConnection.OLEDB. El resto del c6digo est6 incluido en un bloque Try/Catch. Lbgicamente. W r i t e L i n e ( I' Da t a b a s e= " & Co nn 01 e Db .6.WritPLine["*** Error a 1 irlterltar l a c u n e x i u n * * * " 1 End T r y End Sub End Module Los proyectos de ejemplo de este y 10s demas capitulos puede encontrarlos en las distintas subcarpetas de la carpeta Ej emplos que hay en el CD-ROM que acompafia al libro.WriteLine ("Se h a establecido la conexion" 1 Console. > Dim CorlnOleDb As New OleDbConnection ( ) C n n n O 1 e ~ b .Habria conseguido exactamente el mismo resultado facilitando esa cadena como par6metro a1 constructor de OleDbConnection. Fijese en c6mo se indica el camino en el que est6 el archivo.r e c t 1 3 nT 1 m e o u t ) i Co h 5 3 1 e . incluyendo la extensi6n.ConnectiorlStrlng & "'1 Co rls o 1e .Co r. observe como se establece la cadena de conexi6n asignhdola a la propiedad Connections t ring.nidb" Console. C ~ n n e c t i o n S t r i n= g " P r o v i i ~ r = M i c r o s o f tJet. " & . Da t a b a c e ) r 'I CorlnOleDb. Dependiendo .

0. opcionalmente. Cualquier otro mensaje significard que algo no ha id0 bien. a1 no reconocerlo.NET del valor de State.Jet. Conseguimos conectar sin problemas con una base de datos Access El mismo controlador OLE DB que hemos utilizado para conectar con Microsoft Access.4. junto con Excel 8 . el resultado tendria que ser el mostrado en la figura 6.0. el pardmetro HDR=Yes pasaria a1 proveedor OLE DB de ADO. nos servir6 tambien para acceder a cualquier hoja de c5lculo Excel. De no hacerlo asi. tendremos que usar el pardmetro Extended Properties. "Extended Properties-'Excel 8. pase directamente a1 controlador OLE DB de Microsoft Jet. 0. facilitando el camino y nombre del libro. o de que se produzca o no esa excepcibn. Lo unico que tenemos que hacer es cambiar la cadena de conexibn. OP C WBddVirunlBaric tIET\Cap-Ob\ConrxionAcce~r\bin\ConexionAccerr exe . si la primera fila de cada hoja contiene titulos de columnas o no. ConnectionString = - "Provider=Microsoft.4.utilizado para enviar a1 controlador pardmetros exclusivos.10:x Figura 6.OLEDB.4.0. . " & "Data S o u r c e = \ P B d d V i s u a l B a s i c N E T \ C a p _ 0 3 \ L i b r o s . Con el entrecomillado conseguimos que ese pardmetro.Programacidn de bases de datos con Visual Basic . Microsoft. se delimitan entre comillas simples.NET. Jet. Ademds. provocaria un error. ~ l s . Tomando como base el c6digo anterior.OLEDB. que en este caso indican que el archivo es un libro de Excel que cuenta con una cabecera de titulos. 4. veremos salir un mensaje indicativo u otro por pantalla. que intentaria interpretarlo y. cambie la asignaci6n a la propiedad Connectionstring para que quede como se muestra a continuacih: C o n n O l e D b . indicando que lo que va a abrirse es una hoja de Excel y. Si todo va bien. como deberia. HDR=Yes"' " & Observe c6mo las propiedades extendidas.

que ser6 nuestro caso. .5. Conectamos con un libro de Microsoft Excel ___ Nota Para acceder mediante el controlador OLE DB a una hoja de calculo Excel no es necesario tener instalado Microsoft Excel en el equipo. Para poder conectar con nuestra base de datos SQL Server deben darse 10s siguientes requisitos: 0 El servidor SQL Server. debe estar en funcionamiento. como acaba de verse en 10s dos puntos previos. En el equipo donde va a ejecutarse la aplicaci6n debe haberse instalado el software cliente de SQL Server. comunicarse con un servidor que se encargue de efectuar fisicamente la manipulaci6n de 10s datos. Figura 6.5.2000 o MSDE. tras efectuar las modificaciones indicadas. De ahi que la conexi6n sea bastante sencilla. bien en el mismo ordenador donde va a ejecutarse la aplicaci6n o en un ordenador remoto al que se tenga acceso mediante una infraestructura de red.6. es el valor de Conne c t i onS t r i n g . Esto no es necesario si es el mismo equipo donde est6 ejecut6ndose el RDBMS o bien se trata de un ordenador donde se ha instalado la plataforma . sin necesidad de utilizar un software cliente para. como puede verse. Conexidn a1 origen de datos A1 ejecutar el proyecto. a trav4s de protocolos de red. La unica diferencia. ya sea 7. Tanto Access como Excel son origenes de datos a 10s que se accede localmente. el resultado deberia ser como el de la figura 6.NET y la ultima versi6n de 10s MDAC.

la ejecuci6n del programa deberia producir un resultado similar a1 de la figura 6. va a utilizarse la seguridad integrada de Windows. consulte con su administradorde red para que configure su cuenta de tal manera que pueda acceder a SQL Server. partiendo del c6digo del punto anterior.SqlC1ient e n l a instrucci6n Imports. podemos cambiar el valor de Data Source por localhos t. Integrated Security=SSPI. 0 Modificacion de la declaraci6n de la variable de conexion. donde est6 ejecutiindose la aplicacibn.Programacidn de bases de datos con Visual Basic . Si obtiene un error. Si tiene problemas con el acceso al servidor a causa de la configuracion de seguridad. a1 inicio del m6dulo de c6digo. asi como disponer de una cuenta. En caso de que vayamos a ejecutar el ejemplo siguiente en el mismo equipo donde estii ejecutiindose el servidor.Data.NET Hay que conocer el nombre del servidor donde est6 ejecut6ndose el RDBMS.en su defecto. facilite explicitamente un nombre de usuario y clave 0 . A continuaci6n verifique que hay comunicaci6n entre el cliente. que quedaria asi: Dim ConnSql As New SqlConnection( " D a t a S o u r c e = i n s p i r o n .En mi caso SQL Server se ejecuta en una miiquina distinta. empleando nuestra cuenta de acceso a1 sistema cliente para identificarnos ante el servidor y poder acceder a1 RDBMS. y el servidor y. serian 10s indicados a continuaci6n: Sustituci6nde System. compruebe la configuraci6n de seguridad. . finalmente. nombre de usuario y clave. en lugar de con una asignaci6n posterior a ConnectionString.6. " I ni t 1 a 1 Cat a log=Li bros " ) " & - Observe que la cadena de conexi6n se facilita directamente a1 constructor de Sqlconnection. Ademiis. Asumiendo que se cumplen todos 10s requisitos previos. Llevados a cab0 estos cambios. para poder conectar con 61 en caso de que no vaya a utilizarse la seguridad integrada. 10s pasos para conectar con la base de datos. en el que puede verse la cadena de conexi6n y el nombre de la base de datos con la que se ha conectado. comience por comprobar que es posible conectar con la base de datos Libros desde el propio servidor. utilizando la herramienta de administraci6n usada en el tercer capitulo.Data. 0 Cambio de las referencias a la variable ConnOleDb por ConnSql en las lineas siguientes del programa. y que hemos comprobad0 que es posible el acceso desde el cliente a1 servidor utilizando el software cliente de SQL Server.0leDb por System. de ahi que sea precis0 indicar su nombre.

si exceptuamos a la comunidad de usuarios de herramientas de desarrollo Borland. hay varios de tip0 shareware y comerciales.defined. por obtener un controlador OLE DB u ODBC de terceros. DB2 o MySQL. com/ en un archivo auto instalable de tan s610 330 kilobytes. En Internet es posible encontrar varios controladores ODBC para InterBase / Firebird. Algunos de ellos. Conexidn a1 origen de datos Figura 6. Para 10s ejemplos de este libro se ha empleado la versi6n de evaluaci6n del controlador de Gemini. son comerciales. pueden utilizarse gratuitamente. El controlador Microsoft Jet. e instalarlo. ya que no se facilita ninguno con el propio RDBMS. precisamente.net/faq. En este punto se asume que empleara el controlador ODBC indicado. SQL Server. ibdatabase . relativamente grande. basicarnente. per0 si prefiere usar un controlador OLE . El proceso seria. tanto de us0 libre como comerciales. puede encontrar un apartado dedicado. concretamente la versi6n 2. Tambien tiene la alternativa de usar un controlador OLE DB en lugarde ODBC. a 10s controladores ODBC para InterBase. necesariamente. Establecemos conexion con un servrdor SQL Server InterBase.6. cuyo URL es http://ibinstall. como el de IBPhoenix. A diferencia de lo que ocurre con SQL Server u Oracle. mientras que otros.NET para InterBase. son sistemas RDBMS poco conocidos si se les compara con Oracle. y su hermano Firebird. algunos de 10s cuales cuentan con ediciones de prueba durante un tiempo limitado.FAQ. asi que deberemos buscar una alternativa que pasa. el misrno: localizar el controlador. como el Gemini o EasySoft. En la Web IntevBase Installation Info . que puede obtener desde http: //www. tampoco es capaz de conectar directamente con InterBase. htm.6. que hemos usado anteriormente mediante el proveedor OLE DB para acceder a Access y Excel. actualmente no existe un proveedor de datos ADO.1.

InterBase 6. " & ~ " & ~ "Database=\PBddVisualBasicNET\Cap_03\Libros. En este caso. D a t a . en la configuraci6n utilizada para desarrollar este ejemplo. lo cierto es que resulta un product0 .NET para ODBC. Por lo demis. Fijese en yue se utiliza la cuenta SYSDBA con la clave de acceso que tiene por defecto. asi que tendra que abrir el menu emergente del proyecto. O d b c . creada en el tercer capitulo. siendo precis0 tener el RDBMS en funcionamiento. la configuraci6n para poder conectar con nuestra base de datos InterBase. "Server=localhost. El ensamblado M i c r o s o f t . O d b c . D a t a .5 est6 ejecutandose en el mismo ordenador donde se ejecuta el programa.Prograrnacidn de bases de datos con Visual Basic . Asumiendo que la configuraci6n es la correcta. Deber6 cambiar esto si modific6 la clase o desea usar una cuenta distinta para conectar.7. el software cliente instalado en el ordenador donde vaya a utilizarse la aplicacidn y la configuracibn correcta de red para comunicar cliente con servidor. Dejar la declaraci6n de la variable de conexi6n como se muestra aqui: Dim ConnOdbc As New OdbcConnection ( "Driver={Gemini IriterBase ODBC D r i v e r 2. no difiere de la explicada en el punto anterior para SQL Server. hasta llegar a las actuales 8i y 9i. PWD=masterkey") Sustituir las referencias a la variable de conexi6n introduciendo C o n n O d b c en lugar de la empleada en el ejemplo anterior. A pesar de que la facilidad de us0 del RDBMS Oracle ha ido mejorando de versi6n a versibn. Los cambios a efectuar en el c6digo serian 10s siguientes: 0 Importar el 6mbito M i c r o s o f t . el programa deberia producir una respuesta como la mostrada en la figura 6. ya sea en el equipo local en un servidor. donde se encuentra el proveedor ADO. O}." & "UID=SYSDBA. de ahi que se haya asignado el valor l o c a l h o s t a1 par6metro S e r v e r . como si ocurre con el que contiene 10s anteriores proveedores de datos. dll no se aAade automaticamente al crear u n proyecto Visual Basic.gdb. seleccionar la opcion Agregar referencia y aiiadir una referencia a dicho ensamblado para que el codigo siguiente funcione.NET DB tendra que modificar el codigo para acceder a el mediante el proveedor O l e D b en lugar de O d b c .

6 . Conexidn a1 origen de datos

bastante mds complejo que cualquiera de 10s tratados en 10s puntos previos. El proceso de conexih, desde el cbdigo, no difiere del utilizado en 10s ejemplos anteriores, pero, para que funcione, es precisa una preparacidn preliminar configurando 10s servicios en el software cliente.

I

C:WBddVbua8aricN~CaP~06\o1texlonOdbc\bin\onewionOdbc exe

-0 x 11

Figura 6.7. Lograrnos conectar con la base de datos InterBase

Como se indic6 en el tercer capitulo, la base de datos creada a mod0 de ejemplo reside en un servidor Oracle 9i funcionando sobre Windows .NET Server. La aplicaci6n cliente, el programa de ejemplo que vamos a desarrollar, se ejecutard desde otra mdquina, en la misma red, que funciona con Windows XP Professional. En dicha m6quina es precis0 instalar el software cliente de Oracle, debidamente configurado para comunicarse con el servidor. Durante la instalaci6n del software cliente, en mi caso se ha instalado el de Oracle 9i sobre Windows XP, tendrd opci6n a crear un servicio de acceso a una base de datos. Si no lo hizo entonces, tendrd que elegir la opci6nConfiguration and Migration Tools>Net Configuration Assistant para crear ese servicio. Aparecer6 un asistente en el que, como se aprecia en la figura 6.8, puede configurar distintos elementos. Hay que elegir la opci6n Configuracion del Nombre del Servicio de Red Local y pulsar el b o t h Siguiente. En siguiente pdgina del asistente elija la opci6n Agregar, pulsando de nuevo el b o t h Siguiente. Despues tendrd que elegir la versidn de la base de datos a la que va a acceder. Deje marcada la opci6n que aparece elegida, Base de datos o servicio Oracle8i o posterior, y pulse el b o t h Siguiente una vez mds. A continuacGn, en la cuarta ventana del asistente, tendrd que introducir el nombre del servicio con el que se conoce a la base de datos en el servidor. En nuestro caso, durante el proceso de creacibn, utilizamos como nombre global 1ib ros fcharte corn,siendo ese el valor que tendriamos que introducir en este caso. La ventana siguiente le permite seleccionar entre diferentes medios de comunicacidn entre cliente y servidor. Deje seleccionado el elemento TCP en la lista de posibilidades y pulse el bot6n Siguiente nuevamente. Los pardmetros mds impor-

.

.

Programacidn de bases de datos con Visual Basic .NET

tantes, introducidos en estos dos ultimos pasos, se completan con el siguiente, en el que debe facilitarse el nombre del servidor donde est6 ejecutindose el RDBMS, asi como seleccionar el puerto de comunicacih en caso de que no fuese el usado por defect0 por Oracle. La figura 6.9 corresponde a mi configuraci6n particular. Tendr6 que sustituir el nombre del servidor por el del ordenador en el que tenga instalado Oracle.

Bienvenido a Asistente de Conflguractrin de Red de 1 Oracle Esta herramlent3 le mostrara 10s siguientes p3sos comunes para la configuracion Seleccione la configuraairn que desea realizar r- ConriguraciCln de Listener r- Canrigitracion de 10s Metodns de Nomenclatura

.................................................. ..................................................
fi Conriguracion del Nombre del SeMcio de Red Local ....................................................................................................

r Configuracton de Us0 del Directorio

Figura 6.8. Asistente para la configuracion de red de Oracle
I k i c t e n t e de Cdnfigiirnrion dp Red de Orarlp: Configurnrinn del Nombrp dPI %=rvicio de

... f ? : ;

Nombre del Host

/ei-m

Tambten se necestta el numero de puelto TCPIIP. En la rnaforia de 10s casos, Se debe utilizar el numero de pueito estandar

fi Usar el numero de puerto estandar 1521

r

Usar otro numero de puerio

Figura 6.9. lndicamos el servidor en el que esta el RDBMS Oracle y, si es necesario, el numero de puerto por el que nos comunicaremos con el

Una vez que el asistente conoce todos 10s parAmetros necesarios, en el paso siguiente se ofrece la posibilidad de efectuar una prueba de conexih. Seleccione la

6. Conexidn a1 origen de datos

opci6n Si, realizar una prueba y pulse el b o t h Siguiente. El resultado obtenido deberia ser el de la figura 6.10. Si obtiene un error revise toda la configuraci6n previa pulsando el b o t h Anterior.
. ... ... . . .. .. . . . .. . . .

Espere rnientras el Aslstenle de Contiguraclon de Red de Oracle intenta conectarse a la base de 63105 utlliando 1 3 informacion facllltada

Detalles
____I__ ~ ~ l l l
l _ l _ ~ _ _ _ l _
~ _ _ _ _ l l -

Conectanda Prueha rea11:ada rilrrectamente

Carnbiar Conexid"] -

Figura 6.10. La prueba de conexion ha sido satisfactoria

Para efectuar la prueba de conexion, el asistente utiliza la cuenta y clave creadas a mod0 de ejemplo en todas las bases de datos Oracle, Scott y tiger. Puede pulsar el boton Cambiar Conexion, en la ventana de resultado de la prueba de conexion, para cambiar el esquema y clave y probar con 10s que haya definido o le haya indicado su administrador de bases de datos.

Por tiltimo, antes de volver a1 inicio del asistente, tendri que introducir el nombre de servicio local para acceder a esta configuracih. Introduzca Libros y pulse el b o t h Siguiente. Salga del asistente, ahora ya est6 en disposici6n de introducir el c6digo Visual Basic .NET para conectar con la base de datos.

Al igual que con el proveedor ODBC, es precis0 agregar en el proyecto una referencia al ensamblado que contiene el proveedor para Oracle, el ensamblado System.Data.OracleClient.dl1.

El c6digo base utilizado en todos 10s ejemplos anteriores tendr6 que sufrir las modificaciones siguientes:

Prograrnacidn de bases de datos con Visual Basic .NET

Introducir System. Data. Oracleclient tras la sentencia Imports.
0

La variable de conexi6n ahora seria de tip0 Oracleconnection y la cadena de conexibn, entregada a1 constructor, seria "Data Source=Libros ; User ID=scott; Password=tiger". Habria que eliminar el acceso a las propiedades Database y ConnectionTimeout que mostr6bamos m6s abajo, ya que el proveedor Oracle carece de ellas, pudiendo mostrar en su lugar el contenido de la propiedad ServerVersion.

0

A1 crear la cadena de conexih, asignamos a la propiedad Data Source el nombre de servicio local que hemos creado previamente con el asistente de configuration de Oracle. Aunque en nuestro caso dicho nombre coincide con el SID original de la base de datos, en la prhctica podria ser otro. Dado que el nombre de servicio lleva implicit0 el nombre del servidor y la base de datos a la que va a accederse, 10s unicos par6metros adicionales que se necesitan son el nombre de usuario y la clave. Si en la comprobaci6n de conexi6n efectuada con el asistente no tuvo problemas, a1 ejecutar este programa el resultado deberia ser como el de la figura 6.11. Observe 10s datos devueltos por la propiedad Serverversion. Con ellos puede identificar la versi6n y edicidn, en este caso Enterprise, que est6 utiliz6ndose del RDBMS Oracle.

Figura 6.11. La conexion con Oracle ha sido satisfactoria

En 10s cuatro ejemplos del punto anterior, conectando con diversos origenes de datos, hemos introducido siempre 10s parfimetros de conexi&, tales como nombre de servidor, usuario y clave, directamente en la propia cadena de conexi6n. Esto,

6 . Conexidn a1 origen de datos

en ocasiones, puede resultar un inconveniente, ya que cualquier cambio que hubiese que efectuar, por ejemplo por cambiar el RDBMS de un servidor a otro, implicaria una modificaci6n del cbdigo, recompilaci6n y redistribucih de la aplicacih. Hay disponibles distintas alternativas para evitar este potencial problema, comenzando por la posibilidad de que el usuario configure, en la misma aplicacih, pardmetros como el servidor para lo cual, logicamente, tendriamos que habilitar esa posibilidad. Si estamos utilizando el proveedor Microsoft ODBC para .NET, una alternativa es la configuracih de un DSN, un mecanismo por el que toda la informacih de conexihn, exceptuando generalmente el nombre de usuario y clave, se asocia con un identificador. Este se almacena en el registro de Windows o bien en un archivo, pudiendo utilizarse posteriormente desde c6digo en sustituci6n de 10s par6metros a 10s que representa.

Los DSN siempre tienen el mismo objetivo y cuentan con 10s mismos parGmetros, per0 la forma en que se almacenan hace que pueda hablarse de tres categorias diferentes de DSN: De usuario. La informacih se almacena en el registro de Windows, concretamente en la rama perteneciente a un determinado usuario. De esta forma, ese DSN s610 puede utilizarlo el usuario a1 que pertenece.
0

De sistema. Similar a1 anterior, dado que se almacena en el registro, per0 no asociado a un usuario en particular, sino en la secci6n general del sistema. Un DSN de sistema puede ser utilizado por cualquier usuario. De archivo. En vez de en el registro de Windows, la informacidn de conexion se almacena en un archivo, lo cual permite transportarla a 10s equipos en 10s que pueda ser necesaria sin precisar la modificacih del registro en todos ellos.

0

Elegir un tip0 u otro depended directamente de las necesidades de cada proyecto. En cualquier caso, recuerde que un DSN puede utilizarse tan so10 desde ODBC, no resultando Gtil con 10s otros proveedores ADO.NET.

Para crear un nuevo DSN tendr6 que utilizar el Administrador de origenes de datos ODBC. Este se encuentra en el Panel de control de Windows, en el caso de las versiones servidor, y en Windows XP Professional, lo encontrar6 en la carpeta Herramientas administrativas del Panel de control. Haga doble clic sobre el, deber6 aparecer un cuadro de di6logo similar a1 de la figura 6.12. La p6gina Controladores enumera todos 10s controladores ODBC instalados en el sistema, mientras

Programacidn de bases de dafos con Visual Basic .NET

que en las piiginas DSN de usuario, DSN de sistema y DSN de archivo encontrarii 10s DSN de cada tip0 existentes en este momento. Seleccione la pdgina DSN de sistema y pulse el b o t h Agregar. Elija de la ventana que aparece, con una lista de todos 10s controladores, el controlador Microsoft Access Driver (*.mdb), haciendo doble clic sobre el. Entonces verii la ventana Configuration de ODBC Microsoft Access (v6ase figura 6.13) en la que debe introducir el nombre que va a dar a1 origen de datos y todos 10s demds pariimetros. En este caso bastard con pulsar el b o t h Seleccionar y facilitar el camino y nombre del archivo de Microsoft Access que ya habiamos empleado anteriormente como ejemplo.

& kce= T&

rmm) 1-

400601900 400601900 400601900 400601900 1000200 1000005 2 01 22 01 400601900 400601900

Wansoft1
MmosoftI Marsdt Marsoftl t&msoftI IBPhoenu No rnrXCi

Marsoft1 t&msoftl[d

w

Figura 6.12. El Administrador de origenes de datos ODBC cuenta con multiples paginas

WknpaadepSgna

1 T~ASIWW 5
_____

~

rw-

r *b T i w

,

Figura 6.13. Configuracion del nuevo DSN

6. Conexio'n a1 origen de datos

En caso que desee asociar una cuenta de usuario y clave con el DSN, evitando que la aplicacion o el propio usuario tenga que facilitar esta informacion, pulse el boton Avanzadas de la ventana Configuracion de ODBC Microsoft Access.

Para terminar, pulse el boton Aceptar del cuadro de dialog0 anterior. Volvera a la pdgina DSN de sistema del Administrador de origenes de datos ODBC, en cuya lista debe aparecer el DSN r e c i h creado.

c
Una vez que tenemos creado el DSN en el equipo donde va a ejecutarse la aplicacibn, utilizarlo desde &a, con el proveedor Odbc, es realmente sencillo. Tome el ejemplo anterior en el que ustibamos este proveedor para acceder a una base de datos InterBase, cambie la cadena de conexi6n facilitada a1 constructor dejdndola como "DSN=Libros" y ejecute el programa. El resultado deberia ser el de la figura 6.14. Ha conectado con Microsoft Access mediante ODBC facilitando s610 el nombre de un DSN. Observe que ahora la propiedad Database facilita el camino en el que se encuentra el archivo, asi como su nombre sin extensi6n.
-

--__

- -

Figura 6.14. Confirmaclon de la conexlon mediante el DSN Libros

Si en lugarde un DSN de sistema o usuario hubiesemos creado uno de archivo, tendriamos que modificar la cadena de conexion dejandola como "FILEDSN= Archivo.dsn".

Archivos UDL
Los DSN son u n recurso de ODBC para almacenar la informacidn de conexion, una soluci6n exclusiva que no puede utilizarse si, posteriormente, en nuestro c6digo no vamos a emplear el proveedor O d b c . OLE DB cuenta con un mecanismo similar, si bien en este caso la information siempre se almacena en un archivo con extension udl. Para efectuar una prueba, sencilla y rapida, dk 10s pasos que se indican ahora:
En la carpeta correspondiente a1 proyecto Visual Basic .NET en el que conectabamos, mediante el proveedor O l e D b , con Microsoft Excel, haga clic con el b o t h secundario del rat6n sobre el contenido de la carpeta (en el panel derecho del Explorador de Windows), seleccione la opci6n Nuevo>Documento de texto y llame a1 archivo Conexion. u d l . Responda afirmativamente a la pregunta de si desea cambiar la extension del archivo. Haga doble clic sobre el archivo recikn creado, abriendo la ventana Propiedades de vinculo de datos.
0

En la p6gina Proveedor (vkase figura 6.15) seleccione el proveedor Microsoft Jet 4.0 OLE DB Provider. Pulse el boton Siguiente >>.

Rowedom dc OLE DB Micros& ISAM 1 1 OLE DB Provider
Mmmsoit OLE DB Praviderfor lndmng Sewice I&msoft OLE DB Providerfor Internet Publishing Microsoft OLE GB PiovideifoiOGBC Gwen Micros& OLE DB PmviderforOMP Services Micms& OLE DB Pmviderfor O d e Microsoit OLE DB Piowderfor SOL S e w s Mcrosoft OLE DB Simple Provider MSDataShape Omde PrnvidwforOLE DB Pmveedor de bares de datos OLE para s e ~ c i o s diredono d de VSEE Vemonmg Enlistment Manager Prmy Data Source

Figura 6.15. Seleccionamos el proveedor OLE DB a utilizar
0

En la p6gina Conexih pulse el b o t h ... que hay asociado a la primera opc i h , facilitando el camino y nombre del documento Microsoft Excel usado anteriormente como ejemplo.

6. Conexidn a1 origen de datos

0

Vaya a la psigina Todas y haga doble clic sobre la propiedad Extended Properties, en la lista que aparece en el sire, central de la ventana. La ventana Modificar valor de propiedad nos permite introducir el valor que deseamos dar a la propiedad Extended Properties. En este caso, como puede verse en la figura 6.16, escribimos la secuencia Excel 8 . 0 ;HDR=Yes y pulsamos el b o t h Aceptar.

0

I/
Figura 6.16. Propiedades extendidas de la configuracion de conexion
0

Finalmente, vuelva a la p6gina Conexi6n y pulse el b o t h Probar conexi6n que hay en la parte inferior. Deberia aparecer el mensaje La prueba de COnexion fue satisfactoria. De lo contrario, revise 10s pasos comprobando que todos 10s parsimetros son correctos.

Utilizar el archivo udl desde una aplicaci6n propia es tan f6cil como usar un DSN. Abra el proyecto en el que, mediante el proveedor OleDb, conect6bamos con una hoja de c6lculo Excel. Cambie entonces la cadena de conexih, asignada en este caso a la propiedad ConnectionString, dejhndola como "File Name=. . \ Conexion. udl".A1 ejecutar el programa se obtendria una conexi6n satisfactoria, si bien en este caso la propiedad Database no nos indica el origen de datos a1 que estamos conectados.

Figura 6.17. Conexion al documento Excel mediante la configuracion del archivo u d l

Programacidn de bases de datos con Visual Basic .NET

Como ha podido ver en este capitulo, mediante las clases Connection de cada uno de 10s proveedores ADO.NET es posible conectar virtualmente con cualquier origen de datos, tanto RDBMS como no RDBMS. Por una parte tenemos dos proveedores especificos, Sqlclient y Oracleclient, capaces de comunicarse directamente con SQL Server y Oracle, respectivamente. Por otra, 10s proveedores OleDb y Odbc abren las puertas a1 us0 de cualquier controlador OLE DB u ODBC que pudiera existir, facilitando el acceso a Microsoft Excel, Microsoft Access o InterBase, pero tambie'n a dBase, Paradox, Sybase, DB2, MySQL y, en general, cualquier base de datos. Ahora que ya conocemos la sintaxis general de las cadenas de conexih, asi como 10s miembros de la interfaz IDbConnection que permite abrir, cerrar y comprobar la conexion, estamos en disposicion de empezar a recuperar datos desde el origen a1 que se haya conectado. Este serd el objetivo del pr6ximo capitulo.

.

las excepciones tambien existen en este campo y es posible que a1 crear nuestra aplicaci6n desconozcamos 10s nombres de las tablas o columnas. debe facilitar el acceso a cualquier estructura de informaci6n. ya conocen de antemano la estructura de la base de datos. cuando quiere simplemente experimentarse para conocer c6mo conseguir una determinada informacih. Estas aplicaciones. No obstante. aparte de 10s datos propiamente dichos.si este carece de ellos. como es el caso de las hojas de cilculo Excel.NET 0. utilizando para ello 10s servicios del proveedor ADO. sobre todo.como en este capitulo. habitualmente.La mayoria de las aplicaciones que tratan con datos. Es el caso tipico a1 escribir alguna utilidad general para un RDBMS 0. una vez que han conectado con el origen solicitan directamente la informacih que precisan o ejecutan 10s comandos pertinentes. i cion de esquerna? Salvo excepciones. cuando el programa no esti construido especificamente para operar sobre un cierto origen de datos sin0 que. Es un caso que se da. por regla general. todos 10s origenes de datos almacenan. 10s especificos del origen con el que vaya a tratarse. estaba disponible cuando el equipo de desarrollo planific6 la aplicacih. informacih . El objetivo de este capitulo es describir el proceso a seguir para obtener informaci6n de esquema de una base de datos. ya que &ta. Este escenario podriamos denominarlo como normal. por el contrario.

emplear el proveedor nativo para el resto del trabajo. Para recuperar la informacih de esquema de la base de datos. GetOleDbSchemaTable ( ) necesita dos parametros y devuelve como resultado un objeto DataTable con la informaci6n solicitada. Por eso el objeto OleDbConnection dispone de un metodo. Todos 10s RDBMS. siempre existe la alternativa de usar el proveedor OleDb para recuperar la information de esquema y. que hace us0 del metodo original del controlador OLE DB. conteniendo cada uno de ellos una restricci6n aplicable a una columna del resultado que se obtenga. Tables. se ajustan a un estiindar definido por Microsoft. Las restricciones posibles dependeriin del valor entregado como primer parimetro. si es que vamos a usar el proveedor ADO. En 10s puntos siguientes vamos a tratar ambos casos. Los controladores OLE DB. qu6 tip0 de dato corresponde a cada una de ellas. Los proveedores ADO. o servirnos de las instrucciones que el propio origen de datos facilite para obtener esa informacibn. vistas. las bases de datos locales e. el arreglo a facilitar como segundo partimetro de- . contando todos ellos con m4todos que permiten recuperar informaci6n de esquema del origen a1 que han conectado.NET no accede directamente a un origen de datos. posteriormente. Si conectamos con un origen de datos cuya estructura desconocemos. nos permitir6 adaptar diniimicamente el funcionamiento del programa para que trate 10s datos apropiadamente.NET OleDb.7. con qu6 columnas cuentan. Conociendo el funcionamiento de dicho origen de datos. El m4todo OleDbConnection. por tanto. El proveedor OleDb de ADO. etc.NET no cuentan con servicios que faciliten la recuperaci6n de informaci6n de esquema.NET. algunos de 10s cuales se enumeran en la tabla 7. limitiindose a devolver el resultado. el m6todo GetOleDbSchemaTable ( ) necesita un arreglo de objetos Ob j ect. 10s archivos XML utilizan esta informaci6n de esquema para saber cu6les son las tablas existentes. incluso. como si hacen SqlClient u Oracleclient. tendremos que recurrir a medios alternativos. El primer0 de los pariimetros selecciona la informaci6n de esquema a obtener: lista de las tablas. Existen biisicamente dos: utilizar 10s servicios del controlador OLE DB. Si este es OleDbSchemaGuid. etc. facilitando asi tambien el desarrollo de nuevos proveedores.. como 10s proveedores ADO. Como segundo pariimetro. ya que su finalidad es ser lo m6s simples y eficientes posible. tambi6n conocida como meta-informacidn. esto no seria preciso. Los valores posibles son 10s definidos en la clase OleDbSchemaGuid como campos compartidos. llamado GetOleDbSchemaTable ( ) . Informacidn de esquema de la base de datos sobre la estructura de 6stos. sin0 que utiliza a mod0 de intermediario un controlador OLE DB existente.1. procedimientos almacenados. En caso de que no tuvi6semos una alternativa mejor con el proveedor original del origen de datos a1 que vayamos a acceder. por poner un ejemplo. la recuperaci6n de la informaci6n de esquema. sin embargo.

nombre del esquema.Procedures lnformeci6n a recu Tablas de la base de datos Columnas de las tablas Restricciones definidas en las tablas Procedimientos existentes en la base de datos Parametros de entrada de los procedimientos almacenados Lista de las vistas que haya definidas OleDbSchemaGuid. podra recorrer las filas. Procedure-Parameters 0leDbSchemaGuid. Si no se indica un catalogo. La mayoria de 10s valores pueden ser nulos.Views El valor devuelto por cada llamada a la funci6n GetOleDbSchemaTable ( ) es un objeto DataTable. el nombre y tip0 de cada una de ellas. Para obtener todas las claves primarias de una tabla. nombre de la tabla y tip0 de la tabla. mediante la propiedad Rows para acceder a1 nombre de cada tabla. cuyas bases conocimos de manera superficial en un capitulo previo y que aprenderemos a usar con mayor detalle en uno posterior. Conociendo las columnas. tip0 de cada parametro. Tabla 7. C o l u r n r l a As D a t a C o l u r n n For Each F i l a In TblResultddo. podria utilizarse como patr6n un bloque de c6digo similar a1 siguiente: D i m C o r l n O l e D b As New OleDbConnection ( ) D i m TblResultado As DataTable D i m F i l a As D a t a R o w . si quiere mostrar todo el contenido del DataTable.Columns 0leDbSchemaGuid. el del esquema y el de la tabla cuya clave primaria deseamos recuperar. no tiene mas que recorrer la colecci6n a la que apunta su propiedad Columns para obtenerlas de manera individual y recuperar. En general. otro ejemplo.Rows For Each C o l u r n n a In TblResultado. por ejemplo.Tables 0leDbSchemaGuid.Programacidn de bases de datos con Visual Basic . por ejemplo. contando con mas o menos columnas y filas.NET bera constar de cuatro elementos: nombre del catalogo a consultar.Table-Constraints 0leDbSchemaGuid. 10s parametros serian tres: el nombre del catalogo. C o l u m n s .1. etc. Valores a usar como primer parametro del metodo GetOleDbSchemaTableO Valor 0leDbSchemaGuid. Si no sabe qu6 columnas puede encontrar en el DataTable. se retornan todas las tablas de todos 10s catalogos. La estructura de ese DataTable dependera de la informaci6n que hayamos solicitado.

origenes a 10s que ya en el capitulo previo habiamos conectado mediante el proveedor O l e D b .Write(Fila(Columna) Next Console. Nothing. recuperariamos el nombre de cada tabla con Fila ( "TABLE -N A M E " ) . sin necesidad de recorrer todas las columnas. Esa funcion toma dos par6metros: un titulo a mostrar por consola y la cadena de conexi6n a emplear para acceder a1 origen. Con esos datos se establece la conexibn.LetOleDbSc h e m a T a b l c = ( OleDbSchemaGuid.WriteLirie ( ) Next vbTab) & Si conocemos 10s datos que van a devolverse. Nothlng}) ~ ~ . crearemos una funcion genbrica capaz de mostrar informaci6n de cualquier origen OLE DB. lnformacio'n de esquema de la base de datos Console. recuperar informacion de esquema de cualquier origen de datos y mostrarlos en pantalla.Tablp5. Nothing. New O b J e c t O {Nothing. No necesitamos saber mucho m6s de lo ya explicado para. ~ Dim T b l R e s u l t a d o As D a t a r d b l e Dim Fila As D a t a R i w . Sub M i i e s t r i E s q u t m a (ByVal Titiilr As String. recupera la lista de todas las tablas existentes y se muestra por consola.7. mostrando por la consola la informacion recuperada a partir del documento Microsoft Excel y la base de datos Microsoft Access. en lugar de mostrarlos todos podemos obtener solo aquellos que m6s nos interesan. sirvihdonos del proveedor O l e D b . por ejemplo. Vamos a codificar un pequeiio ejemplo que haga precisamente eso. ColiJrnrla As D a t d r c l u m n ConnOleDb. A1 recuperar una lista de tablas existentes en el origen. Para evitar la repeticion de cbdigo. Operl 1 ) ' TblResultado = ConnO1eDb.

r. ToString) Next Console.4. x 1s . ademtis. W r i t e ( F i l a ( " T A B L E _ T Y P E " ) .Programacidn de bases de datos con Visual Basic .0.WriteLine (vbCrLf & vbCrLf) End Sub Disponiendo de esta funcibn. 4.03\ L 1 b ro s .03\L 1b ro s . "Fxtended Properties='Excel 8.0.1. HDR=Yes"') t i " & MuestraEsquerna ("Base Microsoft Access".NET C o n s o l e .WriteLine (Fila("TABLE-NAME" ) . Su ejecuci6n produciria el resultado que ve en la figura 7. "Provider=Microsoft.Jet. etc. r db " ) n ~ Con ellas solicitamos la visualizaci6n de informacih de esquema de 10s dos origenes antes mencionados. .1. lo irnico que tenemos que hacer es afiadir a1 m4todo Main ( ) las dos sentencias siguientes: . Figura 7. Enumeracibn de las tablas extstentes en 10s d o s origenes d e datos En lugarde mostrar 10s nombres de las tablas en pantalla. Jet. eliminando la tabla. " & " Da t a Source= \ PBddV 1 s u a 1B a s 1 cNE T \ Cap. podriamos utilizarlos para componer una sentencia SQL de cualquier tipo.0. varias tablas de sistemas. simplemente facilitando la cadena de conexi6n adecuada. obteniendo su contenido.Tostring() & vbTab) Console. en realidad las dos ptiginas del libro. L r MuestraEsquerna ("Ho]a de "Provider=Microsoft. " & " D a t a Source = \ P BddV 1su a 1B a s 1 cN E T \ Cap. Observe que en el caso de Excel no existen m i s que dos tablas. mientras que en el caso de Access aparecen.OLEDB.OLEDB.

respectivamente. . TABLES. mediante una sentencia S E L E C T . relativas a las tablas. U S E R VIEWS.-. Para recuperar la lista de tablas de una base de datos SQL Server u Oracle. . etc. En el caso de SQL Server existe un esquema. que pueden ser usadas. mediante las cuales podemos recuperar diversa infGrmaci6n de la base de datos._ll__-_l_. cuentan con una serie de tablas especiales en las que almacenan la informacih de esquema de la base de datos. _ " . MySQL. como cualquier otra tabla. TABLE-NAME.. TABLE NAME y TABLE TYPE.7. .____-_--.. . : La obtencion de informacion de esquema de otros RDBMS. Como intermediario tendriamos que usar un adaptador de datos. algunas de las columnas existentes son TABLESPACE-NAME. Este es un tema del que nos ocuparemos mas adelante.- . como si ejecutasemos cualquier sentencia SQL de recuperaci6n de informacih. ejecutar una sentencia SQL y recoger el resultado que. PCT -FREE y PCT -USED. . DB2. son TABLE CATALOG. Oracledispone de tablas similares._. para recuperar todas las tablas de la base de datosTAlgunas de las columnas de datos devueltas. . . . . por ejemplo. llamado I N F O R M A T I O N SCHEMA. A fin de tener un unico ejemplo. como en el caso de G e t O l e D b S c h e m a T a b l e ( ) ._. R O U T I N E S . utilizando sus respectivos proveedores. 1lamadasusER TABLES. seria un objeto DataTable.:- .. como TABLES. tendriamos que utilizar las sentencias Transact-SQL o PL / SQL. se efectua de manera similar. Informacidn de esquema de la base de datos Como se indicaba antes. I"- Veamos c6mo podemos crear un pequedo programa que nos muestre por consola la lista de tablas existentes en las bases de datos SQL Server y Oracle que creamos en el tercer capitulo. . que procediesen. ninguno de 10s proveedores ADO. . etc.. como en el caso de Excel . concretamente en el noveno capitulo. Ambos RDBMS.r. como InterBase. Podemos ejecutar la sentencia S E L E C T * FROM I N F O R M A T I O N SCHEMA. En el caso de U S E R TABLES. COLUMNS. en el que existen diversas tablas.. Tendriamos que definir la cadena de conexi6n con la base de datos. Recurra a la documentacion del product0 particular en el que este interesado.l______.NET cuenta con medios propios para recuperar la informacih de esquema del origen de datos si exceptuamos lo que acabamos de ver en el punto anterior.~ _ll. Estas tablas pueden ser consultadas. . -. per0 en el siguiente ejemplo usaremos sendos adaptadores para poder recoger la lista de tablas que hay en las bases de datos SQL Server y Oracle.___~-~. en caso necesarioTpara filtrar el resatado. . U S E R CATALOG. . SQL Server y Oracle. siempre que se cuente con 10s permisos adecuados. .. etc.

NET y Access. New SqlConnection ("Data Source=inspiron.OracleC1ient Module M o d u l e 1 Sub Main ( ) Dim TblResultado As New D a t a T a b l e O Dim AdaptadorSql As New SqlDataAdapteri "SELECT * FROM INFORMATION-SCHEMA. Password=tiger")) TblFesultado = New D a t a T a b l e O Adaptadororacle. & TblResultado) Sub MuestraEsquema(ByVa1 T i t u l o As String. ByVal TblResultado As DataTable) ~ Dim Fila As DataRow. TblResultado) i 1 ~ i Dim Adaptadororacle As New OracleDataAdapteri "SELECT * FROM USER-TABLES".WriteLine(vbCrLf & New String("=". S q l C l i e n t Imports System. emplear un adaptador de datos para recuperar la informacidn.ColumnName & vbTab) Next Console.Colurnns Console.TABLES". " & "Initial Catalog=Libros. Password=")) ~ ~ AdaptadorSql. a cambio.Data. " U s e r I D = s c o t t . una gran parte del c6digo estari en Main ( ) . se encargue de mostrar su contenido por consola. ademhs. recibiendo un DataTable. i _ ( ' I * * * S Q L Server ~ * * * ' I . codificaremos una funci6n que. Data. New OracleConnection ( " D a t a S o u r c e = L i bros.Fill(TblResultado) ' MuestraEsquema 1 . Imports System. como puede verse en el siguiente programa completo. a1 tener que usar proveedores distintos y. En este caso. Columna As DataColurnn For Each Columna In TblResultado.Write(Columna. 6 0 )) . el metodo MuestraEsquema ( ) ser6 m i s sencillo y.Programacidn de bases de datos con V i s u a l Basic . User ID=sa. Fill (TblResultado) ' MuestraEsquema("*** Oracle End Sub * * * ' I .

dado el ancho limitado de la consola. Wr i t e ( Fila ( C o l u m r l a ) & vbTab) Next Console. Informacidn de esquema de la base de datos For Each C o l u m n a In TblResultado. un S q l Da taAdap te r y un OracleDataAdapter. Pruebe a redirigir la salida del programa a un archivo de texto y despu4s 6bralo en cualquier editor de texto.1 I d l Figura 7. A1 ejecutar el programa. La lista de tablas de SQL Server cuenta con pocas columnas. recuperar el resultado y cerrar la conexidn. entreg6ndoles la consulta especifica y un componente de conexidn tambien exclusivo. N o s e preocupe en este momento por el funcionamiento de 10s adaptadores de datos. probablemente le resultari algo confusa la informacidn mostrada. W r i t e L i n e (vbCrLf End Sub & vbCrLf) End Module Como puede ver. volveremos sobre ellos en el noveno capitulo. como el Bloc de notas o el propio de Visual Studio .NET. y es f6cil verlas. TABLELNNE ACCOUNT SYSTEM BONUS SYSTEM DEPT SYSTEM EDITORIALES EMP SYSTEM LIBROS SYSTEM RECEIPT SYSTEM SALGRADE TABLESPACELNbME CLUSTERLNIIME IOTLNeME PCTLFREE PCTLUSED INILTRANS MAXTRANS IN1 YES YES YES ====-==ii=====E=======iii=====_I======ii= 10 10 10 SYSTEM 10 10 10 SYSTEM 40 40 40 10 40 40 40 10 1 1 1 40 1 1 1 40 255 255 255 1 255 255 255 1 65536 65536 65536 255 65536 65536 65536 255 65536 65536 65536 65536 65536 65536 65536 65536 1 1 1 65536 1 1 1 65536 2147483645 50 2147483645 50 2147483645 50 1 2147483645 2147483645 50 2147483645 50 2147483645 50 1 2147483645 1 1 1 50 1 1 1 50 1 1 1 1 1 1 1 1 1 YES YES YES 1 1. El adaptador de datos. ejecutar un comando con la consulta entregada como primer partimetro.2. creamos sendos adaptadores de datos.7.WciteLine ( ) Next C o r 1 s o l e . le resultar6 mucho mas f6cil analizar 10s datos. se encargar6 de abrir la conexidn. A1 terminar. Lista de tablas SQL Server y Oracle mostradas en el Bloc de notas . per0 en el caso de Oracle el numero de columnas es muy grande. 10s datos se encontrar6n en el DataTable dado como par6metro a1 metodo F i l l ( ) .Columns C o n s o l e . a1 llamar a1 metodo Fi11 ( ) .

0 Llamada a1 metodo ExecuteReader ( ) del comando. OleDbCommand. etc. el proceso para obtener las columnas de cualquier tabla o vista seria el siguiente: Creacion de un nuevo comando. donde Tabla seria el nombre de una de las tablas previamente obtenidas en un DataTable. ya sea de ese tip0 o del DataReader especifico del proveedor que este utilizindose. implementada por las clases DataReader de cada proveedor. en el caso de Excel y Access no hay mas elementos disponibles puesto que no 10s creamos en su momento. existe una alternativa m i s f6cil y. etc. A1 crear el comando este se asocia directamente con la conexi6n ya abierta con el origen de datos. tampoco podriamos hacer mucho. La siguiente necesidad sers conocer las columnas de cada una de esas entidades: nombre.VIEWS. etc. sobre todo. OracleCommand u OdbcCommand. 0 Llamada a1 metodo GetSchemaTable ( ) del DataReader. con una sentencia del tip0 SELECT * FROM Tabla. aplicable a cualquier origen con el que se haya conectado. conocer cu6les son las vistas predefinidas. Descrito paso a paso. . sin datos.interfaz implementada por todos 10s comandos. Si consulta la informaci6n de referencia del metodo GetSchemaTable ( ) . si hay procedimientos almacenados..Programacion de bases de datos con Visual Basic . en la practica podriamos utilizar el mismo procedimiento para. dispone de un metodo. sin mas. Asi solicitamos so10 la recuperation de informaci6n de esquema. Aunque podriamos seguir empleando metodos especificos de cada proveedor u origen de datos para obtener esta informacibn. SqlCommand. Vera que el DataTable devuelto se compone de casi una veintena de campos en 10s .USERVIEWS. Tomando como base el ejemplo previo. pruebe usted mismo con 10s valores alternatives mencionados antes: INFORMATION-SCHEMA. que facilita un DataTable con 10s datos de cada una de las columnas del conjunto de resultados que va a leerse. por ejemplo. El resultado devuelto por este metodo es una referencia IDataReader que tendremos que almacenar en una variable. recuperando asi en un DataTable toda la informaci6n de columnas sobre la tabla o vista indicada.NET Aunque en 10s ejemplos previos nos hemos limitado a recuperar una lista de las tablas existentes en el origen de datos. facilitando como parametro CommandBehavior SchemaOnly. llamado GetSchemaTable ( ) . y asi conocer cuiles son 10s datos devueltos. que conecta con SQL Server y Oracle. La interfaz IDataReader. Si conociesemos tan solo el nombre de cada tabla o vista. Este conjunto de resultados viene definido por un comando ejecutado previamente con el metodo ExecuteReader ( ) de IDbCommand. tipo.

El mktodoMain ( ) . si ha sufrido algunos retoques. vamos a introducir algunos cambios para obtener. "TABLE"} ) 1 1 For Each Fila In Tb1Resultado. su tip0 original y tip0 . asimismo. Nothing.7. C o l u r n n a As DataColumn ConriOleDb. a1 que pertenece el c6digo siguiente. ByVal C ad e ri d C o n ex 1ori As String ) Dim Con n 01e Db A s New 01e Db Co n n e c t 1o n ( Cad e n a Co ri e x 1 o ri ) Dim TblResultado As D a t a T a b l e Dim F i l a As DataRow. New Object( ) {Nothing. El metodo MuestraEsquema ( ) . Tomando como punto de partida el primer ejemplo desarrollado en este capitulo. Sub MuestraEsquema(ByVa1 Titulo As String. precisi6n numkrica.Rows C o n s o l e . si es o no unico. permanecer5 sin cambios.Wr 1 t eLine ( Fi 1a ( "TABLE-NAME" ) . ConnOleDb) Next . el nombre de cada columna. Nothing. ToSt ri ng ) MuestraColumnas ( F i l a ("TABLE-NAME") . si es s610 de lectura.Open() ' TblResultado = ConnOleDb. La teoria vista en el quinto capitulo sera suficiente por ahora. Como en el caso de 10s adaptadores. es un tema que conocera en un capitulo posterior. el nombre y tip0 de todas las columnas de cada tabla. en el que se enumeraban las tablas del documento Excel y la base de datos Access.NET.Tables. lnformacidn de esquema de la base de datos que encontramos.GetOleDbSchernaTable( __ OleDbSchemaGuid. no se preocupe en este momento del funcionamiento de comandos y lectores de datos. desde el que invociibamos dos veces aMuestraEsquema ( ) . por ejemplo. etc.

como cabria esperar. S c h e m a O n l y ) Dim T b l h ~ ~ d l t a d r DataTable As = Ler-tnr.j Console. De esta forma obtendremos s610 tablas reales de usuario. fijese en que dentro del bucle que enumera las tablas se invoca a un nuevo metodo.Close ( 1 End Sub ' Para empezar. W r i t e L i r i e (vbCrLf b If " & vbTab L "Tipo") Corlsol~. La conexi6n establecida a1 principio no la cerramos justo despues de recuperar la lista de tablas. MuestraColumnas ( ) . no tablas de us0 interno del origen de datos. a1 llamar a GetOleDbSchemaTable ( ) para obtener la lista de tablas facilitamos como cuarto elemento del segundo par6metro el valor "TABLE".) Dim Lector A s I D a t a R e a d e r = ( C o m m a n j B i h a b l ir. Close ( ) la hemos llevado a1 final del mbtodo.WriteLine ( v b T a b & "Nombre". es el nuevo metodo Mues traColumnas ( ) .WriteLine(vbTab& New String("-". ( 7 e t S c h e r n a T a b l e !) .. Dim F i l a As D a t a h o w & 'I--C o l u m n a s de la tabla NombreTabla & " . Por ultimo. Conexlor. ya que para ejecutar el comando de creaci6n del Reader la necesitamos abierta. La parte m6s interesante..EndsWith!"$") Then NombreTabla End If = "[" & NombreTabla & "I" "SELECT * FROM " & NombreTabla. 4 0 ) ) For Each F i l a In TblResultado. Su implementaci6n es la mostrada a continuaci6n: ues r a o iimr If NombreTaDla.NET Console. Por eso la sentencia ConnOleDb. P a d R i g h t (15) C o n s v l e .Rows .Programacidn de bases de datos con Visual Basic . facilitandole el nombre de cada tabla y la referencia a la conexih utilizada.WriteLine (vbCrLf & vbCrLf) ConnOleDh.

por lo tanto. J Console. lnformacidn de esquema d e la base de datos i Console. A1 crear este documento no se indic6 tip0 de dato de cada columna. A1 ejecutar el programa deberia obtener un resultado similar a1 de la figura 7. accediendo a la lista de columna cuando el usuario seleccionase una tabla. recorriendose todas las filas para mostrar el nombre y tipo de cada columna. Esta es la raz6n de que en ellos no existan metodos para acceder a la informaci6n de esquema de 10s origenes de datos. sobre todo.Write(vbTab & N e w Str~nglFiiai”ColurnnNam~”)) d R i g h t (15) . habitual a1 operar sobre documentos Excel.Pa Console. Act0 seguido implementamos 10s pasos antes descritos: creamos el comando con la consulta. A partir de ahi el c6digo es similar a1 del metodo MuestraEsquema ( 1. Los proveedores de datos ADO. por ejemplo. obtenemos el IDataReader y llamamos a su metodo GetSchemaTable ( ) .WriteLine(vbCrLf End Sub vbCrLf) El primer condicional comprueba si el nombre de la tabla finaliza con el simbolo $. en cuyo caso lo delimitamos entre corchetes para evitar problemas en la ejecuci6n de la consulta. Oracle o bien InterBase. Nota Puede utilizar el mismo camino para enumerar las columnas de las tablas SQL Server. vista o procedimiento en concreto. vistas. En cualquier caso. dependientes de cada origen en particular.Close i 1 ’ & . facilitando su desarrollo y. Una vez ejecutado el comando y obtenido el DataReader.NET est6n diseiiados con una arquitectura que es relativamente simple. con esta informacion podriamos crear una interfaz que. por lo que el proveedor lo deduce a partir de la informacion que contienen las celdillas. procedimientos..todo el proceso es identico. potenciando el rendimiento sobre 10s dem& aspectos. siendo precis0 utilizar medios mas especificos y. Observe 10s tipos asociados a las columnas de Excel. En este capitulo ha conocido 10s procedimientos para obtener informaci6n de esquema mediante controladores OLE DB y consultando tablas especificas de SQL . etc.7.3. permitiese conectar con cualquier origen de datos y enumerase sus tablas.WriteLine(Fiia (“DataType”) ) Next & vbTab) Lector. En ella pueden verse todas las columnas de las dos tablas que habiamos definido en Excel y Access.

NET Server y Oracle. la recuperaci6n de informaci6n sobre sus columnas resulta mucho m6s f6cil gracias a1 metodo G e t S c h e m a T a b l e ( ) de la interfaz I D a t a R e a d e r . . En el capitulo siguiente conoceremos con m6s detalle esta interfaz y las implementaciones que efectuan 10s diversos proveedores.Programacidn de bases de datos con Visual Basic . vistas o procedimientos almacenados que entregan esa informaci6n de esquema. no tenemos m6s que consultar la documentaci6n de referencia y localizar las tablas. Enumeracion de tablas y columnas existentes en Excel y Access Una vez se conoce el nombre del objeto a consultar. Los dem6s RDBMS cuentan con mecanismos similares. Figura 7.3.

.

Conociendo la estructura que tiene el origen de datos a1 que va a accederse. el proceso vaya a efectuarse de forma relativamente ripida. el siguiente paso que daremos ser6 recuperar 10s datos que contiene dicho origen. ejecutarlos y obtener lectores de datos. Este mktodo de recuperaci6n de datos es el apropiado cuando va a generarse un informe. nerali re 10s comandos Abierta la conexi6n con el origen de datos. cuando utilicemos comandos similares para recuperar no un lector de datos sino un DataSet. operacidn que ya hemos efectuado en el ejemplo final del anterior capitulo. ya que exige el mantenimiento de una conexi6n abierta durante todo el tiempo que dure el trabajo. Nuestro objetivo es conocer las interfaces IDbCommand e IDataAdapter. sus implementaciones particulares en cada proveedor y la forma de utilizarlas para obtener cursores de datos s610 de lectura y unidireccionales. de manera muy breve. Para ello tendremos que preparar comandos. ademis. todas las operaciones se efectuan mediante la ejecuci6n de comandos. En el quinto capitulo. bien porque lo hayamos diseiiado nosotros mismos o lo hayamos recuperado segun las indicaciones del capitulo previo. El conocimiento adquirido en este capitulo tambikn nos seri util en el proximo. . efectuar cilculos a partir de 10s datos o cualquier otro escenario en el que no se requiera la manipulaci6n de la informacibn y.

puede almacenarse en una variable de ese tipo. L6gicamente. Recuperacidn de datos se apunt6 la existencia de la interfaz IDbCommand. Component OdbcCommand OleDbCommand IDbCommand Figura 8. vimos c6mo cre6bamos un comando directamente con el constructor de una de las clases Command.NET empleado. -~ c Si creamos un comando mediante el m6todo Createcommand ( ). segun acaba de decirse. Las clases Command de cada proveedor implementan 10s miembros de la interfaz IDbCommand Mediante el m6todo CreateCommand ( 1. OleDbCommand. en la cual se definen 10s miembros con que deberia contar la clase de ejecucidn de comandos de cada proveedor.1 se puede ver la relaci6n existente entre esta interfaz y las clases OdbcCommand. 6sta deber6 haberse creado previamente. con el que cuentan todas las clases Connection a1 estar definido en la interfaz IDbConnection. Createcommand ( ) no toma par6metro alguno. ConnOleDb) . concretamente con 01eDbCommand.1. Dim Comando As New OleDbCommand(Texto. En la figura 8. pero la referencia devuelta es de tipo I DbCommand y. Ese comando ser6 del tipo que corresponda a1 proveedor ADO. mediante las propiedades CommandT ype y CommandText tratadas m6s adelante. todas ellas derivadas de SystemComponentModel . OracleCommand y SqlCommand. por lo que el comando en si deberd establecerse posteriormente. es posible crear un comando vacio asociado a una conexih ya existente. la asociaci6n entre comando y conexi6n ya se habrA establecido automiticamente.CreateComrnand ) ( En el capitulo previo. por tanto.8. Component. I D b C o m m a n d Cornando = Conr~OleDb. con el fin de crear un lector de datos. Dicho constructor acepta un 01e Db Conne cti on como segundo partimetro. asociando el comando con la conexi6n.

antes de llamar a ninguno de 10s metodos de ejecucibn.Prograrnacidn de bases de datos con Visual Basic . per0 en la implementaci6n de cada proveedor el tip0 es el exclusivo de ese proveedor por lo que. no podriamos asignar a la propiedad Connection de un comando una conexi6n de tip0 distinto. Si es este el caso. podemos ejecutarlo recurriendo a uno de 10s tres m6todos con que cuenta IDbCommand o bien a algun m6todo especifico del proveedor que estemos utilizando.NET Otra posibilidad es que creemos el comando sin facilitar ese segundo parfimetro. respectivamente. Tambien podemos leer esta propiedad. Dicha propiedad es de tipo IDbConnection en la interfaz IDbCommand. para asi poder acceder a 10s parfimetros de la conexi6n. facilitando el nombre de este en la propiedad CommandText. s610 con el texto del comando a ejecutar: En este caso. El valor predeterminado de CommandType es CommandType Text. se utilizara la propiedad Parameters para acceder a la colecci6n de parfimetros y. basta con facilitar la cadena con la sentencia a1 constructor del objeto Command que vayamos a usar. habria que asignar la conexion a la propiedad Connection. en la prfictica. simplemente facilitando sus nombres en CommandText. cuente con parfimetros de entrada. Storedprocedure y CommandType. que va a enviarse a1 origen de datos para ser procesado.Con ellas se define el tipo de comando y el texto. ya sea procedimiento almacenado o sentencia SQL. El segundo permite recuperar directamente el contenido de una o mfis tablas. siempre antes de ejecutar. TableDirect. En caso de que el comando. Los otros dos posibles valores de CommandType son CommandType. se afiadirfin 10s pertinentes. mediante el metodo Add ( ) . El primer0 se usa cuando es necesario ejecutar un procedimiento almacenado. a1 obtener un comando. Puede crearse un parametro y. an Una vez tenemos el comando preparado. afiadirlo a la coleccion de parametros del comando mediante el metodo Createparameter ( ) de este. al tiempo. . . indicando que el contenido de CommandText es una sentencia SQL. 9 Dos de las propiedades mfis importantes de IDbCommand son CommandType y CommandText.

no datos. el de ExecuteNonQuery ( ) un Integer y el de Executescalar ( ) un Object con el dato obtenido que podemos convertir a1 tip0 que interese.Defau1t. ExecuteNonQuery ( ) : Como su propio nombre indica. Tabla 8. En el capitulo previo. .1. por ejemplo sentencias o procedimientos almacenados que manipulan datos. Es el metodo a usar en caso de que ejecutemos un procedimiento almacenado o sentencia SQL que devuelve s610 un valor. Schemaonly para recuperar s610 informacion de esquema. Devuelve un DataReader del que podemos recuperar la informaci6n. vamos a abrir una tabla o ejecutar un procedimiento almacenado que devuelve un conjunto de resultados. Elementos de la enumeracion CommandBehavior Closeconnection Default KeyInf o SingleResult SingleRow Schemaonly Cerrar la conexion utilizada para ejecutar el comando cuando se cierre el DataReader La ejecucion de la consulta puede retornar multiples conjuntos de resultados Se devolvera tan solo inforrnacion de la clave primaria Tan solo se devolvera un conjunto de resultados Tan solo se devolvera una fila de datos del conjunto de resultados Se devolvera solo informacion de esquerna del conjunto de datos El valor de retorno de ExecuteReader ( ) es un DataReader. su finalidad es ejecutar comandos que no devuelven resultados. Es posible emplear cualquier otro de 10s valores de la enumeraci6n CommandBehavior. Si no se facilitan pariimetros se asume el valor CommandBehavior. por ejemplo. 0 Executescalar ( ) : Se utiliza para recuperar s610 el dato devuelto en la primera fila de la primera columna del conjunto de resultados.1. no un conjunto de resultados. es ExecuteReader ( ) . de forma opcional. de De 10s tres procedimientos. utilizabamos el valor CommandBehavior . Recuperacidn de datos Estos tres metodos son 10s siguientes: ExecuteReader ( ) : El adecuado si ejecutamos una consulta SQL.8. resumidos en la tabla 8. el unico que toma pariimetros. El unico valor devuelto por ExecuteNonQuery ( ) es el n ~ m e r o filas afectadas por la operaci6n. Se trata de un solo pariimetro que determina el comportamiento del comando a1 ejecutarse.

NET Los proveedores Sqlclient y Oracleclient disponen.Progyarnacidn de bases de datos con Visual Basic . de otros metodos Execute asociados a sus comandos especificos. I I I -1 -- -( hi / \ IDa t a R e c o r d IDa t a R e a d e r I SqlDataReader Figura 8. por tanto. En el caSO SqlCommand. implementa las interfaces IDataReader e IDataRecord. En realidad. Si bien retornan un identificador unico de fila en caso de que se usen para afectar a una fila de datos que cuente con este elemento. ademas de los ya mencionados.En el caso de OracleCommand.2 puede ver la relaci6n entre estos elementos. Este metodo devolveri una referencia a un objeto XXXDataReader que. pero el caso de ExecuteReader ( ) es distinto. En la figura 8. Las clases D a t a R e a d e r de cada proveedor implementan las interfaces IDataRecorde IDataReader . funcionan COmO ExecuteNonQuery ( ) y Executescalar ( 1 . para comenzar a recuperar datos desde cualquiera de 10s origenes de que disponemos. En la figura 5. como se indic6 en el quinto capitulo.tenemos a nuestra disposicion 10s metodos especificos ExecuteOracleNonQuery ( ) y ExecuteOracleScalar ( ) qUe.2. Lectura de 10s datos Recuperar 10s datos devueltos por Executescalar ( ) o ExecuteNonQuery ( ) no requiere ninguna explicacion adicional. la interfaz IDataReader est6 derivada de IDataRe cord y. asi como la indication de 10s miembros mas importantes de IDataReader e IDataRecord.podemos usarel metodo ExecuteXmlReader ( ) para obtener UnXmlDataReader en lugarde un SqlDataReader. descritos en el punto Acceso a f i l a s de datos de dicho capitulo. bAsicamente. Con esa information tenemos suficiente. en principio. hereda todos 10s miembros cuya implernentacion es obligada en las clases especificas de cada proveedor.2 del quinto capitulo encontrara un esquema de las cuatro clases DataReader.

ExecuteReader r Dim I n d i i P As Byte Fo Next Con5ole. con el valor CommandType. con el m6todo ExecuteReader ( ) .1 Console.0.C r e a t eComrnand ( ) r )rnand ) . 6 0 ) ) While Lector. 'I & So i i r c e= \ P B d d V i s ua 1Bas 1 cN ET \ Cap 0 3 \ L 1b r 13 s .Data. md b " 1 " Da t a ~ ~ D i m Comando As OleDbCornrnarld = Conexion. no tendriamos m5s que recuperar las filas en el interior de un bucle controlado por el valor de retorno del mktodo Read ( ) del OleDbDataReader.4. C .FieldCount . en este caso un OleDbCommand.OLEDB. Con este fin ejecutariamos un comando. TableDirect en la propiedad CommandType y el nombre de la tabla en CommandText. Jet.WriteLine(vbCrLf & New String("=". Suponiendo que deseamos mostrar el contenido de las tablas de nuestra base de datos Access.Write(Lector.rnmandType xt = = LornmandType. Tab1 e D i r e c t N rnbreTabla ( ) D i m Ltct ~ ) As 0let)bDat~aReader = Cornando.8.OleDb Module Module1 Sub M a i n ( ~uestraTabla ("Editoriales") MuestraTabla("Llbr0s") End Sub Sub MuestraTablaiByVal NombreTabla As String) D i m Conexion As New OleDbConnection ( " P r o v i d e r = M i c r o s o f t . ya en la prActica. Recuperacidn de datos Recuperar el contenido de una tabla Partamos. Ejecutado el comando.GetValue(1ndice) Next For Indice & vbTab) . Read ( ) = 0 To Lector. con uno de 10s supuestos mris simples: recuperar todo el contenido de una tabla. podriamos servirnos del c6digo siguiente: Imports System.

Simplemente modificando la cadena de conexicin. podria efectuar la misma operaci6n sobre el documento Excel.facilitando asi la visualizaci6n de las dos tablas de la base de datos. El nombre de la tabla se recibe como pardmetro desde el metodo Main ( ) . El siguiente paso es la lectura propiamente dicha.3.Programacidn de bases de datos con Visual Basic . cerramos el OleDbDataReader y la conexi6n. A1 ejecutar el programa deberia obtener un resultado similar a1 mostrado en la figura 8.WriteLine0 End While Console. Creamos un OleDbCommand a partir del OleDbConnection.3. invocando a1 metodo Read ( ) en un bucle que finalizarfi cuando no queden mds filas a leer. Finalmente. Sirviendonos de su propiedad Fieldcount recorremos todas las columnas del conjunto de datos. puesto que este tambien se lee con el proveedor OLE DB. Contenido de las tablas d e Microsoft Access .WriteLine(vbCrLf End Sub End Module & vbCrLf) La cadena de conexicin es la misma utilizada en ejemplos previos. A continuacidn ejecutamos el comando y obtenemos el OleDbDataReader.NET Console. y afiadiendo el carQcter$ tras el nombre de las tablas. mostrando el nombre de cada una de ellas. Figura 8. mediante el metodo CreateCommand ( ). Por cada fila mostramos el valor de todas sus columnas. estableciendo a continuacicin el tip0 de comando y el texto.

Password=" ) & co Cornando. - ~' if. Recuperacidn de datos El us0 deCommandType. a diferencia de Read ( 1. es posible que la ejecuci6n de un comando devuelva varios conjuntos de datos como resultado. o un lote de sentencias SQL. per0 teniendo en cuenta que.SqlC1ient Module Module1 Sub Main( ) . Veamos cdmo conseguir un efecto similar a1 del ejemplo del punto anterior." h "SELECT * FROM L i b r o s . Varios conjuntos de datos A1 ejecutar un procedimiento almacenado. per0 en este caso utilizando un lote de sentencias SQL sobre SQL Server. " Dim Conexion As N e w SqlConnection( "Data Source=inspiron. facilitando el acceso a 10s demPs mediante el metodo N e x t R e s u l t ( 1. en caso de que deseemos recorrer todos 10s conjuntos devueltos. entregando el nombre de la tabla en la propiedad CommandText. ya que no todos 10s proveedores ADO. El c6digo seria el mostrado a continuaci6n: Imports Systern. T a b l e D i r e c t . 6ste puede ser utilizado como condicional de un bucle. es mucho mas compatible la segunda opcion. recuperando todo el contenido de las dos tablas. "User ID=sa.ComrnandText = "SELECT * FROM Editoriales. T a b l e D i r e c t . 1.Data.2 -. Initial Catalog=Libros. gestionando 10s conjuntos de datos devueltos con 10s mktodos del S q l D a t a R e a d e r ..ExecuteReader() . seria equivalente a ejecutar una sentencia SELECT * FROM NombreTabla.8.NET contemplan el us0 de CommandType. SELECT COUNT ( * ) FROM LIBROS" I - J . Auque en este ejemplo se ha mostrado como utilizar la posibilidad de recuperar el contenido de una tabla con ese sistema. la primera llamada a N e x t R e s u l t ( ) nos llevaria directamente a1 segundo conjunto de datos. ( a n r I n _ i = Dim Lector As SqlDataReader Dim Indice As B y t e Comando. que con la primera llamada nos lleva a la primera fila. En principio el D a t a R e a d e r apuntaria al primero de ellos. .

Dentro de &te tenemos otro bucle. . sin embargo. etc. como se aprecia en la figura 8. entre ellos. NextResult ( ) .GetNarne(1ndice) & vbTab Next Console.Write(Lector. No todos 10s proveedores ADO. Asi procesaremos 10s tres conjuntos de datos obtenidos. El resultado.CSose End Sub End Module ' ( ) ' Observe que. tan s610 hemos conectado con el origen una vez y tan s610 hemos ejecutado un comando.Write(Lector.W r i vbC 1 7 & vbTab) < . es prdcticamente i d h tico. 6 0 ) While Lector.] ~1 Loop While Lector. por supuesto. 10s comandos de selecci6n. para recorrer todas las filas de cada conjunto. S ~ Mediante un objeto Command es posible ejecutar cualquier tip0 de comando SQL. cuando lo habitual es que sepamos qu4 columnas de datos vamos a recuperar y las tratemos segun interese.S ConsoSe. En el ejemplo anterior nos hemos limitado a obtener todo el contenido de dos tablas y un contador.4. ordenando 10s resultados.NET Do r Fo nt - 1 ConsoSe. en 10s ejemplos anteriores enumeramos todas las columnas de todas las filas.NextResult0 Lector. por ejemplo combinando tablas.como se ha hecho en este ejemplo con Sqlclient.Close ( ) Conexion. A diferencia del programa anterior.NET contemplan la posibilidad de ejecutar lotes de sentencias SQL. AdemAs.WriteLine(vbCrLf & New String("=".WriteLine0 End While co . el equivalente a1 del ejemplo anterior. la mayor parte del c6digo se encuentra en el interior del bucle Do/Loop While L e c t o r . per0 igualmente podriamos ejecutar una sentencia mds compleja.FieldCount .Pvogramacidn de bases de datos con Visual Basic . salvo la conexi6n y ejecuci6n del comando.GetValue(1ndice) Next ConsoSe. Read ( ) For Indice = 0 To Lector.

CreateCommand ( ) Cone t i 0 ' I I . per0 el proceso seria btisicamente el mismo. L. Imports System. Data. Estos datos podria utilizarlos para generar un informe impreso. 4. " & "Data Source=\PBddVisualBasicNET\Cap~03\Libros. E.CommandText = "SELECT L. .OleDb Module Module1 Sub Main( ) 2 1 Dim Conexion As New OleDbConnection ( "Provider=Microsoft. ~ . junto con el nombre de su editorial y el precio.Editoria1 " & "ORDER BY L.Titulo.. " "Extended Properties='Excel 8. A? 'I Comando.Precio "FROM [EditorialesS] E.~ .8. Contenido de 10s multiples conjuntos de datos obtentdos Suponga que desea obtener el titulo de cada uno de 10s libros que hay en la tabla L i b r o s .~ls.IDEditoria1 = L.0. r f & - i + I \I Dim Lector As OleDbDataReader = Comando. un documento HTML o cualquier otro tip0 de resultado. En el c6digo siguiente nos limitamos a mostrarlos por consola.0.Nombre.OLEDB. Jet.Titulo" . HDR=Yes'") & - Dim Comando As OleDbCommand = Conexion. Recuperacidn de datos ~ ~ ~ ~ Figura 8.4. [LibrosSI L " & "WHERE E.ExecuteReader0 .

5 puede ver el resultado de la ejecuci6n de este ejemplo. Tan s610 tiene que utilizar la conexi6n adecuada. W r i t e L i n e ("Titulo". Resultado de la consulta SQL sobre e documento Excel l . puesto que el car6cter $ no puede introducirse directamente en la consulta. G e t St r 1 nq ( 0 . Get S t r i rlg ( 1 . podemos utilizar directamente 10s metodos GetXXX ( ) del D a t a R e a d e r . I Figura 8. Observe c6mo en la consulta se han facilitado 10s nombres de las tablas entre corchetes. En la figura 8. P a d R i g h t ( 2 5 ) & vbTab & "Precio" L - vbCrLf Wh & New String("-". segun se explic6 en el sexto capitulo. Lect o .W r i t eL 1 ne f " { 0 . 1001 1 C o n s o 1 e .5. P a d R i g h t (50) L vbTab) C o n s o 1 e . L6gicamente.Programacidn de bases de datos con Visual Basic . W r i t e i L e c t o r .5 1 ' I .NET C o n s o l e .PadRight ( 5 0 ) L vbTab & "Editorial".GetDouble(2) End While L e c t r L .Close ( ) ' End Sub End Module Ya que conocemos el tip0 de las columnas seleccionadas en la consulta. G e t s t r i n g ( ) para recuperar el titulo y nombre de la editorial y GetDouble ( ) para leer el precio. y eliminar de la sentencia de consulta 10s corchetes y el simbolo $ a1 final del nombre de cada tabla.W r i t e i L e c t o r . en lugar de utilizar el documento Excel como origen puede usar cualquier otro. por ejemplo. P a d R i g h t ( 2 5 ) L vbTab) C o n so 1 e .

En la sentencia anterior se ha precedido C o d E d i t o r i a l con dos puntos.._l"" . por ejemplo. Este devuelve un objeto del tip0 adecuado.. que habrd que definir en algun momento antes de ejecutar la sentencia. El us0 de este tip0 de pardmetros puede permitirnos adaptar nuestra consulta a las indicaciones del usuario sin. En principio esa lista est6 vacia. la siguiente consulta: En el condicional se compara la columna E d i t o r i a l de la tabla L i b r o s con un valor. el proveedor deduce el tip0 de 10s datos a partir del contenido de las celdillas."_.. C o d E d i t o r i a l . por ejemplo S q l p a r a m e t e r u O r a c l e p a r a m e t e r . tener que reconstruir la sentencia SQL segtin cada caso.-. meters.. _-. pore1 contrario.. lo que significa que siempre se ejecutan igual y obtienen 10s mismos resultados. no obstante. no teniendo mis que asignar.. como se indico anteriormente.-.^__I_. por ello.8. usa el caracter @ para denotar la existencia de un parametro sustituible. el nombre y valor del partimetro. Por eso el precio se trata como un Double. que mantiene la lista de parimetros necesarios para la ejecuci6n del comando. Nota La sintaxis para indicar la existencia de un parametro difiere de un proveedor a otro.. un objeto que seri dependiente del proveedor._ Las sentencias SQL usadas en 10s ejemplos anteriores son constantes. El p r o v e e d o r s q l c l i e n t . Una alternativa es llamar a1 metodo C r e a t e p a r a m e t e r ( ) del objeto Command que estemos usando. Los objetos que implementan IDbCommand disponen de la propiedad P a r a comentada brevemente antes.. pudiendo afiadirse 10s parimetros que se necesiten mediante el metodo Add ( ) . datos que usando el metodo indicando antes se entregarian a1 constructor de la clase P a r a m e t e r adecuada.. Una sentencia..-. ._____ _ ~__)-.-____ _x - . .I _." .. Este necesita como argument0 el objeto que representa a1 parimetro. lo que se conoce normalmente como parimetros sustituibles. puede contener pardmetros cuyo valor se desconoce en el momento de expresar la propia consulta. Recuperacidn de datos Al acceder a Excel.-_x_-^_-. Observe. usando sus propiedades. Al conectar con un origen distinto podria tener que cambiar G e t D o u b l e ( ) pOr G e t D e c i m a l ( ) . sintaxis adecuada p a r a o r a c l e c l i e n t .

s +i ~ ::jilL:. Asumiendo que utilizaremos la base de datos creada anteriormente en Oracle.ReadLine0) . se aiiade un elemento a la coleccidn p a r a m e t e r s creando un nuevo O r acle P a r a m e t e r.. el c6digo necesario seria el siguiente: Imports Systern.s-J . : i ~ r ~ ? r i ~ i > . Pass wo rd= t ig e r " ) Conexion.f-.Read0 Console.ExecuteReader0 & Console.. -> c1 I- + / > Whlle Lector.:~lj:i tc:.-jy.. uno de 10s posibles.. Podria aiiadir. El resultado de ejecutar el programa.ComrnandText = "SELECT ISBN. . 2 Dim Lector As OracleDataReader ( I / .-) a I. j:>.i?P=: i L ' i n t5L~ - Cornando. Us e r I D= s cot t .:c. ..Add(New Oracleparameter( "CodEditorial".!.J I . 77 = Cornando.I.NET Suponga que quiere crear una consulta de libros pertenecientes a una cierta editorial. Console. Titulo FROM Libros "WHERE Ed i to r i a 1= :Cod Ed itori a 1" D i m NurnEditorial As Integer 1 & - :.G+= ? .Data.WriteLine (Lector("1SBN") End While & vbTab & Lector("Tltu1o") ) End Module Observe cdmo se define el comando y.Write ("Introduzca un c6digo de editorial : " 1 NumEditorial = Integer.la .t~i. tras solicitar el c6digo de editorial por la consola.OracleC1ient Module Module1 Sub Main() I L-Fj. seria el de la figura 8. Open ( 1 ) - ) ' " Comando. permitiendo a1 usuario que sea 151 quien seleccione dicha editorial.Parameters.>'a tjs s p l s.js .PadRight (13) & vbTab "Titulo" & vbCrLf & New String("=". . antes de solicitar el cddigo de editorial a1 usuario.3 I .:-.r Dim Conexion As New OracleConnection( " Data Source= L ib ros . WriteLine ("ISBN".Programacidn de bases de datos con Visual Basic .r\--. NumEditorial) ) ' Z . 7 0 ) ) I " + - i' + .Parse(Console.Jzld.6.-j~rjk ~: l .

e introduce el c6digo de una editorial. En casos asi. atos Aunque el titulo de este capitulo hace referencia expresa a la recuperaci6n de datos. Si ejecuta ahora el programa.ExecuteScalar0 Console. modifique la consulta dej6ndola asi: Comando. Figura 8. h e devuelve directamente el resultado. contador o algdn otro cdculo. por ejemplo una suma.CornrnandText = "SELECT COUNT(*) FROM Libros "WHERE Editorial=:CodEditorial" " L - A continuaci6n se solicita el c6digo de editorial a1 usuario e introduce como par6metro en el comando.WriteLine("Esa editorial tiene { O l titulos". Lista de 10s titulos pertenecientes a la editorial seleccionada e un solo valor Hasta ahora hemos usado reiteradamente el metodo ExecuteReader ( ) para acceder a uno o varios conjuntos de datos. aunque podriamos utilizar ExecuteReader ( 1. y a este tema se dedica la mayor parte del mismo. Partiendo del ejemplo del punto anterior. resulta m6s fdcil y eficiente utilizar el m6todo ExecuteScalar ( ) . Recuperacio'n de datos el c6digo necesario para mostrar el c6digo y nombre de cada una de ellas. facilitando asi la selecci6n. En ocasiones. sin necesidad de recorrer filas ni columnas.6. que ahora ejecutaremos asi: Dim Resultado As Integer = Cornando.8. hay que apuntar que un . Resultado) Hemos eliminado la declaraci6n del DataReader y la llamada a1 metodo Close ( ) . el resultado de una sentencia de consulta ser6 dnico. ver6 aparecer el ncmero de titulos que corresponden a ese c6digo.

podemos virtualmente extraer y manipular todo su contenido.ExecuteNonQuery() Conexion. podrian modificarse o eliminarse filas. modifican las existentes o las eliminan.NET comando preparado en un objeto Command puede contener cualquier tip0 de sentencia SQL. & " ' Wi re 1 e s s Java ' .Data. Imports System. sino un entero que indica el numero de filas que se han visto afectadas por la operaci6n realizada. efectuar cualquier operaci6n de manipulaci6n de datos no implica mayor complejidad.0.Close i End Sub End Module ' ' ? I . incluidas las que aiiaden filas. de forma similar.Prograrnacidn de bases de datos con Visual Basic . " & "Data S o u r c e = \ P B d d V i s u a l B a s i c N E T \ C a p _ 0 3 \ L l b r o s . . Este tip0 de sentencias no devuelve conjuntos de resultados. '1-893115-50-X'. r i - 1 Dim Resultado As Integer = Comando.4. o bien abrir directamente el documento en Microsoft Excel para observar el cambio. La operaci6n se efectuaria de manera anfiloga en cualquier otro origen y. . recuperando el contenido del documento y mostrhdolo por la consola. 3 4 . "Extended Properties='Excel 8. 3.' 0 . 9 5 ) 'I 1 i i . Otras operaciones Dado que con un comando podemos ejecutar cualquier sentencia SQL sobre el origen de datos. El siguiente ejemplo aiiade una fila de datos a la hoja Libros del documento Excel.OLEDB.OleDb Module Module1 Sub Main ( 1 rA Dim Conexion As New OleDbConnection( "Provider=Microsoft. ~ l s .CreateCommand ( ) '. Jet. ' Jonathan Kriuds en ' . HDR=Yes'") ~ " & Dim Cornando As OleDbCommand Cone I = Conexion. ) I / . Conociendo la sintaxis SQL del origen con el que vayamos a conectar.CornrnandText = "INSERT INTO [LibrosSI " & "VALUES ( 1 6 . Por ello se ejecutan con el metodo ExecuteNonQuery ( ) en vez de ExecuteReader ( ) . : Cornando. Para ver el resultado puede ejecutar alguno de 10s ejemplos previos.0.

SqlClient Module Module1 Sub Main( ) . en cuanto a tratamiento. seleccionando 10s datos que nos interesen.8. crearemos una nueva aplicacidn de consola con el cddigo siguiente: Imports System. posiblemente tambien pueda utilizarse para manipular la informacidn. Oracle e InterBase. I *- D i m Conexion As New SqlConnection( " "Data Source=inspiron. Recuperacidn de datos Sin embargo. Open ( ) ' 1 I Ti Comando. en caso de ser un RDBMS. Recuperacion de una vista Las vistas. ejecutando la sentencia SQL y obteniendo su resultado. mantiene estructuras prefabricadas como las vistas y procedimientos almacenados. concretamente en las de SQL Server. que devuelve una lista de las editoriales existente junto con 10s titulos que le corresponden a cada una. una vez definidas en la base de datos. cuyo objetivo es facilitar nuestro trabajo a1 efectuar operaciones relativamente complejas. Podemos consultarlas con una sentencia SQL corriente. CornrnandText = "SELECT * FROM LibrosEditorial" D i m Indice As Byte . ordenando la lista alfabeticamente por el nombre de la editorial. respecto a las tablas. simplemente habria que cambiar de proveedor.CreateCornrnand() - Conexion. pero el procedimiento seria el mismo con cualquiera de 10s otros origenes. llamada Libros Edi torial. Para recuperar esta vista. no se diferencian demasiado. Dependiendo de la vista y del RDBMS. Initial Catalog=Libros. A continuacidn va a utilizarse el proveedor Sqlclient para operar con SQL Server. Data. En las bases de datos que estamos empleando a mod0 de ejemplo. introdujimos la definicidn de una vista y dos procedimientos almacenados. "User ID=sa. eximihdonos a nosotros de codificarlas en SQL. en ocasiones el origen de datos. poco mds. En nuestra base de datos SQL Server tenemos definida una vista. Password=") & - ' 1 + 3 1 - 3 2 - 3 - j < D i m Comando As SqlCommand = _ = c cx Conexion.

Read ( 1 Console . LibrosEditorial es una vista que.Close0 ' Conexion. que tal tabla no existe.-2 0 } " & vbTab vbTab & " { 2 . si cabe.NET Console. Conjunto de datos devuelto por la vista L i b r o s E d i t o r l a l Ejecutar un procedimiento almacenado es. devuelve la lista de datos que puede verse en la figura 8.-50]" & Como puede ver.Close( ) End Sub End Module & "{1. sin embargo.PadRight(50) & vbTab & "Precio" & vbCrLf & New String("=". asumiendo que tenemos la conexi6n ya preparada: . 5 ) " . Sabemos.P a d R i g h t ( 2 0 ) & vbTab "Titulo". a1 ejecutarse. /'I Figura 8. la sentencia SQL asignada a CommandText bien podria ser la de consulta a una tabla llamada LibrosEditorial. Lector ("Precio" End While Lector.WriteLine("Nornbre". B6sicamente tenemos que dar tres pasos. puesto que 10s datos de las editoriales y 10s libros se encuentran separados.7.Programacidn de bases de datos con Visual Basic . Lector("Nombre") Lector ("Titulo").7. 9 0 ) ) & While Lector. m6s f6cil que abrir una vista.Wr 1 t e L 1 ne ( " { 0 .

Aiiadir a la propiedad properties 10s par6metros que el procedimiento almacenado pudiera necesitar. En este ultimo caso. creando el comando y abriendo la conexion. La lectura de ese conjunto de datos. .-25}" & vbTab & vbTab & "{1. ejecutariamos el comando con ExecuteReader ( ) . obtendria el numero de filas afectadas por la operation. L e c t o r ( " N o m b r e " ) . lntente ejecutar el procedimiento almacenado NumTitulos. 0 0 Hecho esto. Tomando como base el ejemplo previo. Asignar el nombre del procedimiento almacenado a la propiedad CommandText. W r i t e L i n e ( " N o m b r e " . 5 0 ) ) & While Lector. introduciendo el codigo siguiente: Dim L e c t o r As S q l D a t a R e d d e r Dim I n d i c e As Byte = Comando. y modificamos a partir de la asignacion de la sentencia SQL. como ya sabe.Read ( 1 ("{0. ExecuteReader ( ) C o n s o l e . Lector ( " N u r n T l t u l o s " ) End While En este caso usamos el procedimiento almacenado NumTi tulosEditoria1 para obtener un conjunto de datos formado por el nombre de cada editorial y el numero de titulos con que cuenta. Hemos usado previamente 10s tres m&odos.8. un solo valor o nada. segun devuelva un conjunto de datos.5}". por lo que no necesitamos saber nada nuevo para ejecutar uno de 10s procedimientos almacenados que tenemos en nuestra base de datos. definiendo la conexion. StoredProcedure a la propiedad CommandType del comando. mantenemos la primera parte. Recuperacidn d e datos 0 Asignar el valor CommandType. como puede verse. P a d R l y h t ( 2 5 ) & vbTab " T i t u l o s " & vbCrLf & New String("=". ExecuteScalar ( ) o ExecuteNonQuery ( ) . no difiere de lo que ya conociamos. facilitando 10s parametros necesarios y recogiendo el resultado unico que devuelve.

vistas y procedimientos almacenados. Conjunto de resultados devuelto por la ejecucion del procedimiento almacenado A1 finalizar este capitulo ya est6 familiarizado con la definici6n y ejecuci6n de comandos. incluidas las de actualizaci6n. leian 10s datos para mostrarlos en consola y se cerraba la conexi6n. 10s DataReader no son el medio m6s apropiado. por ejemplo una visualizaci6n en una rejilla para permitir que el usuario 10s edite.Programacidn de bases de datos con Visual Basic . por lo que el proceso de la informaci6n no deberia requerir demasiado tiempo a fin de evitar que esa via est6 abierta indefinidamente. En caso de que necesitemos alguna operativa m6s compleja sobre 10s datos. Utilizando esta tbcnica puede recuperar datos y ejecutar cualquier tip0 de sentencia. En 10s ejemplos mostrados en este capitulo ha visto c6mo se abria la conexidn. Debe tener en cuenta que mientras trabaja con un DataReader est6 manteniendo abierta la conexidn con la base de datos. En su lugar deberiamos utilizar 10s conjuntos de datos que vamos a conocer en el capitulo siguiente. asi como en el us0 de las clases DataReader para recorrer 10s conjuntos de datos obtenidos a partir de esos comandos. .NET Figura 8.8.

.

tiene sus aplicaciones concretas.El sistema de trabajo mostrado en el capitulo anterior. utilizando comandds y lectores de datos. Las mas importantes de ellos son D a t a S e t y 10s distintos D a t aAdapt er. recuperando las filas y despu6s generando las sentencias necesarias para enviar 10s cambios a1 origen. puesto que no cuenta con ninguna ayuda a1 respecto. concretamente en el punto Conjuntos d e datos y 10s siguientes. Data. A diferencia de la mayoria de elementos que hemos conocido en 10s tres capitu10s previos.NET dispone de un conjunto de clases. las tareas de edicion de 10s datos pricticamente tendra que codificarlas a mano. Tendra que conocer la sintaxis especifica de cada origen de datos. Estara obligado a mantener una conexion persistente con el servidor todo el tiempo que est6 operando sobre 10s datos. cuyo us0 vamos a conocer en este capitulo con diversos ejemplos. alojadas en su mayor parte en el ambito systern. Ademas. per0 presenta algunos inconvenientes si intenta usarlo como sistema general para todas las aplicaciones de acceso a datos. ADO. que se caracterizan por implementar alguna interfaz comun per0 con . por ejemplo a la hora de componer sentencias SQL. Estas se introdujeron brevemente en el quinto capitulo. que pueden facilitarnos mucho nuestro trabajo diario.

de la clase D a t a T a b l e . Estas. Cuando se llena un D a t a S e t a partir de un origen de datos. En esta clase pueden existir. objetos de la clase D a t a S e t . o bien definirse mediante c6digo. Es algo que veremos en la prbctica posteriormente. La tabla tambien puede contar con una colecci6n de objetos C o n s t r a i n t especificando las restricciones aplicables a 10s datos. existiendo tambien. es decir. de filas y columnas. sin embargo. a1 tratar las herramientas del entorno para el trabajo con datos. nada nos impide crearlas a fin de que se ajusten a la estructura concreta de 10s conjuntos de datos sobre 10s que vamos a operar. mediante un adaptador. Tablas y relaciones Las dos propiedades fundamentales de un D a t a S e t son T a b l e s y R e l a t i o n s .9. Cada una de ellas mantiene una referencia a una colecci6n de objetos. derivadas de D a t a S e t . Si bien en principio no existen clases derivadas de D a t a S e t. la posibilidad de resolver 10s cambios con el origen de datos del que se extrajo la informaci6n. con sus filas y columnas. segun se apuntaba en el quinto capitulo. mientras que con la coleccion Columns tenemos a nuestro alcance la informaci6n de esquema de cada columna: nombre. Aunque podriamos crear estas clases manualmente. alojados en la propiedad R e l a t i o n s . restricciones y relaciones. respectivamente. En este capitulo utilizaremos siempre conjuntos de datos genericos. . como es 16gic0. las colecciones de tablas y relaciones se definen autombticamente. mediante un adaptador. crear nuevas tablas y relaciones en el interior del D a t a S e t . Cada tabla se compone. a1 tiempo. Independientemente de esto. pueden recuperarse mediante un adaptador de datos o bien definirse con c6digo. 10s conjuntos de datos tan s6lo cuentan con una clase: D a t a S e t .NET dispone de asistentes que se ocupan de hacerlo. Conjuntos de datos implementaciones especificas para cada proveedor. es decir. representadas por las colecciones Rows y Columns. Un conjunto de datos puede obtenerse a partir de un origen de datos. Mediante objetos D a t a R e l a t i o n . multiples tablas. tipo. que Gstos Sean de 10s tipos apropiados. Los conocerb en un capitulo posterior. en el primer caso de la clase D a t a T a b l e y en el segundo de D a t a R e l a t i o n . etc. serian conjuntos de datos con comprobaci6n de tipos que facilitarian el acceso a 10s datos comprobando. como ya sabe. La primera es importante ya que nos permite recuperar y modificar la informaci6n almacenada en el conjunto de datos. Mediante la colecci6n Rows podemos acceder a 10s datos que contienen las filas. Visual Studio . el contenido del conjunto de datos puede almacenarse y recuperarse localmente. Estas clases. afiadir nuevos elementos a las colecciones. mientras que la segunda define la relaci6n entre tablas en caso de que el conjunto est4 compuesto por varias. se establecen 10s enlaces entre las tablas que forman parte del D a t a S e t . a1 igual que el contenido del resto del D a t a S e t . Nada nos impide.

Programacidn de bases de dafos con Visual Basic .NET

En el quinto capitulo, en la segunda mitad, se comentaron las propiedades mas impOrhIteS de 10s objetos D a t a T a b l e , DataRow, Datacolumn y DataR e l a t i o n . Puede recurrirde nuevo a el si es que necesita recordaralgun punto concreto.

Seleccih de datos
Mediante la propiedad Rows de cualquier D a t a T a b l e es posible acceder a la totalidad de las filas que componen la tabla en ese momento. Utilizando el mgtodo S e l e c t ( ) de la clase D a t a T a b l e , no obstante, es posible establecer filtros de selecci6n para recuperar un arreglo compuesto tan s610 por aquellas filas que 10s cumplen. Observe que el metodo S e l e c t ( ) no afecta a la propiedad Rows, es decir, no provoca que en la colecci6n aparezcan o desaparezcan filas, sin0 que es el mismo metodo el que devuelve un arreglo de objetos DataRow con el resultado. A1 efectuar busquedas con el m6todo S e l e c t ( ) ,por defecto, no se distingue entre mayusculas y minusculas. Este comportamiento est6 controlado por la propiedad C a s e s e n s i t i v e del D a t a S e t que, por defecto, tiene el valor F a l s e . Puede asignarle T r u e si necesita que a1 establecer un filtro se distinga entre mayusculas y minusculas.

El contenido del arreglo devuelto por e l metodo S e l e c t ( ) son las referencias a 10s objetos DataRow de la coleccion R O W S que cumplen con el filtro. No se trata de copias, sino de referencias a 10s mismos datos. Cualquier modificacion en un DataRow obtenido con S e l e c t ( ) , por tanto, tendra su reflejo inmediato en la coleccion ROWS del D a t a T a b l e .

Aunque, como se veri mis adelante en este capitulo, es posible almacenar y recuperar conjuntos de datos usando archivos locales, al trabajar con objetos D a t a S e t asociados a origenes de datos, que es el caso m6s habitual, resultan imprescindibles 10s adaptadores de datos, introducidos tambien en el quinto capitulo. Un adaptador de datos actua como intermediario entre el origen de datos, con dependencias de cada product0 particular, y el D a t a S e t , que tiene una estructura totalmente independiente.

9. Conjuntos de datos

La relaci6n entre 10s distintos elementos relacionados con adaptadores de datos, interfaces, clases gen6ricas y clases de proveedores, es la que puede apreciarse en la figura 9.1. Como puede ver, la clase DataAdapter implementa la interfaz IDa t aAdap t e r, sirviendo a su vez como base para la clase generica DbAdap t e r. Esta sirve como base de OdbcAdapter, OleDbAdapter, OracleDataAdapter y SqlDa t aAdap t e r, adaptadores de datos de cada proveedor que, adem&, tambien tienen en comun la implementacih de la interfaz IDbDataAdapter.

-l eo
IDbDa t a Adap t e r

/

Figura 9.1. Clases e interfaces relacionadas con 10s adaptadores de datos

Del esquema de la figura 9.1 es fdcil deducir que la clase DataAdapter de cualquiera de 10s proveedores, OleDbAdapter u OracleAdapter por ejemplo, implementa todos 10s miembros de las interfaces I Da t aAdap t e r e IDb Da taAdapter, bien sea por si mismo o por haberlos heredado de las clases genericas DataAdaptero DbDataAdapter.

La clase DbDataAdapter es abstracta, es decir, no pueden crearse objetos directamente a partirde ella, sin0 que esta diseAada especificamente para servir como base de otras.

Los adaptadores de datos se crean siempre a partir de la clase DataAdapter especifica de un proveedor dado, existiendo, en principio, las cuatro que aparecen en la figura 9.1. En el momento de la creacibn, es posible facilitar a1 constructor un

Programacion de bases de datos con Visual Basic .NET

pariimetro, dos o ninguno. El adaptador que obtendriamos, segun el caso, tendria las siguientes caracteristicas:

Ningiin pariimetro. Se obtiene un adaptador que no est6 asociado a una conexion ni tiene un comando de recuperaci6n de datos. Seria precis0 asignar posteriormente un objeto Command a la propiedad SelectCommand, facilitando un comando de selecci6n ya asociado a una conexi6n.

U n objeto Command. El adaptador se crea ya asociado a1 comando que se entrega como parsmetro.
Una cadena de caracteres y un objeto Connection. El propio adaptador se encarga de utilizar la cadena de caracteres para crear el comando de selecci6n, asociindolo con la conexi6n que se entrega como segundo par6metro.
Dos cadenas de caracteres. La primera seria el comando de selection y la segunda la cadena de conexi6n a1 origen de datos. Con esto el adaptador se encargaria de crear 10s objetos Connection y Command del proveedor apropiado, estableciendo todas sus propiedades.
A diferencia de lo que ocurria con 10s lectores de datos, un adaptador no requiere que la conexi6n con el origen de datos est6 abierta de antemano. El mismo se ocupa de abrirla y cerrarla cuando es necesario.

Una vez que tenemos el adaptador preparado, con su comando de selecci6n definido, para ejecutarlo y obtener 10s datos en el DataSet no tenemos m6s que invocar a1 metodo Fill ( ) . Este puede tomar distintas listas de par6metros, aunque la sintaxis m6s habitual es la siguiente:
AdaF)tadorDatos.F i l l ( C o n j u n t o O a t o s 1

ConjuntoDatos seria el DataSet destinatario de la informacih, en cuyo interior se crearia, con el resultado de la sentencia de seleccibn, un DataTable llamado Table. Si deseamos que el objeto DataTable tenga otro nombre, no tenemos m6s que facilitarlo como segundo par6metro al mismo metodo Fill ( ) . El comportamiento del metodo Fill ( ) viene determinado, en parte, por el valor que tengan las propiedades MissingMappingAction y MissingSchemaAction del adaptador. La primera determina qu6 ocurre cuando se obtienen del origen de datos tablas o columnas que no existen aun en el DataSet.Los posibles valores son 10s enumerados en la tabla 9.1. Mediante la segunda se especifica qu6 hacer con la nueva informaci6n de esquema que pudiera derivarse del origen, pudiendo tomar uno de 10s cuatro valores indicados en la tabla 9.2.

9. Conjuntos de datos

Tabla 9.1. Valores posibles de la propiedad MissingMappingAction

Valor
MissingMappingAction.Ignore MissingMappingAction.Error MissingMappingAction. Passthrough

Comentario
Los datos no coincidentes se ignoran Se genera un error en caso de encontrar datos no coincidentes Todo dato no coincidente se agrega a 1 DataSet

Tabla 9.2. Valores posibles de la propiedad MissingSchemaAction

Valor
MissingSchemaAction.Ignore MissingSchemaAction.Error MissingSchemaAction.Add MissingSchemaAction.AddWithKey

Comentario
Se ignora la inforrnacion de esquerna adicional Producir un error en caso de que se encuentre inforrnacion adicional La nueva inforrnacion se aiiade a la ya existente en el DataSet

Lo misrno que el anterior, per0 aiiadiendo ademas informacion sobre claves de la tabla

El valor por defecto de MissingMappingAction es Passthrough y el de MissingSchemaAction es Add. Asi, a1 llamar a1 metodo Fill ( ) se afiadirhn a1 DataSet todos 10s datos del origen, tengan o no una correspondencia en ese momento con el contenido del Data S et, incorporando, ademis, informacih de esquema relativa a las columnas que forman la tabla.

Si se llama al metodo Fill ( ) facilitando un DataSet vacio, alg0 muy habitual, es imprescindible que el adaptador aiiada todos los datos del origen y la informacion de esquema, de ahi que 10s valores por defecto de las dos propiedades Sean esos y no otros. Podria ocurrir, sin embargo, que tuviesemos un DataSet con una cierta estructura ya definida, caso en el cual podria interesarnos recuperar informacion en 10s DataTable ya existentes, sin aiiadir nada. En un caso asi asignariamos a ambas propiedades 10s valores Ignore o ~ r r o rseglin deseemos simplemente ignorar el hecho u obtener una excep, cion para conocerlo.

Programacidn de bases de datos con Visual Basic .NET

Si ademas de la informacion de esquema de las columnas, que es lo que se recupera por defecto, deseamos tambikn que se obtenga la relativa a las columnas clave, antes de llamar a1 metodo Fill ( ) tendriamos que asignar el valor AddWi thKey a la propiedad MissingSchemaAction. Debe tener en cuenta, sin embargo, que a1 recuperar datos teniendo esta informacion se sustituiran automhticamente aquellas filas en las que el valor de la columna clave coincida con las recuperadas del origen.

El objeto DataSet dispone de la capacidad suficiente como para facilitar la edici6n local de 10s datos, almacenando tanto la informaci6n original como 10s cambios que se hayan ido produciendo en el conjunto de datos. Cada una de las filas de cada tabla mantiene en la propiedad RowState un indicador con el que es posible saber si se ha cambiado o no, si se trata de una fila nueva o bien si se ha eliminado. Partiendo de esos cambios, el metodo Update ( ) del adaptador de datos, a1 que hay que facilitar el DataSet como pariimetro, sabe si tiene que ejecutar una sentencia de insertion, actualizacion o borrado. Estas sentencias se encontrar6n almacenadas en comandos a 10s que hacen referencia las propiedades Insertcommand, Updatecommand y Deletecommand, respectivamente, a las que tendriamos que asignar un objeto Command con la informacion de comando y conexi6n apropiada. Siempre que la sentencia de selecci6n utilizada en el adaptador no contenga m i s de una tabla, podemos servirnos de un objeto CommandBuilder para generar automhticamente 10s comandos de insercion, actualizacih y borrado. Como se aprecia en la figura 9.2,los componentes CommandBuilder de cada proveedor no guardan, aparte de ser derivados todos de Component, ninguna relacion especial entre si. No obstante, funcionan de manera practicamente idhtica y cuentan con 10s mismos miembros, entre ellos tres llamados GetInsertCommand ( ) , GetUpdatecommand ( ) y GetDeleteCommand ( ) que, como puede suponer, devuelven las referencias a 10s Command ya preparados.
Component
I I

1

OdbcCommandBuilder OleDbCommandBuilder

I

I

I

OracleCommandBuilder SqlCommandBuilder

Figura 9.2. Objetos CommandBuilder de cada proveedor

9. Conjuntos de datos

Puede ver c6mo funciona un objeto CommandBuilder con un ejemplo tan simple como el siguiente, en el cual se crea un SqlCommandBuilder a partir de un adaptador de datos ya existente. Una vez creado, podemos utilizar 10s m6todos antes citados para acceder a 10s comandos y obtener las sentencias SQL. El resultado de la ejecuci6n seria el de la figura 9.3. Cambie de proveedor y ver6 c6mo las sentencias se ajustan, en consecuencia, a la sintaxis del nuevo origen de datos.
I m p o r t s System. Data. S q l C l i e n t Module Module1 Sub Main( ) Dim Adaptador As New SylDataAdapteri "SELECT * FROM Editoriales", "Data Source=inspiron; Initial Catalog=Libros; "User ID=sa; Password=")
~

"

&

Dim Cornandos As SqlCommandBuilder = New SqlCommandBuilder(Adaptador)

Console.WriteLine("INSERT='{O]'" & vbCrLf & vbCrLf & "UPDATE='{l]'" & vbCrLf & vbCrLf & "DELETE='{ZJ'", Cornandos.Get1nsertCommand ( ) .CornrnandText, Cornandos. GetUpdateCommand ( ) . ComrnandText, Cornandos.GetDeleteCommand().CommandText)
End Sub End Module

-

Figura 9.3. Sentencias de insercion, actualizacion y borrado generadas por el CommandBuilder

Programacidn de bases de datos con Visual Basic .NET

En la figura 9.4 se ha representado de forma esquemitica, y simplificada, el modelo de objetos empleado para acceder a un origen de datos, llenarlo con informaci6n y despues actualizarla. Observe que el Data S e t no forma parte del proveedor de datos, mientras que el resto de elementos si. Establecidos 10s parimetros de la conexih, creariamos un DataAdapter y un CommandBuilder asociindolo a1 primero. A continuacih llamariamos a1 metodo Fill ( ) para obtener 10s datos, con 10s que trabajariamos internamente o mediante una interfaz de usuario. A1 Ilamar a1 metodo Update ( ) , el DataAdapter haria us0 del CommandBuilder para enviar a1 origen las sentencias necesarias.

DataAdapter Connection

InsertCommand Updatecommand

Figura 9.4. Relacion entre conjuntos de datos, adaptadores, generadores de comandos y conexiones

Debe tener en cuenta que el metodo Update ( ) del adaptador se sirve del estad0 de cada DataRow de la tabla para determinar si necesita 0 no ser actualizada. No debe llamar al metodo Acceptchanges ( ) del DataSet antes de invocar a Update ( ) , ya que, de hacerlo, todos 10s RowState volverian a su estado por defect0 y el adaptador no encontraria nada que actualizar. Tras Ilamar a Update ( ) , a fin de mantener sincronizado el DataSet, puede llamar a Acceptchanges 0 bien volver a invocar al metodo Fill ( ) a fin de ver no solo 10s cambios propios sin0 tambien 10s de terceros.

Ahora que conocemos te6ricamente el funcionamiento de un adaptador y, en parte, el de un DataSet,vamos a ir poniendo en prictica algunas de las operaciones posibles usando conjuntamente ambos elementos. Primer0 conectaremos con el origen de datos y generaremos un DataSet a partir de 10s datos de uno de 10s origenes, recorriendo despues las tablas para conocer su estructura y contenido.

9. Conjuntos de datos

Despuks veremos c6mo efectuar algunas operaciones sobre 61 y c6mo devolverlas a1 origen de datos. Una vez que nos hayamos familiarizado con estas operaciones bdsicas, continuaremos profundizando en 10s detalles de 10s DataSet y la realizaci6n de otras operaciones.

Recuperacion de datos
Utilizando el proveedor S q l c l i e n t , para acceder a SQL Server, vamos a preparar un adaptador que nos devuelva en un DataSet las tablas E d i t o r i a l e s y L i b r o s que hay en la base de datos. Recuperaremos las tablas por separado, con dos sentencias independientes, obteniendo asi varios conjuntos de datos segtin se vio a1 tratar 10s DataReader. En este caso, sin embargo, no tendremos que pasar explicitamente de un conjunto a otro y leer las filas de manera individual, sin0 que obtendremos toda la informaci6n de una vez. Creado el adaptador de datos y el propio DataSet, nos limitamos a llamar a1 metodo F i l l para ejecutar 10s comandos y recuperar la informaci6n de esquema y datos propiamente dichos. El resto del programa, como puede verse a continuaci6n' es una sucesion de bucles con 10s que recorremos todas las columnas de cada fila a de cada tabla que contenga el D t aS e t .
Imports System.Data.SqlClient
Module Module1

Sub Main( )
x-

Dim Adaptador As New SylDataAdapter( "SELECT * FROM Editoriales; SELECT * FROM Libros", "Data Source=inspiron; Initial Catalog=Libros; " & "Uscr l D = s a ; Fasswoid-")

Adaptador.Fi11 (Datos)

Dim Tabla As DataTable Dim Colurnna As DataColumn, Fila As DataRow

For Each Tabla In Datos.Tables Con sol e . Write Li ne ( "Tab1 a ' "
&

Tabla. Tab l e N a m e

&

"

'")

For Each Columna In Tabla.Columns Console.Write (Columna.ColumnName & v b T a b ) Next co (vbCrLf & New String("=", 7 0 ) )

Programacidn de bases de datos con Visual Basic .NET
For E a c h Fila In Tabla.Rows I ,:, c > l c s T,LIiori:-.5 de 2.3d.i #-.oluir!r;,s For E a c h Columna In Tabla.Columns Console.Write(Fila(Columna)) Console.Write(vbTab) Next Console.WriteLine() Next Console.WriteLine0 Next
E n d Sub E n d Module

La llamada a1 m4todo F i l l ( ) provoca el envio del comando a1 origen de datos, en este caso SQL Server, que procesa las dos sentencias SQL facilitadas de manera independiente, devolviendo dos conjuntos de resultados. fistos son recogidos por el DataAdapter, que se encarga de crear un DataTable por cada conjunto de datos recibido. Puesto que no hemos especificado de manera explicita nombre alguno para las tablas, el propio adaptador les darii un nombre por defecto. A continuacih, dentro de cada DataTable, se definiriin 10s Datacolumn que se precisen, utilizando para ello la informacih de esquema facilitada por SQL Server. De esta forma se estableceriin, entre otros datos, el nombre y tip0 de cada columna. Por Liltimo, se aiiadir6n a cada DataTable tantos DataRow como filas de datos compongan cada conjunto. A1 ejecutar el programa deberia obtener un resultado similar a1 de la figura 9.5. Observe 10s nombres asignados a las tablas, Table y Tablel.

I

I

Figura 9.5. Contenido del D a t a S e t

9. Conjuntos de datos

La ejecuci6n por lotes, introduciendo varios comandos en la misma sentencia, es una caracteristica que no contemplan la mayoria de 10s origenes de datos, excepci6n hecha de SQL Server. El mismo resultado anterior podria conseguirse usando dos adaptadores de datos independientes, uno para cada comando, y sendas llamadas a sus metodos Fill ( 1 . Puede comprobarlo eliminando la primera parte del programa anterior, hasta la declaracidn de la variable Tabla,y sustituyendola por el codigo siguiente:
D i m Conexior) As New SqlConnection (

~

"Data Source=inspiron; Initial Catalog=Libros; "User I D = s a ; Password=")

"

&

D i m AdaptadorEditoridles As New SqlDataAdapter(
"SELECT

-

* FROM Editoriales", Conexion)

D i m AdaptadorLibros As New SylDataAdapter( " S E L E C T * FROM Libros", C o n e x i o n )

Di

a Set ( "M 1 c Da t o s " )

Adapt arJo r Fd 1 t or i a 1e s . Fi 1 1 ( Da t o s , " t'd I t o r i a 1 e s " ) AdaptadorLibroq. Fill (Datos, "Libros")

Observe que en este caso hemos facilitado como segundo parametro del metodo Fill ( ) el nombre que deseamos dar a 10s DataTable. Otra opcidn seria ariadir un elemento a la colecci6n TableMappings de cada adaptador, indicando el nombre de la tabla origen, que suele ser Table si en la sentencia SQL no se ha establecido ninguno, y el nombre que deseamos dar a1 DataTable.En cualquier caso, a1 ejecutar el programa tras estos cambios el resultado sera practicamente identico, tan s610 diferiran 10s nombres de 10s DataTable existentes en el DataSet.

En el ejemplo anterior, por la consola se da salida a una combinacidn de informacidn de esquema (el nombre de las columnas) y de datos contenidos en las tablas. Vamos ahora a centrarnos en la informaci6n de esquema que, en cierta manera, restringira las operaciones que podemos efectuar con 10s datos de cada fila de cada tabla. En principio, a1 llamar a1 metodo Fill ( ) de un adaptador de datos, la unica informaci6n de esquema que se recupera es la de las columnas: nombre, tipo, longitud maxima, valor por defecto, etc. No se obtienen, por el contrario, las restricciones aplicables a las columnas que actuan como clave primaria, ni se indica que dichas columnas deben mantener valores unicos o que se generan automaticamente como una secuencia.

en el que recupergbarnos datos. S i hemaTyye.F i l l S c h e m a ( D a t o s . Pa-sword=") " & D i m A i a p t a d r F d i t c r i a l e s As New SqlDataAdapteri "SELEPT * FROM E d i t o r i a l P s " . siendo una de las versiones sobrecargadas la siguiente: A . habria que hacer una llamada a Fi 11Schema ( ) por cada conjunto de datos a recuperar. lo que se hace en el c6digo siguiente: D i m C o n e x i o n As New SqlConnpction ( "Data Sour(-t=inspiron. I r l i t i a l Catalog=Libros. 0. " L i b r o q " ) . D a t o s . R e l a t i o r i s . A1 aiiadirse de rnanera independiente. lo que ni 10s adaptadores ni el DataSet pueden determinar es la relacion entre 10s distintos DataTable creados. Source. C o l u m n s ("Editorial")) ) .Tables("Libros")." ) A J .Mapped. SchemaType . S o u r c e .F i l l S c h ~ r n a ( D2t J s . un DataRelation.F i l l S c t l e m a ( D a t a S e t . SchemaType . Sin embargo. S o u r c e . NombreTabla El primer y tercer padmetro corresponden a 10s que hemos facilitado a1 metodo Fi 11 en el ultimo fragment0 de codigo del punto anterior. no obstante. utilizando para ello el metodo Fi 11Schema ( ) . C i r l e x i o n ) D i m D a t o s As New D a t a S c t ( " M i s D a t o . esta informacih puede generarse f6cilmente creando una relaci6n.E d L i b r o " . aiiadiendola a la coleccion Relations del DataSet.Tables ( " E d i t o r i a l e s " ) .. por el contrario. por lo que no se generan las restricciones apropiadas de clave externa. precisamente. incluidas las restricciones de claves primarias. "IJCcr ID=sa. " E d i t o r i a l e s " ) A ? a y t a d o r L i b r r > s . El segundo determina si la informacih de esquema creada en el DataSet es la del origen de datos.NET Antes de recuperar 10s datos propiamente dichos. generando en el DataSet un DataTable con toda la informacih. Como en el ejemplo anterior. ? a p t a \ j r ) r . Este toma distintas listas de argumentos. S c h e m a T y p e . es necesario establecer algun tipo de asociacion. p t a ~ o r E d i t o r i a l e s . Datos. C o l u m n s ( " I D E d i t o r i a l " ) . entre las tablas. Datos. podemos preparar el Data Se t obteniendo toda la informacion de esquema.Programacion de bases de datos con Visual Basic . S c h e r n a T y p e . A d d (New D a t a R e l a t i o n ( " F K . C o n e x i o n ) Dim A d a p t a d o r L i b r o s As New S y l D a t a A d a p t e r i "SELECT * FROM L i b r o s " . Esto es.

t r a i n t For Each l i b l a I n b a t -. C o l u m n s (01. 601 1 Next Console.: {l]".T2bles bla ''I & Tabla.6. asi como las restricciones definidas en cada tabla. Columna.AllowDBNull}.{"Tip"". Observe 10s atributos de las columnas IDEditorial e IDLibro. R e s t r i c c i i n As C o n . - .. F o r e i g n K e y C o n s t r a i n t ) .ConstraintName) CType(Restriccior1. Podemos mostrar 6sta por consola con el codigo siguiente. que producirs el resultado mostrado en la figura 9.TabltName * * * * * ' I & ""' & - & vbirLf) - { "Nombre". Columna. UniqueConstraint).WriteLine("***** RESTRICCIONES * * * * * ' I & vbCrLf1 Fo mbre C o n s tr a i n t s . Conjuntos de datos Tras las dos llamadas a Fillschema ( ) . DatosColurnnas (Contador. Colurnna. DatosColumnas (Contador. Con esto se generan automiticamente las restricciones apropiadas. C T y p e ( R e s t r i c c i o r 1 . tendremos un DataSet sin datos per0 con toda la informaci6n de esquema. T o S t r i r .: { O]".-15]. A1 ejecutar el codigo anterior. D a t a T y p e . - - 1 )) C o n s o l e . W r i t e L i n e (New String("=".Columr~Ndme}. Columna . Dim I d k > l a As D a t a T a b l e .RelatedColurnns (0) 1 Else Console. Restriccion. C o l u m n a .Unique). F o r e i g n K e y C o n s t r a i n t ) .WriteLine("Valor l i n i c o : {O)". { "Autoincremento". O i .AutoIilcrement 1 {"Valor unico". una referencia a la columna de la tabla principal y otra a la columna de la tabla de detalle. - . ~ ( )1 . Facilitamos a su constructor el nombre que deseamos darle a la relacion. observe c6mo se afiade la relaci6n entre las tablas creando un objeto DataRelation.9. { "Admite nulo". CType(Restriccior1..Columns(O)) .

NET Figura 9. lnformacion de esquema del conjunto de datos .Programacidn de bases de datos con V i s u a l Basic .6.

deberia obtener el ultimo valor existente en la tabla. En cualquier caso. se comprobarian las restricciones definidas.El identificador lo asigna automiticamente la base de datos en algunos casos. por tanto. por ejemplo. tendriamos que interceptar el evento Rowupdated del adaptador. que existiesen valores duplicados en las columnas que actuan como clave o un c6digo editorial inexistente en un libro. Por ello lo mejor es usar un generador. Conjuntos de datos Teniendo el DataSet en este estado. en la que se almacena el ultimo valor de la columna identidad. Partiendo de que tenemos un Data S e t con toda la informaci6n de esquema de nuestras tablas. no impidiendo el us0 de ese nuevo identificador en la tabla de libros. 10s libros estan haciendo referencia a editoriales que no existen. No puede introducir el libro directamente. Basta con recurrir a la propiedad Rows de cada tabla para encontrar una fila. utilizando una sentencia SELECT para leer la variable @@I DENT I TY. Tendria. Si tras las dos llamadas a Fillschema ( ) del ejemplo anterior intenta ejecutar la sentencia AdaptadorLibros. cambiar sus datos. el orden en el que invoque a 10s metodos Fill ( ) de cada adaptador es importante. Fill (Datos. Suponga. que crear primer0 la nueva editorial en la tabla Editoriales. correspondiente a un titulo perteneciente a una editorial que no esti definida en la tabla Ed1 toriales. segun el tip0 de origen de datos que se use. lo cual no nos garantiza que otro cliente. y todas sus filas. efecttie idhtica operaci6n y emplee el mismo c6digo. Por el camino. "Libros"). Debe tener en cuenta que. sin embargo. secuencia o procedimiento almacenado. Veria que se produce una excepcion. muy sencillo. que necesita afiadir una nueva fila a la tabla Libros. manipular el contenido podria parecer. eliminarla o afiadir nuevas filas. En el primer caso. al no haber todavia datos en la tablade editoriales. en la misma situacih. podemos encontrarnos algun obsticulo que otro. por ejemplo. violando una de las restricciones. mientras que otros se estableceria mediante c6digo. En ese momento no s610 se almacenarian 10s valores de las filas en 10s correspondientes DataTable sino que. incrementarlo y usarlo como identificador. En el segundo. llamariamos a1 metodo Fill ( ) de cada adaptador para recuperar 10s datos. para obtener el c6digo asignado a la editorial por el origen de datos. columna de identidad. ademds. con toda la informaci6n de esquema y las relaciones definidas. en principio. Para ello bastaria con una nueva llamada a1 me- . tras crear la nueva editorial habria que actualizar el Data s e t a fin de que refleje el nuevo estado de la tabla. puesto que a1 no existir la editorial obtendria un error a1 violar la restricci6n de integridad referencial generada a partir de la relaci6n entre ambas tablas. evitando.9. Esto es asi porque. una vez se han definido las restricciones.

Conexlon) 1- - riales. Conexion) Dim AdaptadorLlbros As New SqlDataAdapter( "SELECT * FROM Libros". insertariamos el nuevo libro.RowUpdated.Source . "User ID=sa. "Editorlales" ) AdaptadorLlbros. " Ed itoria 1es " ) lScherna(Datos.Tables ("Libros").NET todo Fi 11 ( ) . "Libros" ) f .:nLjil Dim Conexion As New SqlConnection ( "Data Source=inspiron.' I . SchemaType. Initial Catalog=Libros.SqlClient Sub Main I r pe ~ .Tables ("Editoriales") ..Re 1at io ns .Add (New DataRe 1at io n ( " FK-EdL ib ro " ..Rows . F l l l (Datos. Fill (Datos.n??> 5 i 1 lL L-t. Source.FillSchernai .7 : ).Data. Da tos .... Por Gltimo..>1.i - AdaptadorEditoriales. Datos . El proceso completo queda reflejado en el programa siguiente: Imports System. ' 1 1 Dim Datos As New DataSet ("MisDatos") t 1 s.5 L i n d .Columns ("IDEditorial") ....Columns ("Editorial")) ) +_ ' .. New SqlRowUpdatedEventHandler(Address0f ActualizaEdltorlales) I" i Dim CornandosEditorlales As New SqlCornmandBullder( AdaptadorEditoriales) Dim CornandosLibros As New SqlCornmandBuilder( AdaptadorLibros) I - - - 1 -1 -. Password=") i I I' & - Dim AdaptadorEdltorlales As New SqlDataAdapter( "SELECT * FROM Editoriales".Tables ("Editoriales") . Datos. "Libros") 1 3 1 Dim Filas As DataRowCollection = Datos.. ) :<.Programacidn de bases de datos con Visual Basic .

Fijese t a m b i h en la codificacidn del m6todo ActualizaEditoriales ( 1 . I I . 43" AdaptadorEditoriales. ByVal args As SqlRowUpdatedEventArgs) ~ If args.StaternentT -_ - IDEditorial = New SqlCommand ("SELECT @@IDENTITY". "0-471-37523-3". IDEditorial. En su interior comprobamos si lo que se produce es una insercidn. que se ejecutar6 cada vez que se actualice una fila de la tabla Editoriales.WriteLine("Nuevo codigo d e editorial: {O}". Observe c6mo se afiaden nuevas filas a las tablas.Rows Filas. . args. "Editoriales"] Da t os .5)) 'I I i .Update (Datos. Find(1)("Direccion") = "Telkrnaco.Add(New Object( ) {O. 60. Conjuntos de datos Fi w York" 1 ) Filas.Executescalar ( ) t i Console. " Je f f Dun t ernan n " . "Ass emb 1y La rig u ag e S t ep-by. IDEditorial) End I f End Sub E n d Module Ademis de afiadir una nueva editorial. se utiliza el metodo Find ( ) de la coleccidn Rows de la tabla de editoriales para encontrar la que corresponde a1 identificador 1 y modificar su direcci6n.S t ep . mediante el m6todo Add ( ) . 5 I + 1 2 L L L ' AdaptadorLibros.Cornrnand.Tables ("Libros") .9.Connection1. caso en el cual recuperamos el valor del identificador y lo almacenamos en una variable. " Ed1 tor i a 1 es " ) Filas = Datos. "Libros") End Sub ctualizaEditoriales( ByVal sender As Object.Update(Datos. facilitando como argument0 un arreglo con todos 10s valores.

siendo posible definirla tambien mediante cbdigo. se aAadiran multiples editoriales y Iibros a las respectivas tablas. indicando su tip0 y otras propiedades. creando objetos DataTable y DataColumn y definiendo sus propiedades. sin0 que se quiere almacenar la informaci6n localmente en un archivo para trabajar de forma independiente. En lugar de instalar. Las colecciones Tables y Relations de un DataSet son dindmicas. decide generar el DataSet mediante c6digo de la siguiente manera: . con exactamente la misma informacion per0 distintos identificadores. segun se ha visto en 10s ejemplos previos. Lo mismo ocurre con las colecciones Columnas y Rows de un DataTable. Consulte la informacion de referencia de la clase DataTable para ver las diferentes versiones que existen de dicho metodo y saber como se usa. En 10s siguientes vamos a crear un DataSet con dos tablas relacionadas. tambien puede usar el metodo Select ( ) para recuperartodas aquellasfilasque cumplen un cierto criterio de busqueda. Es una tkcnica que resulta apropiada. ya que estos 10s genera automaticamente SQL Server. cuando no va a utilizarse un origen de datos tip0 RDBMS o base de datos. Despues vendria la inserci6n de datos. y una relaci6n entre esas dos tablas.NET Si ejecuta este programa varias veces. configurar y utilizar un RDBMS. que se emplea para encontrar la fila que tiene un cierto valor en la columna que actua como clave principal. en un supuesto proyecto para una pequeiia clinica privada que dari como resultado una aplicaci6n instalada en un solo ordenador y con un solo usuario. insertando algunas filas en ellas. por ejemplo. Creacion de tablas. esto no resulta imprescindible. por lo que pueden aiiadirseles elementos. nuevas tablas y relaciones. para lo cual son vigentes las mismas normas vistas en 10s puntos anteriores. no tendriamos mucho problema para definir dos tablas con varias columnas. Definicion de conjuntos de datos Aunque la estructura de un DataSet puede extraerse de un origen de datos. columnas y relaciones Suponga que desea crear un conjunto de datos para almacenar informaci6n relativa a pacientes y sus historiales.Programacion de bases de datos con Visual Basic . S610 sabiendo esto. Ademas del metodo Find ( ) .

Type.*. .Add ("Historial") IL.Int32") ) .t:. i j . Type.AutoIncrementStep .PrimaryKey = New Datacolumn() [Historial.AllowDBNull = False End W i t h End W i t h .GetType("System. Type.DateTirne") ) W i t h . f .GetType("System.Readonly = True End W i t h x = = 100 5 .Lil.9.GetType("System.GetType ("System.MaxLength = 50 End W i t h W i t h .7 .. Type.Columns ("IDEntrada")) .Tables.MaxLength = 40 .Columns ("IDPaciente")) 1- ) - " Type.Add("Fecha". L ) I- Pacientes.Add ( " Dire ccion".MaxLength = 12 End W i t h End W i t h .AutoIncrementStep = 1 .Columns Type. Type.iii. Conjuntos de datos Di aSet ("Hospital") D i m Pacientes A s DataTable D i m Historial As DataTable = = Datos . W i t h Pacientes .String")) . PrimaryKey = New DataColumn ( { Pacientes.Readonly = True W i t h .Stririg") ) . ::i.Add ( "Tel e fono". Ge tT ype ( "System.AutoIncrement = True .Add("Paciente". i. . Type..MaxLength = 1024 . .Add("Descripcion". GetType ( "System.Add ("Pacientes") Datos .C'L.. c.Add("Nombre".r.AllowDBNull = False End W i t h W i t h .AutoIncrementSeed = 1 .iQrL? - Historial.Int32") ) ..Tables.AutoIncrementSeed .GetType ("System. . I . Int32") ) .GetType("System. String" ) ) .-e . St r i rig" ) .

Para llenar el DataSet con datos no vamos a conectar con un origen. 5 4 " . A medida que van afiadiendose columnas. definir un comando y llamar a1 mktodo Fill ( ) de un adaptador. Las columnas que actuan como clave. el mismo estado que obteniamos tras las llamadas a Fillschema ( ) de un ejemplo previo. A continuacicin tenemos dos bloques de c6digo similares. Podemos recuperar su valor leyendo la columna de la fila r e c i h ariadida. Re1 a t 1o n c . concretamente en la columna Paciente.ya que &tos son tipos y lo que necesita el constructor es un valor que identifique a1 tipo. sino que iremos afiadiendo fila a fila e introduciendo 10s datos apropiados en cada una de las columnas. como MaxLeng th oAllowDBNul1. Para ello usamos el metodo Add ( ) que. ~ Eacierit ~ s .NET Da t(> = . En este momento tenemos un Data S e t con informacion de esquema per0 vacio. Fijese tambien c6mo se establecen como claves principales asigntindolas a la propiedad PrirnaryKey de sus respectivas tablas. No podemos entregar directamente. La primera columna de cada tabla. s H i r t i r i a l . como puede ver. Integer o System.NewRcw() P a c i e n t e ("Nornbre" ) = " F r a n c l s c o C h a r t e " P a c i e n t e ( " D i r e c c i o n " ) = "Apdo. C o l u m n ( " I D P a c i e n t e " ] . ya que la clave principal puede componerse de multiples columnas. en 10s cuales vamos afiadiendo elementos a las colecciones Columns de cada uno de esos DataTable. esta relacion generarti automtiticamente otras restricciones. se definen solo de lectura y con increment0 automtitico. Dicha propiedad necesita un arreglo de objetos Da taColumn. IDPaciente eAdentrada. Int32. dos tablas llamadas Pacientes e Historial. segun la tabla. clave primaria definida como so10 de lectura y con autoincremento. Finalmente. aiiadimos una relaci6n a1 Data Set creando una clave externa en la tabla Historial. c o l u m r ~ s "Pac-ierlte")) ) ( Creamos un DataSet vacio a cuya propiedad Tables afiadimos dos elementos. como valor.Programacidn de bases de datos con V i s u a l Basic . cuyas referencias almacenamos en sendas variables. Lo obtenemos mediante el metodo compartido GetType ( ) de la clase Type. En este caso creamos el arreglo con un unico elemento: la columna IDPaciente o IDEntrada. se usa la referencia devuelta por el metodo Add ( ) para establecer algunas propiedades adicionales. Es lo que se hace en el c6digo siguiente para enlazar las entradas de historial con el paciente que corresponda: I Dim P a c i e n t e As DataRow = Pacientes. Como sabe. tomarii su valor automiiticamente a medida que vayamos afiadiendo filas.Add (New L)a t a R e 1a t 1 on ( " FK 11 I st o r 1a 1P a c i ent e " . toma dos partimetros: el nombre del nuevo Datacolumn y el tip0 de dato. enlazada con la clave primaria de la tabla Pacientes.

Para verlo en la practica. ROWS . RI ds . vamos a aiiadir a1 programa compuesto por 10s dos bloques de c6digo previos. r r o " ) = " P e r . implicita o explicitamente. A d A ( E n t r a d a ) I'acierlte = 1erAte " N ~ ~ r n b r e " ) ( Pdcientes.9. A d 3 ( P a c i e n t e ) Dim E r t t r a d a As D a t a R o w = H i s t o r i a l . recibe como parimetro una referencia a un D a t a S e t y muestra por la consola su estructura. A d d ( P a c i e r L t e ) Si durante este proceso infringimos alguna de las restricciones definidas en las tablas. 12" P.r~r") " 1 2 3 4 5 6 789'' = P a c i e n t e s . y facilitado el contenido de las tablas que lo componen. el metodo para obtener esa informacion y contenido son 10s mismos que ya conocemos. muy similar a1 usado en un ejemplo anterior. se producira la correspondiente excepci6n. El c6digo de este metodo. ROWF.icier. Ocurrir6 esto si.NewKow( ) " F i l i ~ ~ i F i~ l ~ "~ . dos metodos adicionales. N e w K o w ( ) C n t r a d a ("Paciente") = Paciente ( " I D P a c i e n t e " ) Erltrada ("Fecha") F r l t r a ?a ( " Des c r I p ) = " ( ' ~ l i c o renal" Hlst. r i a l . Conjuntos de datos P a c i e n t e ( " T e l e f o n o " ) = " 7 6 3 376 3 2 1 " P a c i e n t e s . seria el mostrado aqui: Sub I r t f o r m a c l o n E s q u e m a (ByVal D a t o s As D a t a S e t ) . a1 que llamaremos InformacionEsquema ( ) . El primero. r t _ _ I -- Independientemente de c6mo se haya creado la informacion de esquema del D a t a S e t . intenta establecer el valor de las columnas I D P a c i e n t e o I D E n t r a d a duplicando un valor existente o si aiiade una entrada que haga referencia a un paciente inexistente. introducidos en el metodo Main ( ) .te("Telefor. por ejemplo.

{ "Longitud". Wri teLlrie ( "Clave externa : { 01 .DataType. DatosColumnas (Contador.: { 0)'' & vbTab. Columna.AllowDBNull]. ["Tipo"..W r 1 t eL 1 n e ( " * * Fo * REST R ICC IO N E S * * * * " ) riccion In Tabla .Columns "Nombre". - Console.ColumnName]. WriteLine (vbCrLf1 Next End Sub . Columna.Columns ( 0 ) ) End If Next 'I. 1) ) - Ne Console. f - r.WriteLine ("Tabla ' ' I & Tabla. Columna. ForeignKeyConstrairit) .ToString()} . W r i t e L i n e ( " * * ~ *COLUMNAS * *****'I & I"" & - ) For Each Columna I n Tabla.Constraints e .TableName vbCrLf & New String("-". - Dim Contador As Byte ' For Contador = 0 To 5 co .Unlque).WriteLine("Valor iinico : t o ] " . { "Autoincremento". Columna .MaxLength1 1 J .-15). . 0 ). 1atedColumns ( 0 ) ) Else ' i Console. CType(Restriccior1. DatosColumnas (Contador. UnlqueConstralnt). .WrlteLlne(New String("=".: {l)". 6 0 )) Next Cons o 1e . Restriccion As Constraint Dim Columna As Datacolumn. CType(Restriccion.AutoIncrement {"Valor unico". ~ t C + : I Console.Prograrnacidn de bases de datos con Visual Basic . Columna . Columna. F i l a As DataRow Fo Console. 4 0 ) ) C o n s ~ l e .NET Dim Tabla As DataTable.Columns( O ) . ["Admite nulo".{ 1 } CType(Restriccion.

cada DataRow mantiene una indicaci6n de su estado. El c6digo seria el siguiente: I Sub MuestraContenido (ByVal Datos As DataSet) D i m Tabla A s DataTable D i m C o l u m n a As DataColumn. 16gica- . La ejecuci6n deberia producir un resultado como el de la figura 9. para mostrar su contenido.ColumriName & vbTab) Next vbCrLf & New S t r i n g ( " = " . F i l a As DataRow Console.En este caso lo que se hace es recorrer todas las tablas. For Each C o l u m n a In Tabla. C o l u m n s Console.WriteLine Next Console. indicando el nombre de cada columna. 70)) bla. llamado MuestraContenido ( ) . afiadiriamos a1 final del metodo Main ( ) sendas llamadas a estos dos metodos.7.WriteLine( "Tabla "' & Tabla. facilitando como unico pariimetro el DataSet Datos cuya estructura y contenido hemos preparado previamente.9. Tras la inserci6n de datos efectuada en 10s DataTable de nuestro DataSet. Para ello. en este caso todas las filas son nuevas. de tal manera que podria abrirse una conexi6n de datos con un origen. tambien recibe como pariimetro un Data S e t.Write(vbTab) Next Console. Conjuntos de datos El segundo metodo. Fijese tambien en las restricciones que han surgido a partir de haber definido las claves primarias y la clave externa.Write(Columna.Write( F i l a ( C o l u m r 1 a ) ) Con?nle.WriteLine ( ) Next End Sub ( ) Para completar el programa. Observe c6mo se han generado 10s valores de las columnas IDPaciente e IDEntrada seg6n el valor de inicio e increment0 que habiamos definido.ColumnConsole. y filas de cada tabla. prepararse un adaptador y enviarse la informaci6n a un RDBMS.TableNarne & '"") For Each C o l u m r ~ a In Tabla.

NET mente. Estructura y contenido del D a t a S e t definido mediante codigo . en el origen de datos deberia existir exactamente la misma estructura o esquema que hemos definido nosotros en el D a t a S e t.7. ~ Figura 9.Proaramacidn de bases de datos con Visual Basic .

recuperando toda la informacidn de esquema de dicho archivo. teniamos que definir manualmente la relacibn entre las tablas Editoriales y Lib ros generando las correspondientes restricciones de integridad referencial. Escritura de esquema y datos LaclaseDataSet cuentaconlosmCtodosWriteXmlSchema ( ) yWriteXml().podemos almacenar conjuntamente esquema y filas de datos. en forma de esquema XML. por ejemplo EsquemaHospital xsd.9. Se asume que la estructura de las tablas en el origen no van a cambiar. siendo la finalidad del primer0 guardar el esquema de 10s datos. tendr6 que conocer la sintaxis de 10s esquemas XSD. detrds. Si la informacidn de esquema no va utilizarse nunca de forma independiente. ya que en ese caso la informacion de esquema que hay en el archivo XSD podrian no coincidir con 10s datos recuperados por el adaptador. a1 principio. De esta forma. si puede almacenarse y recuperarse localmente. I . y 10s datos. no s610 a la conservaci6n y recuperaci6n de datos locales. mediante cbdigo. Si no entrega- . y cada vez que se inicie la aplicacibn. en cualquier otro punto de este mismo programa o en otra aplicacGn. En lugar de hacer esto en cada ordenador cliente. Llame a1 final del mdtodo Main ( ) del ejemplo del punto anterior a1 mdtodo WriteXmlSchema ( ) del DataSet. sin0 asociada siempre a 10s datos que contiene el propio DataSet. en un archivo. en el que despuds pueda almacenarse la informacih. sin embargo. El almacenamiento de la informacibn de esquema.Puede verlo con el Bloc de notas. facilitando como Gnico par6metro el nombre del archivo en el que se almacenar6 el esquema. Conjuntos de datos Cuando el esquema de un Data S et se define como hemos hecho en 10s puntos previos.NET para ver una representaci6n (vease figura 9.Wri teSchema.8). despuds de recuperar informaci6n de esquema desde el origen con el mdtodo Fillschema ( 1. En uno de 10s primeros ejemplos del capitulo vimos cbmo. podriamos guardar el esquema en un archivo XSD y distribuirlo junto con la aplicacGn. de manera independiente. se puede aplicar a diversos escenarios. bastaria una llamada a1 mktodo ReadXmlSchema ( 1 de un DataSet para recuperar toda la informaci6n Be esquema. normalmente es porque no existe un origen de datos del que pueda recuperarse y. Posteriormente. . y la del segundo almacenar 10s datos propiamente dichos. h t a . con o sin informacibn de esquema segun interese.El resultado seria un archivo XML conteniendo el esquema XSD. Para ello utilizariamos el mCtodo Writexml ( ) facilitando dos par6metros: el nombre del archivo donde va a escribirse y el indicador XmlWri teMode . tras conectar con el origen de datos tan s610 habria que recuperar 10s datos.lbgicamente. o bien abrirlo directamente en Visual Studio .

.NET para obtener una representacion del esquerna DiffCrams A medida que se efectuan cambios en las tablas de un Data s e t. Figura 9. a pesar de que no se haya invocado a A c c e p t c h a n g e s ( ) .9. La perdida del estado de las filas. Esta informaci6n. invoca a1 metodo homdnimo de cada DataTable. Cuando se almacena la informaci6n en un archivo XML. lo que se almacena son 10s valores actuales de las filas.tambien tendriamos que indicar si queremos leer la informaci6n de esquema o s610 10s datos. mediante el metodo W r i t e x m l ( ) . las colecciones DataRow de cada DataTable alojan no s610 la nueva informaci6n. Podemos usar Visual Studio . A1 recuperar el archivo. por tanto.NET mos el segundo parimetro. permanece ahi hasta que se llama a1 m6todoAcceptChanges ( ) del D a t a S e t que. tras efectuar todos 10s cambios. A1 recuperar el archivo de datos. y la informaci6n previa a la modificacibn.Prograrnacidn de bases de datos con Visual Basic . tendriamos un Data s e t con datos per0 sin informaci6n de c6mo se oper6 sobre estos. el archivo contendria s610 10s datos como puede apreciarse en la figura 9. relativa a 10s cambios producidos desde que se cre6 o recuper6 el contenido del D a t a S e t .8. no seri importante si la aplicaci6n esti diseiiada para trabajar siempre localmente. como sabe. sin0 tambien el estado y 10s datos que contenian previamente. mediante el metodo ReadXml ( ) .

. sin embargo..... .. .. . sin informacion de esquema Suponga. Conjuntos de datos . . .. deberhn almacenarse localmente a fin de quc puedan posteriormente. A partir de ahi.. - f. Estructura del archivo XML conteniendo solo 10s datos.. "_\C?: .... una estructura en la que s c determina el estado de cada fila y.... . en alg6n momento en que se tenga conexibn.. Estos pueden alma. que la aplicaci6n que esth disefiando obtiene el esquema y 10s datos a partir de una conexi6n con un origen de datos. . se indica cud1 era el estado anterior i . sin0 1: propia informacih de 10s cambios que han ido efectuindose.._ . En un caso asi es imprescindible conservar no s610 10s datos nuevos. ademis... .9... ...s >"' ..9..... Todas las ediciones....... tiene que trabajar sin conexi6n porque el programa.gt....... r--. . \\Ek400\SiitansC\ . se ejecuta en un portitil y el usuario viaja de un punto a otro sin posibilidad de conexi6n permanente con el servidor de datos. por lo tanto.v'-F--.. ... por el contrario.. Figura 9. . resolverse con el origen de datos. cenarse en un documento XML con formato DiffGrarn. pongamos pol caso.... ...

Puede hacerlo con una sentencia como la siguiente: P a c i e n t e s . antes de recuperar 10s datos propiamente dichos. 0 Observe que el primer paciente y la entrada que hay en su historial no cuentan con la propiedad haschanges. Aqui aparecerian. Alli encontramos 10s valores que tenia la segunda fila de la tabla Pacientes antes de efectuar el cambio indicado mbs arriba. Di f fGram como segundo parbmetro. con una llamada aWriteXmlSchema ( ) . Fijese en c6mo se identifica de manera inequivoca cada fila de cada tabla con un entero asignado a la propiedad roworder. Fijese en la parte inferior del documento.NET 10s cambios y 10s posibles errores que pudieran haber surgido. de igual forma. partiendo del c6digo del ejemplo anterior. en la rama <diffgr: before>.DiffGram. como en la figura 9. En las dem6s entradas podemos apreciar el estado modi f ied o inserted. a fin de ver la estructura del DiffGvarn. como segundo parbmetro. Puede efectuar una prueba. Dk 10s pasos siguientes: 0 Despuks de aiiadir 10s dos pacientes a la tabla paciente. 10s contenidos de las filas que pudieran haberse eliminado. recuperandose posteriormente. Modifique el telkfono del segundo de 10s pacientes. el indicador XmlWriteMode.Prograrnacio'n de bases de datos con Visual Basic . tras aiiadir las entradas del historial del segundo paciente. por lo que esta deberia mantenerse separadamente. en el momento de volver a crear el conjunto de datos. la descripci6n del estado y datos del DataSet. simplemente por modificar un dato que ya estaba aceptado para ver c6mo lo refleja el DiffGrarn. a1 mktodo Wri teXml ( ) pasando el indicador XmlWriteMode .10. ya que tras introducirlos en el DataSet se llam6 a Acceptchanges ( ) . De esta forma 10s cambios quedarbn consolidados y las filas no mantendrbn estado ni valores previos. Haga doble clic sobre el archivo generado para abrirlo en Internet Explorer y poder apreciar.El numero de fila del paciente modificad0 coincide en la rama de datos y en la de valores previos. como puede verse. S e l e c t ( " N o m b r e = ' F i l i p i n o Fino"') 0 (0) "Telefono") ( = "987 654 321" 0 Llame a1 final del ddigo. invoque a1 mktodo Acceptchanges ( ) del DataSet. Al guardar el estado de un DataSet en formato DiffGrarn no se guarda la information de esquema. . En este caso habria que facilitar a1 mktodo Wri texml ( ) .

.

xsd") D a t o s .xml: Contendrfi el DiffGrarn con 10s datos y modificaciones.WriteXml("HospitalCor~Esquema. xsd:Tendri el esquema XML.3. xml: Contendri 10s datos actuales. o bien deducirlo a partir de la estructura de 10s datos. Hospital. ReadXml ( ) siempre puede obtener el esquema. W r i t e S c h e r n a ) Datos .WriteXml ("HnspitalCarnbios . sin esquema y sin informaci6n de modificaciones. D i f f G r a m ) De esta forma tendrd cuatro archivos diferentes con informacih del DataSet: 0 EsquemaHospital . sin informacidn de esquema. deduciendo el esquema si no esta disponible. manteniendo la informacion de cambios Menos habitual.NET El comportamiento de ReadXml ( ) difiere segun el contenido del archivo XML que se recupere. en el que se definia un Data Se t y se aiiadian datos a dos tablas. leyendo tambi6n el esquema. Ese comportamiento por defect0 puede modificarse mediante 10s indicadores enumerados en la tabla 9. 0 0 0 . ya que 4ste no incorpora el esquema en el documento y tampoco es posible deducirlo a partir de 10s datos.xml". X r n 1 W r i t e M o d e . HospitalConEsquema. La Onica excepci6n se produce cuando va a recuperarse un DiffGram.3.WriteXrnlSchema i"EsquernaHospital. recuperando en formato D f f Gram si &ta es la estructura del documento. xml: Almacenard el esquema junto con 10s datos.xrnl". sin datos. si 4ste se encuentra embebido en el documento XML. En el ejemplo desarrollado antes. lee documentos generados en el formato FOR XML de SQL Server Como puede ver. Elementos de la enumeracion XmlReadMode Identifieador Auto Readschema Inferschema Ignoreschema DiffGram Fragment Cornentarlo Determina la operacion a efectuar segun el contenido del documento XML Recuperar el esquema junto con 10s datos Deducir el esquema a partir de la estructura de los datos lgnorar la informacion de esquema que pudiese existir en el archivo Lee el documento como un DiffGram. si estd disponible en el mismo documento.Programacidn de bases de datos con Visual Basic . W r i t e X r n 1 ("Hospital. HospitalCambios . es imprescindible que antes hayamos obtenido el esquema con una llamada a ReadXmlSchema ( ) .rm1") Datos. etc. aiiada las sentencias siguientes a1 final: Datos. X r n l W r i t e M o d e . Tabla 9. por tanto. Si vamos a recuperar un documento de tip0 DffGrarn.

Rea HospitalCarnbios. podemos modificar el bucle final del mdtodo MuestraContenido ( ) dejhdolo asi: For Each F i l a In Tabla. Si lee el archivo Hospital . ya que &a se almacen6. recupere la informaci6n del DiffGram almacenada en el archivo HospitalCambios .xm1") I n f o r m a c i o n E s q u e r n a ( Datos) M u e s t r a C o n t e n i d o (Datos) End Sub A fin de poder apreciar la informaci6n recuperada por el ReadXml ( ) . C o l u m n s C o n s o l e . Observe que antes recuperamos el esquema ya que. y las dos ultimas de la tabla His torial son nuevas.Rows For Each Colurnna In Tabla . per0 no la informaci6n de claves primarias ni externas. Conjuntos de datos En un programa distinto. ni tampoco las restricciones. por el contrario. xml. tal y como se hace en el siguiente fragment0 de c6digo.9. x s d " ) Datos. gstos son elementos que ReadXml ( ) no puede deducir a partir de la informaci6n. W r i t e ( F i l a (Columns) ) Console. xml anterior. En este caso si se cuenta con toda la informaci6n de esquema. Estos datos no 10s veria .Write(vbTab) Next Console. podriamos recuperar el contenido del DataSet usando diversas variaciones del metodo ReadXml ( ) . obtendriamos una excepci6n. ReadXrnlSchema ( "EsquemaHospital. de lo contrario. ver5 que obtiene el nombre y tipos de las columnas. utilizando 10s mismos metodos InformacionEsquerna ( ) y MuestraContenido ( ) del ejemplo anterior para apreciar el esquema y 10s datos. tras ejecutar el anterior. lo han perdido. Pruebe a leer el archivo HospitalConEsquema.11 puede ver c6mo se indica que la segunda fila de la tabla Pacientes est6 modificada.WriteLine("< " & Fila.RowState.sin m&. a1 ejecutar cualquiera de las variaciones veria si las filas mantienen su estado 0. en el mismo archivo y de manera independiente.ToString & " >") Next De esta forma. En la parte inferior de la figura 9. Sub M a i n ( ) Di aSet ( " H o s p i t a l " ) D a t o s . o bien a recuperar el esquema EsquemaHospital. Por ultimo. xml. xml. a fin de poder recuperarla. xsd con una llamada a ReadXmlSchema ( ) y luego recuperar el mismo Hospital.

11.NET si lee 10s documentos Hospital. desde el codigo. . obtenidos o no desde un cierto origen. incrementa la escalabilidad a1 facilitar el acceso de un mayor numero de clientes. Previamente. cuando dicha conexi6n es posible. Indicacion del estado de las filas tras la recuperacion En caso de que desearamos. xml. consolidando 10s datos a posteriori. crear aplicaciones que no cuentan con una conexi6n permanente a1 servidor. por tanto. podriamos comprobar si esa informacion esta disponible usando el metodo Hasversion ( ) del propio DataRow. Figura 9. en 10s que todas las filas aparecerian como insertadas.Prograrnacidn de bases de datos con Visual Basic . son un medio que permite a las aplicaciones trabajar con datos. Esto reduce el us0 de recursos en 10s servidores y. podemos hacerlo utilizando la propiedad Item de DataRow indicando como segundo parametro uno de 10s valores de la enumeracion DataRowVersion. representados por objetos de la clase DataSet. adem&. recuperar Ios antiguos valores de las filas que se han modificado. Los conjuntos de datos. por ejemplo a1 operar en sistemas mbviles. Esta naturaleza desconectada nos permite. sin necesidad de mantener una conexi6n persistente. xml u HospitalConEsquema.

Ha visto en la prdctica c6mo obtener datos. manipularlos y devolver 10s cambios a1 origen.9. asi como del us0 de las clases DataSet. mediante cbdigo. almacenhdolos y recuperdndolos de un archivo XML local. Conjuntos de datos A1 finalizar este capitulo tiene un conocimiento mucho mds profundo de las caracteristicas de 10s conjuntos de datos. Tambien cdmo usar conjuntos de datos creados dinimicamente. DataAdapter. . visualizarlos. DataRow. A pesar de todo. aun quedan ciertos detalles que i r i conociendo con la prdctica y tambien en algunos de 10s capitulos posteriores. etc. DataTable. Datacolumn. como 10s problemas de concurrencia que se tratardn mds adelante.

.

Con ADO. el resultado es inmediato a1 no tener que esperar la respuesta del servidor. Las filas de datos recuperadas. Lo que se hacia en estos casos. Logicamente. por tanto. se precise el mismo conjunto de datos per0 con las filas en un orden diferente. habitualmente. formado incluso por multiples tablas. a1 igual que 10s adaptadores y 10s propios conjuntos de datos.En el capitulo previo se ha visto coma. es posible recuperar un conjunto de datos completo. una operation de este tip0 consume recursos y tiempo del servidor de datos. adem&. durante la ejecucion de una aplicacion.NET existe una alternativa a esa t&cnica. credndolos mediante c6digo para obtener varias vistas diferentes de 10s mismos datos. era enviar una nueva sentencia SQL a1 servidor para recuperar un conjunto de resultados a medida. sin necesidad de tener una conexion persistente con el servidor. o con un subconjunto de la lista de filas obtenidas inicialmente. aunque puede utilizarse el m&todo Select ( ) para obtener una lista de aquellas que cumplen un cierto criterio. Ademds. mediante el us0 de la clase DataSet. alojadas en el interior de objetos DataTable.consistente en utilizar objetos DataView y DataViewManager para obtener diferentes vistas del mismo conjunto de datos. aparecen siempre en el orden en que se obtuvieron. Estos objetos. pueden generarse de una forma mucho mds simple . Nuestro objetivo en este capitulo es conocer el funcionamiento bdsico de Dataview y DataViewManager. el DataTable siempre facilita el conjunto total de filas. Un DataView filtra y ordena 10s datos existentes en un DataSet. No es extrafio que. Se usan. sin necesidad de conectar con el origen de datos y ejecutar un nuevo comando. menos recursos y. y operar sobre 61 localmente.

1. Estado) :Losdosprimerosparimetros coinciden con 10s del formato anterior. Opcionalmente. La clase DataTable dispone de un metodo. puede ser realmente complejo pues se permite el us0 de operadores de diversos tipos. sino que crea un arreglo de referencias a objetos DataRow en el orden apropiado. Select ("Criterio". s610 aquellas que cumplen un cierto criterio. Con 61 seleccionaremos las filas que se encuentran en un cierto estado.NET como tendri ocasi6n de ver en capitulos posteriores. s610 las que cumplen el criterio y en un cierto orden o bien s610 las que cumplen el criterio y tienen un cierto estado y en un cierto orden: Select ( ) : Facilita la lista de todas las filas que forman parte de la tabla. una cadena de caracteres. Miembros de la enumeracion DataViewRowState Added CurrentRows Deleted Filas que han sido aiiadidas nuevas Todas las filas que componen actualmente la tabla a excepcion de las elirninadas Las filas que se han eliminado . Select ( ) no ordena las filas de la tabla. como primer parimetro. En su forma m i s bisica. sigue las reglas habituales de las consultas QBE. mediante el cual es posible extraer todas aquellas filas que cumplen un cierto criterio y / o estad0 con el orden que se prefiera. incluyendo en 61 solo las referencias de aquellas filas que cumplen el criterio de filtrado.1. En realidad. se entrega tambien una cadena indicando el nombre de la columna por la que se ordenari. Este. Tabla 10. Pueden crearse criterios como "Precio < 3 0 " o "Titulo L I K E Prog"". mientras que el tercero sera uno de 10s elementos de la enumeraci6n DataRowViewState de la tabla 10.10. llamado Select ( ) . "Orden"): Aparte del criterio de seleccibn. pueden incluirse uno de 10s modificadores ASC o DESC para comunicar de manera explicita si el orden debe ser ascendente o descendente. Select ( "criterio". "Orden". Relaciones y vistas usando el entorno de Visual Studio . Select ( "criterio" ) : En el arreglo se hace referencia s610 a las filas que cumplen con el criterio indicado. Podemos invocar a1 metodo Select ( ) facilitando cuatro listas de parimetros distintas. segih las cuales se devolverin todas las filas del DataTable.

segun criterio o estado. adem&. S '3 1 T 1 i i: r t l Module M o d u l e 1 Sub Ma1 1 1 ( ) Dim Conexion As New S y l C o r l n e c t l o r 1 ( y= " Da t a Source= i n s p i ro n .NET ModifiedCurrent ModifiedOriginal OriginalRows Unchanged None Las filas actuales tras las modificaciones que se hubiesen ef ect uado Las filas con sus valores originales Las filas originales. por la columna Precio. Da t a . Filas) . Imports S 7 s t ii rn . Password=") " & Dim AdaptadorLibros As New SylDataAdapter( "SELECT * FROM Libros". s610 aquellas en las que el titulo del libro comienza con la palabra Programacion y s610 las que corresponde a la primera editorial orden6ndolas. Recuerde que el resultado obtenido por una llamada a Select ( ) siempre es un arreglo de DataRow que.1es una muestra del resultado que se obtendria. dependiendo de 10s criterios de seleccidn. se muestran diversos resultados: todas las filas. partiendo de la tabla Libros de SQL Server.s a . o bien las filas en un cierto orden. En el ejemplo siguiente puede ver c6mo. Fi 1 1 ( Da to s .Programacidn de bases de datos coif Visual Basic . accediendo a una tabla del DataSet para recuperar tan s610 ciertas filas. Dim F i l a s O As DataRow ' " L 1 b ro s " ) MuestraFilas("Todas las f i l a s " . La figura 10. podria estar vacio. I n i t 1 a 1 Ca t a 1CJ Li b ro s . incluidas las que se han eliminado Las filas que no han sufrido cambios Ninguna fila Puede comprobar el funcionamiento del metodo Select ( ) partiendo de cualquiera de 10s ejemplos del capitulo previo. Conexion J Dim Datos As New DataSet ("MisDatos"] Ad apt a d o rL 1 b ro s . "Uqer I D .

Relaciones y vistas Filas = D a t o s . El resultado devuelto por este mgtodo. Fila("Editoria1") ~ . W r i t e L i n e ( v b C r L f & "Pulse < I n t r o > p a r a c o n t i n u a r " ) Console. ReadLine ( j End Sub End Module El m6todo Select ( ) de la clase DataTable tiene ciertas hmitaciones. S e l e c t "Titulo L I K E ' P r o g r a m a c i 6 n ' "' ) M u e s t r a F i l a s ( " L l b r o s d e programacion". especialmente cuando no se controla el acceso a datos mediante c6digo sin0 que se pretenden utilizar componentes de interfaz de usuario.WriteLine ( T i t u l o & vbCrLf & New String("-".recuperando diferentes conjuntos filas y en diferentes brdenes. ( Filas) = D a t o s . Podemos usar un DataView para obtener parte de las filas de un DataTable. 7 0 ) ) Dim Fila As DataRow For Each Fila In F i l a s C o n s o 1e W r 1 t e L i n e ( " [ 0 . La clase DataView ofrece un mecanismo mds flexible para obtener subconjuntos de 10s datos alojados en un DataTable. Fila("Titulo"). Next C o n s o l e . T a b l e s ( " L i b r o s " ) . sobre la base de un criterio de selecci6n o estado. T a b l e s ( " L i b r o s " ) .10. Filas " Fllas) End Sub su Console. sin por ello duplicar la informaci6n. no puede vincularse directamente con una rejilla u otros controles de datos..50 ) ( 1.6) ( 2 .Select ( Ed i t o r i a 1= 1' I . Es posible crear mCiltiples DataView sobre un mismo DataTable. 3) ' I . Fila("Precio"). " P r e c i o ASC" ) MuestraFilas ( "Titulos d e l a e d i t o r i a l 1 o r d e n a d o s p o r p r e c i o " . un arreglo de DataRow. en el orden que nos interese. facilitando la vinculaci6n directa con componentes de interfaz. .

Relacion de las clases DataView y DataViewManager . MarshalByValueComponent IBindingList Figura 10. Ambas clases. usaremos la clase DataViewManager en lugar de Dataview. Conjuntos de filas devueltos por el metodo S e l e c t ( ) Un objeto DataView s610 puede operar sobre las filas de un DataTable. en una colecci6n de Dataview. bAsicamente. Gracias a ella es posible. En caso de que tengamos m~ltiples tablas.1. En la figura 10. actualizando la informaci6n mostrada a1 usuario. implementan la interfaz IBindingLis t que hace posible la vinculaci6n con componentes de interfaz. pudiendo aplicarse cada uno de ellos a un DataTable del DataSet. en el interior de un DataSet. la notificaci6n de cambios por parte de la vista de datos a 10s componentes de interfaz. Un objet0 DataViewManager consiste. relacionadas entre si. DataView y DataViewManager.Programacidn de bases de datos con V i s u a l Basic .2.2 se ha representado esquemiiticamente la base de estas dos clases y la implementacih de la citada interfaz. por ejemplo.NET Figura 10.

es decir. El filtro se define como una cadena de caracteres en cuyo interior se introducen 10s pariimetros de seleccibn. puede indicar tras cada nombre de columna si el orden debe ser ascendente o descendente. una caracteristica no disponible para 10s objetos de la ChSe DataViewManager. El conjunto de filas que forman la vista dependerii del valor que tenga la propiedad RowFil t er. A 1 1owDelete y AllowEdit del propio Dataview. no tenemos m4s que indicar en la propiedad Sort el nombre de la columna o columnas por las que deben ordenarse. Esa columna se convertir4 en clave de un indice.I 10. o no. En cualquier caso. que actua como indexadora de la clase. gste puede facilitarse como segundo partimetro del constructor de DataView o bien establecerse posteriormente mediante una asignaci6n a dicha propiedad. Relaciones y vistas Los objetos DataView pueden crearse y personalizarse de manera visual en el entorno de Visual Studio . tambien podemos efectuar operaciones de edici6n sobre las filas. indicando las columnas por las que se ordenari. dependerii de 10s valores que mantengan las propiedades A11owNew. Los objetos de esta clase ofrecen una vista de un DataRow en un estado en particular. Cada uno de 10s elementos de la propiedad I tem. facilitando las operaciones de busqueda. que ser4n todas o parte de las existentes en la tabla. Funcionamiento de un DataView Los objetos DataView se asocian con objetos DataTable. es un objeto de la clase DataRowView. podemos asignar un estado a ROWS t a t e Fi 1t e r a fin de obtener s610 las filas que se encuentren en el estado indicado. pudiendose indicar otro estado diferente mediante una asignaci6n a RowStateFilter o entregando el mismo valor como ultimo argumento del constructor. Como se decia antes. concretamente como tercer argumento. Esta cadena. utilizando para ello 10s metodos AddNew ( ) y Delete ( ) del DataView y BeginEdit ( ) . Si no deseamos que las filas aparezcan en la vista con el orden por defecto. por defecto el valor actual. ya sea facilitando la referencia a este ultimo a1 constructor de la clase DataView o usando la propiedad Table del DataView para vincularlo a1 DataTable. tambibn puede facilitarse como pariimetro a1 constructor de Da t aVi ew. EndEdit ( ) y CancelEdit ( ) de cada DataRowView. Que estas operaciones Sean posibles. en lo que respecta a las propiedades de selecci6n de filas. con la misma sintaxis empleada con el metodo Select ( ) de la clase DataTable. no mantienen 10s diversos estados que puede tener una fila de datos durante la edici6n. a partir de ese momento podemos usar la propiedad Item del DataView para acceder a las filas de la vista. Adem4s de acceder a 10s datos.NET. . mediante la citada propiedad I t e m . Por ultimo. 10s objetos DataRowView representan el valor de un DataRow en un cierto estado. Opcionalmente.

indicando una columna que actuar5 como clave. a la que puede accederse mediante la propiedad Defaultview. Los dos miembros de m5s inter& para nosotros. a partir de dicho momento pueden utilizarse 10s metodos Find ( ) y FindRows ( ) para localizar la fila o filas. Sort y RowState. El primero. junto con la propiedad Table que vincula la configuraci6n con una cierta tabla. tambien podemos obtener el que tiene por defecto el conjunto de datos mediante la propiedad DefaultviewManager de la clase DataSet.que puede modificarse mediante las propiedades RowFilter. en la clase DataViewManager.Programacidn de bases de datos con Visual Basic . afectara. Si se ha establecido un orden en la vista. Para ello.AllowNew y AllowEdit. En lugar de crear un nuevo DataViewManager.NET El valor de 1% propiedadesAllowDelete. Sort y RowStateFilter explicadas en el punto anterior. respectivamente. por ejemplo. 10s objetos Da t aVi ewManage r se enlazan directamente con un DataSet y no con un DataTable. mientras que el segundo. Podemos vincular el DataViewManager con el DataSet facilitando una referencia a este ultimo a1 constructor del primero. serdn Dataviewsettings y CreateDataView ( ) . que tienen un valor dado en esa columna clave. en lugar de crear un DataView nuevo. es el encargado de crear nuevas vistas asociadas a tablas.que no solo podemos leer sin0 tambihn modificar. o bien sirviendonos de la propiedad DataSet con que cuenta la clase DataviewManager. una propiedad. . la clase Dataviewsettings cuenta con las mismas propiedades RowFilter. De esta forma podriamos modificar la vista por defecto que nos ofrece el propio DataTable. Cada elemento de Ia colecci6n DataViewSet tings mantiene 10s atributos de la vista aplicada a cada tabla. Su finalidad es facilitar una vista global de todas las tablas que forman el conjunto de datos. Todos 10s DataTable cuentan con una vista por defecto. nos permite acceder a la colecci6n de objetos DataViewSet ting que establecen las propiedades de la vista de cada tabla. al comportamiento de 10s componentes de interfaz que se enlacen con el Dataview. un metodo. respetando las relaciones que pudieran existir entre ellas. Funcionamiento de un DataViewManager A diferencia de Da t aVi ew.

en la documentaci6n de Visual Studio . ___ Nuestro primer ejemplo tiene el objetivo de conseguir un resultado identico a1 del programa de la figura 10. .Da taVi ewMana ge r. CIr l e x i b r l . Nos sirve. DataViewRowState. Posteriormente. Relaciones y vistas Como siempre.NET encontrarh la informaci6n de referencia relativa a cada uno de 10s miembros de las clases mencionadas. de un nuevo proyecto de tip0 Aplicacion de consola usando el lenguaje Visual Basic . Da taView. D i m Datos AS New DataSet ("MlsDatos") AdaptadorLibriJs. ( ) .Tahlrr ("Libras")) D i m V i r t a E r o g r a r a c i o n A s New DataView(Dator. en 10s capitulos dedicados a1 us0 de las herramientas de Visual Studio . Sub I 4 a i n Di .F i l l (Datos. aprenderzi a crear vistas y enlazarlas con componentes de interfaz sin necesidad de escribir codigo alguno. la primera parte en la que se definia la conexion. .NET.Tdblesi"llbros"). " T i t u l c L I K E ' P r o g r a r n a c i o r l * "I. el adaptador de datos y se creaba el Data S e t con la informacion de la tabla L i b r o s . A partir de ahi.1.10. ect i o n ! itial C a t a l i " U S C . per0 usando multiples vistas sobre la misma tabla en lugar de emplear el metodo Select ( ) de 6sta. por tanto.CurrentRows) . "Libros") D i m VistaTotal A s New - DataView(Datos. empiezan los cambios. ~ID=sa. ~ - "Titulo". como se ve en el c6digo siguiente. Data RowView y Da t aVi ewS e tting. como en todos 10s ejemplos previos.A partir de este punto nos centraremos en ver c6mo utilizarlas en la przictica. con algunos ejemplos sencillos per0 demostrativos.NET. Partimos. E'asswcxd=" ) D i m AdaptddorLibros AS New S q l D a t a A d a p t e L ( " S E L E C T A FROM L i b r o s " .

7 0 )) For Each Fila In Vista { 1.WriteLine(Titulo D i m Fila As DataRowView vbCrLf & New S t r i n g ( " .6) {2. VistaTotal) Mues t ra Fi las "Libros d e programacion". Utilizando las propiedades RowFilter. podemos configurarla para que nos facilite 10s datos que nos interesen en cada momento. WriteLine ( " { 0. VistaProgramacion) MuestraFilas "Titulos de la editorial l". J i i Console. Para trabajar con estos objetos tendremos. " Pr e ci o DESC" . un objeto DataView a1 que hace referencia la propiedad Def aultview. A1 final tenemos tres objetos que ofrecen vistas diferentes de la misma tabla de datos. exceptuando el orden de 10s datos en la segunda y tercera vista. Esta vista. Fila("Precio"). tal y como se aprecia en la figura 10. Cada DataTable cuenta con una vista por defecto. DataViewRowState. VistaEditoriall) End Sub Hemos optado por establecer 10s criterios de selecci6n y ordenaci6n en el mismo momento en que se crea cada Dataview. facilitando 10s m6todos apropiados a1 constructor de dicha clase. Asimismo. . Sort y Rows t ate Fi1te r. > Dim VistaEditoriall A s N e w DataView(Datos.-50 } Fila("Titulo").c su Ti trin & Vista As Dataview) Console. hace referencia a todas las filas de la tabla. que hacer algunos cambios en el m6todo Mues t ra Fi1as ( ) . " Ed i to r i a 1= 1 " .Programacio'n de bases de datos con Visual Basic .3) Console.3. es casi id6ntico a1 del ejemplo previo. Fila("Editoria1") ) Next ' I ." . El resultado.CurrentRowsi ~ I ' * - I 1 1 Muestra Fi las "Todas las filas".Tables("Libros"). Readi 1 ne ( ) End Sub & "Pulse <Intro> para continuar") Observe que la variable Fila ahora no es un DataRow sino un DataRowView. Este quedaria como se muestra a continuacih: . el elemento que se recorre en el bucle For Each es la propia vista entregada como segundo argumento. asimismo. no un arreglo de objetos DataRow.WriteLine (vbCrLf C o n s o l e .NET . inicialmente. sin embargo. f .

: c : ~ c . ~ i ~ ~ ~ : Dim Conexion As New SqlConnection( "Data Source=inspiron. Conjuntos de filas ofrecidos por las distintas vistas creadas La configuracion del D e f a u l t v i e w afecta a las filas devueltas por la vista. i i . El metodo Mues t r a F i l a s ( ) se mantiene identico a1 punto anterior.~ L i ~ i . Password=") i.2 ~ . Initial Catalog=Libros. .10. Es lo que se hace en la siguiente versi6n modificada del mismo ejemplo anterior.A. Sub Main( j ~ I :. . "User ID=sa.0 1 Figura 10. il.. Relaciones y vistas 0 C:\P&MVisualBasicNmCap_lO\VariasVistas\bin\VariasVistas.3.ere . En lugar de crear mLiltiples vistas diferentes. lo cual en ocasiones puede no ser imprescindible. per0 nunca a las contenidas en la propiedad Rows del D a t a T a b l e que siempre sera la coleccion de todas las filas que haya en la tabla... L.~ __ " & - .. podemos modificar las propiedades de D e f a u l t V i e w segLin las necesidades de cada caso.

MiTabla.NET Dim AdaptadorLibros As New SyiDataAdapter( "SELECT * FROM Libros". Bhsqueda de datos en una vista Una vista facilita un subconjunto de las filas de una tabla. Puede efectuar una pequeiia prueba iniciando una nueva aplicaci6n de consola e introduciendo el c6digo siguiente: . seria identico a1 mostrado en la figura 10.Currer1tRows MuestraFilas("Titu1os d e la editorial l". sobre la base de un filtro de seleccih.RowFi1ter = "Titulo LIKE ' Proqramacion* "' ~ MuestraFiias("Libros d e prograrnacihr.Tables("Libros") L - - -- i MuestraFi1asi"Todas las filas". S o r t = "Precio DESC" ' . Find ( ) y FindRows ( ) . actdan como columnas clave en esa vista.". en cierta manera.DefaultView.DefaultView) End Sub El resultado.DefaultView) MiTabla. cuya finalidad es encontrar la primera fila o el conjunto de filas.Prograrnacidn de bases de datos con Visual Basic .L t i 1 i _. mientras que el segundo facilita un arreglo de objetos DataRowView con todas las filas que lo contienen. Este viene determinado por el valor de una o m i s columnas que. facilitando operaciones rApidas de bdsqueda. Dim MiTabla As DataTable L = Datos. respectivamente. exceptuando el orden alfab6tico de las filas en la segunda vista. Conexion) r r Dim Datos As New DataSet ("MisDatos") Adapt adorLibros . "Lib r o s " I r ~ ) L . a1 ejecutar este ejemplo.DefaultView) Wi .RowStateFilter End With 1 = DataViewRowState.3. RowFilter = "Editorial=l" . Fi 11 ( Da tos. El primero devuelve un entero que es el indice de la fila dentro del Dataview. MiTabla. MiTabla. que tienen un cierto valor en esa columna clave. En la clase DataView existen dos mdtodos. en un determinado orden.

Pas s w o r d = " ) & - D i m A d a p t a d o r L i b r o s As New S q l D a t a A d a p t e r ( "SELECT * FROM L i b r o s " . R e a d L i n e ( ) D i m I n d i c e As Integer = M i T a b l a If I n d i c e <> -1 Then Console. ? Corlsole.Tables("Libros") D i m Columna As DataColumn D i m NornbreColumna As String D i m ValorBuscado As String Cons o 1e . F i n d ( ValorBuscado ) r 3 1 {2. D e f a u l t v i e w ) . t - D i m D a t o s As New D a t a S e t ("MisDatos") D i m M i T a b l a As D a t a T a b l e = Datos. - "Titulo").10. W r i t e ( " I n t r o ~ u z ~e l nc mbrc de l a a "columna F o r l a q u e q u i e r e o r d e n a r : " ) NombreColumna = Console. Relaciones y vistas Imports S y s t e m .Write ( " I n t r o d u a c a e l v a l o r a buscar: ValorBuscado = C o n s o l e . D a t a . D e f a u l t v i e w ( I n d i c e ) MiTabla..S3rt = NombreCclumna M u e s t r a F i l a s ("Todas las filas". "Editorial"). I n i t i a l Catalog=Libros.ReadLirle ( ) " & MiTabla. "U s er I D= s a .W r i t e L i r i e ( " { 0.W r i t e L i n e ( " * * * Co 1urnn a s d i s po n I b 1e s * * * " 1 For Each Columna In M i T a b l a .DefaultView. D e f a u l t V i e w ( 1 n d i c e ) ") Def a u l tView . C o n e x i o n ) r . M i T a b l a . C o l u m n s C o n s o l e . S q l C l i e n t Module M o d u l e 1 Sub M a i r J ( ) " D i m C o n e x i o n As New S q l C o n n e c t i o n ( "Data Source=inspiron.61"." & Columrla. "Precio") 1 End If End Sub .5 0 1 { MiTabla. ColurnnNarne) Next C o n s o l e .DefaultView(Indice) MiTabla. W r i t e L i n e (vbTab & " .

3 0 1 i 1. aunque podriamos utic lizar cualquier otro origen de datos. F i l a ("Precio"). mostramos el contenido de la vista. A continuaci6n solicitamos un valor a buscar. Puede modificar esta parte final para.31 " I End Sub End Module Usamos una vez mAs la tabla L i b r o s de S Server.Pvogramacidn de bases de dafos con Visual Basic .NET Sub MuestraFllas(ByVa1 Titulo A s String. 7 0 )) Fo Conso 1e . Fila("Autor"). ByVal Vista As Dataview) Console. Fila ("Editorial")) Next i4. act0 seguido. Seleccionamos el orden de las filas y un valor a buscar . Fila("Titulo"). mostrando algunos datos de la primera fila que lo contenga en la columna clave.4. enumeramos las columnas de la tabla para que.-50 l I 3I 6 1 Flla("ISBN"). Asignamos el nombre de columna introducido a la propiedad S o r t del DataView y. como puede verse en la figura 10. en h g a r de llamar a F i n d ( ) .13 I { 2. Tras crear el adaptador de datos y generar el D a t a S e t . a traves de la consola. el usuario del programa pueda seleccionar una de ellas para ordenar las filas.. AparecerAn. Figura 10. emplear el metodo FindRows ( ) y enumerar todas las filas que coinciden. las filas ordenadas por esa columna.4.WriteLine(Titulo Dim F i l a As DataRowView & vbCrLf & New String("-".Wr 1 t eLi ne ( " { 0.

Relaciones y vistas En este ejemplo no se han controlado las posibles excepciones que podrian generarse. afiadiendo otras nuevas o bien eliminando las existentes. 1 iP # ? . Manteniendo el metodo Mue s tr a Fi1as ( ) de 10s ejemplos previos. Initial Catalog=Llbros. > Dim AdaptadorLibros As New SqlDataAdapter( "SELECT * FROM Libros". se utilice el metodo Update ( ) del adaptador de datos. por ejemplo al introducir el nombre de una columna inexistente para ordenar por ella. Cualquier modificaci6n de las filas causari que en el DataTable del que depende la vista se aiiadan nuevas filas o cambie el estado de 10s asistentes.en caso de que deseemos transferirlos a un origen de datos.10. esos cambios no son en firme hasta en tanto no se llame a1 metodo AcceptChanged ( ) del DataSet 0. o bien CancelEdit ( para deshacerlos. para confirmar 10s cambios. Password=" ) 7 " & - . sino que se modifica su estado para que aparezca como candidata a ser eliminada. El procesol en todos 10s casos. modificando el contenido de las filas. cambie el metodo Main ( ) para que quede tal y como se muestra a continuaci6n: Sub Main( ) r 7 1 i * I i Dim Conexion As New SqlConnectlon( "Data Source=inspiron. Conexion) - . En realidad la fila no se elimina en ese instante. Eliminar una fila: Basta con llamar a1 metodo Delete ( ) del DataRowView a eliminar.asignando a continuaci6n 10s valores de todas sus columnas y. llamariamos a1 metodo BeginEdit ( ) para iniciar 10s cambios. como en el caso anterior. confirmando 10s cambios o descartindolos mediante 10s metodos EndEdit ( ) y CancelEdit ( ) . En cualquier caso. El proceso terminaria con una llamada a EndEdit ( ) . tras lo cual modificariamos el valor de las columnas que deseemos. Edicion de datos en la vista Una vista de datos. puede utilizarse tambidn para actualizar datos. "User ID=sa. es igualmente sencillo: Editar una fila existente: Localizado el objeto DataRowView que corresponda. t z * + 4 . siempre que contenga informaci6n suficiente como para asociar cada fila de la vista con la fila original en la tabla. 0 Aiiadir una nueva fila: Invocamos a1 metodo AddNew ( ) del DataView para asi obtener un nuevo DataRowView.

Act0 seguido creamos una vista y mostramos las filas que la componen. como en el propio origen de datos.con la llamada a EndEdit ( ) . CurrentRows ) 2 . no se han controlado las posibles excepciones de ejecuci6n que podrian generarse. inserci6n y borrado del origen de datos.Tables("Libros") End Sub Ademris del conjunto de datos y el adaptador.5.NET" Fila ("Autor") = "6scar Gonzdlez" Fila ("Editorial") = "1" Fila("Precio") = 10. Tras ejecutarlo.Update(Datos. "Editorial=l". Si todo va bien.AddNew() Fi 1a ( " ISBN" ) = " 8 4 . cambiando s610 la llamada a AddNew ( ) por la acci6n que corresponda.:'+ & r : : "Se afiade una nueva fila" _ % & vbCrLf) 1 Dim Fila As DataRowView = Vista. igualmente podrian haberse modificado datos de las existentes o haberlas eliminado. DataViewRowState. la ejecuci6n de este programa deberia generar el resultado que puede verse en la figura 10.75 Fila. El proceso es exactamente el mismo. ahora creamos tambien un CommandBuilder que se encarga de generar las sentencias de actualizacibn. Como en casos anteriores. tanto en el DataRowView. llamando a Update ( ) . por ejemplo desde el Administrador corporativo de SQL Server. "ISBN ASC".WriteLine(vbCrLf .4 1 5 .EndEdit ( ) ' MuestraFilas ("Tras aAadir la nueva fila". .1 4 0 2-X" Fila ("Titulo"j = "Guia prdctica ASP. -.Tables("Libros"). Aunque en este ejemplo tan s610 se inserta una fila. tras lo cual aiiadimos una nueva fila y confirmamos 10s cambios. y por mantener la simplicidad del cbdigo. Vista) Console.Programacidn de bases de datos con Visual Basic .NET I Dim Comandos As New SqlCommandBuilder(AdaptadorL1bros) I c Dim Datos As New DataSet ("MisDatos") + Dim Vista As New DataView(Datos. para ver la nueva fila insertada. Vista) AdaptadorLibros. i MuestraFilas ("Filas iniciales". puede comprobar el contenido de la tabla L i b r o s .

IsEdit e IsNew.:iii. un DataGrid. Suponga que quiere mostrar en una cuadricula. : ~ . aiiadimos el c6digo siguiente a1 evento Load: I i . q ~ ~ ~ L:. . La vista de datos antes y despues de aiiadir una nueva fila La clase DataRowView dispone de dos propiedades. es totalmente distinto cuando van a utilizarse componentes de interfaz que es necesario vincular con origenes de datos. L j~ - L : . .i ' . "User ID=sa.5.:~~:. El caso. como Lhico componente. Relaciones y vistas Figura 10. Tras crear una nueva aplicacidn Windows e insertar en el formulario. Es en este context0 en el que encuentra su mayor utilidad la clase DataViewManager. sin embargo.5 511 ~ Dim Conexion As New SqlConnection( "Data Source=inspiron.. respectivamente. Password=") " & - . Initial Catalog=Libros.que nos permiten saber si la fila esta en mod0 de edicion o si se trata de una nueva fila. c ! iJ : .i u I 2 . una serie de editoriales como filas primarias y ciertos titulos de cada una de ellas como filas secundarias. conjuntamente con m6todos de DataTable como GetChildRows ( ) . Utilizando las propiedades de Da t aVi ew. desde c6digo no necesitamos m6s para gestionar relaciones maestro/detalle entre dos o m6s tablas.c?. en el interior de un formulario Windows.10.".

Da t aMembe r = = Datos " Edit or i a 1es " A1 ejecutar el programa. "Editoriales") AdaptadorLibros. De f aultVi ew.MissingSchemaActior1 = Mi s s i ng SchemaAc t i o rl .NET D i m AdaptadorEditoriales As New SqlDataAdapteri - "SELECT * FROM Editoriales".Tables ("Editoriales"). C o n e x i o n ) .MissingSchemaAction M i s s i n g Sc h e ma Ac t i on . Tab1 es ( "Libros" ) . Conexion) D i m AdaptadorLibros As New SqlDataAdapter( "SELECT * FROM Libros". las editoriales tan sdlo deberian mostrar 10s libros cuyo titulo comenzase con 10s caracteres P rog rama cion A1 ejecutar el programa. RowFi 1ter "Titulo LIKE ' Programaci6n* "' = - Con esto. sin embargo. Dato?.6.Programacidn de bases de datos con Visual Basic .Add Wi t h Ke y = Adapt 11 (Datos.!as estudiaremos en un capitulo posterior. la editorial seleccionada se indicarg en la parte superior de la cuadricula y aparecerin 10s datos de todos sus titulos.t- D i m Datos As New DataSet ("MisDatos") I T AdaptadorEditoria1es. En principio. A d d W 1 t h Ke y AdaptadorLibros. de tal forma que las editoriales sdlo muestren 10s libros cuyo titulo comience por el texto dado. C o l u m n s ("IDEditorial"). Con la sentencia I' . A1 pulsar en el nombre de la relacidn. En este ejemplo las usamos simplemente para mostrar la funcionalidad de la clase DataViewManager.Add(New DataRelation ("Libros d e l a editorial". Suponga que quiere permitir a1 usuario la introduccidn de parte de un titulo. Datos. C o l u m n s ("Editorial")) ) ~ DataGridl. veri que el resultado es exactamente el mismo que obtenia antes. la cuadricula mostrari un aspect0 similar a1 de la figura 10.Relations. podriamos intentar hacer lo siguiente: Datos . F i l l (Datos. "Libros") .Tables ("Libros"). Datasource Data Gr i d 1 . Datos. No se preocupe en este momento por las particularidades del componente DataGrid 0 laS propiedades de vinculacion DataSource y DataMember.

A continuaci6n usamos la colecci6n DataViewSettings para establecer el filtro de la selecci6n sobre la tabla Libros. per0 lo que estamos mostrando en el DataGrid es el DataSet completo.10. al ejecutar el programa. Da t aM e rnb e r = = = - ViewManager " Ed i to r i a 1e s " Creamos un nuevo DataViewManager asocihdolo con el DataSet. Por ultimo. DataViewSettings ( " L i b r o s " ) . Ahora.DataSource = Datos.__-_______-.7.DefaultView -. como se aprecia en la figura 10. 43 EdificioValreaiW.l'phnta 901 Grsiscn Street 605 Thtrd Avenue New Ywk Figura 10. no una vista en particular. asi que intentamos lo siguiente: DataGrid1. podrti seguir seleccionando cada editorial por separado. ya que queremos tener la posibilidad de seleccionar 10s titulos de cada editorial por separado. Sustituya las dos sentencias anteriores por el c6digo siguiente: Dim ViewManager As New DataViewManager(Datos) ViewManager. Relaciones y vistas anterior estamos modificando el filtro de la vista por defecto de la tabla Libros. Datasource Da t a G r id 1 .Tables("Editoriales"]. per0 el filtro asignado a la vista por defecto de la tabla Libros sigue sin aplicarse. Lista de editoriales en la cuadricula Vinculamos el DataGrid con la vista por defecto de la tabla Editoriales. per0 s610 aparecer6n 10s libros cuyo titulo comience por el prefijo indicado.RowFilter "Titulo L I K E ' Prograrnaci6nt "' DataGridl. enlazamos el DataViewManager directamente con el DataGrid. Es en estos casos donde resulta util la clase DataViewManager. ya que puede enlazarse directamente con el DataGrid facilit6ndole todos 10s parametros de las vistas individuales de cada una de las tablas relacionadas.6.__ ~ ultimedia Telemaco. .

o la elecci6n de un orden distinto. programando el acceso a datos desde c6digo tal y como estamos haciendo en 10s ejemplos de 6ste y 10s capitulos previos. s e g ~ ha podido verse en este capitulo. con ADO. En realidad. Gran cias a la clase Dataview. gracias a la clase DataViewManager es posible mantener las relaciones en las vistas de datos. principalmente en componentes de interfaz como DataGrid. tradicionalmente ha requerido una comunicaci6n con el servidor para facilitar el nuevo resultado.A la hora de enlazar las filas con un componente de interfaz. sin necesidad de gestionar por separado la selecci6n de filas en cada DataView individual.7. . obtenido previamente mediante una consulta.isual Stvdio N E T Prcgramaaonoon\Asual Basic NET Prcqramanoncon k l p k i 6 ) Kylix FraroscoCb FranciscoCh FrancisaJCh Francisco Ch 1 1 1 1 35 A0 39 33 25 Figura 10.NET es posible conseguir esas operaciones de manera mucho m6s r6pida y sin establecer una conexi6n con el origen de datos. un tema del que nos ocuparemos en un capitulo posterior. las cosas cambian. las vistas no son muy necesarias puesto que podemos conseguir resultados similares mediante el m6todo Select ( ) con el que cuentan 10s DataTable. La rejilla una vez vinculada al DataViewManager Como puede ver.Prograrnacidn de bases de datos con Visual Basic . La selecci6n de parte de las filas de un conjunto de datos. ya que no es posible vincular con un arreglo de DataRow. pero si con un DataView o un DataViewManager.NET b c 6 ie Y W i15-1392 ?A 415-13'5N 4151351 54-4151261 ProgmmaclonconMs~al N E I CP Prcgranucioncon\.

. .~ ..

puede llegar a ser mucho mds estrecha como se veri en este capitulo. la transformacih de 10s datos mediante XSLT o b&quedas m6s elaboradas que las que permite el metodo Select ( ) de un DataTable. Datacolumn. vamos a hacer un rdpido recorrido por algunos conceptos de XML y otros temas relacionados. DataTable. La integracion entre ADO.NET y XML. '3610 esa posibilidad nos permite. XSL o XPath. lectura y manipulacih de documentos XML. SAX. Antes de introducirnos en el us0 de las clases . Tambien existe la posibilidad de tratar como un Data S e t informacih alojada en un documento XML. y su informacih de esquema. DataSet. sin que necesariamente tenga el formato propio de ADO. Esto posibilita.NET para la creacih. sin embargo. etc. sin necesidad de ninguna base de datos ni servidor. como DOM. se introdujeron algunos temas relativos a1 almacenamiento y recuperacibn de 10s datos.NET. en forma de documentos XML y esquemas XSD. como se vio en dicho capitulo. por ejemplo. haciendo posible el acceso sincronizado a 10s mismos datos desde un DataSet y en forma de documento XML. Esto abre las puertas a la integraci6n entre aplicaciones a1 ser XML un lenguaje adoptado como estgndar mundial. ..En el capitulo dedicado a1 estudio de 10s conjuntos de datos y clases relacionadas. DataRow. trabajar con datos en una aplicacih almacen6ndolos localmente.

xsd"> <Libras> <IDLibro>l4</IDLibro> <ISBN>84-415-1145-4</ISBN> <TItulo>Introducci6n a l a prograrnacihn</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>24. En el siguiente documento. salvo un conjunto base. sin0 para describir su estructura.w3.com/xml. las marcas de XML. 0" encoding="utf-8" ?> <Libros xrnlns="http://tempuri. tambien se denomina Lib ro s. Algunas de estas herramientas las conoci6 en el tercer capitulo. han estado marginados en el campo de las tecnologias de la informaci6n. Breve introduccion a XML XML es un lenguaje estiindar. Algunos expertos denominan a este lenguaje como el nuevo ASCII. sin importar las diferencias entre plataformas hardware. podriamos comparar XML con HTML. es ficil ver que existen dos elementos principales. como es el caso de HTML. a1 crear 10s archivos Libros xsd y Libros . Esto facilita el us0 de caracteres de cualquier idioma. por lo que no se aporta un estudio detallado de XML como el que podria encontrar en un titulo m i s especifico sobre este tema. Tambikn puede encontrar abundante informaci6n sobre XMLen http://MSDN. Para conseguir esta compatibilidad tan amplia.NET usando principalmente ADO.NET. ya que XML no se emplea para definir la apariencia de 10s datos que contiene.04</Precio> . incluidos aquellos que. XML se describe con marcas codificadas en texto simple. no estan predefinidas. sistema universal de codificacih de caracteres reconocido por la priictica totalidad de 10s sistemas. nada de formatos binarios mas compactos per0 incompatibles. . fragment0 del utilizado en el tercer capitulo como ejemplo. Los documentos XML son muy ficiles de leer. histbricamente. creaci6n de esquemas XSD u hojas de estilo XSL. En este aspecto.x m l . <?xrnl version="l. Esta capacidad es en si una necesidad. tenga en cuenta que este libro se centra en el tema del acceso a datos desde Visual Basic . XML Ante todo. org). Ambos elementos estiin contenidos en una raiz que. Cualquiera puede definir su conjunto de marcas o etiquetas XML y aplicarlas a sus necesidades especificas.11. generalmente Unicode. cuyo objetivo es facilitar el intercambio de informaci6n entre aplicaciones. ya que la estructura prPcticamente se describe por si sola. a1 ser ambos formatos aplicables de manera universal. como la edici6n de 10s documentos.NET cuenta con diseiiadores y asistentes que facilitan la mayoria de las tareas que implica el trabajo con XML. cuya especificacibn podemos encontrar en la sede del W3C (http : //www. sin embargo.Microsoft. org/Libros . que se repiten conteniendo informacidn de distintos libros y editoriales. Libros y Editoriales. lenguajes de programaci6n ni idioma. sistemas operativos. en este caso. El entorno de Visual Studio . A diferencia de HTML.

Wointei.Prograrnacidn de bases de datos con Visual Basic . L Activitv Stateniwt explains the W3Cs work on this topic in more detail For related work. M Nearby XML Protocol XML Schema XML Querf XLink.NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>39</Precio> </Libras> <Editoriales> <IDEditorial>l</IDEditorial> <Nornbre>Anaya Multirnedia</Nornbre> < Di reccio n > J u a n Ign a c i o Luc a d e Ten a.NET </Libras> <Libras> <IDLibro>G</IDLibro> <ISBN>84-415-1351-l</ISBN> <TItulo>Prograrnacihn con Visual Basic . XML Base DOM PDF CSS YSL XHTML ~ MathML SMlL _ XML Sianature and Canonicalization _ Working Drafts Follow the links above for details about the drafts issued by the XML Query. and XML Linlang WGs The documents listed below are the working drafts issued by the YML Core working group XML /nc/usims j%/nziudel Last Call working dmtt issued16 May2001 reauirernents section of original proposal worlang group XML Core . . . S e d e del W3C dedicada al lenguaje XML .1. Figura 11. 1 a p 1ant a < / Di re cc ioTi> </Editoriales> </Libras> Extensible Markup Language (XML) Core Drafts Develowei Discussion EwntslPubs (translationsl Software Test Sulte B !m & X! a The Extensible Markup Language (XML) is the unlversal format for structured documents and data on the Web \\ML f 0 e n nuinrs explains XML briefly The base specifications are XML 1 0. and Nariieswaces.Jan '99 The .lSSUeS feedback 1mwxmLxinclude Lornrnents i i h K information Ss! Proposed Recommendationissued 10 August 2001 XML Information Sel Reourremenls Feb '99 working group XML Cure feedback ~-xI*il-infoset-cornrnents discussion e v cornw textxml %MLFraamenl lnterchanas Candidate Recommendationas of 12 February2001 . . see . W3C RecommendationFeb '98. XML Schema. . 15< / D i re c c i on> </Editoriales> <Editoriales> <IDEditorial>2</IDEditorial> <Nombre>McGraw-Hill</Nornbre> < Di recci on > Ed i f i c i o Va 1re a 1t y .

las DTD y 10s esquemas XSD.11. El fragment0 anterior. o bien un esquema XSD. Un ejemplo de DTD. (#PCDATA) : ' < ! ELEI'IENT 1 S H N j #PCDATA)> I!ELEMF:NT T I t i i l o ( # P C D A T A ) > <!ELEMENT P l ~ t o r(#PCDA'I'A)> <'ELEMENT E d i t o r i a l [ #PCbA?'Ai > <!ELEMENT P r e c i o (#PCDATAj> c ! ELEMENT E d i t c r i a 1es ( E \ J i t (c. ISBN. T i t . segundo. primero. D i L e c c i o r l j > <!ELEMENT I D E d i t o r i a l ( # P C D A T A ) > < ! ELEMENT Nc-. por ejemplo.mbrc ( # P C D A T A ) > < !ELEMENT Direction ( # P C D A T A ) > P r e c i o )> Esta definici6n puede colocarse a1 inicio del propio documento XML o bien almacenarse separadamente.El inconveniente de las DTD es que no siguen la sintaxis propia de XML y no son demasiado flexibles. no basado en XML. si bien en este aspecto las limitaciones son bastante importantes. si deseamos estar seguros de que 10s datos introducidos tienen 10s tipos adecuados y que la estructura es siempre la correcta. E d i t o r i a l e s ) > < ! E L E M E N T L i b r o s (Libra+)> < ! E:LEMENT L i h r o ( I D L i b r o . que su estructura concuerde con la definida en una DTD o esquema XSD. A u t o r . definiendo una estructura similar a la del documento XML previo. Una DTD es un documento. de que este bien formado y. como el mostrado en el punto anterior. tendremos que servirnos de un documento de definici6n de tipos. fistas son normas del propio lenguaje XML y que. en el que se describe la estructura de 10s elementos de un documento XML. haciendose referencia a el desde el documento XML mediante la marca < ! DOCTYPE>. Que un documento XML sea o no viilido dependerii. E d i t o r i a l . todos 10s atributos se introducen entre comillas dobles y el documento cuenta con un solo elemento raiz en el que estan incluidos todos 10s demas.i r l o . Norrtbr e . es un documento bien formado. por tanto. en un archivo con extensi6n d t d . por lo que un analizador XML podria leerlo y extraer datos sin mayores problemas. conocido como DTD.ri It ) > a < ! KLEMENT E d I t (3r i a 1 ( I DEdi t o r i a 1. Estos elementos. X M L Los documentos XML deben estar bien formados y ser viilidos. <:!f<LEMENT I D L i b r r . asi como su tipo. se utilizan para validar documentos XML y verificar que son apropiados para la aplicaci6n que debe procesarlos. A pesar de que a partir del contenido de un documento XML. sin importar cuiiles Sean ni su longitud. . es relativamente fiicil deducir su estructura. Un documento est6 bien formado si todas las marcas de apertura cuentan con sus respectivas marcas de cierre. seria el siguiente: <!ELEMENT L i b r e r i a ( L i b r o s . por ejemplo a1 no contar con tipos de datos mas especificos ya que en #PCDATA entra cualquier secuencia de caracteres. debe cumplir cualquier documento XML.

en cierta forma. Estas aplicaciones podrian. generalmente con el nombre de dominio de nuestra empresa y algun identificador adicional. En Visual Basic .org/20O1/XMLSchema. como su propio nombre indica. A partir de ese momento. de tal forma que la aplicacibn. En el esquema XSD del punto previo puede ver c6mo se define el Bmbito con nombre xs. es un conjunto simple de funciones que facilitan la extracci6n de datos a partir de un documento XML generando eventos a medida que lo lee.11. emplea por defect0 el U R L h t t p : / / t e m p u r i . Para ello. leyendo y modificando informacion. suele apuntar a un esquema XSD. Aqui es donde entran en juego 10s ambitos con nombre o namespaces. dando lugar a un URI unico. que nunca debe confundir con 10s Bmbitos con nombre de Visual Basic. por lo que debe existir un mecanismo para distinguir las etiquetas que. leerlos e intentar analizarlos por si mismas. del nombre del Bmbito. a partir de la informacih leida del documento se genera un irbol jerirquico con todos 10s elementos. Visual Studio . son relativamente fdciles de comprender y pueden ser editados manualmente. disponihdose el URL tras un signo =. es participe del analisis del documento. aunque realmente nada nos impide hacerlo. per0 no es necesario gracias a la existencia de estandares como DOM y SAX. y 10s esquemas XSD. lo cierto es que estin pensados para que Sean aplicaciones a medida las que 10s manipulen. asociBndolo con el URL http://www. si bien tambidn mas flexible.NET. tras dos puntos. La definicion se efectua en la marca raiz del documento utilizando el atributo x m l n s . X M L informaci6n en forma de documentos XML. pertenezcan a aplicaciones o empresas distintas. siendo posible emplear varios en un mismo documento. Este URL debe modificarse por uno que identifique de manera unica a ese Ambito. A pesar de que 10s documentos XML. o r g asociado a 10s ambitos con nombre. Este irB seguido. aunque esto no es imprescindible. afortunadamente. a1 producir nuevos documentos XML. SAX.w3. que recupera un documento completo y nos ofrece la posibilidad de navegar por sus nodos. no tenemos por qu6 utilizar mdtodos de relativo bajo nivel para operar sobre documentos XML. ya que son archivos de texto simples.NET.y c6mo se usa en el resto del documento como prefijo de las marcas propias de XSD. coincidiendo en nombre porque eso podria suceder. DOM es una alternativa m i s compleja. incluso con herramientas tan sencillas como el Bloc de notas de Windows. Los Ambitos con nombre se asocian siempre con un URL que. por regla general. de . Por una parte disponemos de la clase X m l R e a d e r que. 10s elementos usados en el documento se precederan del nombre del Bmbit0 a1 que correspondan.

.

pero no se intenta facilitar una referencia de todas las clases y sus miembros ya que &a es una informacih que ya tiene a su alcance. * La mayoria de las clases dirigidas a operar sobre documentos XML. nodo a nodo y elemento a elemento. en cierta manera. esquemas XSD y emplear XPath y XSLT se encuentran en el ambito system. Como siempre. cada una de ellas contenido en el ambito correspondiente.aplicando una hoja de estilo XSL a cualquier documento XML que tenga alojado en un XmlDocument. estan en s y s tem. Svstem .Xml.XPath I Figura 11. persistencia de datos. mostrandose ejemplos practices.11. Ambitos relacionados con XML y algunas de sus clases Para leer un documento XML de manera secuencial. para el que exista un XPathNavigator.NET puede utilizar XSLT a traves de la clase XslTransform.Xml. tenemos a nuestra disposicih las clases derivadas de XmlReade r que.Xml XmlDocumen t XmlDataDocument XmlReade r XmlElement XmlNode XmlWri ter XslTransfo m XPathNavigator II Microsoft.2 se han representado las clases mas representativas. son equivalentes a las clases Reader implementadas por 10s . respectivamente. X M L Desde Visual Basic . E n 10s puntos siguientes se explica el uso de algunas clases. no olvide consultar la documentaci6n electr6nica de Visual Basic .Xml o alguno de sus subambitos. o derivado.X m l .2.Schema XmlSchema XmlSerializer II Svstem.NET para encontrar informacih detallada sobre cada uno de 10s miembros de &tos bmbitos. En la figura 11. y las de utilizaci6n mas habitual. siendo el resto de 10s Bmbitos especificos para la gesti6n de esquemas. Como puede ver. uso de XPath y transformaci6n de documentos. el mayor numero de clases.

Como es Iogico. nombre. Centrdndonos en las dos primeras. si bien sus metodos y propiedades son otros.NET proveedores ADO. Suponiendo que queremos tan so10 mostrar por la consola el contenido del documento XML Libros . asi como la interfaz que implementan dos de ellas y cuyo objetivo es facilitar informacion de posicih de 10s elementos en el documento. prefijo si estd asociado a un dmbito con nombre.usado como ejemplo en el tercer capitulo. su constructor puede tomar como primer argumento. XmlTextReader.NET. XmlTextReader es el medio mds rdpido para leer un documento XML. que incluso podria ser un fragmento XML preparado en memoria. a1 que tenemos acceso mediante multiples propiedades para. XmlValidatingReader y XmlNodeReader comparten un buen numero de miembros. so10 puede avanzar. podriamos usar el c6digo siguiente. Estas funciones si las tiene XmlValidatingReader. el metodo Read ( ) nos permite ir avanzando por sus elementos. como ocurre con SAX. Clases derivadas de X m l R e a d e r t IXmlLineInfo A1 derivar de una base comun. un Stream o un Text Reade r. En la figura 11. per0 el proceso de recuperacion serd identico a1 mostrado aqui. conocer su tipo. Este metodo para acceder a un documento XML seria similar a1 us0 de SAX. el cursor interno del XmlReader apuntard a un elemento del documento. por ejemplo. entre otras opciones. que nos permiten leer un documento XML desde un flujo de datos sin o con validacih. disponemos de un cursor solo de lectura y unidireccional. xml. per0 en lugar de responder a eventos que se generan a medida que se encuentran 10s diversos elementos. en la prdctica efectuariamos algun proceso de la informacion en lugar de imprimirla simplemente.3 puede ver la clase XmlReader y sus derivadas. X m 1 . Object 41 XmlReader XmlTextReader XmlValidatingReader XmlNodeReader Figura 11. Imports S y a t e r n . etc. Tambikn tenemos a nuestra disposicion m6ltiples mktodos del tipo ReadXXXX ( ) para leer el texto de un elemento en distintos formatos. Teniendo acceso a1 documento XML a recorrer.3. para recuperar esos elementos. En cada momento.Pvogramacio'n de bases de datos con Visual Basic . una cadena con un camino y nombre de archivo. a1 no efectuarse validacion alguna respecto a una DTD o esquema XSD.

per0 no lo hemos leido directamente como si fuese un texto sino mediante un XmlReader.22. como saber si el elemento tiene o no atributos.xrn1") While L e c t c r .indicando en la propiedad ValidationType el tipo de .Name="EJitc r i d l t ' " Then End I f End Select End While Li L. Esto nos permite distinguir 10s tipos de nodo y efectuar otras operaciones. etc. N a r r i e . L e c t o r . Name para recuperar su nombre. h e a d ( ) " t OI-".Name) c .FJritcLinc() ' L . X M L Module Module1 Sub M a i n ( ) D i m L e c t c r As New XmlTextReader("Libros.C1 ? End Sub End Module La ejecuci6n de este c6digo deberia generar un resultado identico a1 mostrado en la figura 11. Depth para conocer la profundidad en el documento y Value para recuperar un valor de un nodo de texto. separar el prefijo de dmbito del nombre de 10s elementos.4. en lugar de XmlTextReader empleariamos la clase XmlValidatingReader. conocer su n6mero." L i h r c ~ " Or L e r t lc. En caso de que deseemos tratar un documento XML previa validaci6n contra una DTD o un esquema XSD. Bdsicamente es el documento XML original. En el ejemplo anterior se ha usado NodeType para saber el tip0 de nodo.

NET I validacibn a efectuar y adadiendo el esquema a Schemas o facilitando la informacibn necesaria en XmlResolver para acceder a la DTD. tal como indica su propio nombre. a la lectura de informacibn.4.Programacidn de bases de datos con Visual Basic . El documento XML procesado por el codigo de ejemplo Las clases derivadas de XmlReader est6n dirigidas.exe ri Figura 11. per0 en ningdn caso facilitan mecanismos . IC:\P&lctVisuatBasicN~Cap-l I\LecturaXMLWn\kturaXML.

0 Firstchild: Devuelve el primer nodo hijo del nodo actual.actuando a su vez como base de XmlDataDocument. mediante codigo. por lo que. per0 existen alternativas m6s eficientes y simples. y luego usar un Xmlwriter para volver a generar el documento. Attributes: Atributos del nodo actual. La recuperacion de este puede efectuarse desde un archivo en disco. mediante la propiedad Document Element obtendriamos el primer elemento. entre ellas: NodeType: Contiene el tip0 de nodo. insertion y borrado. Disponiendo del documento en el objeto XmlDocument.5 puede ver que XmlDocument est6 derivada de XmlNode.5. clase que implementa la interfaz IXPathNavigable. El metodo Load ( ) cuenta con varias versiones que aceptan distintos pariimetros. lectura. X P a thNa vig a b 1 e XmlDocument XmlDataDocument Figura 11. tenemos muchas de las propiedades y metodos con que cuenta XmlDocument. ChildNodes: Recupera la lista de nodos hijo del nodo actual. etc. Este es de una clase tambien derivada de XmlNode. segun nos interese en cada caso. 0 Value: Almacena el valor del nodo. Podriamos efectuar este trabajo manualmente en el programa. un TextReader. En la figura 11. Una de esas opciones es la clase XmlDocument. compuesto por 10s nodos y elementos que existan en dicho documento. Esta clase aloja el documento XML completo en memoria y ofrece facilidades de navegacion. La clase XmlDocument y relacionadas XmlDocument recupera todo el documento XML y genera un drbol jerarquico en memoria. HasChildNodes:Devuelve True si el nodo que esta tratiindose tiene nodos hijo. eliminar o afiadir elementos. modificacion. Name: Aloja el nombre del nodo. en principio.un XmlReader. un flujo o Stream. una clase que usaremos posteriormente para sincronizar la informacion de un documento XML con un DataSet. el que actua como raiz de todos 10s demas. X M L para modificar el contenido de 10s nodos. 0 .11.en la que se implementa el DOM nivel 1y 2.

del indicado. heredados de XmlNode. . un nodo hijo existente por otro. Supongamos que quiere actualizar el documento XML que contiene 10s datos de 10s libros. para recorrerlo. 0 Aparte de &os. D o c u m e n t E l e m ~ n tChildNodes . la obtenci6n de elementos a partir de su identificador o la escritura del documento de vuelta a un archivo o flujo de datos.NET 0 Lastchild: Devuelve el ultimo nodo hijo del nodo actual. Nextsibling: Obtiene el nodo siguiente a1 actual en el mismo nivel. L o a d ("libros. Replacechild ( ) : Sustituye 0 SelectNodes ( ) : Selecciona un conjunto de nodos a partir de un camino XPath.Programacidn de bases de datos con V i s u a l Basic . por ejemplo. incrementando 10s precios un 10 por ciento a1 tiempo que se muestra por consola el titulo de cada libro. CreateNavigator ( ) : Devuelve un XPathNavigator asociado a1 documento. El c6digo necesario seria el siguiente: I Module Module1 s New XmlDocurnent Dim Nodo As XrnlNode ' I' [ ) I Dim Titulo As String. Appendchild ( ) : Afiade 0 0 0 0 un nodo hijo a1 actual. la creaci6n de un nodo. Removechild ( ) : Elimina 0 0 un nodo hijo del nodo actual. el antiguo precio y el nuevo. ParentNode: Devuelve una referencia a1 nodo que actua como padre del actual. xml" 1 v For Each . la clase XmlDocument cuenta con multiples miembros adicionales que facilitan. Previoussibling:Obtiene el nodo anterior a1 actual en el mismo nivel. Precio As Decimal D o c u m e n t o . respectivamente. 0 InsertBefore ( ) /InsertAfter ( ) : Inserta un nuevo nodo antes o despu&.

en caso afirmativo.6 puede ver el resultado generado por el programa.InnerText l l r 5 i -> 12r51"r Nodo. Figura 11.11.ChildNodes(5).6. y ChildNodes nos ofrece la coleccidn de todos 10s XmlNode que contiene. actualizamos el precio y lo asignamos a1 nodo. Finalmente. titulo y precio. recuperamos el texto que hay en las columnas tercera y ultima.ChildNodesi5). Comprobamos si el nodo corresponde a un libro y. <Libras>. ob-memos la lista de nodos existentes en el elemento principal. xml en Internet Explorer. DocumentElement es ese nodo principal. Una vez mostrados en la consola. y en la figura 11. En la figura 11.7 aparece el documento NuevosPrecios . x m l " ) End Sub End Module Tras recuperar el dLcumento XML. X M L Titulo Precio = = Nodo. Resultado producido por el programa . mediante el metodo -oad ( ) . Save "NuevosPrecios . guardamos el documento en un nuevo archivo.InnerText End If Next 1 I_ I = Precio D o c u m e n t o . con 10sprecios ya modificados.ChildNodes(2).InnerText Nodo.

.

Select ( " / I . se encuentra definido en especificaciones del W3C y . Va 1ue ) Cu End While End Sub End Module Figura 11. gracias a XSLT. Rei 1 1 1t 41.8. Este lenguaje. con instrucciones de proceso XSLT tales como template. Load ( " L i b r o s . para seleccionar 10s datos.Prograrnacio'n de bases de datos con Visual Basic . genera el nuevo documento a partir de la informaci6n de origen.NET Dim Docurnento As New X m l D o c r J r n e r ~ t( 1 D o c u m e n t o . M c v e N e X t i ) Con sole . u l t a d o . Re c u 1t a d o .CreateNavigator ( ) Dim R e s u l t a d o As X P a t h N n d e I t e r a t o r = N a v e g a d o r . Lista de titulos de la editorial con codigo 1 __ __ -I_^_ __. tras ser procesada por el analizador XSLT.- - -- Los documentos XML pueden ser transformados en documentos de otro tipo.. i b r ' r / L i b r o [ E d i t o r i a l = l ]/ T I t u l o " ) ~ teLi CrL f . x r n l " ) Dim N a v e g a d o r As X P a t h N a v i g a t o r = Documento. segun se anotaba en un punto previo. Writ e L i r ~ ie" i 0 J " . como todo lo relacionado con XML. r r e r l t . El proceso se basa en la construcci6n de una plantilla XSLT que. En esa plantilla se combinan expresiones XPath. for-each o value-of. C o u n t 1 While R e .

concretamente para generar una tabla HTML con el nombre y precio de 10s libros del documento XML de ejemplos previos: Las dos primeras lineas son las que identifican a1 documento como una plantilla XSLT u hoja de estilo XSL. A continuaci6n encontramos marcas HTML corrientes para la creaci6n de una tabla. ya que la expresi6n XPath del atributo match selecciona todo su contenido. . Previamente. equivalente a1 hom6nimo de la clase Xml D o cument. segun se vio antes. Todas las instrucciones XSLT van precedidas con el prefijo xsl. leidos con <value-of>. aparte de 10s que ya conocemos. lo que nos interesa es ver como podemos hacerlo desde un programa propio. sin embargo. Finalmente. El unico elemento adicional que precisamos. por ejemplo 10s titulos de una cierta editorial. La marca <template> aplica la plantilla que hay a continuaci6n. en el interior de las celdillas de la tabla HTML se introduce el valor de dos elementos de cada libro. como puede apreciarse. El documento mostrado a continuaci6n es una plantilla XSLT para transformaci6n de documentos. es la clase XslTransform.encargado de aplicar la transformaci6n a1 documento. La etiqueta <for-each> es equivalente a un bucle For/Next de Visual Basic. Esta deriva directamente de O b j ect y no implementa interfaz alguna.a todos 10s datos del documento.11. repitiendose tantas veces como elementos Libro existan en la rama Libros. Aunque podriamos asociar esta plantilla de transformacibn directamente a1 documento XML. como 10s lenguajes de programaci6n. es precis0 recuperar la plantilla XSLT mediante el metodo Load ( ) . hasta la etiqueta de cierre </template>. X M L cuenta con sentencias condicionales y de repeticibn. El metodo de mayor inter& es Trans form ( ) . viendo el resultado en Internet Explorer dado que este es capaz de analizar y ejecutar la transformacibn. Ya sabe que esta expresion puede cambiarla para seleccionar cualquier otro conjunto de datos.

X r r l I m p o r t s Sq'tem.x 1 End Module Las clases que acabamos de conocer tienen utilidad por si mismas. centrados en el tema de acceso a datos.YPath I m p o r t s -. incluyendo camino si es necesario. encuentran su mayor aplicaci6n en nuestro caso. y tras tener 10s DataTable con las filas de datos quiere obtener s610 aquellas que cumplan una cierta condicibn. del archivo XML de origen y el archivo de destino.mediante 10s adaptadores de datos adecuados. sin importar su finalidad. Asumiendo que tenemos la plantilla de transformaci6n anterior almacenada en un archivo llamado TablaHTML. o bien generar una pdgina HTML a partir del .Yrnl. ya que hacen posible la lectura y manipulaci6n de documentos XML desde cualquier aplicaci6n desarrollada con Visual Basic . etc. sin que tuvi4semos que modificar el programa. Otras opciones nos permiten usar flujos de datos. No es espectacular. I m p o r t s Sy: tern. una tabla mhs vistosa o mas informacion de la contenida en el documento XML. produciendo a partir del documento XML otro formato de documento sin necesidad de procesar elemento a elemento todo su contenido.NET. pero s610 seria precis0 afiadir algunas marcas mhs a la plantilla para introducir un titulo de pdgina. Muchas de las operaciones descritas. con el sencillo programa mostrado a continuaci6n generariamos el documento HTML que puede verse en la figura 11. a1 sincronizar un documento XML con un DataSet o viceversa. en el propio programa.Prograrnacidn de bases de datos con Visual Basic .9.Jm1. siendo el formato mhs fhcil el que tan s610 toma dos cadenas de caracteres conteniendo el nombre.> tpm. no obstante. El resultado se adaptaria automhticamente a 10s cambios de la plantilla. Tambien existe la posibilidad de crear la plantilla XSLT a1 vuelo.NET El metodo Transform ( ) puede tomar distintas listas de pardmetros. x s l t . XmlPathNavigat o r como origen. Suponga que ha creado un DataSet.

Podemos obtener un documento XML desde una aplicacion externa. a/& Fa. Documento HTML generado a partir de la transformacion XSLT Segun se aprecia en la figura 11. crefindose la vinculacion entre conjunto de datos y documento XML de manera inmediata. en ciertos casos. consultas SQL y generar 10s documentos mediante ASF'. A 10s miembros heredados. ~ 5 Piogratuacion con T'imd Bahic NET 39 Piogianiacion coil \*iaual \hidlo YET 40 Progiatuacioii con Yibual C NET 39 Guia practica paia usuaiios JBuildcr 10. El constructor de la clase tambien puede tomar como parfimetro un Data S et. el us0 de XPath o XSLT pueden ser mejores opciones. Podriamos usar vistas.11.5.NET pero. ya contamos con todos 10s miembros de &a y sabemos. &rihiio Edcian yer Faioitos !erramentar I . como recuperar un documento XML y recorrerlo. Xml DataDo cument es una clase derivada de XmlDocument por lo que. XmlDataDocument afiade un propiedad. bfisicamente. DataSet. manipular su contenido como si se tratase de un conjunto de tablas de datos. . que facilitan la obtencion de un elemento XML perteneciente a una cierta fila del Dataset o viceversa.9. Burqueda Cap-1 liiransfolmacion b eeiultado m ~ - I _ hlanual del iiiicropiocssador 80386 40 Inttoduccioii a la piogxarnacioii 34 04 Guia practica pata uauariob de KjIir 10 5 2 Guia practica para usuaiios d2 Excel 2002 10. y algunos metodos. como GetElementFromRow ( ) o GetRowFromElement ( ) . mediante la sincronizacion con un DataSet.'5 L'aei Interface Dshigii for Propianinisrs 31 EQL \ m e i 2000 10 -5 IL--------LItO ~ ___- - ~~~ 1HPC ____ _ _ _ ~ Figura 11. X M L DataSet para su presentacion a traves de la Web. El caso inverso tambien puede darse.51 hIaiiual aLanzado Excel 1001 1 1 04 Guia piactica pata us~iaiioh Delphi 6 de 10 5 2 Programacion con Delphi 6 1 KJ hi 3 26 ' Guia practica pata muaiio5 de T'isual Studio NET 10 5 2 Guia piactica paia usuaiiob d2 T'iaual Basic YET 1 1 2 . en principio. y. . por ejemplo a traves de Internet.

vayan a mantenerse.NET El procedimiento de trabajo vinculado entre DataSet y XmlDataDocument puede desarrollarse. ya sea leyendola de una definici6n XSD o bien cre6ndola segun se vio en un capitulo previo. ya sea obtenida mediante un adaptador o aiiadida por otros medios. Puede hacerse. de dos formas distintas: 1.Xm1 I m p o r t s System.Data Module Module1 Sub M a i n ( ) Dim Datos As New Dataset() D a t o s . E n f o r c e C o n s t r a i n t s = False . recogerlo desde el Da taSet mediante el metodo ReadXml ( ) . y lectura de la informaci6n desde un documento XML a traves del Xml Data Document. Vamos a ver 10s dos procedimientos con un breve ejemplo en 10s dos puntos siguientes.xsd") D i m Docurnento As New X r n l D a t a D o c u r n e n t i D a t o s ) . si nos interesase. R e a d X r n l S c h e m a ["Lihros. r Datos. Puede pensar que podriamos guardar la informacidn en formato XML en un archivo y. incluso conectarla con componentes de interfaz de usuario. nada nos garantiza que el orden de 10s elementos. Leyendo el documento en un XmlDataDocument estaremos seguros de que la estructura se mantiene. por ejemplo separaciones y espacios en blanco. posteriormente. Creaci6n del Data S et con informacibn. por ejemplo procedente de una aplicaci6n externa a traves de una red. El primer caso se dar6 cuando la informaci6n se nos facilite en formato XML.Programacidn de bases de datos con V i s u a l Basic . Creacion del Data S et vacio. Si hacemos cambios y luego guardamos la informaci6n con W r i texml ( ) . principalmente. sus atributos y la estructura con que estaba escrito. Puede comprobarlo con el siguiente programa de ejemplo: I m p o r t s Systern. per0 con el inconveniente de que no se respeta el formato original que tuviese el documento XML. y necesitemos introducirla en un Data S et para poder tratarla como un conjunto de tablas y. 2. a1 tiempo que conseguimos el acceso desde un Data S et . creando a continuaci6n el XmlDataDocumen t vinculado a1 Data S e t. recuperaci6n de informaci6n de esquema.

Finalmente. para tener autom6ticamente el documento XML que representa a1 contenido del conjunto de datos.11.Load ( " L i b r o s.Tables Console. o aplicar una transformacih a 10s datos para generar un nuevo documento. que se efectua en la sentencia siguiente. las restricciones de las columnas podrian no ser vdidas y generar excepciones. podemos efectuar seleccionados de datos XPath sobre un DataSet.10. se lee el documento XML y muestra por consola el contenido del DataSet.El resultado serd similar a1 de la figura 11. LPara que puede servirnos esto? Como se decia antes. En vez de escribir 10s datos. como en este ejemplo.Columns Console. aiiadir. porque lo conozcamos de antemano.Write( F i l a ( c o 1 u r n n a ) & vbTab) Next c o n s o l e . -~ Este proceso es acin mfis simple si cabe. W r i t e I . recuperamos la informacih de esquema del archivo L i b r o s ..xrnl") D i m Tabla As DataTable D i m F i l a As DataRow. ya sea definiendolo mediante cddigo. y despues devolver la informacih a1 documento XML con el metodo Save ( ) de la clase XmlDataDocument.entregando este como argument0 a1 constructor del primero. Acto seguido damos a la propiedad EnforceConstraints del DataSet el valor False. ya que basta con crear el XmlDataDocument vinculado a1 DataSet. insertar. c o l u r n n a As D a t a C o l u r n n For Each Tabla In Datos.Rows For Each c o l u m n a In Tabla. Son posibilidades que ha conocido brevemente en puntos anteriores. o bien deduciendolo del contenido del propio documento XML. A continuacih creamos el XmlDataDocument. XML 1)ocumerito.ya que durante la lectura del documento. i ne ( Next Console.WriteLine(Tabla.Tab1eNarne & vbCrLf) For Each F i l a In Tabla.Observe c6mo se pasa a1 constructor el DataSet r e c i h creado. etc. podriamos modificar.WritoLine ( ) Next ) End Sub End Module Tras crear el Data S e t vacio. . x s d creado en el tercer capitulo. De no disponer de este archivo tendriamos que obtener la estructura de algun otro modo.

.it 1 D i m Datos As N e w DataSet("MisDatos") I.!a cznl. Imports Imports Imports Imports System. A continuaci6n crea elXmlDataDocument y lo muestra por consola..NET 4 Figura 11. .Xm1 System. LOS datos obtentdos del D a t a S e t a traves del XmlDataDocument A mod0 simplemente de ejemplo.10.-. I D i m Conexion As N e w SqlConnection( " "Data Source=inspiron. Initial Catalog=Libros..SqlC1ient Module Module1 Sub Main() ' Jr!il.. "User ID=sa. mediante un adaptador de datos. : p3t_.: li.Programacidn de bases de datos con Visual Basic . se localizan todos 10s titulos de libros pertenecientes a la primera editorial. Por ultimo. Conexion) I .. el programa siguiente crea un D a t a Se t y lo llena.s::.j. con el contenido de la tabla L i b r o s que teniamos en la base de datos SQL Server. Password=") I i 11' ? a 3' dLJL' D i m AdaptadorLibros As N e w SqlDataAdapterl "SELECT FROM Libros".lG. L % s .Data. .XPath System. Observe la expresidn XPath.XIL7li . .Xml..il. l .. en la que la raiz es M i s D a t 0 s ya que &e es el nombre que hemos dado a1 D a t a S e t . usando un X P a t h N a v i g a t o r . mientras que L i b r o s es el nombre de la tabla._i & - - . Data System.

WriteLine("Hay { O } t i t u l h s " & vbCrLf. La posibilidad de enviar conjuntos de datos en formato XML tambien es util entre aplicaciones .NET. que no trabajan con ADO. X M L Dlm N a v e g a d )r As XPathNavlgatoL = Dacumeritr X r e a t e N a v i g a t o r [ ) Di ~ [ E j i t o r i d 1= 1 ] / T 1t ul o " 1 Console. ya que 10s conjuntos de datos pueden producir flujos de datos XML adecuados para ser remitidos a aplicaciones externas. la integraci6n entre XML y ADO. Los beneficios que se obtienen son muchos. y viceversa. o basarse en 61 para crear otro. como aparece toda la informaci6n por la consola en formato XML. por ejemplo entre un servicio Web y una interfaz o entre un componente de negocio que se ejecuta en un servidor de aplicaciones y un cliente . Tras pulsar Intro se enumeraran 10s titulos de 10s libros pertenecientes a la primera editorial. y asumiendo que la conexi6n con el origen de datos es satisfactoria. invirtihdose el proceso cuando es nuestra aplicaci6n la que actua como receptora. Como ha podido ver en este capitulo. con el fin de que se aplique una transformaci6n generando una tabla HTML con 10s datos de 10s libros. Resultado.Count) E n d While E n d Sub E n d Module A1 ejecutar el programa.Puede ampliar el programa.NET es tan estrecha que 10s conjuntos de datos pueden tratarse como documentos XML.11.11.NET. ver$ en un primer momento. con gran simplicidad. especialmente en 10s ultimos puntos. como se aprecia en la parte inferior de la figura 11.

NET remoto.11. invirtihdose el proceso en el destino. En casos asi el conjunto de datos se convierte en XML para ser transmitido por la red.I Programacidn de bases de datos con Visual Basic . Documento XML generado a partir del D a t a S e t y resultado de la seleccion XPath . Figura 11.

no hay que menospreciar la posibilidad de emplear tkcnicas como XPath y XSLT sobre informacih almacenada en un Data S e t. . puede ser mucho m i s eficiente a travks de un XmlDataDocument que creando vistas o usando el metodo Select ( 1 de 10s DataTable. conociendo XPath con detalle. X M L Por ultimo.11. como se ha demostrado en el ultimo punto. En ocasiones una busqueda de datos.

.

.

Las posibilidades o capacidades que encontraremos en el entorno. ha efectuando escribiendo c6digo. crear conjuntos de datos con comprobaci6n de tipos. o . para definir conexih. cuando surgen problemas imprescindible para resolverlos. del cual forma parte Visual Basic . ser6n unas u otras dependiendo de la edicion con la que contemos. Como probablemente sabr6. de tal forma que sepa cu6les de 10s elementos explicados en 10s capitulos siguientes tiene o no a su disposici6n.Los capitulos de la segunda parte.NET es un product0 que puede adquirirse por separado en su propia caja. acceder a la informaci6n desde el propio entorno. Ser6 el tema de 4ste y 10s pr6ximos tres capitulos. Visual Basic . relativas a1 trabajo con datos.NET pueden ahorrarnos gran parte del trabajo que.NET. que acaba de finalizar. El objetivo de esta tercera parte del libro es mostrarle c6mo usar el entorno de Visual Studio . y en cualquier comercio especializado.NET. Saber qu4 clases son las que se emplean y c6mo funcionan es importante. le han servido para conocer un gran numero de clases de ADO. aprendiendo a utilizarlas en el codigo de sus programas sin recurrir a asistente o herramienta de diseiio alguna. etc. per0 tambien es cierto que las herramientas de disefio de Visual Studio . hasta ahora.NET. Ese ser6 el aspect0 que tratemos en este capitulo. generar adaptadores de datos.

12. tambikn incluye 10s lenguajes Visual C# . la primera de Visual Studio . A pesar de corresponder todos 10s productos a una misma version. como SQL Server. proveedores o socios.NET.NET. encontraremos una version especifica de Visio para el modelado de bases de datos y aplicaciones y el producto Microsoft BizTalk Server para la construccion de procesos de integracion con aplicaciones de clientes. Tambikn se diferencia de la anterior en la incorporation de Visual Sourcesafe.NET. Adem6s de &as.NET presentada en febrero de 2002. herramientas de diseiio para el servidor que facilitan el acceso a servicios.NET. bases de datos. que podriamos calificar de ediciones comerciales. como lenguaje.NET. etc. donde la anterior solo facilita MSDE. Puede obtenerse una version de prueba de esta edicion.NET per0 solo con 10s diseiiadores y elementos de Visual Basic . en la que. per0 difieren en ciertas caracteristicas como 10s servidores integrados en el paquete o la funcionalidad de ciertos elementos de diseiio. ya que incorpora todas las herramientas de diseiio necesarias y algunos servidores fundamentales.NET Standard: Es la edicion m6s simple y unica que puede adquirirse sin una suscripcion de servicio. .NET Enterprise Architect: Es la edicion superior del producto. Visual Studio . podemos encontrarlo en una de las ediciones siguientes: Visual Basic . aparte de todo lo indicado en la anterior. Capacidades d e d a t o s en V i s u a l S t u d i o .NET Enterprise Developer: Seguramente la edicion m6s apropiada para el desarrollo de aplicaciones con necesidades de acceso a bases de datos.NET. Visual C++ . asi como enlaces a comparativas individuales entre Visual Studio . tambien existe un Visual Studio .NET Academia dirigido a estudiantes y profesores. si bien incorpora algunos elementos adicionales y especificos para la audiencia a la que se dirige.com/vstudio/howtobuy/choosing. Visual Studio . herramientas visuales de bases de datos.NET y Visual J# .NET Professional: Aparte de Visual Basic . Visual Studio .asp.NET y la misma biblioteca de clases. solicitiindola en la Web de Microsoft.microsoft. Visual Studio Analyzer y Application Center Test. en http: //msdn.NET.NET y las ediciones Standard de 10s lenguajes. la plataforma .NET bien como parte de una suscripcion a alguna de las ediciones de Visual Studio . Visual Basic . existen varias ediciones distintas. asi como capacidades inexistentes en la edicion anterior: Crystal Reports. Todas ellas comparten un mismo entorno. Sus caracteristicas son similares a las de la edici6n Professional. limitada a 60 dias. Incluye el entorno de Visual Studio . Puede encontrar una comparativa completa entre las tres ediciones de Visual Studio . que es lo m & habitual.

sino de la propia BCL que existe en cualquier instalaci6n .NET.2. Caja de Visual Studio .NET que hemos conocido en 10s capitulos previos.NET Standard Figura 12. por ejemplo. todas las clases ADO.1.NET Enterprise Developer Los mecanismos de acceso a datos de la plataforma . Caja de Visual Basic .NET MlCmsofr Visual Basicnet Standard Figura 12. no forman parte de un lenguaje o una edici6n de Visual Studio .NET en particular.NET que vayamos a emplear para .NET y que. por lo tanto.Programacidn de bases de datos con Visual Basic . son independientes de la edici6n de Visual Studio . Las posibilidades de acceso a datos de nuestras aplicaciones. encontramos ya como parte del sistema en el nuevo Windows .NET.

Capacidades de datos en Visual Studio . otros productos que podriamos necesitar para el desarrollo. el de tratamiento de datos. Las diferencias. la Professional. Mgicamente. comprobaci6n y depuraci6n de nuestros proyectos. como se indic6 en su momento. bisicamente. es una buena posibilidad ya que podemos operar sobre uno de 10s RDBMS mds potentes y populares. no en explotaci6n.NET. en las ediciones superiores de Visual Studio . cuando las necesidades lo requieran. tanto Developer como Architect. en caso de que dependieramos de ellos. Con la edici6n m6s baja. respecto a productos como Microsoft Access. a SQL Server ser6 mucho m i s ficil. La mayor parte de ellas son accesibles desde el Explorador de servidores que. disponemos de MSDE que. vienen acompaiiadas de varios servidores de Microsoft. o con las herramientas de administraci6n especificas de cada origen de datos. ya que muchas de las operaciones efectuadas mediante ddigo. pudiendo ser necesaria. por ejemplo. aparte del propio entorno de diseiio. es.NET pueden realizarse desde el propio entorno. En cualquier caso. Lo que si resulta imprescindible es disponer de 10s controladores y proveedores adecuados para nuestras aplicaciones. . asi como conectar con servidores para ver qu6 servicios tienen disponibles. un product0 que nos permitird usar tecnicas de modelado basadas en est6ndares para construir nuestros modelos de bases de datos y negocio. las encontraremos en el entorno de trabajo. Microsoft SQL Server 2000 y Microsoft Visio. esos productos son MSDE. el motor de SQL Server per0 sin herramientas de administraci6n y capacidades reducidas en cuanto a numero de conexiones y tamafio de las bases de datos. Algunas ediciones de Visual Studio .12. entre ellos SQL Server 2000. La licencia del producto nos permite utilizarlo durante el desarrollo y comprobaci6n. en el sentido m i s amplio de la palabra. 10s compiladores y la plataforma .NET 10s desarrollos. Finalmente. aunque con MSDE. Las ediciones Enteprise.NET ofrecen. como puede verse en la figura 12. En el campo que nos interesa especialmente. es que estaremos empleando el controlador S qlC1i e n t y todas las posibilidades de SQL Server.NET integra una serie de herramientas que son conocidas genericamente como Visual Database Tools. Evolucionar. nos permite definir conexiones con origenes de datos y acceder directamente a estos. la instalaci6n de 10s MDAC o 10s proveedores para ODBC u Oracle. la edici6n Enterprise Architect tambien se entrega junto a la edici6n hom6nima de Microsoft Visio.3. Visual Studio . El us0 de MSDE. Para facilitar el trabajo con bases de datos.

vistas. las capacidades de estas herramientas visuales serin unas u otras. Tambien facilitan el diseiio de tablas. Las dos ediciones Enterprise permiten explorar cualquier servidor para el que exista un controlador OLE DB u ODBC.@W a d w & serndores 1 f f Cuadro - ___ ___ dc heiramtentas Figura 12. procedimientos almacenados.NET con que contemos. Aspect0 del Explorador de servidores Dependiendo de la edici6n de Visual Studio . asi como diseiiar tablas y vistas sobre MSDE. 0 0 . Resumidamente podriamos decir que: 0 En las ediciones Standard podemos explorar las conexiones para ver el contenido de las tablas de bases de datos Access y MSDE. La edici6n Professional tambien nos permite explorar servidores SQL Server y cualquier origen con un controlador ODCB u OLE DB.Programacidn de bases de datos con V i s u a l Basic .dbo2 - '8Diagramas de base de datos IBTablas + 17 CS-SRS(MDSYS) 0 MDDICWER (MDSYS) (MDSYS) 0 OGIS-SPATIAL-REFEFENCE-SYSTEMS 1 ME-PROYYINFO 7 + [MTSSYS) 0 DEPT 0 0 EDITORIALES EMp 0 LIBROS + + 0 RECEIPT 0 SALGRADE ntos almacenados r Sinonimos b E# Caias de mensajes UContadores de rendmiento a RegistTas de eventor - . cualquier elemento que pueda existir en un RDBMS como SQL Server u Oracle. asi como SQL Server de forma nativa. desencadenadores y.3. en general.NET insplron pubs.

etc. Generaci6n automatica de conexiones a origen de datos. sin embargo. por ejemplo para definir una conexibn. adaptadores de datos y objetos D a t a S e t con comprobaci6n estricta de tipos.NET sin necesidad de recurrir a la herramienta de administracidn propia de cada producto. vistas y procedimientos almacenados.NET. Diseiio.NET estuviese disponible.NET nativos para Oracle y ODBC aparecieron despues de que Visual Studio . por ello desde el Explorador de servidores.NET para la generacih semi-automAtica de comandos SQL para la creaci6n y modificacih de consultas. Diseiio de formularios de visualizaci6n y edicidn de datos tanto para interfaces basadas en Windows como para clientes Web. un adaptador de datos o un conjunto . observando el resultado desde el propio entorno de Visual Studio . D a t a V i e w 0 similar para facilitar la presentaci6n y manipulacih por parte del usuario final. puede accederse nativamente a un servidor SQL Server para operar sobre el. I Asumiendo que estamos trabajando con una de las ediciones Enterprise de Visual Studio . per0 no puede hacerse lo mismo con Oracle. Capacidades de datos e n V i s u a l Studio . en las ediciones superiores. en 10s capitulos siguientes se abordard el us0 de las herramientas visuales de datos y muchos de 10s componentes que pueden vincularse con un D a t a S e t. Vinculaci6n de conjuntos de datos y vistas con componentes de interfaz Windows y Web. Nada nos impide. de nuevos elementos tales como tablas.12. A medida que vaya conociendo todos 10s elementos. procedimientos almacenados. Los puntos siguientes le ofrecen una visi6n general de 10s temas que podri encontrar en dichos capitulos: Us0 del Explorador de servidores para definir una conexi6n y acceder a 10s elementos de un origen de datos. veri c6mo una parte importante del c6digo que en 10s ejemplos de capitulos previos introduciamos manualmente. acceder a una base de datos Oracle usando el proveedor OLE DB correspondiente. desde el Explorador de servidores.NET Los proveedores ADO. aunque en el codigo despues utilicemos el proveedor O r a c l e C 1i e n t . vistas. Us0 de 10s diversos asistentes de Visual Studio . introduciendo el us0 del Asistente para formularios de datos. o a cualquier origen para el que exista un proveedor OLE DB.

Ahora ya sabe lo que podr6 hacer. a partir del capitulo siguiente. Tambien se han avanzado. o VisualBasic .N€TStandard.Prograrnacidn de bases de datos con Visual Basic . segun la edicidn que tenga instalada en su sistema. algunos de 10s procedimientos en 10s capitulos siguientes pueden no estar disponibles en su instalacion del producto. esurnen Con este breve capitulo se han situado.NET.de tal forma que tan s610 tenemos que usar 10s componentes creados mediante operaciones de arrastrar y soltar. las diferentes capacidades de las ediciones existentes de Visual Studio .NET. algunos de 10s temas que se van a tratar en 10s capitulos de esta tercera parte del libro. en caso de que utilice la edicion Professional de Visual Studio . .NET de datos. o no. Ha de tener en cuenta que. en cuanto a caracteristicas de acceso a datos se refiere. ahora se genera de forma automQtica. en una visidn rQpida.

.

10s componentes que son necesarios para comunicarse con un origen de datos. llenado DataSe t con informaci6n de esos origenes a traves de adaptadores de datos. generado automAticamente 10s comandos de actualizacibn. . creaci6n automiitica de componentes de conexibn. y podemos aprovecharlo con el fin de ahorrar una cantidad importante de trabajo. mediante operaciones de arrastrar y soltar. adaptadores y conjuntos de datos. etc.En 10s ejemplos desarrollados en 10s capitulos de la segunda parte hemos conectad0 con diferentes origenes de datos. etc. lo cual nos ha servido para conocer muchos de 10s detalles de las clases implicadas.NET abierto para poder ir siguiendo las explicaciones.NET. No obstante. Tal y como podrii observar. extraer y devolver informaci6n. definici6n de estructuras y otros elementos. El objetivo de este capitulo es mostrarle c6mo puede servirse de esas herramientas de disefio para efectuar tareas como la edici6n directa de datos. ejecutado comandos. produciendo automiiticamente. por lo que es casi imprescindible que se encuentre delante de su ordenador con Visual Studio . ese entorno de disefio existe en Visual Studio . el contenido de este capitulo es mucho menos te6rico que el de 10s capitulos de la segunda parte y va a indicarle directamente c6mo efectuar cada tarea. recuperado informaci6n mediante objetos DataReader. Todas esas acciones las hemos implementado escribiendo c6digo. sabiendo c6mo emplearlas sin necesidad de asistentes ni un entorno de disefio.

.

NET vinculo de datos.3.Prograrnacidn de bases de datos con Visual Basic .1. Aspect0 inicial del Explorador de servidores If 1 --- Crear p e v a base de d a b s SQL Server - - Figura 13. Seleccione el proveedor OLE DB que desea utilizar e introduzca 10s datos necesarios para identificar el origen de datos y facilitar cualquier parimetro adicional que pudiera necesitarse. mostrado en la figura 13. @j de eientos Regirbos Serviuos de Crystal + + ‘1 Seriidores SQL Serler Figura 13.2. concretamente a1 tratar 10s archivos UDL. AAadimos una nueva conexion al Explorador de servidores . que ya conoce por haberlo usado en capitulos previos. onemnes de datos e mensaws + + f izJ Contadares de rendmiento % Servlclor I.

asi como el nombre de usuario y la clave. . en el Explorador de servidores. finalmente. Herramientas visuales de datos Figura 13. tras crearla. introduciendo en la pAgina Conexion el nombre del servicio local Oracle que cre6 con el software cliente. En 10s ejemplos de capitulos previos el servicio era L i b r o s .4.NET. al desplegarla en el Explorador de soluciones. lntroduzca el mismo nombre de usuario y clave que us6 a1 definir la conexion.3. podra tanto modificar sus parametros como eliminarla. Pulse el b o t h Probar conexi6n para asegurarse de que 10s pardmetros son correctos y. el usuario s c o t t y la clave t i g e r . como se aprecia en la figura 13. El nombre con el que aparecerd la nueva conexi6n. en caso de que ya no le sirva. Usando el menu emergente asociado a una conexion. A1 desplegarla ya tenemos acceso a todo el contenido de la base de datos desde el propio entdrno de Visual Studio .13. Tras crear una conexion con un RDBMS es posible que. pulse el b o t h Aceptar para finalizar la definici6n de la conexi6n. ser6 una combinaci6n del identificador de servicio y el nombre del usuario. Ventana Propiedades de vinculo de datos Seleccione de la pdgina Proveedores el proveedor Oracle Provider for OLE DB. sin necesidad de usar el software cliente de Oracle. aparece una ventana solicitandole la identificacion.

A partir de ese momento. directamente su direcci6n IP.Sermos de Crystal + ‘9 Sei. en la que aparecen varias carpetas. En la ventana que aparece.NET. .5.NET las posibilidades de diseiio que me ofrece el Explorador de servidores. En mi configuraci6n particular. no necesitamos definir una conexi6n para acceder a 61. si lo prefiere y la conoce. para usar desde Visual Studio .NET + + + + + Diagramas debase de dabs ‘$Tablas & smonimos - i& v1stas Procedtmientos ahacenados + b Funomes + Espafieoones del paquete + @ Cuerpos de paquete Servidores @ dimension + & Colas de mensajes + Contadores de rendimiento + @. mientras que SQL Server lo hace en otro llamado Inspiron.4. no tenemos m6s que desplegar dicho nodo para acceder a las bases de datos. Regirbos de eientos + Sermos + f.6.Programacidn de bases de datos con Visual Basic . Los servidores SQL Server aparecen como elementos en el nodo Servidores SQL Server del equipo donde se encuentren. Visual Studio . segun puede verse en la figura 13. similar a la mostrada en la figura 13. si SQL Server se encuentra en una maquina distinta. El proceso es realmente sencillo: haga clic con el boton secundario del raton sobre el elemento Servidores del Explorador de servidores y elija la opci6nAgregar servidor. simplemente introduzca el nombre de la maquina 0. he de registrar lnspiron como servidor adicional. En caso contrario.NET se ejecuta en un ordenador llamado Dimension.idores SQL Server B a % Figura 13. En ella se aprecia c6mo se ha conectado con el servidor y desplegado la base de datos L i b r o s . aunque se encuentre a miles de kil6metros. Al desplegar la conexion aparece una lista de carpetas con objetos existentes en el origen de datos Si el origen de datos sobre el que vamos a trabajar es SQL Server. Si tenemos nuestro servidor ejecutandose en el mismo equipo donde estamos usando Visual Studio . tendremos que registrarla como un nuevo servidor. Por ello. podr6 operar sobre el nuevo servidor de forma remota. Hecho esto tengo un acceso completo al servidor SQL Server que se encuentra en esa otra maquina. siempre que en dicha otra maquina tenga las credenciales apropiadas.

Acceso desde Visual Studio .NET a un servidor SQL Server que se ejecuta en otra maquina En caso de que no aparezca en el nodo Servidores SQL Server la instancia del RDBMS que deberia aparecer. Esto. ~ I - I - ~ L. cada una con su nombre de servicio. puede utilizar la opcion Registrar instancia de SQL Server.~ ~ ” . .13. facilitando el nombre del servicio.6. Para acceder desde el Explorador de servidores a1 contenido de un origen de datos.SC0Tr as de base de datos dmentor almacenados Figura 13. ~ . ejecutandose en la misma maquina.l _ l l _ _ ~ - ~ ~ .5. no suele ser necesario a menos que tenga varias instancias de SQL Server 2000. ya sea SQL Server o cualquier otro para el que hayamos definido una co- . Herramientas visuales de datos Ep$o &e & senidor Figura 13. normalmente. lntroducimos el nombre del servidor a registrar r@ Conemones de dabs + 0 Servidwes f* LlbrOS.. _ ^ _ ( ~ l _ ~ l _ _ ( ~ l _ _ _ ” l _ ” .

Puede hacerse de dos maneras: 1. si bien con la primera opci6n tendriamos que indicar el servidor donde va a crearse la base de datos y con la segunda no es necesaria. Dependiendo de las operaciones que efectuemos. a la derecha.7 puede observar. Esta se abre.8. La misma conexion en 10s dos estados. __I I ____ . esa conexi6n se mantendr6 abierta durante mds o menos tiempo. iC6mo saber si una cierta conexi6n est6 o no abierta? Tan s610 tiene que fijarse en el icono que precede a1 nombre de la conexibn. si empleamos la primera alternativa. cuando le interese. un detalle de dicho icono. no hay conexi6n activa. puesto que hemos empleado el menu emergente del servidor sobre el que recaerd la acci6n. En la figura 13. y cerrada. Adem6s tendremos' que introducir el nombre de la nueva base de datos. o simplemente como otra base de datos en el servidor. y cerrada. Para cerrar una conexi6n explicitamente.NET con SQL Server es superior a la que tiene con el resto de origenes de datos. normalmente. de forma automdtica cuando es necesario. Si dicho icono tiene en la parte inferior derecha un pequeiio enchufe es que hay abierta una conexi6n. que ser6 creada y quedard como una nueva conexi6n disponible. En ambos casos aparecerd el mismo cuadro de didlogo. .Programacidn de bases de datos con Visual Basic .___- - Conemones de datos Figura 13. a la izquierda. En caso de que lo que aparezca sea una cruz en rojo. en la ventana Explorador de servidores. abierta. con una conexi6n activa. como se aprecia en la figura 13. no tiene mds que abrir el menu emergente de la conexi6n y seleccionar la opci6n Cerrar conexion. a la izquierda. ampliado.NET. de haber usado la segunda. es necesario establecer una conexi6n.7. o la base de datos en caso de SQL Server. Seleccionando la opci6n Nueva base de datos del menu emergente asociado a una instancia de servidor de SQL Server. existiendo opciones especificas para este RDBMS que nos estdn disponibles para 10s demas. por ejemplo a1 ir a acceder a las tablas de una base de datos. Seleccionando la opci6n Crear nueva base de datos SQL Server del menu emergente asociado a1 elemento Conexiones de datos. a la derecha La integraci6n de Visual Studio . Una de esas opciones es la que nos permite crear una nueva base de datos desde el propio Visual Studio . 2.NET nexi6n mediante OLE DB. sin necesidad de recurrir a1 Administrador corporativo.

Los procesos descritos en 10s puntos previos. despliegue el servidor de datos y seleccione. registre el equipo en la rama Servidores del Explorador de servidores. son aplicables de manera indistinta. es algo que puede hacerse directamente desde el entorno de Visual Studio . Durante el desarrollo de una aplicaci6n es habitual la necesidad de editar directamente 10s datos alojados en el origen. por tanto.NET. ya sea para preparar un bloque de datos de prueba. tratindose desde ese momento como cualquier otro de 10s elementos que ya existiesen con anterioridad. una vez definida la estructura de la base de datos. tampoco para definir la estructura precisamos m i s que este entorno si tenemos una de las ediciones superiores de Visual Studio . En cualquier caso. la nueva base de datos queda en el Explorador de servidores como una nueva conexi6n o una nueva base de datos. Asi lo hicimos en el tercer capitulo.8. a1 emplear Microsoft Access para introducir informaci6n en una base de datos Access o las herramientas de administracibn de SQL Server y Oracle para hacer lo propio sobre esos RDBMS. segtin el caso. En realidad. En realidad. simular posibles fallos o corregir 10s que pudieran generarse. Si tiene acceso a un servidor SQL Server. no necesitibamos emplear ninguna de esas herramientas para editar la informacih puesto que. de .NET. casi siempre se recurre a una herramienta especifica del origen para efectuar ese trabajo.13. Herramientas visuales de datos Conexiones de dams + - a + dimenson Inrpron hlf Colas de mensajer Contadores de rendimiento Reqissos de evenbs + - f* Serviaos de Crvstal 1 Seruidorer SQl Server 9 + a IB Propedades Figura 13. Opcion para crear una nueva base de datos SQL Server A partir de la creacih. como va a ver de inmediato.

71 39 .9. x l s y no L i b r o s . Tras hacer doble clic. veri aparecer en el entorno de Visual Studio . en el Explorador de servidores siempre aparece el prefijo ACCESS. Si se fija. Si el origen de datos no es SQL Server primer0 tendri que definir una conexih. Edicion de tablas de datos en el entorno de Visual Studio NET Observe que siempre que defina una conexion utilizando el proveedor Microsoft JET. . Vera que el nombre del archivo es L i b r o s . mientras que la inferior es la tabla L i b r o s que creamos con Microsoft Excel en 10s ejemplos del tercer capitulo.75 10.52 21.0 1 n 0 + + LlBROS RECEIPT 39 10.0 1 Figura 13. y siempre que la conexi6n con el origen sea satisfactoria.Programacidn de bases de datos con Visual Basic .04 . tras lo cual el proceso seria 10s idhtico. s e g ~ n pasos explicados antes. no obstante.9 puede ver como se editan dos tablas de manera simultinea.NET la carpeta Tablas de la base de datos que prefiera.52 24. La de la parte superior corresponde a una base de datos de ejemplo instalada con Oracle 8i. siendo posible la eliminacihn.24 10. En la figura 13.04 10.52 1U. por ejemplo para acceder al libro de Excel en este caso. una tabla cualquiera.75 10 52 37. m d b . modificaci6n e insercidn de datos. haciendo doble clic sobre ella.NET una cuadricula con 10s datos actuales de la tabla. En ambos casos se ha definido una conexion mediante el proveedor OLE DB. ACCOUhTNG CESS C VBddviwaiBaxNEl I NEW YORK SALES OPERATIOFIS CHICAGO BOSTCA + t $VStaS @ Procedimientor aimacenado - )biibroi5cm + hagramas de bare de datw I 1 I I X + 0 + + + + BONUS c ] D m EDIIORIKES €MP LlBRO 10.

Si deseamos eliminar una de ellas tendremos que seleccionarla completa. y pulsar a continuacion la tecla Supr. lo cual puede significar tan s610 unas decenas de filas.-. No podra.. respectivamente. agrupar datos. _ _ _ _ _ I I _ l_ x _ ~ l _ ._-. para ir ripidamente a la primera de las filas o a la ultima. respectivamente. se activa una paleta de herramientas que por defect0 no esti visible. - __. Tampoco podra editar aquellas columnas cuya precision exceda unos ciertos limites. apareciendo automiticamente una fila vacia en la que podemos introducir 10s nuevos datos. ademis. puesto que su valor se genera automaticamente.____. como ocurre con la base de datos creada a mod0 de ejemplo para este libro. segun puede verse en la figura 13. Las tres anteriores van a la primera fila.---- - A1 abrir una tabla con el sistema anterior. A1 abrir una tabla. modificar la columna I D L i b r o de la tabla L i b r o s de la base de datos SQL Server. por ejemplo para llenar ripidamente una tabla.-. podemos modificar el contenido de cualquiera de las filas mostradas. como hemos hecho en el punto previo.13.. Herramientas visuales de datos ~ . ~ ---I. Debe tener en cuenta que ciertas columnas de datos pueden no ser editables. ejecutar una sentencia SQL. el valor de dicha columna sera insertado automaticamente.10) y seleccionar la acci6n que deseamos ejecutar. En lugar de efectuar todas estas operaciones mediante teclas o combinaciones de teclas.____.. existen multiples botones con 10s que podemos ocultar y mostrar distintos paneles. no s610 aparece una cuadricula con las filas y columnas de datos sin0 que. .____-. haciendo clic en el selector que aparece a la izquierda de la primera columna. Las que hay detras facilitan la copia y el pegado de datos o filas completas. o bien el puntero del rat6n para actuar sobre la barra de desplazamiento. por ejemplo. nos podremos desplazar de un punto a otro fila a fila.. En ella. obtendremos todo el contenido. o bien miles de ellas.11. etc. Tambikn pueden emplearse ciertas combinaciones. Si aiiade una nueva fila. Para insertar una nueva fila no tenemos mAs que desplazarnos debajo de la u1tima que tiene datos. tambien podemos abrir el menu emergente (vease figura 13. como Control-Inicio y Control-Fin. La opci6n Fila nos permite ir directamente a una cierta fila introduciendo su numero. De forma similar. en caso de que conectemos con una base de datos en explotaci6n real u obtenida como copia de una que se encuentre en explotacih. afiadir otras tablas.. haciendo doble clic sobre ella. Usando las habituales teclas de desplazamiento del cursor. a la ultima e insertan una nueva fila.

75 39 w 39 10.NET no necesita saber mhs. Menu en el que encontramos las operaciones mas habituales _ _ _I k a ~Q -. todos 10s datos de la editorial correspondiente.75 3.52 10.26 10. Ver6 que la tabla de datos mostrada cambia. primero. indica q u e L i b r o s . pulse el b o t h Agregar tabla (ultimo de la paleta indicada antes) y seleccione de la ventana que aparece (vease figura 13.12) la tabla Editoriales.52 24. Paleta de botones activa durante la edicion de datos Tras haber hecho doble clic en la tabla L i b r o s .10. I11 l e f f Duntemann Oscar Gonzak: 1 1 1 1 1 1 1 1 1 1 1 1 2 nsz 37. IDEdit o r i a l .1-115 1324 4 8 W 1 5 1392 9 84415 1376 7 34415-1351-1 34415 1290 6 Guia piacbca paia usuanos JEuilder 7 84415-1B1-1 84-115 1261 2 84 415 12558 84415 1230 2 8.52 21. aparecen en gris.NET Simplemente situe el punter0 del rat6n sobre cada b o t h para obtener una indicaci6n de su finalidad. a continuacicin. para abrir la correspondiente cuadricula.Prograrnacidn de bases de datos con Visual Basic . sin embargo. que ya estaban visibles.1415 1202 7 84-115-1132-2 84 415 11454 847615 234 5 0-171 37523 3 34415 1402 X Franuaco Charte R a n o x n Charte Franuscn Charte/lnrge Seriano Francisco Charte Franuzco Charte Franosco Charte Franosco Charte FrancEcn Charte Franorco Charte Franosm Chartem Jesus Luque Franorcn Chatte Franosco Charte Chris ti Pappas&WiliiamH Murray.11.75 10. Su estructura. pulsando el b o t h Agregar. .13 que la editorial mostrada a la derecha es la correspondiente a1 c6digo de editorial de cada libro. 1x 3 a 4 4 1 5 1136 S SOL Server 2000 1 10. En principio lo unico que notar5 es que 10s datos de la tabla L i b r o s .04 40 1 1 m.04 10.5 10. Fijese en la figura 13. aparte de la informaci6n del libro en cuesticin. a pesar de que no hayamos indicado explicitamente esa vinculaci6n entre ambas tablas. Pulse el b o t h Ejecutar consulta. cuyo icono es un signo de admiraci6n. apareciendo en cada fila.75 Figura 13.__- gavharbpo- ! % L '_ ~ EZ a Figura 13. asi que Visual Studio .EditorialesunaclaveexternaqueapuntaaEditoriales. y el b o t h Cerrar.

13. tendri . Herramientas visuales de datos I) Figura 13.%to Figura 13. el primer0 contando desde la izquierda. posiblemente no necesitemos tener visibles todas las columnas. Agregamos la tabla E d i t o r i a l e s . puede marcar y desmarcar las columnas que desea tener visibles. Una alternativa es pulsar el b o t h Mostrar panel SQL y editar directamente la sentencia SQL que se desea ejecutar. sin0 simplemente efectuar alguna comprobacidn. Puede pulsar el b o t h Mostrar panel de diagrama. Para ver el resultado. para abrir un esquema visual en el que se aprecia la relacidn entre ambas tablas y. ademAs.12. Resultado obtenido tras aiiadir la tabla E d i t o r i a l e s y ejecutar de nuevo la consulta Si no pretendemos editar 10s datos.13. como en el caso anterior.

NET que pulsar el b o t h Ejecutar consulta.Programacion de bases de datos con Visual Basic .14. titulo que aparece en el panel de resultados. el Panel SQL. en la parte superior. a medida que haga cambios en el Panel de diagrama y Panel de cuadricula podra ir viendo como se reestructura la sentencia SQL que ejecutara a1 pulsar el boton Ejecutar consulta. Ademds se ha ordenado ascendentemente por el titulo del libro.14 puede ver el Panel de diagrama.75 10 52 37 26 10 52 21 04 4115 120 1 2 4 4 1 5 1230 2 ? 115 l2n2 7 4-315 11'2 2 4415 1115 4 I7615 23+5 Frogiamaclon i o n Delphi 6 Manual abanrado Excel 2ui Guia pacbca para uwams de Excel 2nn2 Guia pracbca para usuarius de Yb+ihl lnboducoon a la programacion Manual del micropmesador 80386 Assembly Language Step-bf Step 10 5 2 1 52 0 2. aparte de seleccionarse s61o aquellos cuyo precio esti por debajo de 10s 40 euros.l L r b r m Tihrlo Libros Frecio Editoriales Nombre Edturiales ON Lbbros Editutial = Editmale: IDEd tmal I 15 1136 5 ? $15 13241 4 4 : 1392 9 -1 $415 1170 7 1415 1351 1 --I 1290 6 !+5 SQL Server 20 Gum prarbca para USUailOs JBulder 7 Programaoon con lisual C 2 NET Programaoon con visual Studio NET Frugrmaoon con visual Basic NET G m paCbca wra U S U ~ ~ ~de S wal Bavc NET D I 39 40 39 1G. etc. en el drea central. Ldgicamente.15 se ve c6mo se ha asignado a la columna N o m b r e de la tabla Editoriales el alias Editorial. En la figura 13. Seleccion de columnas mediante el Panel de diagrama y el Panel SQL Nota Si mantiene abierto el Panel SQL. Otra forma de establecer criterios de selecci6n y ordenaci6n consiste en abrir el Panel de cuadricula (segundo de 10s botones de la barra) e introducir directamente las opciones deseadas.a Mulbmedia Anaya Mulemedia AnajaMulbmcda Anwa Mulemedia M a y a Multimedia McGran+ll Anma Multimedia Figura 13. y el Panel de resultados en la secci6n inferior. En la figura 13. ordenacibn. l@ SELECT Lbrbros 1SBI.) 04 40 471 37523 3 6iJ 5 m a y a Mulbmeda Anaya Mulbmedia Anaw Multimedia m a y a Mulbmedia Anam Mulbmedia Anaya Mulbmedia Ana. puede afiadir a la consulta SQL cl6usulas de selecci6n de filas. . agrupamiento.

52 10 75 24. Con 10s elementos indicados en el punto previo.Z 39 39 10. de actualizacidn o de eliminaci6n.16. Si tras abrir una tabla despliega la lista adjunta a1 b o t h Cambiar tipo.13. . Puede hacer pruebas manteniendo abierto el Panel SQL para ver las sentencias ge- . La sentencia. Herramientas visuales de datos . es posible seleccionar columnas y filas. seguir5 siendo de consulta. 10s distintos paneles inicialmente ocultos.04 21.52 10. no obstante.04 37. NET 10. en el Panel SQL veri aparecer una sentencia I N S E R T INTO. las acciones que llevemos a cab0 en 10s paneles de diagrama y cuadricula. se genera automiticamente una sentencia SQL de consulta para recuperar todas las filas y columnas de la tabla. Segun la opci6n que elija. eligiendo columnas o estableciendo criterios de selecci6n de filas. A partir del momento en que se modifique el tip0 de sentencia.I uj lReaa Guia paiaca w r a usuanos de Excel 2002 Gum pacbca para uwanos de Kdix Guia pacbca para uwarios de Visual Baac NET Guia pacbca para uylanos de Visual f b d i o NEI Gua pactlca para uwarios JBulder 7 Inmducoon a la pogramaoon Manual atanzado Excel 2002 Progtamwon con Delphi 6 y Kylh Programanon CM Visual Baa< NET Progiamaaon imr Visual C . como se ha hecho en la figura 13.52 10.I SQLferier 2000 User Interface k s g n for Programmers 31 np-ess Figura 13.15. podri cambiar la sentencia SQL para que en vez de ser de consulta sea de inserci6n de resultados. se aplicarin a la nueva sentencia SQL.NET.75 lEditmd h y a Mulhmedla Anaya Mulbmedia Anaya Mulbrnedra Anaya Mulbmedia Anaya Mulbmeh Anaya Mulbmedia Anaya Mulbmeda Anaya Mulbmeha Anaya Mulbmedia Anaya Mulbmedia Anaya Mdbmedia Anaya Mulbmedia 1 8 4 4 1 5 1132 2 84415 1202 7 84415 1290 6 84415 12914 84415 13244 84415 1145-4 84415 1230 2 84415 1261 2 84415 1351 1 84415-13924 84415 1136 5 1893115 94 1 . de valores. UPDATE 0 DELETE.52 10 75 10. haciendo doble clic sobre ella en el Explorador de servidores. Establecernos filtros de seleccion de datos y criterios de ordenacion A1 abrir una tabla desde Visual Studio .

y asumiendo que aun no ha abierto ninguna tabla. I INTO Editonales Editonales = Edtoriales __ - i M I a Figura 13. por ejemplo. puede agrupar las filas de datos segun el valor de una cierta columna para obtener un resultado agrupado. la eliminacih de 10s datos. Abra el Panel de diagrama y seleccione de la tabla Editoriales la columna IDEdit o rial. .16. per0 sin llegar a pulsar el b o t h Ejecutar consulta para evitar. 0 0 Pulse el b o t h Agregar tabla y seleccione la tabla Editoriales.Programacidn de bases de datos con Visual Basic . puede hacer una simple prueba dando estos pasos: Haga doble clic sobre la tabla Libros para abrirla. Modificamos el tipo de sentencia SQL Si tiene como parte de la consulta alguna expresi6n de resumen.Teniendo &a seleccionada. pulse el b o t h Orden ascendente. Partiendo desde el Explorador de servidores. estableciendo asi un criterio de ordenacih.NET neradas.

Por ultimo.17. prescindiendo de 10s demas paneles de diseAo. el penultimo de la barra. cuyo c6digo aparece en la segunda columna.17. pulse el b o t h Ejecutar consulta. Herramientas visuales de datos 0 Pulse el b o t h Agrupar por.23. mientras mantiene la selecci6n en la misma columna I D E d i tori a 1. tambien puede acceder a la consulta SQL y modificarla directamente. La primera columna de resultados es el numero de titulos que tiene cada una de las editoriales. asi como para cambiar el orden en que aparecen en la cuadricula de resultados simplemente arrastrando y soltando. Figura 13. Si conoce el lenguaje SQL muchas veces le resultara mas rapido. 0 El resultado obtenido deberia ser similar a1 de la figura 13. Puede usar el Panel de cuadricula para asociar alias a estas columnas. Resultado obtenido al agrupar por la columna I D E d i t o r i a l Nota Como en 10s demas casos. .

asumiendo. Una cuadricula donde podri ir introduciendo el nombre de cada columna. a la izquierda.Programacidn de bases de datos con Visual Basic . al crear una nueva tabla. Cuando se finaliza el diseiio. se encontrarti con una interfaz similar a la que emple6 en Microsoft Access o SQL Server. En cualquier caso. vistas y procedimientos almacenados. tambi6n tenemos la posibilidad de editar la informaci6n de esquema si estamos usando MSDE 0. como se aprecia en la figura 13. tanto si la tabla es nueva como si ya existia. abra el menu emergente de la carpeta Tablas de la base de datos sobre la que vaya a trabajar. aparecera una pequefia ventana preguntando si desea crear la tabla y solicitando un nombre definitivo para ella. y se cierra la ventana. de cualquier origen de datos tip0 RDBMS.NET le da un nombre provisional del tipo T a b l a l . _ ~ I_ ~ _ l _ l l _ _ I______ "-____I ~ ~ _ _ ^ _ _ _ I - ~ - - - Para crear una nueva tabla. no obstante. eligiendo la opcion Nueva tabla. para crear las tablas de la base de datos de ejemplo. cuenta con cinco botones cuyo nombre y finalidad. Esta. asi como modificar la estructura de 10s elementos existentes siempre que el origen no nos lo impida. a1 pulsar este b o t h se generarti la secuencia de comandos SQL correspondiente. que la estructura de las bases de datos ya se encuentra establecida. son 10s siguientes: 0 Generar secuencia de comandos de carnbio:Finalizado el disefio o modificaci6n de la tabla. Inicialmente. En principio dicha secuencia aparece en una ventana (vease figura 13. y elija la opci6n Diseiiar tabla. mientras que a la derecha se esti afiadiendo una nueva tabla a la base de datos Oracle.20) desde la que podemos guardarla en un archivo.19. su tipo de dato. longitud. Podemos crear nuevas tablas. incluidos Oracle y SQL Server. etc. Si lo . por supuesto. en el tercer capitulo. de izquierda a derecha. Gracias a las Visual Database Tools de Visual Studio . A1 igual que ocurria a1 abrir una tabla para edicicin de datos. la edici6n de la estructura de la tabla L i b r o s de SQL Server. pulse el b o t h secundario sobre ella.18 puede ver. en el Explorador de servidores. mientras disefiamos su estructura hace su aparici6n una paleta de botones especifica. en el caso de las ediciones Enterprise.NET. Si lo que necesita es editar la estructura de una tabla existente. En la figura 13. por ejemplo porque causase una p6rdida de informaci6n. Visual Studio .NET En 10s puntos previos nos hemos centrado en la edici6n de datos.

0 .que presumiblemente va a registrar movimientos de cuentas. en la secuencia de comandos SQL. I Figura 13.19. De esta manera se crea una clave externa. puede activar la opci6n Generar automaticamente secuencia de comandos de cambio al guardar para que. y las relaciones existentes entre ellas. o columnas. sin necesidad de volver a pulsar este b o t h . una restriccih de clave primaria y otra que impide la introduccih de valores nulos. Barra de botones especifica para el disefio de la estructura de una tabla 0 Establecer clave principal: A1 pulsar este b o t h se establece como clave principal la columna. Esto produce. con la tabla TABLA1. por ejemplo. este b o t h nos llevar6 a la p6gina Relaciones de la ventana de propiedades de la tabla.13. se genere autom6ticamente esa secuencia de comandos cuando haya finalizado el diseiio. En la figura 13. En ella podemos establecer la relaci6n que esta tabla tenga con otra.21. est6 relacionindose la tabla TABLA3. Herramientas visuales de datos desea. Podemos tanto modificar la estructura de una tabla existente como crear nuevas tablas Figura 13.18. que tuviksemos seleccionada en ese momento. Relaciones: En caso de que estemos disefiando multiples tablas.que contiene 10s datos de cada cuenta.

TABLA1 MODIFY IDCUENTA wAR(1. Establecemos las relaciones entre tablas 0 Administrar indices y claves: Abre la misma ventana que se muestra en la figura 13.21. seleccionando 10s nombres de las columnas participantes e introduciendo el nombre que tendr6 el indice.20. per0 con la pigina fndices o claves en primer plano. SMDO rwILER(18. No tiene mis que ir pulsando el b o t h Nuevo de la pigina fndices o claves para ir aiiadiendo indices.I) C D N W M . m Q AWAR(Zs).NET &sea Q u a r k esta Eealerw de c a a n d o s de c d w en t W m ~ W O de text02 CREATE T F SCOTT TABLA 1 h i DCUENTA CtlAR(14). Desde ella podrin crearse nuevos indices asociados a la tabla. .2) k ALTERTPleLE SCOTT.TAELA1 Aw C C W 5 R A M K-TABLA1 PRIMARV C Y Y Figura 13. asi como establecer la clave principal en caso de que no la hubiesemos fijado previamente con el b o t h Establecer clave principal.T A B L A l NOTNULL.Programacidn d e bases de datos con Visual Basic . Secuencia de comandos de creacion de una tabla Figura 13.21. P T E R TABLE XOTT.

en la que podemos definir restricciones adicionales que pudieramos necesitar. Creadas las tablas.NET como si de una tabla normal se tratase.13. La primera permite modificar la definicion de una vista existente. mientras que la segunda crea una nueva vista. o a cualquier otra. Definirnos una restriccion para evitar que el saldo de la cuenta pueda ser negativo Los datos obtenidos a partir de una vista pueden abrirse en Visual Studio . veremos dos opciones especialmente utiles: Diseiiar vista y Nueva vista. Figura 13. Verd que el resultado es una cuadricula de datos. podemos editar su contenido como con cualquier otra tabla.22. Recuerde que en el tercer capitulo usdbamos herramientas especificas para efectuar estas tareas.NET. Si abrimos el menu emergente asociado a esa vista. mientras que ahora lo hacemos todo desde el propio entorno de Visual Studio . .22). tras cerrar las ventanas de disefio y responder afirmativamente a la pregunta de si se desean guardar 10s cambios. como la de una tabla. per0 mostrando el resultado de la consulta que define la vista. Herramientas visuales de datos 0 Administrar restricciones Check: El 6ltimo de 10s botones nos lleva a la PAgina Restricciones CHECK de la misma ventana de propiedades (vease figura 13. Puede desplegar la carpeta Vistas de la base de datos SQL Server u Oracle y hacer doble clic sobre la vista LibrosPorEditorial que se habia creado como ejemplo en un capitulo previo.

Con esto habr6 modificado la vista en el servidor de datos. .NET El disefio de una vista se efectua a traves de 10s paneles de diagrama.23.ll.hnaya Mulmmeda nap 1- itme medial Anaya Mulhmedla Anaya Multmmeda Anaya Muitmedia 1- ---. Podemos introducir modificaciones en cualquiera de esos apartados. Usando esos mismos elementos puede crear una nueva vista.lo.L- [PREUO m n e Anaya Mulbmedia 31 10. IY /1 I NOKBRFAS Edltorld'. aparecen las tablas que la forman. sus relaciones y selecci6n de columnas y criterios. Deber6 encontrarse con un entorno como el de la figura 13.l. y luego cerrar la vista respondiendo afirmativamente a la pregunta de si desea guardarla. LIBROS EDITOMALES IDEDmORIAL = LIBROS EDITORIAL EDITOMALES LiiKOS P c C f i 'iklSElEcr - - -- - -- -- WHERE 1Edlond I_ friar0 User Interface D e q n fm Programmers s g l server 2000 Guia paceca para uwarms IBuMm 7 Prwamaoon mn Visud Clt NET Programaooncor Vlwal s b h o NET Programman con VISA B a x NET Guia p a d m para uwarlos de Visual Basc NEl tuia paceca pala usuanos de Viyld S b h o NET Programaooncon Deiphi 6 y Kyhx .52 373 I I - --- J I Figura 13. Seleccione la vista que teniamos como ejemplo.75 . Ya que la vista existia.' Anaya Mulbmeda Anaya Multmedla -__ . Elementos para el diseiio de una vista icion de procedimientos almacenados y funciones Desde el entorno de Visual Studio . Pruebe a afiadir una vista a las bases de datos existentes para familiarizarse con 10s distintos paneles y la barra de herramientas asociada.NET es posible ejecutar procedimientos almacenados y funciones que residen en un RDBMS.Prograrnacidn d e bases de datos con V i s u a l Basic . crearlos y. asi como editarlos._---__ ________ E l 'D 10. abra el menu emergente y luego elija la opci6n DiseAar vista. LIBROS LO ps Tib.23. La diferencia es que la sentencia SQL resultante ser6 asociada a una vista.75 39 40 39 10.75 10. EDITORIALES.-"A-r%h. por ejemplo estableciendo un criterio de selecci6n de filas. cuadricula y SQL que conocimos en el punto dedicado a la edici6n de datos.

Si el procedimiento tiene parhmetros de entrada. que pueden crearse.13. incluso depurarlos. No tenemos mhs que introducir el valor y pulsar el b o t h Aceptar para ejecutar el procedimiento y ver el resultado. Menu de opciones asociado a un procedimiento almacenado SQL Server A1 ejecutar un procedimiento almacenado. igualmente. como ocurre con uno de 10s que definimos a mod0 de ejemplo en el tercer capitulo.. apareceri un pequeiio cuadro de dialog0 como el de la figura 13. depurarlo o crear un nuevo procedimiento almacenado.24.NET.25. I % Propedades Figura 13. como si hubiese ejecutado cualquier aplicaci6n.. Si hace clic con el b o t h secundario del rat6n sobre un procedimiento almacenado. Vera aparecer 10s resultados en el panel Resultados de Visual Studio . editar el codigo. Las operaciones descritas en este punto son aplicables. Parametros necesarios para ejecutar un procedimiento almacenado . mostrando una fila por cada parametro que se precise. En 61 se encuentran las opciones adecuadas para ejecutarlo.24. Vera aparecer un men^ emergente similar a1 de la figura 13. a las funciones.NET.25. I7 Editar Procedmiento almacenado i r a Procedimiento almacenado FJuevo procedimento almacenado Actualizar Snerw s e m n a a de cwnandos de oeaam . Figura 13. Herramientas visuales de datos en el caso de SQL Server. editarse y ejecutarse desde el entorno de Visual Studio .

reconoce la sintaxis del lenguaje en el que est4 escrito el procedimiento almacenado. Fijese en c6mo la selecci6n de datos se encuentra delimitada por una linea. Edicion de un procedimiento alrnacenado Mediante la opci6n Diseiiar bloque SQL podri disefiar visualmente el bloque de SQL que aparece delimitado por la linea. Observe la figura 13. en la que est6 edittindose el procedimiento almacenado NumTitulosEditorial de SQL Server. como haria en cualquier programa. puede establecer puntos de parada en el c6digo del procedimiento a fin de poder depurarlo.Programacidn d e buses de dutos con Visual Basic . sirvikndose para ello de 10s mismos paneles que utilizaria a1 diseiiar una vista.26. Figura 13.NET en el editor de ddigo.NET Los procedimientos almacenados. Si trabaja con SQL Server. como si de un m6dulo cualquiera se tratase.26. obtenihdose el resultado que aparece en la parte inferior. Mediante el menu emergente se ha ejecutado el procedimiento. se manipulan en el entorno de Visual Studio . ofreciendo opciones especificas para ejecutarlo o disefiar aquellos bloques SQL que efectuan selecciones de datos. Este editor. ya Sean existentes o nuevos. como en este caso. . no obstante. En la parte superior aparece el c6digo del procedimiento almacenado.

13. Herramientas visuales de datos

Si utiliza la opcion Nuevo procedimiento almacenado para crear nuevos procedimientos, observara que el esqueleto de codigo que aparece en el editor se ajusta a la sintaxis propia del RDBMS con el que estemos trabajando. Esto es asi, al menos, con SQL Server y Oracle.

Ahora que ya sabemos c6mo emplear las herramientas visuales de bases de datos de Visual Studio .NET para preparar, o conocer, la informaci6n sobre la que vamos a trabajar, el paso siguiente seri aprender a usar 10s componentes de acceso a datos con que contamos. En realidad, esos componentes ya 10s conocemos, la unica novedad es que en lugar de crearlos mediante cbdigo, como en capitulos previos, usaremos operaciones de arrastrar y soltar y la ventana Propiedades. Si inicia una aplicaci6n tipica Windows, o para la Web, veri que en la Caja de herramientas existe una secci6n llamada Datos. En ella aparecen, como se aprecia en la figura 13.27, 10s componentes OleDbConnection, OleDbDataAdapter, OleDbCommand y 10s equivalentes para el proveedor SqlClient, asi como 10s componentes genkricos Da taVi ew y Data Se t.

Figura 13.27. Cornponentes de la seccion Datos en el Cuadro de herramientas

Programacidn de bases de datos con Visual Basic .NET

En principio no contamos con componentes especificos para 10s proveedores Oracleclient y Odbc.Siempre que tenga dichos proveedores instalados, puede seleccionar la opci6n Personalizar cuadro de herramientas del menu emergente del Cuadro de herrarnientas, abrir la pBgina Componentes de .NET Framework y activar 10s componentes Oracle Command, Oracl eCommandBui lde r, OracleConnection y OracleDataAdapter, como se ha hecho en la figura 13.28, y / o 10s componentes Odb cCommand, Odb cCommandBui lder, Odb cConnection y Odb cDa taAdap te r. Tras cerrar el cuadro de didogo, pulsando el b o t h Aceptar, verB aparecer en el Cuadro de herramientas todos esos componentes.

UOdbcDataAdapter mOleDbCommand OleDbCommandBuilder ~OleobComecbon mOleDboataAdapter OpenFileDialog OOradeCommand DradeCommandBuilder mOradeConnecbon OradeDataAdapter

Microsoft Data Odbc System Data OleDb
System Data OleDb
System Data OleDb

System Data OleDb System hindows Foimr
System Data OradeClient

System Data OradeClient System Data OradeClient
System Data OradeClient

7
I/

-

-

__

. .-- . .

Miaosoft.Data.Odbc (1.0.3300.G) Svrtem.Data (1.0.3M0.0) System.Data (1.0.3M0.0) System.Data (1.0.3M0.0) Svrtem.Data (1.0.3M0.0) System.Wmdows.Fams (1.0.330.0) System.Data.OradeClient (1.0.3330.0) System.Data.OradeCbent (l.G.3M0.0) System .Data .OradeClient (1 .0 ,3300 .0) System .Data .OradeClient (1 .0 ,3330 .0)

I

. .

-

I

. -. . .

. .. .I

-

.

fY’

!.>I

I/

1

II

Figura 13.28. Seleccion de 10s componentes correspondientes a 10s demas proveedores

Teniendo todos 10s componentes dispuestos en el Cuadro de herrarnientas, en 10s puntos siguientes vamos a usarlos para establecer una conexibn, definir un comando, preparar un adaptador de datos y generar un conjunto de datos, todo ello sin necesidad de escribir codigo alguno.

re
Dependiendo del proveedor que desee emplear, haga doble clic sobre el componente Connection adecuado del Cuadro de herramientas, consiguiendo asi su inserci6n en el m6dulo que tenga abierto en ese instante. Suponiendo que desee acceder a 10s datos alojados en una base de datos Access o un libro de Excel, haria entonces doble clic sobre el componente OleDbConnection. Este aparecersi en el Brea de disefio, en la zona inferior, y sus propiedades estarian visibles en la ventana Propiedades. La unica propiedad que tendremos que editar sersi Connectionstring, a fin de facilitar la informaci6n de conexi6n necesaria. Esta propiedad cuenta con una

13. Herramientas visuales de datos

lista que, a1 desplegarse, muestra la lista de conexiones que hay predefinidas en el Explorador de servidores, pudiendo seleccionar directamente cualquiera de ellas. Si no nos interesa ninguna de ellas, no tenemos m i s que seleccionar la opci6n Nueva conexion para abrir el cuadro de diilogo Propiedades de vinculo de datos y definir las propiedades de la conexi6n.

El componente Sqlconnection se comporta practicamente de forma identica a OleDbConnection,de tal forma que la propiedad connectionstring tambien muestra la lista desplegable con la opcion Nueva conexion. Los compOnenteS OracleConnection y OdbcConnection, por el contrario, no disponen de esa lista ni asistente alguno, por lo que la cadena de conexion debe escribirse directamente como valor de la propiedad Connectionstring. En la figura 13.29 puede ver c6mo se ha insertado un OleDbConnection en una aplicaci6n Windows y c6mo, abriendo la lista adjunta a la propiedad Connectionst ring, se elige una de las conexiones predeterminadas, concretamente la de acceso a1 libro Microsoft Excel. Si nos interesa, podemos cambiar el nombre del componente por otro m i s adecuado. En este ejemplo mantendremos 10s nombres por defect0 que tienen 10s componentes a1 ser insertados. Tras la inserci6n del componente de conexibn, y asignaci6n de un valor apropiado a Connectionstring, para abrir la conexidn usariamos el componente como si de una variable previamente declarada se tratase, es decir, como hariamos con cualquier otro componente en Visual Basic .NET. La sentencia siguiente, por tanto, usaria el componente insertado en la figura 13.29 para abrir la conexi6n con el libro de Microsoft Excel.
OleDbConnectior~l. Open (
)

-~
Con 10s componentes Command, por ejemplo OleDbCommand, prepararemos
10s comandos de selecci6n de datos que precisemos. La unica diferencia es que

ahora el componente se crea a1 insertarlo en el disefiador, creandose automaticamente la variable, y las propiedades del comando se establecen visualmente. Nos encontraremos, no obstante, con exactamente las mismas propiedades que ya conocimos en capitulos previos, lo unico que cambia es la forma de crear el objeto y personalizarlo. Asumiendo que tiene en este momento definida la conexi6n del punto previo, inserte un OleDbCommand, simplemente haciendo doble clic sobre 61 en el Cuadro de herramientas, y edite en la ventana Propiedades las propiedades siguientes:

Programacidn de bases de datos con Visual Basic .NET

deherrmentas

s

OradeDataMaptcr

Figura 13.29. Seleccion de la cadena de conexion

Connection: Despliegue la lista adjunta y, del nodo Existente, elija luego la conexi6n OleDbConnectionl. De esta manera ya tiene asociado el comando con la conexi6n.

Si no tiene un componente de conexion, porque no lo haya insertado previamente, puede usar la opcion Nueva de la propiedad Connection para definirla en ese mismo momento, generandose automaticamente el componente OleDbConnection.
0

CommandType: Esta propiedad tambikn tiene asociada una lista de opciones, de la que puede elegir si el comando recuperar6 directamente una tabla, contiene una sentencia SQL o el nombre de un procedimiento almacenado. Mantenemos el valor Text que aparece por defecto, indicando que el comando tendri asociada una sentencia SQL.

13. Herramientas visuales de datos

0

CommandText: A1 seleccionar esta propiedad veri aparecer un b o t h , en el extremo derecho, con tres puntos suspensivos. Pulselo para abrir la ventana Generador de consultas (vease figura 13.30) y, usando 10s paneles que ya conoci6 en puntos previos, diseiiar visualmente la selecci6n de datos.

>
A
1

Y

>
nulo Aubr Preoo

V

>

Figura 13.30. Generador visual de consultas

La ventana Generadorde consultas no aparece, en este caso, como un diseiiador de Visual Studio .NET sin0 como una ventana independiente. Lbgicamente, podemos definir tantos comandos como necesitemos para efectuar nuestro trabajo. En este caso nos quedaremos s610 con el comando que puede verse en la figura 13.30, introducido en el componente OleDbCommandl.

En este momento, tras definir el comando, podriamos ponernos a escribir c6di-

go para, mediante el metodo ExecuteReader ( ) , obtener un OleDbDataReader y recuperar datos. Nuestro objetivo, sin embargo, es recuperar dichos datos en un DataSet con el fin de vincularlo con un D a t a G r i d , asi que el paso siguiente serti
definir el adaptador de datos que, partiendo del comando, llenarti el DataSet. Haga doble clic sobre el elemento OleDbDataAdapter, en el Cuadro de herramientas, para insertar un objeto de esa clase en la aplicacih. Se pondr6 en marcha

Programacidn de bases de datos con Visual Basic .NET

un asistente de configuracih que, en este caso, vamos a cerrar pulsando el boton Cancelar. Asi accederemos directamente a las propiedades del adaptador. Si observa la ventana Propiedades ver6 algunas como SelectCommand, TableMappings o MissingSchemaAction, que ya conoce de capitulos previos. Despliegue la lista adjunta a SelectCommand y elija del nodo Existente el unico elemento disponible. Con esto ya ha asociado el adaptador de datos con el comando definido antes. Seleccione la propiedad TableMappings y luego pulse el b o t h que aparece tras (Coleccion), accediendo a la ventana mostrada en la figura 13.31. En ella asociaremos la unica tabla de entrada, procedente de la sentencia SQL definida en el comando, con una tabla que existir6 en el DataSet a la que llamaremos Libros. Pulsamos el b o t h Aceptar y damos por acabada la configuracih del adaptador.

Figura 13.31. Asociaciones entre tablas de origen y tablas del conjunto de datos

En el mismo cuadro de dialogo Asignaciones de tablas puede tambien establecer una correspondencia entre las columnas del origen de datos y las que existiran en el conjunto, si es que este cuenta con una estructura predefinida.

s
El penultimo paso, en cuanto a tareas de diseiio se refiere en este simple ejemplo, ser6 la creaci6n del conjunto de datos, para lo cual hacemos doble clic sobre el elemento DataSet que aparece en el Cuadro de herramientas. Como en el caso del

13. Herramienfas visuales de dafos

adaptador de datos, se pondrfi en marcha un asistente que cerraremos pulsando el b o t h Cancelar. De esta forma tenemos un conjunto de datos simple y vacio, como 10s que utilizfibamos en 10s capitulos previos. La ventana Propiedades muestra todas las propiedades del DataSet,resultando especialmente interesantes En forceCons t raint s , Re1 ati ons y Tab1e s, que ya conocemos. Puesto que trabajaremos sobre una sola tabla, no van a existir relaciones, pero abriendo la colecci6n Relations tendremos acceso a un cuadro de difilogo desde el cual pueden ir definiendose esas propiedades de manera visual. Si vamos a tener una tabla, asi que seleccionamos la propiedad Tables y abrimos el correspondiente editor de esta colecci6n. En principio no aparece elemento alguno, asi que pulsamos el b o t h Agregar para insertar una nueva tabla. A la derecha, como se ve en la figura 13.32, aparecen todas sus propiedades. S610 vamos a modificar TableName, asignfindole el mismo nombre que dimos a la tabla en el adaptador de datos, es decir, Libros.

Figura 13.32. Edicion de 10s elementos de la coleccion T a b l e s de un D a t a S e t

Observe que, a diferencia del resto de componentes, el DataSet no se enlaza directamente con el adaptador de datos o cualquier otro componente. Sera mediante codigo como lo llenemos con datos.

ai

Z

Para ver el contenido del Data S et en esta ocasi6n no usaremos la consola, sino que disefiaremos una sencilla interfaz de usuario. Abra la secci6n Windows Forms

Programacidn de bases de datos con Visual Basic .NET

del Cuadro de herramientas y tome un componente DataGrid, insertiindolo en el formulario. Modifique la propiedad Dock para que ocupe todo el espacio disponible. Despliegue la lista adjunta a la propiedad Datasource y seleccione el elemento Data S et 1,vinculando asi la rejilla de datos con el conjunto de datos. Dado que este puede contar con mLiltiples tablas, usaremos la propiedad DataMember para seleccionar la que deseemos. En este caso s610 hay una disponible, asi que la elegimos. La interfaz, finalizada, quedaria como se aprecia en la figura 13.33. Observe en la parte inferior del 6rea central 10s componentes que se han ido insertando en 10s pasos previos.

0Wndow
Tw, Left

________

~

-

A

E
8
M

0Wndow

I Amworkspace
FixedD [z1 AcbveCapbon
AcbveCapbanText

Llsto

I

Figura 13.33. Aspect0 del forrnulario con el DataGrid en su interior

Si ejecut6semos el programa tal y como est6 en este momento, veriamos que la rejilla de datos permanece vacia. Es 16gic0, puesto que la hemos vinculado con un DataSet que est6 vacio y, ademis, en ningtin momento hemos vinculado 4ste con el adaptador de datos. Para hacerlo, abrimos la ventana de c6digo y, en el evento Load del formulario, insertamos la sentencia siguiente:
OleDbDataAdapterl.Fill(DataSet1)

No es mucho codigo, especialmente si lo comparamos con algunos de 10s ejemplos de capitulos previos y el resultado obtenido que, en este caso, seria el de la figura 13.34. Una rejilla en la que podemos navegar por 10s datos.

Frarcisco Cbarte M esvs L L w e Frarcisco Charte

12 52

IntrodLccior a la programion
Marual a.anzado Grcel :W2 F,lawal &I microrrocesador 33386 Programaacn C G Oelph 6, K , h ~ P r o g a r x i o r c w t/lsbal b s i c NET
sLal Studio NET

FraTx-iscu'Itsrte Farcisco Charte Frapcisco Charte Ckris H Pappas&'Allialr H Murra, Ill Frarcisco Charte Frarcisco Chide Frsrcisco Chide

40

Figura 13.34. Ventana con la rejilla de datos

No cabe duda, usando 10s componentes de conexi6n a datos como hemos hecho en 10s puntos previos, insertandolos en un disefiador y personalizandolos mediante el us0 de la ventana Propiedades, ahorramos una cantidad importante de trabajo respecto a la escritura de c6digo para efectuar todo el proceso. Tan s610 hemos tenido que escribir una sentencia para conseguir una cuadricula de datos que muestra el resultado de una consulta SQL, sin necesidad de recorrer filas, acceder a columnas y acciones similares mediante c6digo. No obstante, el trabajo puede simplificarse atin mAs mediante la creaci6n automitica de parte de 10s componentes que, en 10s anteriores puntos, hemos ido insertando y personalizando de manera individual. A continuaci6n vamos a tratar de obtener el mismo resultado, o similar, con menos pasos y en menor tiempo. Puede partir de un nuevo proyecto o bien eliminar el c6digo y 10s componentes que insert6 en el ejemplo previo.

Los adaptadores de datos cuentan con un asistente que facilita su configuracidn, asistente que anteriormente cerramos sin usarlo. Ahora, partiendo de un proyecto en el que tan s610 tenemos un formulario vacio, vamos a hacer doble clic sobre el

elemento OleDbDataAdapter del Cuadro de herramientas para poner ese asistente en marcha. La primera ventana que aparece es simplemente indicativa, bastando con pulsar el b o t h Siguiente > para ir a1 siguiente paso. En 61 deberemos seleccionar la conexi6n asociada a1 adaptador, ya sea eligiendo una de las existentes, tal y como se hace en la figura 13.35, o bien pulsando el b o t h Nueva conexidn para definir una nueva. En este caso nos encontraremos con el cuadro de di6logo que ya conocemos. Para seguir este ejemplo vamos a optar por la conexi6n Libros . d b o del servidor en el cual se tenga SQL Server en funcionamiento, en mi caso particular 1NSPIRON.Libros.dbo.

Figura 13.35. Seleccionamos la conexion que utilizara el adaptador de datos

Tras pulsar el b o t h Siguiente > nos encontramos con el apartado Elija un tipo de consulta. En ella, s e g h se ve en la figura 13.36, podemos elegir entre tres opciones distintas:

Usar instrucciones SQL: Para actualizar 10s datos, en caso de ser necesario, se emplear6n sentencias SQL del tip0 UPDATE, INSERT o DELETE. Estas se generarin automiticamente para nosotros a partir de la sentencia de selecci6n que facilitemos en el paso siguiente.
0

Crear nuevos procedimientos almacenados:En lugar de preparar comandos con sentencias SQL, esta opci6n crea en el RDBMS un procedimiento almacenado para obtener 10s datos, otro para actualizar, otro para insertar y otro para borrar, utiliz6ndolos cuando sea necesario. De esta forma las sentencias SQL ya se encontrarin compiladas en el RDBMS y el rendimiento ser6 superior.

por lo que usariamos esta opci6n con el fin de aprovecharlos en lugar de generar otros nuevos.38). asegurando asi que este siempre se mantiene en consonancia con el contenido real del origen de datos. actualizacidn y eliminacih. Pulsando el b o t h Opciones avanzadas de esta ventana. utilizando la misma interfaz que ya conoce de ejemplos anteriores.37. comandos adicionales para la insercih.36. en nuestro caso nos quedaremos con la que aparece seleccionada por defecto. En ella aparecen tres opciones inicialmente activadas. Figura 13. Seleccionamos el mecanismo que se utilizara para la actualizacion de datos Si elegimos una de las dos primeras opciones. en el paso siguiente tendremos que introducir la sentencia SQL de seleccion de datos. aparte del comando de seleccibn. La primera provoca que el asistente genere. Por ultimo. Con la segunda se conseguir5 que las instrucciones de actualizaci6n y eliminaci6n empleen el mecanismo conocido como concurrencia optirnista. Herramientas visuales d e datos Usar procedimientos almacenados existentes: En caso de que ya hubiesemos empleado la opci6n anterior en otro adaptador. en el RDBMS existirAn 10s procedimientos almacenados apropiados para efectuar las tareas de edicibn. abrir6 entonces la ventana Opciones d e generacion SQL avanzadas (vease figura 13. Si 6sta es compleja. no bloqueando el acceso a ellos. puede pulsar el b o t h Generador de consultas para diseiiar visualmente. . consistente en asumir que 10s datos no van a cambiar desde que se recuperan hasta que van a modificarse. no tan sencilla como la de la figura 13. la tercera opci6n provoca que tras cualquier actualizaci6n se efectue una actualizacih inmediata del conjunto de datos.13. en la parte inferior izquierda.

38. aun esta a tiempo de pulsar el b o t h < AtrPs y corregir lo que desee. A1 finalizar. Si no esti conforme con algo. componentes OleDbCommand.. apareceri en el disefiador el componente OleDbDa taAdapter y un OleDbConnection. sin embargo. a1 menos aparentemente. Opciones avanzadas de generacion de sentencias SQL Tras pulsar el b o t h Siguiente > una vez mas.. bastando la pulsaci6n del b o t h Finalizar para cerrar el asistente y concluir el proceso.37. lntroducimos la sentencia SQL de seleccion de datos Figura 13.Prograrnacion de bases de datos con Visual Basic . Figura 13. accedera a una ultima ventana de resumen y confirmacibn.No existen.NET 1 o m avanzadas Genera& de comultas. si examina el c6digo generado por el asistente encontrara las siguientes declaraciones justo antes del mktodo 1 nit i a 1i zeComponent ( ) : . Sin embargo. En ella se detallan las acciones elegidas.

mediante el mismo asistente empleado para crearlo. 0 1 e D b C o m m a n d Friend WithEvents O l e D b D e l e t e C o m m a n d l S y s t e m . Data.01eDb.01eDbCommand Friend WithEvents OleDbUpdateCornrnandl System.suponemos nos facilitar6 la visualizaci6n y edici6n de todas las filas de la tabla Libros. Ole Db. La figura 13. Puede cerrar la ventana. Pulse el b o t h Llenar conjunto de datos. En principio se encontrard con un cuadro de didlogo en el que aparece el nombre del adaptador de datos. Acabamos de configurar nuestro adaptador de datos que. O l e D b . De inmediato Vera c6mo aparece el conjunto de filas resultante. un tercero para actualizaci6n y uno mds para eliminaci6n de filas. " Puede cambiar la configuracion de un adaptador de datos en cualquier momento. especialmente las utilizadas para actualizar y eliminar filas existentes.Data. otro para insercion. D a t a . O l e D b C o r n r n a n d As As As As ~ ~ ~ ~ Existe. en la parte superior izquierda.Friend WithEvents O l e D b S e l e c t C o m m a n d l System.Data. que ya tenemos definido y comprobado. o bien eligiendo la opcion homonima del menu emergente del OleDbAdapter. asi como el nombre de las tablas de datos. por tanto. y varias Areas vacias en el resto de la ventana. . una vez lo conectemos con un DataSet. Bastard con abrir el menu emergente del . usando el enlace Configurar adaptador de datos que aparece en la parte inferior de la ventana Propiedades mientras tiene seleccionado el adaptador. y el tamafio global del conjunto de datos. Esta suposicidn puede convertirse en seguridad de forma muy sencilla: seleccionando la opci6n Vista previa de datos del menu emergente asociado a1 adaptador.39 muestra la vista previa del adaptador definido en el punto previo. generar el Data S e t es un juego de nifios. volviendo de nuevo a1 entorno de disefio a fin de proceder a la creaci6n del conjunto de datos. un OleDbCommand para s e l e c c h .OleDbCornrnand Friend Wi thEvents 01 e Db I n s e r t C o m m a nd 1 System. Partiendo del adaptador de datos. Busque m6s adelante la asignaci6n a la propiedad CommandText de cada uno de 10s OleDbCommand y examine las sentencias SQL.01eDb. en este caso s610 una.

.

41. En el encontrard una clase llamada Data S e t 1 derivada de Data S e t . puedan simplificarse asi: DataSetll. El conjunto de datos con tip0 nos ofrece. Herramientas visuales de datos Figura 13. . la integraci6n con la tecnologia IntelliSense del editor de cbdigo. un m6dulo llamado D a t a S e t 1.Tables(”1. a1 coincidir con 10s nombres de las columnas de la tabla L i b r o s . Abralo y eche un vistazo a su contenido. La existencia de este conjunto de datos con tip0 hace que sentencias como &ta: DataSetll.13. como L i b r os.Editorial = 3 No es necesario emplear las colecciones T a b l e s . lo cual hace mucho mas simple nuestro trabajo. como puede apreciarse en la figura 13. Opciones de generacion del conjunto de datos Aunque en principio parece que tan s610 se ha aiiadido el esquema XSD. Esta clase cuenta conuna propiedad s610 de lectura. una clase que. R o w s o Columns. implementa 10s elementos necesarios para facilitar el acceso a las tablas y columnas. si pulsa el b o t h Mostrar todos 10s archivos del Explorador de soluciones verd aparecer. llamada L i b r o s .ya que la clase Data S e t 1 cuenta con propiedades que.Libros(O). asegurando a1 tiempo la validez de 10s tipos.ibros”) . En la lista de miembros aparecen 10s nombres de las tablas y de las columnas del conjunto de datos. ya acceden a esos elementos por nosotros. de tip0 L i b r o s D a t a T a b l e .vb. Lo que ha hecho el asistente anterior es generar un conjunto de datos con t i p .40. ademds. asimismo. derivada de Data Se t. una clase definida mds adelante en la que encontrard objetos DataC o l u m n con nombres que le resultardn familiares.Rows ( 0 ) “ E d i t o r i a l ” ) = 3 ( en la que quiere accederse a la columna E d i t o r i a l de la primera fila de la tabla L i b r o s .

-^".NET Figura 13.~-~~ _____l___~~~. produciendo 10s avisos durante la compilacion. ha efectuado el mismo proceso y creado 10s mismos componentes que en 10s apartados anteriores.l__ ___-_^_ En 10s dos ultimos puntos. Miernbros del conjunto de datos con tip0 Los conjuntos de datos con tip0 evitan ciertos errores.-ll_---~.. I .. iEs posible hacerlo con aun menos trabajo? Pues si. vistas y procedimientos almacenados no son una excepcih. como la asignacion de valores de tipos incorrectos.- _ i _ ~ -"_ ". Los elementos que aparecen en el Explorador de servidores pueden arrastrarse hasta un diseiiador.Programacidn de bases de datos con Visual Basic . -.~. utilizando el asistente de configuracion de adaptadores de datos y el generador de conjuntos de datos.. ~ Q u ocurre si toma. por ejemplo..41. la tabla Editoriales desde la base e . . es posible. en lugar de en ejecucion. en mucho menos tiempo y con menos operaciones manuales. y las tablas. cuando es facil corregirlos.l_l___.

comandos y conjuntos de datos.. . creando y configurando automaticamente un objeto OleDbConnection. Tambien puede arrastrar hasta un diseiiador cualquiera de las conexiones que tenga predefinidas en la rama Conexiones de datos del Explorador de servidores. incluido el control DataGrid que hemos usado en el ejemplo de este capitulo. . ..NET cuenta con potentes herramientas para el trabajo con bases de datos. . Lo unico que tiene que hacer es abrir el menu emergente del adaptador y elegir la opcion Generar conjunto de datos. ... como 10s adaptadores de datos. ~ _ I .. gracias a las opciones..13._._ ._ .... comandos y conjuntos de datos.~. I _ . .... . En ocasiones. ._. directamente desde el Explorador de servidores hasta un diseiiador. e incluso un procedimiento almacenado. . . insertarse en un diseiiador y personalizarse mediante la ventana Propiedades. obteniendo el mismo resultado. simplificando tareas como la edici6n local de datos o informacion de esquema._. el entorno de Visual Studio ._. . asimismo.NET facilita... ... la depuracion de procedimientos almacenados SQL Server desde el propio entorno. pueden tomarse desde el Cuadro de herramientas._I. . caso en el que se crea un SqlCommand. Ya tiene todo el trabajo anterior hecho en dos operaciones de raton._. . incluso cuando se opera sobre un origen de datos remoto. como las tablas y vistas. Como ha podido ver en este capitulo. en el capitulo proximo veremos c6mo conectar esos elementos con controles de interfaz. .. asistentes y la posibilidad de arrastrar elementos... . .. . Los componentes que en capitulos previos creAbamos mediante codigo. _. _' . .. . tal como se ha visto en 10s ultimos puntos. En lugar de una tabla puede arrastrar una vista. . Una vez que sabemos c6mo conectar con 10s origenes de datos y definir adaptadores. que facilita su ejecuci6n. lo que nos ahorra cambiar del entorno de desarrollo a1 de la base de datos a1 depurar una aplicacion que tenga embebidas parte de las reglas de negocio en el servidor de datos.. o equivalente. Herramientas uisuales de datos de datos SQL Server y la suelta sobre el formulario Windows? HAgalo y compruebe como se configura automAticamente el adaptador de datos y la conexi6n. la mayor parte del proceso de configuracih puede efectuarse automAticamente. Visual Studio . ~ .

.

tabla o conjunto de datos con uno o varios controles de interfaz. recuperar 10s cambios efectuados por el usuario para transmitir10s a1 origen de datos. segun que el control sea Windows o Web y tambien dependiendo de que . lo cierto es que la mayor parte de ese proceso puede automatizarse gracias a la existencia de la vinculaci6n a datos en ciertos componentes. es posible enlazar una vista. o bien las interfaces Web. El objetivo de este capitulo es introducir 10s conceptos de vinculacih a datos. empleada en 10s ejemplos de 10s capitulos de la segunda parte del libro. ya Sean Windows o Web. tambikn mediante ccidigo. ejecut6ndose por ejemplo sobre Windows. asi como 10s controles m6s interesantes en este aspecto. automatizando la presentacih y recuperaci6n de cambios. accesibles desde un cliente como Internet Explorer. mediante cbdigo.La presentaci6n y solicitud de datos a travks de la consola. La vinculaci6n entre 10s origenes de datos y 10s controles puede ser de varios tipos. no es precisamente el mecanismo m i s flexible ni amigable para comunicarse con 10s usuarios de sus aplicaciones. obtener 10s datos para presentarlos a1 usuario en componentes propios y. En el capitulo siguiente nos centraremos en el disefio de formularios de datos empleando estos controles. Aunque podriamos. Mediante la vinculaci6n a datos. De esta forma nuestro trabajo se reduce en gran medida. Es mucho m6s habitual la elaboracion de interfaces de usuario basadas en ventanas. o data-binding.

independientemente de que Sean nativas Windows o de tip0 Web. de forma distinta. vista o tabla. Los controles que se utilizan habitualmente para disefiar interfaces de usuario. datos que es precis0 facilitar a1 constructor en el momento de la creation. Controles capaces de mostrar el valor que tiene una cierta columna en multiples fhas. que es posible definir multiples vinculos con diferentes propiedades de un mismo control. en cuanto a su vinculaci6n a datos. por ejemplo un ListBox o ComboBox. la vinculaci6n puede efectuarse no solo con una vista. Los objetos de la colecci6n a la que apunta DataBindings son de clase Binding.NET emplean un sistema distinto. Esto significa. Son kstos: 0 Nombre de la propiedad: Los objetos Binding se aiiaden a la coleccion DataBindings de un cierto control. por tanto. per0 igualmente sencillo. pueden clasificarse. La mayoria de 10s componentes que estamos habituados a utilizar en el disefio de interfaces de usuario. con cualquier componente que implemente la interfaz I Li s t. por ejemplo 10s TextBox y similares. En realidad. tanto Windows como Web con ASP. Cada uno de esos objetos mantiene tres datos distintos para hacer posible el enlace. llamada DataBindings. Los controles Windows disponen de una propiedad. Origen de datos: El objeto del que va a leerse la informacidn. que almacena la colecci6n de vinculaciones o enlaces entre propiedades del control y una fuente de datos.14. normalmente un DataSet. Los controles ASE'. por lo que tan s610 precisan conocer. una tabla o un conjunto de datos. Controles tip0 cuadricula en 10s que aparecen multiples filas con multiples columnas. sin0 tambikn con una lista. tambikn podria ser una lista o un arreglo. DataTable o DataView aunque.NET. como se apunt6 anteriormente. a pesar de que no es lo m i s habitual. estableciendo cada uno de ellos un enlace para una propiedad del control. como el DataGrid que usibamos en uno de 10s ejemplos del capitulo previo. un arreglo y. pueden vincular sus propiedades con un origen de datos. 0 . el nombre de la propiedad que va a enlazarse. en general. 0 0 La conexion de cada una de estas categorias de control con el origen de datos se efectua. por regla general con una cierta columna de un conjunto de datos. como va a verse en 10s puntos siguientes. en las tres categorias siguientes: 0 Controles que tan solo precisan el contenido de una columna de una cierta fila. en cuanto a1 control de destino se refiere. Componentes con vinculacidn a datos pueda mostrar una sola columna de una fila o bien multiples filas o columnas.

Defaultview.Add (New Birdirlg ("Text". para facilitar la visualizacih y manipulacih por parte del usuario. En caso de que la propiedad que deseemos vincular no sea una de las que nos ofrece por defect0 la propiedad DataBindings. Suponga que tiene un DataSet en el que ya existen dos DataTable. sin embargo. siendo dos de ellos las propiedades Text y Tag. Si tras establecer el vinculo examina el c6digo HTML del documento. y 10s objetos Binding estan pensados para vinculos simples. y que desea vincular la columna Titulo de la tabla Libros con la propiedad Text de un TextBox. Asumiendo que el TextBox se llama TextBoxl y que tenemos un DataSet llamado DsLibrosl con la tabla Libros. pudiendo seleccionar para cada propiedad una vinculacih de acceso a datos. Esta propiedad se encuentra en el apartado Datos. pudiendo seleccionar distintos origenes para cada una de ellas. la propiedad DataBindings puede ser editada en la ventana Propiedades. accede a su propiedad DataBindings. como otras. por tanto.3. Eva 1 ( Ds L i b r o s 1 . seleccionariamos el control TextBoxl y hariamos lo que puede verse en la figura 14. o bien como una de las primeras propiedades. ver6 queTextBoxl en realidad no dispone de la propiedad DataBindings.NET Miembros de datos: El origen de datos generalmente contendr6 multiples columnas. L l a t a B i r d i n j s . aiiadiriamos el enlace con una sentencia como la siguiente: T e x t B o x l .2). uno con libros y otro con editoriales. desplegar la lista adjunta a la propiedad Text y seleccionar la columna de origen."Titiilo") ) ~ En realidad. en la ventana Propiedades. sin0 que se ha asignado a su propiedad Text lo que se conoce como una expresidn de vinculacidn. T i tulo") % > . En ella se enumeran todas las propiedades del control que pueden ser vinculadas. A1 desplegar DataBindings nos encontramos con tres elementos. Si inserta un TextBox en un formulario Web y. podemos pulsar el b o t h asociado a la entrada (Avanzado) para abrir la ventana Enlace de datos avanzado (vkase figura 14. si usamos el orden alfabktico. L i b r o ~ . si tenemos las propiedades agrupadas por categorias.NET. Los controles ASP.rl .Son las que se suelen vincular con datos.NET raramente tendremos que escribir sentencias de este tip0 ya que. Para conseguir el mismo efecto que la sentencia anterior. usando el diseiiador de formularios de Visual Studio . cuentan con un mecanismo de enlace a datos diferente. con una sola columna cuyo nombre hay que facilitar como miembro de datos.1. En este caso dicha expresi6n es la siguiente: T ex t = ' < % # Da t a B i ride r . " T a b l e s [ L i b r o s ] . [ 01 . Su funcionamiento es similar a lo explicado en el parrafo anterior. a pesar de que en la fase de disefio parecen idknticos a sus equivalentes para Windows. I)sLibrr.Programacidn de bases de datos con Visual Basic . se encontrar6 con una ventana como la que muestra la figura 14.

Lo unico que hay que hacer es facilitar a su metodo Eva1 ( ) la referencia a1 origen. cuyo objetivo es facilitar el enlace con origenes de datos tipicos. como conjuntos de datos y vistas.1. Titulo. Edicion visual de la propiedad DataBindings para vincular la propiedad Text de un TextBox En lugar de utilizar DataBinder. . marcas que provocan la resoluci6n en el servidor y no en el cliente. puede observar c6mo se ha activado la opci6n Expresion d e enlace personalizada e introducido la expresion dsLibrosl Libros ( 0). Componentes con vinculacidn a datos Las expresiones de enlace se delimitan entre 10s caracteres < % #y %>. que es lo que hace por defect0 el editor de la propiedad Data Bindings. Si son multiples 10s controles vinculados. en este caso un DataSet. DataBinder es una clase con la que cuentan las paginas ASP. En la figura 14. en lugar de llamar a1 metodo DataBind ( ) de cada uno de ellos. y una cadena para seleccionar de 61 una cierta columna. por ejemplo.14. 0 False Top. para que 6sta sea efectiva es necesario siempre llamar a1 metodo DataBind ( ) . Independientemente del metodo que empleemos para establecer la vinculacion. que seria valido per0 rei- .podemos introducir una expresi6n de vinculacidn personalizada haciendo referencia directa a1 conjunto de datos que hayamos creado previamente. 3 25pt NindowText True EiKrnboi Figura 14.4. Left TWt Rindow FixedD True Normal (ningunoi IBearn ilD"e True Microsoii Sans Serif. vinculando asi el TextBox con el titulo de la primera fila de la tabla de libros.NET. que se encarga de resolver las expresiones una vez que el componente de origen ya dispone de 10s datos a utilizar.

puede invocarse a1 mismo metodo de la ptigina... ... . ..... ... Ventana de la propiedad D a t a B i n d i n g s correspondiente a un T e x t B o x de ASP.. p. ..a+&... ... . ...NET terativo.. ... . encargkdose 6sta de todos 10s controles hijo que contiene..Programacidn de bases de datos con Visual Basic .... .. . ... . (Nmsuno) (Nmguno) [Nmguno) (Nwno) Wmguno) @nguno: pimguno) (Nmguno) (Niguno) (Nmguno) WrnSUnQ! (Nmguno) (Nmguno) (Nmguno) (Nmguno) iblinguno) DsLibrosl Libios Tltulo (Nmguno) “mguno) INnauno) Figura 14. “ ..Utiliie el enlace wrrde para enlarat :on LCI d a n n t o de d a i s y enatleca el f m ! o o ~ t i l N d a c e p r w n d i z a d o m solbr ~e a m ewesh de enlace.. ...” ... .....2.. ‘fti S d e o a r la popedad que desea mlarar. ... ...y.. . BackCdor I BorderColM I BwderSMe Borderwidth Columns I CssClasr Enabled Font + + + + 0 Editorial 0 IDLibro U Preoo Y + Figura 14. .NET ... .. ...T. Vinculacion de multiples propiedades del mismo control . .. ... .... . . cmtmuaom.....3.. .

utilice el erdac. cualquier otra columna. En el caso de 10s controles para formularios Windows dichas propiedades son: Datasource: Contendra una referencia a la tabla. cuentan. se obtuviese el identificador del seleccionado.14. tornados de una columna de una tabla. Cualquiera de estos dos componentes puede ser usado para ofrecer a1 usuario una lista de valores a elegir. a1 elegir cualquiera de ellos. Suponiendo que deseasemos mostrar en un control ListBox 10s titulos de todos 10s libros y que.4. ademfis. elegir el nombre de una editorial de un ComboBox y el programa obtener el identificador de dicha editorial. vista u objeto que vaya a actuar como origen de datos. Aunque estos controles t a m b i h disponen de la propiedad DataBindings. lntroducimos una expresion personalizada de vinculacion a datos Son varios 10s componentes capaces de mostrar el valor que una cierta columna tiene en multiples filas.? smple para enlaza onmelementadedatmy estaMecerelfmtcoutiliceelenlace perwrnltzadoparaescntdr m e s t o r de enlace Figura 14. ValueMember: Indica la columna cuyo contenido se obtendrfi como valor asociado a cada uno de 10s elementos de la lista. DisplayMember: Alojara el nombre de la columna cuyo contenido se mostrar6 en la lista. por ejemplo. en la misma fila. asociando dichos elementos con el valor que tenga. con propiedades especificas para el comportamiento especifico que tienen. Cornponentes con vinculacidn a datos s+(eccl. asignariamos entonces el valor Titulo a DisplayMember e I D L i - . siendo 10s mas habituales ListBox y ComboBox.re ~a la propiedad que &a edazar A cmti-lm. El usuario podria.

Vinculacion de una lista ASP.5. Libros.Programacidn de bases de datos con Visual Basic . tras hacer doble clic sobre 61.NET bro a ValueMember. las propiedades a utilizar serdn las cuatro siguientes: 0 Datasource: La referencia a1 conjunto de datos u objeto que contiene la information. introduzca la siguiente sentencia: TcxtBoxl.Va1ue A1 ejecutar el programa deberia obtener un resultado similar a1 de la figura 14. mientras que Datasource podria ser DsLibrosl. En caso de que usemos 10s controles Web equivalentes. donde ve cdmo a1 seleccionar un titulo su identificador aparece en la caja de texto. Puede hacer una prueba simple insertando un ListBox en una p6gina Web ASP.NET con 10s valores de una columna . Esto es asi porque hemos dado el valor IDLibro a la propiedad DataValueField. D6 el valor True a la propiedad AutoPostBack del ListBox y. indicando la columna de donde se tomar6 el valor a asociar a cada elemento. con esta propiedad seleccionariamos una de las tablas disponibles. y enlazando la lista con la columna Titulo de la tabla Libros. DataTextField: Equivalente a DisplayMember. suponiendo que tenemos un DataSet llamado DsLibros 1 conteniendo la tabla Libros.5.SelectedItern.NET. junto con un TextBox. conteniendo el nombre de la columna que se mostrara en el control. 0 0 DataValueField: Equivalente a ValueMember.Text = ListBoxl. DataMember: En caso de que el objeto anterior sea un DataSet. _________ ~ :*I rarnacion con Visual Studio NET /Guia practica para usuarios de Visual Basic NET Guia practica para usuarios de Visual Studio NEl/ Programacion con Delphi 6 y Kylix Guia practica para usuarios de Delphi 6 ‘Manual avanzado Excel 2002 Guia practrca para usuartos de Excel 2002 Guia practica para usuarios de Kylix lntroduccion a la programacion Manual del microprocesador 80386 Assembly Language Step-by-Step i 7 Figura 14.

a la que podemos asignar el nombre de la columna que actiia como clave de la tabla o vista a fin de identificar de manera inequivoca cada fila de datos. como se aprecia en las figuras 14. ISBN &tor Mtorial Precio PI Spnlik. la segunda seleccionar6 entonces una de sus tablas o vistas.7. Componentes con vinculacion a datos Este mismo ejemplo puede aplicarse con un L i s t B o x en un formulario Windows. adem&. Frarcisco Ctarte Frarcisco Ctarte Francisco Charte Fraruaco Charle-orix Seiiaro Francisco Charte Frarcieco Charte Frarcisco Ctane Francisco Charte Frar=isco 3 . manteniendo el resto igual. El control D a t a G r i d en un formulario Windows El D a t a G r i d de ASF'. . por tanto. son muy similares. 10-5 1 1 1. La primera hard referencia a1 origen de datos y. visualmente hablando. la misma informacion a1 vincularse a1 mismo origen de datos.52 3T. tan solo tiene que cambiar las propiedades de vinculacion de la lista. no se enlazan con una columna en particular. con la propiedad D a t a K e y F i e l d . las dos propiedades de enlaces a emplear son las mismas: D a t a S o u r c e y D a t a M e m b e r . tiene la capacidad de mostrar multiples filas y columnas. Aunque el comportamiento de ambos controles D a t a G r i d difiere bastante. como es logico.14. : k 30 1% 1 1 1 1 1 39 10 7 : 10.6 y 14.esm L w u s Frarcisco Charte Francisco Cbarte 1 1 Ill lC5i IC 52 24 9 i 43 Figura 14. a diferencia de 10s anteriores.NET cuenta. mostrando. Independientemente de que usemos el D a t a G r i d de formularios Windows o formularios Web. Estos controles. pudiendo facilitar el acceso a tablas completas de information.6.26 Ctarte Francisco Charte 1 1 1 1352 21 34 Frarciscc CbarteM . La tercera categoria de componentes estd compuesta exclusivamente por el control D a t a G r i d que. sino con una vista o una tabla completa. en caso de que &te sea un D a t a S e t .

puesto que s610 conocen el valor de una columna en una determinada fila. Ya sabemos c6mo enlazar cualquier componente Windows con un origen de datos. a1 que podemos acceder mediante la propiedad del mismo nombre. mediante DataBindings. aunque es posible personalizarlo para incluir enlaces y botones que hagan posible la manipulacion de la informacion.NET Figura 14. no tienen nocion de la fila en la que se encuentran en el conjunto de datos. Los controles que se vinculan con una sola columna. impidiendo que cada uno de ellos muestre el valor de una columna en filas distintas. El control D a t a G r i d en un formulario Web Mientras que el DataGrid de Windows tiene capacidades de navegacion y edicion intrinsecas. DataSource y DataMember.Programacidn de bases de datos con Visual Basic . usando para ello la propiedad DataBindings. Todos 10s formularios Windows cuentan con un objeto Bindingcontext. se&n 10s casos. desde el momento en que se inserta en un formulario. cuya finalidad es .7. Es el propio formulario el encargado de crear 10s elementos necesarios para asegurar la sincronizacih entre 10s distintos controles que puedan estar vinculados con datos. el equivalente para formularios Web se comporta como una tabla HTML estatica.

existentes en el formulario. Como ya sabe. Cornponentes con vinculacidn a datos mantener una lista de objetos. "Libros" ) Con esta expresi6n obtendriamos el CurrencyManager asociado con la tabla Libros del DataSet llamado DsLibrosl. Siempre que el origen sea un DataTable. bien porque existan varios origenes de datos o un mismo origen con enlaces no homog6neos a varios controles.NET no ofrece esa funcionalidad. lo ha visto en 10s capitulos de la segunda parte. La clase PropertyManager se usa para mantener la asociaci6n entre la propiedad de un control y un origen cuando no hay necesidad de saber qu6 fila de ese origen es la actual. DataView o similar. para mantenerlos todos ellos se emplea un objeto Bindingcontext. caso 6ste en el que se emplearia un CurrencyManager. Dado que en un mismo formulario podrian existir multiples CurrencyManager. uno por cada origen de datos que exista.NET. ya que ese concepto. no existe en ADO. a las que puede acceder como si de un arreglo se tratase. CheckBox y RadioButton. muy habitual en otros sistemas de acceso a datos. Como ADO. mientras que cada BindingManagerBase controla todos 10s objetos Binding de un mismo origen de datos. una clase abstracta que cuenta con dos derivadas: CurrencyManager y Propert yManager. Cuando ese DataTable o DataView se enlaza con controles como TextBox. una vez que se ha recuperado informacion en un DataTable 6ste contiene todas las filas de datos. como 10s mencionados DataTable y Dataview. lo que hacen 10s formularios Windows es crear un CurrencyManager para cada origen que mantiene una lista de datos. o derivados. Los elementos de Bindingcontext son de tipo BindingManagerBase. es ficil recuperar el CurrencyManager asociado: B i n d i n g C n r ~ t e x (t D s L i b r o s l . sin embargo. LPor qu6 nos interesa obtener dicho objeto? Principalmente porque es 61 quien mantiene la posicion actual en la lista de . el objeto encargado de mantener la asociaci6n seri un CurrencyManager. Conociendo el nombre del origen de datos. El ObjetOBindingContext mantiene una lista de IOSBindingManagerBase. No existe una propiedad que indique qu4 fila es la actual.14. existe la necesidad de saber c u d de las filas de esa lista de datos tiene que mostrarse en 10s controles. cu6l de las filas es la posicion actual dentro de la lista. que se encargarin de la sincronizacih de todos 10s componentes vinculados a un mismo origen. es decir.

mientras que el segundo notifica una modificacion de la propiedad Position. _ ^ _ .- _._ x . Esto tiene sentido cuando van a efectuarse tareas de edicion sobre 10s datos que pudieran provocar una violation de las restricciones definidas en el origen. l _ l l l ~ _ _ _ ~ _ ^ _ Todos 10s derivados de BindingManagerBase disponen de 10s tres mktodos Refresh ( ) .__I. todos 10s derivados de ButtonBase. no obstante. es fdcil afiadir a un formulario 10s controles de navegacion cl6sicos para que el usuario pueda ir fila a fila por el conjunto de datos.--.. por tanto. mientras que la segunda es un indice con base 0.__. por su naturaleza.. la primera indica el numero de filas existentes en el conjunto. SuspendBinding ( ) y ResumeBinding ( ) .10s controles PictureBox.Windows . un conjunto de controles que. ya usado previamente. con 10s cuales podemos establecer un cierto control sobre la vinculacion.. a1 enlazar un TextBox con una columna de una tabla. I--... mientras que SuspendBinding ( ) y ResumeBinding ( ) desactivan y reactivan la vinculacion. se prestan m6s a la vinculacion. RadioButton y Button. si bien CurrencyManager sustituye algunas implementaciones por otras mds especificas.. .” ____^. Como puede suponer. El mktodo Refresh ( ) provoca la actualization de todos 10s controles enlazados con el origen a1 que representa el objeto BindingManagerBase. Conociendo tan s610 estas dos propiedades._ .Programacidn de bases de datos con Visual Basic .___^__I__x. Cada clase derivada facilita una implementation especifica de estos miembros.(. TrackBar y ScrollBaroDateTimePicker.. contando con propiedades que nos permiten conocer y modificar dicha POsicion. se producen cuando uno de 10s valores vinculados ha cambiado. Forms. La propiedad DataBindings que se citaba en un punto previo. y con 10s eventos CurrentChanged y PositionChanged. En cuanto a posicion se refiere..NET datos. . tales como CheckBox. . La mayor parte de 10s miembros de esta clase son heredados de BindingManagerBase. Algunos de ellos son el propio TextBox. las dos propiedades de mayor inter& que tiene esta clase son Count y Position. Esto significa que es una propiedad heredada por todos 10s controles Windows y que.. __I ... . En cuanto a 10s eventos Currentchanged y PositionChanged..^_ ... estfi definida en la clase Control de System.para la visualization de imigenes. impidiendo a1 usuario trabajar de forma c6moda. por lo que el valor mdximo serd el indicado por Count menos 1. efectudndose las comprobaciones en el momento en que el vinculo vuelva a establecerse. . . Existe. A1 suspender la vinculacion 10s contenidos de 10s controles pueden modificarse sin limitaciones. podemos virtualmente vincular cualquier propiedad de cualquier control con una columna de un origen de datos.

. Cornponentes con vinculacidn a datos Controles como ListBox. Debe tenerse en cuenta que 10s clientes que vayan a usar una aplicacion Web en la que se utiliza vinculacion a datos. . 10s clientes no mantienen una conexi6n continua con el servidor. . RadioButtonList.. a1 fin y a1 cab0 son clases derivadas de Control. mientras que Repeater es un contenedor en el que es posible insertar otros controles que serdn repetidos por la piigina Web.. por el contrario. y 10s controles no facilitan la navegac i h . es decir. .NET la informacion necesaria para que 10s obtenga e instale. .NET no disponen de la propiedad Bindingcontext ni 10s objetos derivados de BindingManagerBase. ComboBox y DataGrid tambien cuentan con la propiedad DataBindings. I . en ASI'. ~ En caso de que vaya a diseiiar una pdgina ASI'.NET existen m6s componentes capaces de presentar una lista de datos que en 10s formularios Windows. A cambio. con etiquetas tales como <ItemTemplate> 0 <HeaderTemplate>. Con Da taLis t es posible crear listas de datos basadas en una plantilla de apariencia definida por nosotros. En muchas ocasiones la vinculaci6n a datos en una pdgina Web se emplea para mostrar informaci6n s610 de lectura.' . . por ejemplo para mostrar las editoriales o libros existentes en nuestra base de da- . edici6n y actualizaci6n directa de 10s datos como si lo hacen en 10s formularios Windows. . En otros. si es precisa la edicibn. tienen que instalar en su sistema 10s MDAC: Puede aiiadir a 10s propios formularios ASP. por ejemplo generando un informe. por naturaleza. . es desconectado. DataList y Repeater. Los formularios ASI'. siendo estos dos dtimos especialmente interesantes. Tanto DataList como Repeater se basan en el us0 de plantillas que hay que definir directamente en el m6dulo HTML. para lo cual ser6 necesario controlar parte de las acciones mediante c6digo.NET con vinculaci6n a datos.' '.14. a1 ejecutarse en un entorno que.. Ademis del conocido DataGrid y el control ListBox. per0 cuentan con propiedades m6s especificas ya explicadas en 10s apartados del primer punto de este capitulo. . S La vinculacion a datos de las aplicaciones Web es muy distinta a la de las aplicaciones Windows. .tambikn tenemos a nuestra disposici6n 10s controles CheckBoxList. . .

y c6mo se utiliza la propiedad DataBindings de la etiqueta de texto para vincularla con la columna Titulo. No hemos necesitado un adaptador de datos. de tal forma que 10s controles muestren en cada momento la informaci6n de la fila actual. realizando el trabajo de manera mas eficiente y con menor us0 de recursos. C use Con61 enlazamos el SqlDataReader devuelto por el mdtodo ExecuteReader ( ) con el control DataList.8 puede ver c6mo se ha insertado un control Label en el ItemTemplate del componente DataList. que hemos insertado y configurado la conexi6n y el comando. . seleccionando alguno de 10s estilos predefinidos para 41. A continuacicjn.NET de un componente DataList. en el evento Load. Se asume. de la apertura de la conexi6n y obtenci6n del DataReader. utilizando para ello un componente DataList y un lector de datos. asignandolo a la propiedad Datasource del DataList. lo mas apropiado es usar un vinculo s610 de lectura mediante un DataReader. serian 10s siguientes: Definicidn de la conexi6n y el comando para recuperar la columna Titulo de la tabla Libros.Programacidn de bases de datos con V i s u a l Basic . insertando en dl un componente que se enlazaria con la cohmna Titulo. ya que un DataReader abre la conexicin y recupera 10s datos mediante un cursor unidireccional y s610 de lectura. bbsicamente.9. En la figura 14. 0 Inserci6n en la pagina ASI'. introduciriamos el c6digo siguiente: sq Da DataBind ( ) ' ( ) SylConnectionl. Este lee todos 10s titulos y genera una tabla como la que puede verse en la figura 14. que pueden enlazarse a una lista de datos. per0 sin necesitar capacidades de edicibn. Los pasos. Los vinculos s610 de lectura emplean menos recursos. seguramente precisara un medio de navegaci6n por la lista de datos. Edici6n de la plantilla correspondiente a1 cuerpo. Codificacibn. sin crear estructuras en memoria como si hace un Data S et.NET tos de ejemplo. s Si a pesar de la existencia de componentes como DataList y Repeater. por supuesto. tras hacer doble clic sobre el fondo de la pdgina. inserci6n ni borrado. generar un DataSet ni nada parecido. decide emplear componentes con vinculaci6n simple. Suponga que quiere mostrar en una p6gina Web una tabla con una lista de 10s titulos existentes en nuestra base de datos.

independientemente del valor que tuviera la variable de posicion creada anteriormente. el control mostraria siempre el titulo de la primera fila. T i t u l o . "TlbAo") A Figura 14. Ubltce el enlace simple para enlazar con un dab5 y establecer el forrnato o &re el enlace persoMflzado para e s a w ma eqxeu6n ropedades enkables AccessKey Backcolor BotderColw Borderswle BordeiWidh cssc1ass Enabled Font Forecolor Height ToolTip Visible Width + 6 Eapresdn de e n k e p s r m l ~ z a d a : DataBinder Eval(Contamer DataItern. Tambien necesitamos un medio para almacenar ese valor. Componentes con vinculacidn a datos elernento de 5eleccime la propiedad we derea enbzar A conbnuaci6nn. asi como la posici6n actual. por tanto. En segundo lugar. La soluci6n m6s fdcil es usar la propiedad Session para crear sendas variables y guardar dichos valores. DiseAo de la plantilla para el cuerpo del DataList La mala noticia es que 10s formularios Web no mantienen objetos equivalentes a 10s CurrencyManager o Bindingcontext de 10s formularios Windows. iCudndo realizar . La buena noticia es que codificar esa funcionalidad no resulta excesivamente complejo. L i b r o s ( 0 ) . dato que podemos obtener facilmente de la propiedad Count de la tabla. Si asignamos a la propiedad Text de un TextBox la expresi6n d s L i b r o s l . por lo que el mecanismo para mantener la posici6n actual y para sincronizar 10s controles vinculados queda completamente en nuestras manos.8. Lo primer0 que necesitamos es saber cuiintas filas existen en la tabla a la que van a vincularse 10s controles. tenemos que asignar de alguna forma 10s valores de las columnas de la tabla a 10s controles que haya en la pfigina.14. por ejemplo. de forma que estkn accesibles durante el tiempo que el usuario est6 trabajando sobre la pigina. debe efectuarse a mano. La vinculaci6n entre tabla y controles.

Tabla generada por el componente D a t a L i s t Puede realizar una prueba dando 10s pasos siguientes: Inicie una nueva aplicaci6n Web ASP. que quedaria asi: P r i v a t e Sub Page-LoadiByVal s e n d e r As System. por ejemplo SQL Server.Object. generado cada vez que se llama a1 metodo DataBind ( ) del control o de la pzigina donde estii insertado.9. Haga doble clic sobre el formulario para abrir el m6todo correspondiente a1 evento Load.lanual a\ atlzado Excel 2002 Guiapr&&apaia muarm &Excel 2002 Guia practrca para usuanos de Kyhx Intr&& a la programackjn M d del rmaoprocesador60386 Assembly Langoage Step-by-step Figura 14.Programacio'n de bases de datos con V i s u a l Basic . Usa lutedace Design for Programmers SQL Servcr 2000 Gum practrca para u s u a ~ ~ s JBuilda 7 P r o g r d con Visual C# NET Programa&n con J'tsual Shtdto NET Rogsaa~cib V i Basic NET con Gum pracbca para usuams de Vtsual Basic Guia przict.NET esas asignaciones? En el momento en que el control reciba el evento DataBinding. B y V a l e As S y s t e m . Genere el DataSet a partir del adaptador de datos. Inserte desde el Explorador de servidores la tabla L i b r o s de uno de 10s origenes que tenga disponibles. E v e n t A r g s ) H a n d l e s M y B a s e .NET.ca para u s u a r b s de Visual Stodio NET NET Programanirn con Delph 6 y Kyhx Guia przicticaparausuasios Detpbi 6 de h. Inserte en el formulario dos controles TextBox y dos Button. L o a d .

O b j e c t .1 Then P o s i t i o n += 1 ' Sessi ~ n ( " P o s i t i o r ~ " = P o i i t i o n ) DataBind ( ) ' End I f End Sub Priva C l i c k (B e r l d c r As S y s t e m . dejhdolo como se muestra a continuaci6n: Private Sub T e x t B o x l DataBinding(ByVa1 s e n d e r As S y s t e m . ByVal e As S y s t e m . Componentes con vinculacidn a datos Sessicrl ("Cirunt" 1 = D s L i b ~ u . T e x t B o x l .14. T e x t = D s L i b r o s l .Autor End Sub Observe que la inicializacibn de las variables Position y Count se efectua s610 la primera vez que se abre la phgina. C l i c k Dim Eori t 1 !n As I ~ S e s i i o n ( C o u n t ) . O b ] e c t . E v e n t A r g s ) Handles B u t t r ! n l . ~ li b r u s . E v e n t A r g s ) Handles B u t t o n 2 . T e x t = D s L i b r o s 1 . y no cada vez que se pulsa uno de 10s botones. Obi e c t . provoca el evento .Libras ( S e s s i o n ( " P o s i t i o n " ) ) . C l i c k Dim P o s i t "Prrsltlori") P o s i t i o n -= 1 Session ( " P o s i t i o n " ) DataBind ( ) = tosition ' End If End Sub Por ultimo. a su vez. T i t u l o T e x t B o x 2 . L i b r o s ( S e s s i o n ( " P o s i t i o n " ) ) . abra el mktodo correspondiente a1 evento DataBinding de uno de 10s TextBox. Cstos recuperan el valor actual de Position y lo actualizan. invocando a continuaci6n a1 mktodo DataBind ( ) de la p6gina que. r o i i r ~ t L = I ) Se-sion("Position") DataBind ( ) End If End Sub El c6digo asociado a 10s dos botones que ha insertado serti el siguiente: Priva But CllC 1 s e n d e r As S y s t e m . ByVal e As S y s t e m .

haciendo posible la edici6n y eliminaci6n de datos. 10s elementos para efectuar dicha edici6n..10. por ejemplo. o utilizar un objeto Command con la sentencia SQL a ejecutar 0. puede mostrar una serie de enlaces como columnas de la rejilla. El componente D a t a G r i d . En cuanto a la actualizacion de 10s datos en el origen. facilitando. En la figura 14.10 puede verse la p6gina mostrando 10s datos de una fila. necesitar6 disponer en el formulario algun boton o enlace que. ejecute el c6digo de sincronizaci6n de 10s cambios con el servidor del que procede la informaci6n. en caso de ser necesario.NET tampoco disponen de un sistema de edici6n y actualizaci6n autom6tica de 10s datos.Programacidn de bases de datos con Visual Basic . servirnos del mecanismo habitual de actualizacibn que ya conocemos.egarASP/WebForm1 awx Programacion con Visual Basic NET Francisco Charte Figura 14. &dwo Eddiom 4er Favoritor flwramientas Amda sy . Esto significa.NET D a t a B i n d i n g de 10s TextBox. .+ I 2 llek~O$BDD~aual6a~1d. a1 ser pulsado.l~/l4~a. si estamos usando un adaptador de datos y un D a t a S e t . La pagina con las dos cajas de texto y 10s botones que permiten avanzar y retroceder entre filas de datos Los controles ASI'. por regla general. Los cambios en la informaci6n mostrada por 10s controles deben detectarse.

.

.

1).Usando 10s controles de las secciones Web Forms o Windows Forms. a . o pulse el b o t h equivalente. navegar por ellos. PO ara forrnularios Windows Comenzaremos analizando el asistente de formularios de datos para Windows. pueden disefiarse formularios que permitan a1 usuario ver 10s datos. como en 10s demds capitulos. usando. segun el tide aplicaci6n que se trate.NET dispone de sendos asistentes que facilitan el disefio de estos formularios. tendriamos que efectuar manualmente. de otra forma. Visual Studio . Para ello necesitard combinar gran parte de 10s conocimientos que ha adquirido desde el principio de este libro. y seleccione del cuadro de didlogo que aparece el elemento Asistente para formularios de datos (vease figura 15. desde la definici6n de la conexi6n con el origen de datos hasta la vinculaci6n de 10s controles. afiadir y eliminar datos. Para ello seleccione la opci6n Proyecto>Agregar nuevo elemento. alguna de las bases de datos creadas en el tercer capitulo. creando una aplicacih Windows tipica. ahorrdndonos gran parte del trabajo que. eliminando el formulario afiadido por defecto e iniciando este asistente. editarlos. Introduzca en la parte inferior el nombre que dard a1 formulario y pulse el b o t h Abrir. El objetivo de este capitulo es mostrarle c6mo servirse de estos asistentes para disefiar sus propios formularios. pasando por la creaci6n de adaptadores y conjuntos de datos o la codificacih de las sentencias necesarias para actualizar el origen.

El primer paso del asistente nos permite. por ejemplo d s l i b r o s . que en 10s capitulos de la segunda parte efectudbamos mediante cbdigo. Formularios de datos I 0Elernentos de proyecto local 3 Interfaz de usuario 3 Codigo Y oat95 DataSet Arthivo XML Esquema X L M 2 Web a Utilidad Archivo XSLT As[stente p a famukbs . Seleccicin del En nuestro caso partimos de un proyecto inicialmente vacio. bastando con pulsar el b o t h Siguiente > para dar el primer paso.15. lniciamos el asistente para creacion de un formulario de datos Windows Nuestro objetivo es crear un formulario con una relacibn maestro/ detalle entre las tablas E d i t o r i a l e s y L i h r o s . se introducirdn las tablas E d i t o r i a l e s y L i b r o s .2. No necesitamos definir una conexibn. usando para ello dos controles D a t a G r i d . La primera pdgina del asistente es tan s610 informativa.. per0 igualmente podriamos haber invocado a1 asistente tras definir un D a t a S e t a partir del origen de datos que nos interesase. ya que todo ese trabajo lo efectuard el asistente.1. En este conjunto de datos. de tal forma que. a1 seleccionar una editorial en el primero. en realidad no puede activar la segunda ya que el asistente ha detectado que no hay n i n g h D a t a S e t existente disponible. aparezcan automdticamente en la rejilla de detalle 10s titulos que correspondan. Deje elegida la primera opcibn. . asi como un objeto D a t a R e l a t i o n para relacionarlas. tal como veremos despuks. ni tomar las tablas desde el Explorador de servidores y arrastrarlas sobre un formulario. Todo ese trabajo. tal como se aprecia en la figura 15. tanto crear un nuevo conjunto de datos como w a r uno que ya existiese en el proyecto. e introduzca el nombre que desea dar a1 conjunto de datos. ser5 ejecutado por el asistente. indicdndonos cud1 es su finalidad. Figura 15..

no tenemos m6s que desplegar la lista que aparece a la izquierda para elegirla.3. ZQu6 conjunto de dabs derea utitizar? F pear II N nuevo conJUnt0 de datos denommado: ldsLlbrosl Figura 15. Tambidn puede optar por conectar con un origen de datos distinto. Seleccionamos crear un nuevo conjunto de datos xi6 El DataSet tiene que recuperar la informaci6n de un origen de datos. como es logico. cualquiera de 10s que cre6 en el tercer capitulo. De forma dhzmathra. la conexi6n seri otra diferente dependiendo de d6nde estd ejecutdndose SQL Server o bien MSDE. en el Explorador de servidores. para lo cual es precis0 facilitar una conexion. de 10s elementos de origen Para crear nuestro formulario podemos partir de tablas. vistas. pulsariamos el b o t h Nueva conexidn y definiriamos la nueva conexion con el cuadro de didlogo que ya conocemos de capitulos previos. cuya ventana se muestra en la figura 15. todos 10s elementos que han podido encontrarse a travds de la . vistas y. procedimientos almacenados que devuelven resultados. Si tenemos una conexion definida que nos sea util.2.Programacidn de bases de datos con V i s u a l Basic . En su caso.NET Elegir el conjunto de datos que desea utilizar El conjunto de dams contiene las tablas y las columnas con las que va a tabalar en el formulario E l m te ayuda acrearun w e y o de dates. De no ser dse el caso. Esta puede encontrarse predefinida. El de la izquierda nos muestra las tablas. En este paso del asistente el cuadro de diilogo esti dividido en dos paneles. En este caso hemos elegido la conexi6n que teniamos definida para acceder a la base de datos SQL Server que se encuentra en el servidor Inspiron. o bien crearse a prop6sito en ese mismo momento. en general. etc. proyecto un conju&o de dabs ya defintdo o uno propt~dwradopos un mwcio Web. Es la tarea del paso siguiente del asistente.

En el panel de la derecha. ZQu6 mne&indebe utllbarel asi+twte? I S r l Nueva L o n e ~ . hemos elegido del origen las tablas Edit o r i a l e s y Libros. deberemos definir una relacion entre ellas. sin embargo. Seleccion de una conexion con el origen de datos Como puede verse en la figura 15. irAn apareciendo 10s elementos que seleccionemos. que ahora aparecen en el panel de la derecha en lugar de ha- cerlo en el de la izquierda. un paso imprescindible era el estable- . Ciertos pasos del asistente dependen de 10s elementos que se elijan aqui. por ejemplo. A cambio. inicialmente vacio. usando para ellos 10s botones que hay en la parte central. Al haber seleccionado dos tablas.15. n Figura 15.4. podria ser necesario facilitar una lista de parametros de entrada.. Cuando creAbamos.3. Pulse el b o t h Siguiente > una vez m& para continuar en el punto siguiente. mediante cddigo.. Elegir una conexion de datos La conexion de d a b s especifica como buscar e iniciar una sesion en un servidor y una base de d a b s especificos - de conenones de datos que esti astualrnente en d e w a d o r de sewidores o agregar una nueva conendn b que d e w nu aparece en b ksta. un D a t a S e t a partir de sendos comandos para obtener el contenido de dos tablas. Forrnularios d e datos conexidn definida en el punto previo. algo que no seria preciso si hubiesemos seleccionado una vista o un procedimiento almacenado.

Tenemos nuevamente dos paneles bien diferenciados. En cualquier caso.6. aunque quiz2 sea 6ste el caso que nos interese. Seleccionamos las tablas con las que va a generarse el formulario En este paso del asistente. el paso siguiente del asistente nos permitird elegir las columnas que deseamos tener en el formulario. en el panel derecho seleccionamos la tabla de detalle y sus columnas. seleccionando las columnas de enlace. per0 sin necesidad de crear de manera explicita el objeto D a t a R e l a t i o n . marcando a continuaci6n las columnas que deseamos tomar de ella.4. dado que en el anterior hemos elegido como elementos dos tablas. Elegir tablas o vistas Las tablas o vistas que seleccione determinaran que columnas estaran disponibles para anarecer en el formulario El asistente crea un adaptador de dam5 para rdlenar el conjunto de datos de las CaMas o las wstas dlsponibles. puede estaMecer una rela& enbe ellos en el squiente paso. . momento en que aparecera en la lista Relaciones. ya que sin ella no se sabria qu6 libros corresponden a la editorial seleccionada en cada momento. Oementos disponibles: + Bementos sekcionados: I-. Hay que pulsar el b o t h > para crear efectivamente la relacidn. segun se aprecia en la figura 15. En el de la izquierda elegimos la tabla maestra de la lista desplegable.Prograrnacidn de bases de datos con V i s u a l Basic . Tablas vistas _1_1 1 Tablas Editoriales Llbros vistas Figura 15. tendremos que establecer esa relacidn. De la misma forma. ya fuese credndola explicitamente o bien recuperdndola con anterioridad de un esquema que hubi6ramos guardado. En su lugar (vkase figura 15. SIsekccrona mis de un elemento.NET cimiento de la relaci6n entre dichas tablas. Que tomemos datos de dos tablas no implica que deban mostrarse todas sus columnas. La existencia de esta relaci6n es fundamental a la hora de crear una relaci6n maestro/detalle.5) bastar6 con indicar cud1 es la tabla maestra y la de detalle.

Definimos la relacion que existe entre las dos tablas Elegir tablas y columnas para mostrar en el formulario El forrnulario puede rnostrar cualquiera de las tablas y columnas disponibles en el conjunta de dabs 5. en la pr6ctica.Crear una relacion entre las tablas El asistente utilizara las relaclones para generar codigo que rnantenga las tablas sincronizadas cuando habaie con ellas Las rebctones s basan en dares c m e s enfze l tabtas. ! tabbs benen una r a W ptinopal-detdfe &Ztd! t a b b y cofunmas dese& nasbar en e fonnubrb? l Tabla de &etaks: i l-.IDLibro o Editorial. a conbnw&~. Seleccion de las columnas a usar en el disefio del formulario Para nuestro formulario de ejemplo dejaremos marcadas todas las columnas aunque. podrian desmarcarse algunas como IDEditorial.l ILibros CQ!UKWW: i Figura 15. agreguela a l a &elaoones: Tabla primaria: Editor ia les TaMa s e c & a n a : ILibros paves: IDEditorial Figura 15. w s f z a i”=” m& de una tabla en d fwdario.5. .6. A%e a lsa de relaaones uWaando el W n de Recha rt Nomkre: IFKLibrosEditorial un Mmbre a la nueva r e k & bs tabla6 y los campos de daves primanos y secundanosy.

Registro unico en controles individuales: Se usan controles de interfaz tipicos. puede agregar controles para b edicim y b ex@ora& r r r r Ahwa el asistente bene la informauon necesaria Haga dic en Fmakar para salir y generar el nwvo formulano Figura 15. mostrando solo una fila en cada momento.ssrzP I icdmo &sea Rlostrar ks datos? F lodo5 lo5 regisbos &e la cuadricula r Regrstro i r ~ en conboles rndrvrduales o ZQmS wntrdes adicionakr desea para e fonnuhrio? l R m-celar tudo .NET ____ El tiltimo paso del asistente nos permite elegir el disefio que deseamos darle a1 formulario. tan s610 podemos indicar si queremos que se afiada a1 formulario un b o t h para cancelar todos 10s cambios o no.otros que se incluyen por defecto. En caso de utilizarse controles individuales. Optamos por usar controles D a t a G r i d para mOStrar 10s datos de las tablas Aparte de 10s botones que indiquemos explicitamente. para mostrar la informaci6n fila a fila. que es lo que nos interesa en este caso. existiendo dos opciones: 0 Todos 10s registros de la cuadricula: Emplea un control D a t a G r i d para mostrar cada una de las tablas.7) estaran accesibles mAs o menos apartados. en la parte inferior de la ventana (vkase figura 15. Elegir el estilo de presentacion Puede mosb-ar un unico reqab-o cada vez o mosfar todos $re. facilitando la insercih.Prograrnacidn de bases de datos con V i s u a l Basic .Cancela lo5 cambios de to& lo5 relpsbos d d conjunto de datos 51selecciona conboles ir~lividualees.7. Si elegimos usar rejillas de datos. podremos elegir 10s botones que se afiadirAn para tareas de edici6n. edici6n y borrado en la misma rejilla de datos. . el formulario contara tambikn con. como T e x t B o x y CheckBox. marcando las opciones de este paso del asistente. como un b o t h para recuperar 10s datos y otro para ejecutar la actualizaci6n. 0 Dependiendo de la opci6n por la que optemos.

cambiando tambidn la propiedad D o c k de ambas cuadriculas para que se adapten automdticamente en caso de que se ajusten las dimensiones del formulario. L6gicamente puede personalizar dicho disefio. Forrnularios de datos ___ . En la figura 15. aiiadiendo nuevos elementos para realzar la interfaz. IUClOn a ForrnularloAsstpnte (1 FmdabAsiotente References Assernblylnfc vb dstibras nsd hnhbrm rb 3 . El formulario en el entorno de disefio Nota Observe. etc. ___-I_ * -__.-__A1 pulsar el b o t h Finalizar del asistente 6ste se cerrar6 y nos encontraremos con nuestro formulario. En nuestro caso nos hemos limitado a modificar el ancho del segundo DataGrid. 10s componentes de acceso a datos que ha generado el asistente: uno para la conexion. dos adaptadores de datos y el D a t a S e t . . en la parte inferior del area de diseiio.-_________ .15. con su aspect0 por defecto.8 puede ver el formulario en el entorno de Visual Basic .8. modificando titulos y disposicih de 10s botones o 10s DataGrid. r ob)diiibras % OlrDbConnemonl boleDbDataAdaprer1 b OleDbDataAdapter2 Figura 15.NET tras 10s cambios.

E x c e p t i u r i ) ..A-lstente. E v r n t A r g s 1 H a n d l e s b t r l L o a d . d s L 1 b r c r s o b i D a t a S e t T e m p = N e w Furmulari~. ya que el asistente lo que hace es mostrar el posible error en una ventana. Me5 5 a q t ) x End T r y End Sub Lo unico que se hace es invocar a1 metodo LoadDataSet ( ) del propio formulario. Analicemos brevemente ese c6digo para saber exactamente qu4 ocurrir6 a1 ejecutar el programa. Stlo. El c6digo del metodo LoadDataSet ( ) es el mostrado a continuacih: P u b l i c Sub L ( arjIiataSet! ) Dim 3biDataSetTernp As F o r m u l a r i u A s i ? t e n t e . r1ic-C ~ T rY C y s t em.__ -_I__ - .. . controlando una posible excepcion.$ ! e L c ad.Ob]ect.Prograrnacidn de bases de datos con Visual Basic .~ Ademas de todos 10s controles que pueden verse en el formulario. F Jim'.FillP3taSet (ob]DdtaSetTemp) Catch e Fi 11 Dd t aSet As Sys t e m . con sus propiedades debidamente establecidas.- - _ _ _ .. '.dsLlbros( T rY Me. hi r1j J w c .. ~ - B y V a l e As S y s t e r n .NET i . Antes de ejecutar el programa tendra que abrir la ventana de propiedades del proyecto y establecer el formulario recien generado como elemento de inicio.* < ' . . Mes s a n e B ) . el asistente tambien ha generado el c6digo necesario para recuperar 10s datos. Tras abrirse el formulario este permanecerti vacio esperando una acci6n por parte del usuario. El bloque de c6digo que hay detr5s del C a t c h est6 diseiiado para que introduzcamos nuestro control de errores personalizado. actualizarlos y cancelar 10s cambios efectuados. Lo habitual es que se pulse el boton Cargar que provoca la ejecuci6n del c6digo siguiente: Private Sub k t r l l i j a d C l i c k ( B y V a 1 s e r i d e r As System.

.

como se aprecia en la figura 15. Este. eliminarlas y modificarlas. se devuelve el conjunto de datos de nuevo a1 metodo LoadDataSet ( ) . inicialmente.9.Programacidn de bases de datos con Visual Basic .9. llamado ob jdslibros. Podemos cambiar de editorial para ver sus libros. bisicamente. aiiadir entradas. El b o t h Actualizar desencadena un proceso bastante m i s complejo que se desarrolla. se limita a invocar a1 metodo siguiente: Public Sub UpdateDataSetO Dim o b i DataSetChanges As ForrnularloAslstente . El formulario con las filas ya en las cuadriculas de datos La pulsaci6n del b o t h Cancelar se resuelve con una simple llamada a1 m6todo Rejectchanges ( ) del DataSet. Anaya Multimedia McGrawHiII Telemaco 43 Editicio Valrealv 1' planta 901 Grayson Street 605Third Avenue NewYork 1 IDLibro 1 ISBN 4 - - . e introduce en 61 las filas obtenidas por la llamada a Fi 11Data Set ( ) . En ese momento el formulario ya apareceria con la lista de editoriales en el primer DataGrid y la de libros en el segundo. d s L l b r o s New FormularioAsistente.dsLibros( ) = - . en el metodo asociado a1 evento Click. fistelirnpia el DataSet existente en el formulario._ IAutor Francisco Charte Francisco Charte Francisco ChartefJorge Ser 1 Francisco Charte Francisco Charte Francisco Charte Francisco Charte 5 6 7 8 9 10 84-415-1324-4 84-415-1392-9 84-41 5-1 376-7 84-41 5-1 351-1 84-415-1290-6 84-41 5-1 291-4 84-415-1 261-2 Guiapradicaparausuarios JBuilder 7 Programacion con Visual C# NET Programacion con Visual Studio NET Programacion con Visual Basic NET Guia practicapara usuarios de Visual Basic NET Guia pradica para usuarios de Visual Studio NET Programacion con Delphi 6 y Kylix Guia pradica para usuarios de Delphi 6 Manual avanzado Excel 2002 Guia practica para usuarios de Excel 2002 Figura 15.NET Una vez introducidas en el Data S et todas las filas de las dos tablas.

b e t C h a r ~ g e s .dCiJ r r e n t E d i t ( Me. se encarga de abrir de nuevo la conexi6n e invocar a1 metodo Update ( ) de cada adaptador. El metodo UpdateDataSource ( ) . I b L i t ~ I o b l 3 s L i b r o s . finalizando asi cualquier operaci6n de edici6n que pudiese haber en curso. Tras comprobar que. "Libros" j . ( ) . efectivamente. en un DataSet temporal. usando para ello el metodo Getchanges ( ) del dsLib r o s . facilitando la informaci6n a1 origen de datos. Catch e U p d a t e As S y s t e r n . Forrnularios de datos Me. hay cambios pendientes de consolidar. se llama a1 mbtodo UpdateDataSource ( ) y combinan 10s cambios en el conjunto de datos a1 que estdn vinculados 10s controles. Observe c6mo se utiliza la propiedad Bindingcontext del formulario explicada en el capitulo previo. Er. M e r g e [ o b jD a t a S e t r h a n y e s ) o b ] d ~ L i b r o sA c c e p t C t i a n g e c . B 1 r d i rig C o n t e x t ( '1)b jd sL i br (2s . Fo L m 1 1a L 1oA. E x c e ~ t i o n Throw eUpdat e End Try End If End Sub En principio se llama a1 metodo EndcurrentEdit ( ) del objeto BindingManagerBase de cada tabla. 10s cambios que se han efectuado en el formulario. d c I. is L 1b rrr s ) T rY .B i r d i n g C o n t e x t j ODj d s L i b r o s . 1 i F rl t e . " E d i t o r i a 1 e s " ) . recibiendo como pardmetro la lista de cambios. Public Sub U p d a t e D a t a S o u r c e (ByVal C h a n g e d R o w s As Fo rmu 1 a r 1 o A s 1s t e n t e .15. E r d r u r r e r i t E d i t [ ) ) oblDataSetChdnyes CType[objJrLibr b . A continuaci6n se recuperan.

y dos D a t a G r i d . puesto que 10s pasos son exactamente 10s mismos: selecci6n o creaci6n de un D a t a S e t .11. Inicie un proyecto de aplicaci6n Web ASP. tan s610 aparece la cuadricula con la lista de editoriales. el asistente para formularios Web nos resultar6 realmente familiar.NET.10.lipdate (ChanqedRuws) End I f Catch u p d a t e E x c e p t i i n As Sy-tern. Sin embargo. no obtenemos funcionalidad alguna de edici6n por parte de este asistente. elimine el formulario que aparece por defect0 y recurra a1 asistente. que se encuentra en el mismo lugar que el de formularios Windows.Prograrnacidn de bases de datos con Visual Basic . Sin embargo. Si conocemos el asistente para formularios Windows.pt Finally I )ri End Try End Sub Nota En lugar de recuperar 10s cambios en un D a t a S e t temporal. en la parte superior. El resultado final deberi ser similar a1 de la figura 15. conexibn. se hard visible la segunda cuadricula con 10s libros que correspondan a la editorial elegida. A1 ejecutar el proyecto ver6 que.Upjate (ChangedRows) OleDbDataAdapterZ.E x c e p t i o n Throw npziat rl A i. columnas. La unica diferencia es que en este caso no podemos elegir entre dos diseiios distintos de formulario. escogiendo las mismas opciones en cuanto a conjunto de datos. . definici6n de la conexi6n a emplear. en caso de que la actualizacion devolviese algun error este se veria reflejado en las filas del conjunto de datos que hay vinculado con 10s controles. tambien podria haberse empleado el original como parametro para el metodo U p d a t e ( ) de 10s adaptadores. puesto que el asistente siempre genera uno basado en el us0 de controles D a t a G r i d . Estos se encuentran vinculados con el D a t a S e t que aparece en la parte inferior. A1 pulsar el enlace que aparece en la primera columna de cada fila.NET OleDbDataAdapter1. tras pulsar el b o t h Cargar. y el c6digo que genera. como se ve en la figura 15. etc. elecci6n de 10s elementos y columnas de origen y establecimiento de la relaci6n entre las tablas. f6cilmente vinculables a origenes de datos. un formulario compuesto por un b o t h .

NET es tambien mAs simple que el generado para el formulario Windows._I- El c6digo de este formulario ASl'. ByVal e As System. lo cual no es de extraiiar ya que no existen capacidades de edici6n. D a t a B i n d ( ) . Formularios de datos IDEditorhl hlostrar hlostrx Mostrar Mostrar detalles Nombre abC DireccIon abC abC detalles detdles detdles 0 1 2 3 ~ abC abC abC abC _ _ _ ~ p - abC abC DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound DataBound ? OleDbDataAdapterZ & & OleDbDataAdapterl t% OleDbCannecbonl & objdsiibros ~ x I. El primer metodo en ejecutarse serh el correspondiente a1 evento C1 i c k del unico b o t h que hay en la piigina: Private Sub buttonLoadpClick(ByVal s e n d e r As System.LoadDataSet ( ) Me.masterDataGrid.SelectedIr4dex = -1 Me.Click T rY Me.Object.EventArgs) Handles buttonLoad.masterDataGrid.15.

11. Esos dos metodos.Response. vinculandolo con 10s datos y ocultando el D a t a G r i d de detalle puesto que.Message) End Try E n d Sub \Iostra detallss \Ioctrar d e t d r c \forttar 1 2 h a 1 a \luttnueda SIcGran Hd Telemaco 43 Edmcto V&e& l'planta dctdcb . en principio. . objeto que contiene 10s datos.Visible = F a l s e Application ["objdslibros") = Me.objdsLibros Catch eLoad As System. son identicos a 10s explicados previamente en 10s comentarios a1 c6digo del formulario Windows.Exception Me. ob j d s L i b r o s .T Progemacton con Delplll6 \ h r h h a practlca para usuanos de Delph 6 \Ianual nanzado Excel 2001 &a prachca para usuanos de Excel 2002 Gua prachca para uiuanos de K i h Inaoduccion a la programaaon Assembh LanguaSs Step bi Step 3' 26 10 ' 2 21 01 10 52 10 ' 2 1 1 1 1 1 11 15 1- 24 0 1 60 5 Figura 15. se encargara de recuperar todos 10s datos en el objeto o b j d s L i b r o s que se ha insertado en el formulario. LoadDat a S e t ( ) y F i l l D a t a S e t ( ) . no tendria contenido alguno a1 no existir una editorial elegida. para facilitar el acceso a el desde otros metodos.Write(eLoad.4 10 39 40 39 -' 1 1 1 1 1 1 GIM prachca para usuanoc de Visual Basic YET 10 ' 5 10 '1 9 10 11 I? 17 &a prachca para usuanos de \-isualStudo \ E .detailDataGrid.4presc 901 Graxson Street 1 4 < 6 S SQL S m a 2000 Gua prachca pma usuarios Budder Progamacion con Visual C= M T Progamacion con ' isual Studm 'iTT i Progmacroti con \ ~sual Basic \TT Francisco Charte Francisco Charte Francisco Chate Francisco C hate Jorpe Smano Frannsco Chmte Frannsco Chmte Franasco Chart? Frmcisco Charte Frannctsco Chme Francisco Chmte Frannsco Chmte \I Jesus Luque Francisco Charte Francisco Chme JeffDuntemann 1 1 1 10 . Por ~ l t i m ose guarda en una variable del objeto A p p l i c a t i o n la referencia a1 . junto con F i l l D a t a S e t ( ) . El forrnulario ejecutandose en Internet Explorer Lo primero que encontramos es la invocaci6n a1 metodo L o a d D a t a S e t ( ) que. Act0 seguido se establece que no haya una fila seleccionada en el primer D a t a G r i d .Me.

Con esta informaci6n se utiliza el metodo C r e a t e C h i l d V i e w ( ) de la fila para obtener el conjunto de filas de detalle... drt a i 1P a t a G r i ? . tendremos que afiadirla nosotros mismos. Da t a Source = cti i 1 d K O W F Me.. .. cada fila disponga de un enlace que permita entrar en modo de edici6n.. t R..... C rc a t e Cki i 1f d V ie ~ d " FK I.. Si queremos esta funcionalidad.5 Li b r o r " ) Fci rr. . lo que ocurre es que se efectua paso a paso.. enlazandolo con el segundo D a t a g r i d y haciendo este visible.... V i s i k > le = F a l s e : E n d If E n d Sub E d i t o r i a 1" ) A pesar de la extensih. se ejecutar6 el c6digo siguiente: P r i v a t e Sub S t i i r w D e t a i l G r i d ( 1 If ( M e . D d t a ... Dat~..x ) 1 bri1. d c t a i 1[a t a G r i d .. \ 1 . cl b jd sL i b r o s = C T y p e ( A p p 1 i c a t i o n ( " iib j d.ricj ) ~ ~ ....... Para ello hay que afiadir nuevos enlaces a1 Dat a G r i d que contengan 10s datos a editar. S e l e c t e S I n d P x <> . t R i ) w= ( M e .. Se utiliza una vista.. Hasta que no se pulse el enlace Mostrar detalles de una de las filas la pagina quedard estatica. en cuanto a numero de sentencias.. p a r e n t R o w s ... asi como c6digo para gestionar 10s eventos que generen. Es lo que vamos a hacer en 10s puntos siguientes. no facilitando las operaciones de edici6n. Tables ( " E d i t o r i a l e s " ) c u r r e r ~ t E ' i i r c r . a t a V i e w D D i m c u r r e r l t P a r P n t R u w As System.. d P t a i 1 Da t u tir i (3.. Cuando eso ocurra...V 1s i b 1e = T r u e Else M e ..d ( 1 l Me. A la vista est6 que el formulario generado por el asistente para aplicaciones Web queda lejos de tener la funcionalidad que ofrecen 10s formularios Windows. se generard el evento S e l e c t e d I n d e x c h a n g e d y. m a s t e r ~ a t a G r i d .-Iw .. r i d s t e L [a t ar. l)a t a Bi rl.. el proceso que ejecutado es relativamente simple.......15... por ejemplo el que muestra 10s libros... .... Data. DataRbwView M e .s cu r r en t E'a re r.. Haga clic con el bot6n secundario del rat6n sobre el segundo D a t a G r i d .. en respuesta. Formularios de datos En este momento tendriamos el formulario con la primera rejilla mostrando las editoriales.. en ejecucibn. d e t a i 1Data ti r i d . r ) a t a V i e w D i m c h i l d R l J w s As S y r t e r n .i .1 ) T h e n D i m F ' a r e r l t K o w s As S y s t e m . El primer paso sera afiadir a1 segundo D a t a G r i d 10s enlaces necesarios para que. ... : . para obtener una referencia a la fila que esta elegida actualmente en el D a t a G r i d maestro. ( M e .i. Se 1ect e ' jI r l ' ? i ...

1General J Columnas 3 Paginacmn d Formato r grear columnas a u t m d t k a m t e en tempo de ejecucion Lrsta de ED ____ _ Columnasselecaonadas Columnas disponrbles: 3 Bordes 0 C o b m enlazada Columna Hipervinculo W Columna Plantilla Propiedadesde EdKommandC&mn Texto del mcabezado: . concretamente 10s eventos . Pulse el boton Columnas (vease figura 15.12... Aiiadimos a la rejilla una nueva columna para el boton de edicion Elija en el apartado Columnas disponibles la secci6nColumna de boton. aiiadiendo a Columnas seleccionadas un elemento Editar.Programacidn de bases de datos con Visual Basic .. Si quiere puede personalizar el texto de 10s enlaces. Texto del pie: I Expresih de _wdem&n: r] p yisibb .. _ . por defecto. asi como cambiar el Tip0 de boton que.NET para abrir el menu emergente. es LinkButton. Cancelar. . y luego seleccione la opcion Generador de propiedades. .\ I. Cierre el cuadro de didogo pulsando el b o t h Aceptar. para que aparezca como la columna m6s a la izquierda de la cuadricula. .12) para acceder a la lista de columnas de la cuadricula. I Converbr esta colurnna en una columna Plantilla Cancebr 1 I I Ayuda I Figura 15. VerA que el D a t a G r i d ya muestra el enlace o b o t h para editar cada fila. .. Actualizar.1 I - Los enlaces o botones aiiadidos como columnas de un D a t a G r i d . Coloquelo como primer elemento.. generan eventos a1 pulsarse sobre ellos.. en nuestro caso el enlace Editar y 10s enlaces Actualizar y Cancelar que apareceran tras pulsar el anterior. pero si ejecuta el programa no obtendr6 respuesta alguna a la pulsation sobre 61.. Se abrira un cuadro de didogo con multiples apartados a 10s que puede acceder con 10s botones que aparecen a la izquierda.

.

es bastante mQscomplejo que 10s dos anteriores: Private (ByVal source As Object. mediante la expresi6n Cells (n).Ed ShowDetailGrid() ' End Sub Tras recuperar la referencia a1 DataSet.Item.TertBox).Controls(O).Text .Controls(O).Titulo = CType(e.Text . tendremos que codificar el metodo del evento Updatecommand que. y llamamos a ShowDetailGrid ( ) ignorando 10s cambios que se pudiesen haber efectuado.Controls(O). almacenada como variable en la propiedad Application de la pAgina.NET Handles d e t a 1 1 Da t a Gr i d .Item.Precio = CType(e.TertBox).Programacidn de bases de datos con Visual Basic .Cells(4).DataGridC~~mmar~dEver~tArgs) ~ Dim F l L d AS dsLibros.Text End With End If ~ ~ de d.Item. Observe c6mo se recupera el control que hay en cada celdilla.Cor~trols(O). buscamos en 41 la fila que corresponde a1 libro que estQeditiindose.Cells(3). como se puede ver.Controls(O). Libros. TextBox).WebContro1s. 1 LOlS(O). convirtiendolo en un TextBox para poder leer el texto que contiene. para finalizar la edici6n que estaba en curso. Por Liltimo. TextBox).UI. a la que corresponde el indice 0.Web. E d i t o ~ i a l CType(e. La primera celdilla.Text .Text) ~ ~ If Not F i l a Is Nothing Then .Cells(S).LibrosRow = obldslibros. TextBox). que no es mAs que un derivado de DataRow en el que existen propiedades especificas para el acceso a las columnas de esta tabla. Se obtiene un objeto LibrosRow.Cells(l). La cuadricula vuelve a aparecer con sus datos originales. FindByIDLibro ( CType(e. C a n ce 1 Cornmarld detailDataGrid. ya que no existe una conexi6n directa entre 10s TextBox que muestra el DataGrid y 10s DataRow del conjunto de datos subyacente.Item. ByVal e As System. .Autor = CType(e.Cells(G). es .EditIternIndex ShowDetailGrid ( ) ' End Sub = -1 Simplemente asignamos el valor -1 a EditItemIndex. Controls (O).€tem.

per0 si comprueba el origen de datos. en el DataSet. verii que puede efectuar cambios y que. asi que necesitaremos aiiadir un b o t h o enlace para que dicha actualizacion se efectue a demanda.Ob]ect. comprobara que esos cambios se pierden. Los recuperamos asignando10s a las columnas de la fila en el Data S e t. Si ejecuta el programa en este momento.15. insertaremos ese b o t h a la derecha del que ya existia en la parte superior de la pagina Haga doble clic sobre el b o t h e introduzca el c6digo siguiente: Private Sub B u t t o n 1 Cllck(ByVa1 s e n d e r As System. 2 ii 811 ___ -__-_ No tiene sentido actualizar la informaci6n con el origen cada vez que se modifique una columna. ~ . tras pulsar el enlace Actualizar. Forrnularios de datos la que contiene 10s enlaces de edition. &tos permanecen ahi. Tenemos que actualizar el origen de datos. Como se aprecia en la figura 15.13. o simplemente sale del programa y vuelve a ejecutarlo. asi que el identificador del libro se encuentra en la segunda y 10s demiis datos en las siguientes.

NET B y V a l e As System.xcrptlnn P a g e . per0 hemos optado por algo mucho m6s directo. El efecto. si lo comprueba. se escriben 10s cambios en el origen de datos complethdose el ciclo que le permitir6 editar la informacih desde un navegador Web. W r l t e ( E x c e p c l >n. . es el mismo.Prograrnacidn de bases de datos con Visual Basic .Cllck Catch Exceprlon As E. R e s p o r i s e . Recuperamos la referencia al DataSet y lo usamos directamente como parhmetro del mktodo Update ( ) del segundo adaptador de datos.Messaye) End Try E n d Sub Podriamos haber dado todos 10s pasos que se ejecutaban en el c6digo generado por el asistente de formularios Windows para efectuar la actualizacih.EventArgs) Handles Buttonl.

tablas y vistas. .15. 10s capitulos de esta tercera parte le han facilitado gran parte de la informaci6n que necesitari para crear interfaces de usuario. Windows o Web. puede aAadir al miSmODataGrid la posibilidad de eliminar cualquiera de sus filas y tambien la de aAadir filas nuevas.NET relacionados con el acceso a datos. En resumen. mediante 10s cuales pueden generarse formularios con controles vinculados a datos tanto en aplicaciones Windows como en aplicaciones Web. Le resultara un buen ejercicio para conocer mas detalles sobre D a t a G r i d . principalmente conjuntos de datos. le ha servido para conocer dos de 10s asistentes m&spotentes con que cuenta el entorno. Este ultimo capitulo dedicado a1 estudio de 10s elementos de Visual Studio . Ha podido ver que el asistente para formularios Web genera menos funcionalidad que el equivalente para Windows. y t a m b i h c6mo suplir dicha deficiencia con la personalization de las columnas del D a t a G r i d y la escritura de algunas sentencias. Formularios de datos Tomando como base todo el proceso descrito. con controles vinculados a 10s elementos que conoci6 en la segunda parte. El proceso de actualizacion con el origen de datos le servira tal cual esta.

.

.

per0 sin emplear directamente las clases especificas de cada proveedor a lo largo de todo el ddigo. incluso en ejecuci6n a demanda del usuario. generalmente de forma directa mediante algun ejemplo. le explican c6mo abordar casos concretos. En el quinto capitulo.NET. En algunos de ellos se resume informaci6n vertida en capitulos previos. las interfaces que podriamos considerar miis interesantes son las siguientes: . sino tan s610 en un punto. A mod0 de recordatorio. dedicado a1 estudio del modelo de objetos ADO. como en 10s capitulos previos. que es el primer0 de la cuarta parte. el objetivo es codificar un ejemplo en el que se conecta con un origen de datos y se recupera informacibn. o bien se profundiza en temas que. De esta forma conseguiremos una conexi6n gen6rica muy fiicil de modificar. a pesar de haberse tratado anteriormente. En este decimosexto capitulo. conocio multiples interfaces que eran implementadas por clases de cada proveedor de datos. no se ha hecho con detalle. en general mucho m6s breves que 10s anteriores.Los capitulos de esta ultima parte del libro.

per0 igualmente podrian afiadirse 10s elementos necesarios para facilitar la edici6n y actualizaci6n. etc.2. Puede asignar identificadores mis coherentes a 10s controles. Como puede verse.La clase Da taAdap te r. 0 IDbCommand:Esta interfaz.InsertCommand. el ejemplo s610 recuperari informaci6n del origen seleccionado. En el punto siguiente las usaremos para escribir un ejemplo que pueda operar indistintamente sobre una base de datos Access. Estas implementan directamente la interfaz IDbDataAdapter. . abriendola y cerrfindola. se encarga de implementar 10s dos primeros metodos y servir como base de DbDataAdapter que. como Anchor. IDataReader:Interfaz implementada por las clases SqlDataReader. un b o t h para recuperar 10s datos y un DataGrid ocupando toda la parte inferior.01eDbConnect ion. DiseCio de la interfaz de usuario Comenzaremos creando el formulario Windows en el que incluiremos todo el c6digo. que facilitan la lectura unidireccional de conjuntos de datos sin posibilidades de edici6n. un cuadro de texto para introducir la sentencia. ya sea obteniendo a cambio un lector de datos o no. Si necesita refrescar m i s la memoria observe las figuras 5.UpdateCommandy DeleteCommand. OracleCommand y OdbcCommand. tambien generics. OleDbCommand.4.16. en las cuales se representaban esquemiticamente las relaciones entre estas interfaces y las clases que las implementan. es la base comun de SqlDa taAdap ter. 5. OracleDataReader y OdbcDataReader. a su vez. para que 10s controles se ajusten automiticamente a 10s cambios de tamafio del formulario. implementada por las clases SqlCommand. mientras que la segunda declara las propiedades SelectCommand. OleDbDa taAdap ter. establece el conjunto de miembros necesario para definir un comando y ejecutarlo. OracleDa taAdapter y OdbcDataAdapter. OleDbDataReader. mostrando 10s resultados en una cuadricula. Conexidn genhica IDbConnect ion:Implementada por SqlConne ction. introducir un comando de selecci6n y ejecutarlo. asi como modificar ciertas propiedades. Su finalidad seri permitirnos seleccionar una conexi6n de tres posibles.3 y 5. IDataAdapter e IDbDataAdapter:La primera define 10s mktodos Fill ( ) y Update ( ) que hemos empleado repetidamente para llenar un DataSet o actualizar el origen. define el conjunto de metodos base para trabajar con una conexi6n estableciendo la cadena de parimetros. SQL Server u Oracle. Oracleconnection y OdbcConnection.1: tres botones de radio en un grupo. Inicie un nuevo proyecto e inserte en el formulario 10s elementos que puede ver en la figura 16.

1.NET 3 ( I Figura 16.Prograrnacidn de bases de datos con Visual Basic . Comenzaremos escribiendo la declaraci6n de las cuatro variables siguientes a1 inicio del m6dulo: Dim Dim Dim Dim Coriexion As I D b C o n n e c t i o n Comando As IDbCommand A d a p t a d o r As I D b D a t a A d a p t e r d s D a t o s As D a t a S e t . Diseiio del forrnulario e funciones El paso siguiente ser6 la codificaci6n de 10s procedimientos y funciones necesarios para abrir la conexi6n y recuperar 10s datos a partir del comando de seleccibn que se haya introducido.

.

Programacidn de bases de datos con Visual Basic .NET
Case 2 ' Co riex 1 o 1Connection ( " D a t a S o u r c e = I n s p i r o n ; I n i t i a l Catalog=" & " L i b r n s ; riser I D = s a " ) e w SqlDataAdapterO Case 3 ' w OracleConnection ( " D a t a Source=Libros; User ID=scott; Password=tiger"l Adaptador = N e w O r a c l e D a t a A d a p t e r ( ) Case E l s e ' Return F a l s e E n d Select
~ ~

C'onarldb

=

C o r e ~ i o nC r e a t e C o m m a r d ( ) .

R e t u r n t b r i m a n d o . T e x t <> End Function

""

Como puede ver, se asigna a la variable Conexion un OleDbConnection, Sqlconnection u Oracleconnection, dependiendo del boton de radio seleccionado. Tambien se crea el adaptador de datos especifico. Observe que la creaci6n de comando es generica, pudiendose haber efectuado en cualquier otro punto del programa sin necesidad de tener que conocer el tip0 real del objeto a1 cual apunta Conexion. Si este metodo devuelve el valor True,porque se hayan creado satisfactoriamente 10s objetos y, ademss, el cuadro de texto no est6 vacio, se proceder6 a ejecutar el metodo AbrirConexion ( ) :
P r i v a t e Sub A b r i r C o r L e x i o n ! )
Conexion.Open! ) C a t c h E x c e p c i o r l As Except i o n

MesqageBox.Show(Excepclori.Message) End Try E n d Sub

Simplemente se usa el metodo Open ( ) de IDbConnection para abrir la conexidn, notificando un posible fallo que pudiera producirse. Despues se ejecutar6 el metodo RecuperarDatos ( ) que, tal y como se puede ver a continuaci6n, prepara el comando, lo enlaza con el adaptador y crea el conjunto de datos:
P r i v a t e Sub RecuperarDatosO

Comando.CornrnandText

=

tbComando. T e x t

16. Conexidn genLrica

mand

C o n e x i o n . Close ( ) E n d Sub

Observe que el DataSet se crea nuevo cada vez que se ejecuta el metodo RecuperarDatos, de no hacerse asi, dos llamadas consecutivas al metodo, con comandos identicos o diferentes, causarian que el conjunto de datos fuese una combinacion de ambos resultados.

Por ultimo tenemos el m6todo VincularRejilla ( ) en el que, con dos simples asignaciones, se enlaza el DataGrid con la tabla creada en el DataSet. h a , a1 no haberse facilitado ningun nombre a1 llamar a1 m6todo Fill ( ) del adaptador, siempre se llama Table.

P r i v a t e Sub VincularRe]illa

( )

DataGrid1.DataSource Da t a G r 1 d 1 . D a t aM emb e r End Sub

= =

dsDatos " T ab 1 e "

No necesita ninguna preparacih adicional para ejecutar este proyecto, asumiendo que tiene instalado el proveedor para Oracle y que ha afiadido la correspondiente referencia a su ensamblado en el proyecto. De no ser asi, elimine el c6digo que hace us0 de 10s objetos OracleXXX. A1 ejecutar el programa tendri el formulario vacio, tal y como aparecia en la figura 16.1, debiendo seleccionarse una de las tres conexiones disponibles e introducirse un comando de seleccih. En la figura 16.2 puede ver el resultado de una sentencia en la que se combinan las tablas de editoriales y libros. Una vez introducida la consulta, no hay m6s que cambiar de proveedor y volver a pulsar el b o t h Recuperar para obtener 10s datos de otro origen. De no existir las interfaces gen6ricas indicadas en el primer punto del capitulo, la creaci6n de un programa como 6ste hubiese requerido mucho m i s cbdigo, pricticamente el triple, a1 tener que codificar la apertura y el resto de acciones de manera especifica para cada proveedor.

Programacidn de bases de datos con Visual Basic .NET

Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia McGrawHiII Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Anaya Multimedia Apress

Assembly Language Step-by-step Guia pradica para usuarios de Delphi 6 Guia pradica para usuarios de Excel 2002 Guia practica para usuarios de Kylix Guia practica para usuarios de Visual Basic NET Guia pradica para usuarios de Visual StudicI NET Guia pradica para usuarios JBuilder 7 lntroduccidn a la programacion Manual avanzado Excel 2002 Manual del microprocesador 80386 Programacion con Delphi 6 y Kylix Programacion con Visual Basic NET Programacion con Visual C# NET Programacion con Visual Studio NET SQL Sewer 2000 User Interface Design for Programmers

Jeff Duntemann Francisco Charte Francisco Charte/M Jesus Luque Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Francisco Charte Chris H Pappas&William H Murr Francisco Charte Francisco Charte Francisco Charte Ojeda Francisco Charte/Jorge Serrano Francisco Charte Oleda Joel Spolsky

60.5 10.52 10.52 10.52 10.75 10.52 10.75 24.04 21.04 40 37.26 39 39 40 10.75 31

Figura 16.2. El programa en ejecucion

El RDBMS de Oracle es el miis utilizado a escala mundial, especialmente en sistemas de tamafio medio y grande, lo cual no es de extrafiar pues se trata de una de las empresas con m6s experiencia en el sector, una empresa que ha hecho de su producto de base de datos el centro de todo su negocio. A pesar de las mejoras introducidas en las versiones 8i y 9i, lo cierto es que Oracle no resulta un RDBMS fiicil de instalar ni administrar, tarea que suele quedar encomendada a administradores de bases de datos especializados en este producto. No obstante, como programadores acostumbrados a utilizar herramientas de distinta naturaleza, nos debe resultar mds fiicil usar Oracle que a un usuario que tan s610 tenga conocimientos biisicos. En 10s capitulos de la primera y segunda parte se han dado varios pasos para, a1 final, llegar a usar una base de datos Oracle desde una aplicaci6n Visual Basic .NET. El objetivo de este capitulo es mostrarle, de forma resumida y riipida, cu61 seria todo el proceso de configuracih necesario.

De partida, como es 16gic0, deber5 contar con un servidor en el que est6 ejecutindose el RDBMS de Oracle, conociendo el servicio a1 que quiere conectar, el nombre del esquema y la clave de acceso. Seguramente la empresa para la que vaya a trabajar ya tenga el RDBMS instalado y en funcionamiento, per0 tambi6n es seguro que

Programacidn de bases de datos con Visual Basic .NET

El proceso de instalaci6n de Oracle9i es bastante largo, si bien nuestras intervenciones en el proceso se limitarh, en la mayoria de casos, a elegir una opci6n y pulsar el b o t h Siguiente para ir avanzando. En este punto puede ver un resumen del proceso y ver, paso a paso, las p6ginas que deberia mostrarle el asistente. Tras iniciar el instalador, ejecutando el archivo s e t u p . exe del primer CD, deber5 aparecer el Instalador universal de Oracle. Este le permite, como se aprecia en la figura 17.2, tanto instalar nuevos productos como ver 10s que tiene instalados o desinstalar aquellos en 10s que ya no est6 interesado. En este caso, puesto que queremos instalar el RDBMS y 10s productos de que depende, pulsariamos el citado b o t h Siguiente.
OrklTe.""ine;;al
. . . .. . .

. .,...

.-,- .,.

"

," - .

.. .

- .. -.- . ....

-

. . .. ~. --. *..,. . .;
,.%.

.

... ... . . .

-.

. . -

cia _.
.-. ...

Bienvenido
Oracte universal Installer le guiarh en la instalacion y confuuracdn

Haga clic en "Productos lnstalados '' para ver todos los productos

Figura 17.2. Ventana principal del instalador universal de Oracle

Lo primer0 que tenemos que hacer, antes incluso de elegir el product0 que queremos instalar, es facilitar un nombre para el directorio raiz donde se efectuarri la instalacih, junto con el camino completo en el que se crearri dicho directorio. De ser necesario, facilitariamos en el apartado Origen el camino y nombre del archivo j a r donde se encuentra el indice de productos que hay en 10s CD. Esto habitualmente no es necesario. El instalador propone un directorio raiz por defect0 que es el que puede verse en la figura 17.3. Lo aceptamos y pulsamos de nuevo el b o t h Siguiente.

17. Acceso a Oracle desde Visual Basic .NET

Ubicacion de 10s Archivos
Origsn...
IntroduZCa l a ruta

Ruta de ACC~SO

Figura 17.3. Seleccion del directorio raiz donde se efectuara la instalacion

Finalizada la lectura del archivo j a r, el instalador nos mostrara la lista de opciones que tenemos a nuestra disposicih. En este caso son tres (vease figura 17.4), de las cuales nos interesa, en principio, la primera, instalando la base de datos completa en el sistema. La dejamos marcada y luego pulsamos nuevamente el bot6n Siguiente. El paso siguiente nos permitir6 elegir una de las ediciones de Oracle9i, Enterprise, Esta'ndar o Personal. Dependiendo de la edicidn se instalarin mas o menos servicios y herramientas. Para el objetivo que perseguimos es indistinta la edici6n por la que optemos, puede ser cualquiera de las tres disponibles. A1 tiempo que se instala el RDBMS, el asistente de instalacion tambien puede crear una base de datos evitandonos ese trabajo posterior. En la ventana que aparece en la figura 17.5 puede ver que aparecen distintas opciones. Si no quiere crear una base de datos, sin0 instalar el software sin mis, elija So10 Software. Las demis opciones crean una base de datos, optimizindola para el procesamiento masivo de transacciones, el almacenamiento de datos para analisis o un us0 general. Dejamos marcada la primera option, que aparece elegida por defecto, y pulsamos el b o t h Siguiente. Las bases de datos Oracle se identifican con un nombre global y un SID o identificador simple dentro del servidor. Es la information que tenemos que facilitar en el paso siguiente. A medida que introduzcamos el nombre global veremos que el mismo asistente propone un SID que, normalmente, aceptaremos. En este caso (vease figura 17.6) asignamos el nombre global Libros .AnayaMultimedia.e s a la base de datos, con el SID Libros.

Programacidn de bases de datos con Visual Basic .NET

Productos Disponibles
Seleccione el product0 que dosea InStrlar.
5 Oracle91 Database 9 0 1 1 1
S ~ N ~ C DdeS D red

lndsia uoa base de dabs Masi DpCmnal prrconfQur& la% OpUDnw Iss ufildadea y el scftwsre basrco 6el clente w e un

r Oracle91 Clent 9 0 1 1 1
degeslandcEatarpnse hbrsemmsdered

Figura 17.4. Elegimos el software que deseamos instalar

Configuracidn de Base de Datos
Selecuone una base de datos que se ajuste a sus necesidades
@

Us0 General
hstsia U M bage de dstos confqurada prwlamte @ a s m d wfa Mo

r Procesamlentode Transacctones

Figura 17.5. Optamos por crear una base de datos para us0 general

La ubicaci6n de las bases de datos que vayan cre6ndose suele ser el directorio
o r a c l e \ o r a d a t a de la unidad donde se haya instalado Oracle. El siguiente paso

17. Acceso a Oracle desde V i s u a l Basic .NET

del asistente, no obstante, nos permite especificar el directorio que deseamos emplear, pudiendo dejar el indicado por defecto o cambiarlo.

E Oracle Universal i n s t a l k Identifiacirjn de b s e s de b t o s
... ...

'

7

.

.

.

.

__

. . . . .'2-s ...

kill

ldentificacion de Bases de Datos
-3s D J S S S J e O m s Or3.1e91j e denlificin : c n a u n i m ccn e ncmbre ce Dase de datos glabal, njrm31nien!e el 131manas ncmnre a,min,c Intrcc,ica el nomoie de base de Oatos gobal para esta base

de 3315s

.... - . . . I .. _ _ . __ I . r o m n ~ e a e l a B 3 s e a e D a l o s G ~ a ~ a ~x -111 x l - i r w ~ E i j Lt r 3

,

.. .

....

I/

l

Libros

I

Figura 17.6. ldentificamos la base de datos que va a crearse

El paso siguiente serfi la elecci6n del conjunto de caracteres que se utilizara para almacenar la informacih en la base de datos. Tendremos tres opciones: el juego de caracteres por defecto del sistema, el juego de caracteres Unicote o bien cualquier otro que nos interese seleccionfindolo de una lista. Llegamos a la ventana resumen de la instalacih, mostrada en la figura 17.7. Es el punto en el que debemos revisar todos 10s parhmetros y a continuacih pulsar el b o t h Instalar, si todo es correcto, o bien retroceder y cambiar aquellas opciones que deseemos. Tras pulsar el b o t h Instalar nos limitaremos a ir cambiando el CD-ROM del producto, a medida que lo solicite el instalador, o bien indicar el directorio donde se encuentra el contenido de cada uno de ellos, en caso de que hayamos dejado 10s paquetes descomprimidos en directorios individuales. A1 final de la copia de archivos se pondrh en marcha la configuracih de las distintas herramientas. Se iniciarfi el servidor HTTP de Oracle (una versi6n personalizada de Apache), el agente inteligente de Oracle y, como se aprecia en la figura 17.9, se invocarfi a1 asistente de configuracih de bases de datos. El proceso de generacih de la base de datos, en el que prhcticamente no tendremos que intervenir, irh abriendo algunas ventanas de consola que se cerrarhn automfiticamente, no tiene que actuar sobre ellas. El proceso de creaci6n de la base de datos quedar6 reflejado en una pequeiia ventana (vease figura 17.10). Se copia-

1 Requutos de Espaclo L401urnen C\Necesarios 1 U l G B Disponibies 28 42GB +?@danced Replication 9 0 1 1 1 Figura 17. poniendo en marcha un servicio Windows que ser6 el que atienda las solicitudes de conexi6n.1.1. Oracb9i Database 9.0.1 Figura 17.NET r6n del CD-ROM 10s archivos de una base de datos tipo. Resumen previo al inicio del proceso de instalacion 'instairno Oracle Complete DSS Starter Daiatmse 9 0 1 0.7.8.Programacidn de bases de datos con Visual Basic . Proceso de copia de archivos y configuracion .

NET Herramientas de Configuracion r3ce Oracle Intelligent agent en curso pendiente Figura 17. Acceso a Oracle desde V i s u a l Basic .10.17. veri aparecer una pequeiia ventana indic6ndole el nombre global. Apareceri la de confirmacion de fin de instalacion del instalador universal de Oracle. Pulse de nuevo el b o t h Salir.9. Pulse el boton Salir de esa ventana. . el SID y la contraseiia de las cuentas SYS y SYSTEM. Configuracion de las herramientas instaladas fl fl v Tennban&Creaci&tUeBasede~os Creaaon 6e ba3e de datos donica en curso Figura 17. dindole opci6n a modificarlas con el b o t h Gesti6n de Contraseiias. Ya tiene Oracle instalado en su sistema. El asistente crea y configura la base de datos automaticamente sin intervencion nuestra Terminada la creacion y Configuracion de la base de datos.

Oracle instala un gran n6mero de asistentes y herramientas. Abra el servidor.NET ___ I____ _____I __ ___- I - - _ _ I __ ~ --- I _ ~ _ I _ _ _ I~ Una vez instalado el RDBMS. perfiles y administracion de la base pueden realizarse con el Oracle Administration Assistant for Windows NT (vease figura 17. siendo necesaria tambien una definici6n en 10s clientes. OracleSi instala multitud de herramientas y asistentes Muchos de 10s aspectos relacionados con cuentas.inRAP Acrobat Readri 5 ill Enteipnse Manager Quick T O U ~ b Integrated Management Tools b I Figura 17. la rama Bases de datos y seleccione el SID de la base creada durante la instalaci6n. etc. seguridad. € __ - - __ ___ Para poder conectar con una cierta base de datos Oracle. En la figura 17.12).11. Nuestra base de datos . Este se define en el momento de la creacion en el servidor. Todos ellos puede encontrarlos en la carpeta Oracle . PonerChute pius Enterpire ManagementP ~ d s t i ~ '!Mhale :W. perfiles y administradores. Haga clic sobre ella con el b o t h secundario del rat6n y elija la opci6n de conexi6n.HoraHomeSO de Inicio>Todos 10s programas. en contraposici6n a productos como SQL Server en 10s que pricticamente todas las operaciones se encuentran centralizadas. seguramente necesitari configurar parimetros de red.11 puede ver algunos de esos elementos. A partir de ese momento podri acceder a las listas de usuarios. concretamente la subcarpeta correspondiente a herramientas de configuraci6n y conversi6n.Programacidn de bases de datos con Visual Basic . es indispensable conocer el nombre del servicio.

Acceso a Oracle desde Visual Basic . scott. vistas o procedimientos almacenados. es posible acceder a multiples origenes de datos sin necesidades adicionales.17.NET.__ -- proon Yec - Eavontos - - Ven_tana -~ A& 08 del Ststema O p r a b v o Adrninistradwes de Bases de Datos del Sisterna Operc operadores de Bases de DatOr del Ststerna Operabbc Opeiadorer de Bases de Datos d d Sistema Uruarios Externos del Sistma Operabvo Roles Extemos d d Sisterna Operabuo Adnnnstradwes de Bases de D a b s del 9sten Operadores de Bases de D a b s del Sirtema 0 Figura 17. Existe un esquema por defecto. es reconocida en el propio servidor con el nombre de servicio L i b r o s ] M&va __ . generada por el asistente.NET. una hoja de cdculo Excel o comunicarnos con un servidor SQL Server sin necesitar ningun software adicional. Puede crear su propio esquema y personalizarlo. como tablas. ya que t a m b i h se instalan 10s MDAC. emplean distintos medios de comunicacih entre cliente y .NET inicial.12. Desde un sistema en el que se instale la plataforma Microsoft . No es posible. sin embargo. que hemos usado en todos 10s ejemplos de 10s capitulos previos en 10s que se utilizaba la base de datos Oracle creada en el tercer capitulo. indispensable para ejecutar cualquier aplicaci6n creada con Visual Basic . por lo tanto. una comunicacion directa con todos 10s productos RDBMS disponibles en el mercado. Esto significa que podemos usar una base de datos Access. especialmente cuando son de diversos fabricantes y. Consola de adrninistracion de Oracle Cada base de datos cuenta con una serie de esquemas en 10s que se alojan 10s distintos elementos. si no quiere emplear 4ste.

Programacidn d e bases d e datos con Visual Basic . A1 finalizar el proceso. Ya tenemos en el equipo del cliente el software cliente instalado y el nombre del servicio definido. Para ello ese cliente debe indicar el nombre o direcci6n del ordenador que actua como servidor. Este proceso se describi6 en el sexto capitulo. caso en el que no es necesario. simplemente eligiendo la opci6n OracleSi Client en lugar de OracleSi Database en el paso del asistente que aparece en la figura 17.NET Oracleclient. como es el caso de SQL Server.NET. desde una aplicacGn. el valor asignado a1 parimetro Data Source es el nombre de servicio local con el que se conoce a la base de datos. Por ello es necesario instalar en cada ordenador cliente el software que facilite el fabricante del RDBMS. Podemos redistribuir el archivo oracle net . puede recurrir a 61 para recordarlo. asi como la base de datos que se desea abrir.NET servidor. basta con instalar el software cliente para. Para que nuestra aplicaci6n funcione.ms i como un m6dulo adicional que es necesario a1 instalar nuestra aplicacizn. conectar con una base de datos que se encuentra en el servidor. Sin embargo. S i debe instalado en todos 10s ordenadores cliente donde vaya a utilizarse la aplicacion. La instalaci6n de dicho software cliente se inicia con el mismo proceso explicad0 en el punto dedicado a la instalaci6n de Oracle9i. por lo que debe ser instalado en cada sistema donde vaya a utilizarse para acceder a una base de datos Oracle. sin embargo. a diferencia de Sqlclient y OleDb. a1 usar Oracle el cliente no tiene porque conocer ni el servidor donde se ejecuta el RDBMS ni la base de datos. Estos datos corresponden con 10s parimetros Data Source e Inicial Catalog de la cadena de conexi6n.4. de manera que este ahi disponible . Con algunos RDBMS.Este no forma parte de la instalaci6n estandar actual de la plataforma Microsoft . usando para ello el Asistente de Configuracion de Red de Oracle que se instala como parte del software cliente. Ese nombre de servicio hay que definirlo. tendri en el ordenador 10s elementos necesarios para comunicarse con el RDBMS Oracle9i remoto. en este caso el software cliente de Oracle9i. El software cliente debe instalarlo en la maquina de desarrollo tan solo si no es la misma en que este ejecutandose el RDBMS. es necesario un elemento m6s: el proveedor ADO.

facilitando en la cadena de COnexi6n no el nombre del servidor RDBMS O del servicio remoto. Adem6s puede ser necesario facilitar el nombre de esquema/usuario. y la clave de acceso correspondiente. segun se ha descrito en 10s capitulos de la segunda parte. sin importar que 6ste se ejecute tambi6n sobre Windows o cualquier otro sistema operativo. el proceso para acceder a la base de datos mas usada desde el lenguaje de programaci6n m6s popular no es demasiado complejo. Como puede ver. funcionando sobre Windows y accediendo a un RDBMS Oracle9i. Acceso a Oracle desde Visual Basic .17.NET. Con esto ya tendria su aplicaci6n Visual Basic . por ejemplo S c o t t . Nuestra aplicaci6n usaria 10s objetos de este proveedor. sin0 el nombre de servicio local que ha sido definido para acceder a esa base de datos. .NET cuando haga falta.

.

dejando el aseguramiento de esa integridad en manos de ADO. luego de ejecutar el m6todo Update ( ) del primer adaptador que.A1 operar sobre sistemas RDBMS.NET. codifica una serie de adaptadores de datos y DataSet para actuar sobre dos tablas: una que contiene encabezados de factura y otra que almacena las filas de detalle. Una transacci6n asegura que todas las operaciones efectuadas en su bmbito. Imagine que. especialmente cuando se actua sobre multiples tablas. sin embargo. desde que se inicia hasta que se cierra. momento en el cual necesitaremos emplear el objeto Transaction del proveedor adecuado tal y como se explica en 10s puntos siguientes. es habitual utilizar transacciones que aseguren la integridad de 10s datos. Esto nos garantiza la integridad de la informacih almacenada en la base de datos. conternplan el us0 explicito de transacciones. Oracle y SQL Server son dos ejemplos. una parte de 10s origenes de datos que hemos usado en capitulos previos lo son. En ocasiones. Todos 10s sistemas RDBMS considerados como tales. puede ser precis0 un control explicito del inicio y fin de la transaccibn.NET y el RDBMS con el que se conectaba. En ninguno de 10s ejemplos propuestos hasta ahora nos hemos ocupado de las transacciones. se ejecutan de forma satisfactoria o no se ejecuta ninguna de ellas. A1 efectuar parte de la actualizacih. en una aplicaci6n Visual Basic . .

para evitar que la operacih pudiese interrumpirse entre ellas. consiste en emplear el sistema de transacciones de la propiedad base de datos. y que se dan constantemente en la mayoria de aplicaciones. El control de transacciones en la base de datos se efectuard con las sentencias propias del lenguaje de cada RDBMS. dado que no es posible encontrar 10s datos del cliente y la factura a la que pertenecen las lineas. Suponga que quiere tener en la base de datos SQL Server creada como ejemplo en el tercer capitulo. por ejemplo PL/SQL en Oracle o T-SQL en SQL Server. Una forma de asegurar la integridad de 10s datos en operaciones como la descrita. invocan a1 procedimiento almacenado facilitandole 10s parametros necesarios. cuando necesitan efectuar alguna operacih. de tal forma que las aplicaciones. de tal manera que las dos . las introducimos en una transacci6n. se produce un fallo de alimentaci6n o una interrupci6n en las comunicaciones. cada una de estas sentencias ira seguida de un identificador propio. El procedimiento almacenado podria ser el siguiente: Observe que a1 final del m6todo no se utiliza una sentencia COMMIT. Esta se iniciaria antes de la prirnera actualizacih y terminaria tras la ultima. la segunda la confirma y la tercera la revoca. de tal forma que se han enviado a1 servidor las lineas de detalle per0 a1 intentar el Update ( ) para enviar la cabecera se produce un error. ROLLBACK TRANSACT I ON. La primera inicia una nueva transaccih. Control d e transacciones pongamos por caso. En este momento en la base de datos existe una inconsistencia patente. Dado que en SQL Server las transacciones pueden anidarse. confirmandose si todas se reciben satisfactoriamente o descartandose si se produce cualquier evento que impida mantener la integridad. COMMIT TRANSACT ION. En el caso de T-SQL las sentencias a conocer son estas tres: BEGIN TRANSACTI ON. sino ROLLBACK. En ese ambito las operaciones se registran de forma temporal. Para evitar esta situaci6n debe utilizarse una transacci6n. un procedimiento almacenado a1 que facilitandole el c6digo de una editorial elimine todos 10s libros que le pertenecen y la propia editorial.18. Para ello lo habitual es codificar procedimientos almacenados en la base de datos. ocupandose 6ste de realizar la manipulacion de las tablas. es el de las lineas de detalle. que seria lo habitual para confirmar la operacion. Esto requiere dos sentencias DELETE y.

..NET...._..NET sentencias anteriores quedan canceladas aunque.. Desde una aplicacion Visual Basic .-._.. dejando el control de las transacciones directamente en manos del servidor de datos...... como se ha hecho en la figura 18. . Si las abre._ .._ . en apariencia.I_... sin embargo..... empleando para ello el objeto Trans action especifico del proveedor que vayamos a utilizar para acceder a1 origen de datos: S q l T ran sa ct ion.. ~ _ ~ _ ^ _ Las transacciones tambien pueden ser controladas de manera explicita desde el codigo de un programa Visual Basic ... Fijese en el panel de resultados.____. Las cuatro clases mencionadas tienen en comun la implementacibn de la interfaz IDbTransaction. _ _..... .. 01e DbTran saction. _.. Puede comprobarlo ejecutando el procedimiento desde el Analizador de consultas SQL de SQL Server.1.__ . parezca que se ejecutan. ~ . Col 28 Figura 18. Y > Cwndetado el proceso wr lotes de la conwlta INSPRON ( 0) INSPIRON$ranorca (52) L h o s 8 0 00 00 0 Rlas i n 1. donde se indica el numero de filas afectadas en ambas tablas.Esta cuenta tan solo con cuatro miembros._t. 0ra cleTran sa cti on u Odb cTransaction. dos propiedades y dos m6todos: .NET podriamos ejecutar este procedimiento almacenado.._ . cornprobar5 que no se ha eliminado fila alguna.^__....1. Aparentemente el procedimiento almacenado ha eliminado filas en ambas tablas .Programacidn de bases de datos con V i s u a l Basic ..

2. implementado en el objeto Connection de cada proveedor. tras ejecutar todas las operaciones de actualizacion. Una alternativa es emplear el metodo BeginTransaction ( ) de la interfaz IDbConnection. . todas las operaciones ejecutadas durante su tiempo de vida. en la interfaz IDbConnection hay definida una propiedad llamada Transaction.18. un b o t h para seleccionar las filas. Rollback ( ) : Revoca la transacci6n. Veamos en la practica como crear y controlar una transaccion desde un programa Visual Basic . empleando para ello el proveedor de SQL Server. Con este fin. Para crear una transaccion asociada a una cierta conexion. El metodo BeginTransaction ( ) de Sqlconnection. Hemos arrastrado la tabla Libros de la base de datos SQL Server desde el Explorador de servidores hasta el diseiiador. Comenzaremos insertando en un formulario 10s componentes que pueden verse en la figura 18. IsolationLevel: Fija el nivel de aislamiento entre esta transacci6n y las demds que pudieran existir en el RDBMS sobre 10s mismos elementos. Los principales elementos de interfaz son un cuadro de texto para introducir el c6digo de una editorial. Control de transacciones 0 Connection: Establece el vinculo entre este objeto Transaction y un objet0 Connection. mediante las sentencias comentadas anteriormente. utilizando el menu emergente de SqlDataAdapterl para generar el conjunto de datos DsLibrosl. bastaria con asignar a la propiedad Connection la referencia a la conexi6n. por tanto.NET. y un segundo boton que eliminaria esas filas del origen de datos. en realidad hacen us0 de la gestion de transacciones propia del RDBMS. 0 0 commit ( ) : Confirma la transacci6n. usariamos el metodo Commit ( ) o Rollback ( 1. asi como 10s metodos Commit ( ) y Rollback ( ) de SqlTransaction. como puede deducirse de 10s miembros existentes en la interfaz IDbTransaction. para confirmar o revocar la transaccion y. Ese objeto tiene que asociarse tambien con cada uno de 10s comandos que vayan a ser ejecutados y que se desea que queden bajo el dmbito de la transaccion. que aparecerdn en el DataGrid que hay debajo. No necesitamos mds para controlar desde un metodo Visual Basic un proceso similar a1 explicado en el punto previo a mod0 de ejemplo. Creada la transaccion y enlazada tanto con la conexion como con 10s comandos.

Ob]ect.Libros.Click ~ SqlDataAdapterl.(ByVal s e n d e r As System.Prograrnacidn de bases de datos con Visual Basic . DiseAo del formulario En principio no existe ningun vinculo entre 10s elementos de interfaz y 10s componentes de acceso a datos.NET Dates 8 - Format0 Herramlentas p Debug - '3@*33-. "Libros") Dim Vista As DataView = New DataView(DsLibrosl. Priva ByVal e As Systern.2. Este ejecuta el c6digo siguiente: . Text. Fill (DsLibrosl.EventArgs) Handles btnSelecc1onar. "Editorial=" tbCodigoEditoria1. ~ & ~ DataViewRowState. 1 : x Figura 18. "Titulo".CurrentRows) . vinculo que se establecer6 a1 pulsar el b o t h Seleccionar.

O b ] e c t .Delete() sq De S g 1[lat a A d a p t e r 1 .18. Finalmente. C l i c k Dim I n d F i l a As I n t e g e r ~ Dim Vista As DataVlew = C T y p e ( d g L i b r o s . C o u n t End W h i l e > 0 Virta(O). Control de transacciones I g L i b r o s . Eso es. basta con recorrer la vista e ir llamando a1 metodo Delete ( ) de cada uno de 10s elementos y llamar a1 metodo Update ( ) del correspondiente adaptador de datos. enlazamos esa vista con el DataGrid.Rollback ( ) E n d If = DsLibrosl. Tab L e ) "Trar. per0 delimitando la operacion dentro de una transacci6n y confirmtindola o revoc6ndola segun lo que responda el usuario a una ~ l t i m a pregunta de confirmacibn. lo que vamos a hacer a1 pulsar el b o t h Eliminar. YesNo) D i a l o g R e s u l t . Dataview) Dim T r a ri s a c c 1on As I DbT r a n s act i on While V i s t d . Upd a t e ( V I s t a . El proceso de eliminacih de las filas es sencillo. que mostraria las filas que van a eliminarse en caso de que pulsemos el b o t h Eliminar.sacciones". E v t ? n t A r g s ) H a n d l e s b t n E l i m i n a r . llenamos el DataSet usando el adaptador de texto. Datasource = V i s t a E n d Sub Como puede ver.Clear() . bisicamente. s B y V a l e As S y ~ t e m . MessageBoxButtons. D a t a S o u r c e . Yes T h e n T r a n s a c c i o n . Commit ( ) Else ' Transaccion. creando a continuaci6n una vista en la que aparezcan s610 10s titulos de la editorial cuyo c6digo se haya introducido en el TextBox. El c6digo asociado a1 evento C l i c k del boton seria el siguiente: - P r i v a t e Sub b t n E l i m i n a r ~ C l i c k ( B y V a 1 e n d e r As S y s t e r n .

incluso. efectuando la conversi6n de tipo necesaria.Prograrnacidn de bases de datos con Visual Basic .3. El programa mostrando la lista de filas que van a eliminarse De manera an6loga podriamos controlar con transacciones explicitas cualquier otra situacibn. ya que en este caso hubiese bastado con pedir la confirmaci6n antes de eliminar las filas y actualizar con el adaptador de datos. mientras que de revocarse el D a t a G r i d volver6 a mostrar las mismas filas.Close i ) End Sub Obtenemos una referencia a la vista que se cre6 previamente para vincularla a1 D a t a G r i d . borramos las filas. b 17 11 13 14 4 15 12 10 3 0 471 37523 3 84 415 1255 8 84 415 1202 7 84 415 1132 2 84 415 1230 6 84 415 1291 4 84 415 1324 4 84 41 5 1145 4 84 41 5 1230 2 84 415 1261 2 84 415 1351 1 84 415 1392 3 84 41 5 1376 7 8441511365 Assembly Language Step by Ste Guia piactica para umarios de D Guia piactica para umaiios de E Guia ptactica para U S U ~ ~ I Ode r S Guia practica para usuarios deVi Guia practica paia usuarios de VI Guia ptactl~a para usuatosJEW lntroduccion a la programacion Manual avanzado Excel 2002 Progiamacioncon Delphi 6 y Kyli ProgiamacionconVirual Basic Piograrnacion conVisual C# NE PiogramacionconVisual Studio SQLServer2000 Jeff Duntemann Francisco Chaite Francisco Charte/ Francisco Charte Francisco Charte Fiancisco Charte F ~ a n c ~ Charle co Francisco Charte Francisco Charte Francisco Charte Francisco Charte Fiancisco Chaite Francisco Chartet Francisco Charte 1 1 1 1 1 1 1 1 1 1 1 1 1 1 60 5 1052 1052 1052 10 75 1052 1075 24 04 21 04 37 26 33 39 40 10 75 Figura 18. En ese momento las filas desaparecerh del D a t a G r i d e.NET SqlDataAdapterl. Que llamemos a1 metodo commit ( ) o R o l l b a c k ( ) depender6 de la respuesta del usuario. . sin necesidad de usar una transacci6n. no podria acceder a ellas desde otra aplicaci6n o desde el Administrador corporativo de SQL Server. Se encuentran bloqueadas a la espera de que la transacci6n se confirme o descarte. generalmente en la que se encontrasen implicadas dos o m6s tablas que deban mantener una integridad referencial. el D a t a G r i d permanecera vacio ya que las filas se habran borrado. " L i b r o s " ) Sqlconnectionl . Si se ha confirmado. asociamos la transacci6n con el D e 1 e t e C o m m a n d del adaptador e invocamos al metodo U p d a t e ( ) de kste.F i l l ( D s L t b r o s l . terminamos refrescando la informacih del D a t a S e t y cerrando la conexi6n. Independientemente de c u d se ejecute. Luego abrimos la conexi6n e iniciamos la transaccibn.

* A ...

s e g ~ ha podido n verse en el capitulo previo. a continuacibn. sin perder directamente 10s cambios que haya efectuado el usuario per0 sin escribir tampoco 10s cambios sobre el origen perdiendo la informacibn que otro cliente haya introducido. posteriormente. ya cambiada o inexistente? Por defecto se genera una excepcidn. deben ser actualizados. iQu6 ocurre si un usuario modifica o elimina alguna de esas filas y.NET utiliza una politica de bloqueos optimista. incluso. ADO. Por defecto. otro usuario intenta modificar esa fila. de que varias aplicaciones cliente. por tanto. con un ejemplo. cdmo responder a esta situacidn para poder resolverla de forma satisfactoria.El empleo de transacciones asegura la integridad de 10s datos. hay que elegir una politica de bloqueo y de . Puede darse el caso. per0 no resuelve por si solo 10s problemas de concurrencia que pueden presentarse. generalmente en distintos ordenadores distantes entre si. lo cual significa que 10s datos se recuperan en un Data S e t per0 cualquier otro usuario puede acceder a ellos de manera simultAnea. e bloqueo y actualizacion A la hora de codificar una aplicacidn en la que van a obtenerse datos que. e s t h mostrando la misma informacidn e. impidiendo a1 segundo usuario hacer cambios en una fila cuyo estado ha cambiado desde que la recuperd en el Data S e t. El objetivo de este capitulo es mostrarle. permitan a1 usuario modificarlos.

ADO. Hay una tercera. no a1 seleccionar datos. Asi. La politica de bloqueo optimista s610 bloquea las filas que van a ser modificadas o eliminadas y s610 en el momento de la actualizaci6n. es tan simple como asumir que en la base de datos s610 permanecer6n 10s datos que se escriban en ultimo lugar. hay que controlar la posibilidad de que dos o m6s de ellos efectuen cambios en la misma fila. por naturaleza. Resolucion de problemas de concurrencia actualizacion. recupere una lista de 10s titulos existentes en la tabla L i b r o s . se perderAn todos 10s cambios excepto 10s del ultimo en enviarlos a1 RDBMS. En cuanto a la politica de el ultimo gana. es decir. lo cual no suele ser aceptable en aplicaciones que se ejecutan en multitud de clientes contra una misma base de datos. porque de lo contrario no podria mantenerse el bloqueo sobre las filas. en caso de que un programa. iniciando una transaccion antes de recuperar las filas y manteniendola hasta despues de la actualizacion. El bloqueo optimista tiene el problema antes planteado: ya que varios usuarios pueden acceder a las mismas filas. El bloqueo pesimista consiste en bloquear las filas que presumiblemente van a actualizarse desde el mismo momento en que leen de la base de datos. Cuando se crea un adaptador de datos.19. esto no implicar6 que ningun otro cliente pueda obtener esos mismos datos. Bisicamente existen dos opciones: bloqueo optimista y bloqueo pesimista. No es necesario mantener una conexi6n continua con el servidor. ya sea directamente a1 arrastrar una tabla desde el Explorador de servidores o tal y como se describi6 en 10s capitulos de .NET nos facilita 10s eventos y excepciones necesarias para ello. ya que el bloqueo se estableceria s610 en el momento de ejecutar la sentencia UPDATE. En ADO. suele ser una opci6n inaceptable en la mayoria de 10s casos. no obstante. Es posible simular ese comportamiento. lo cual significa que ningun otro cliente puede tener acceso a ellas hasta que el proceso de modificacibn y actualizaci6n termine. Es una politica que requiere mantener una conexi6n abierta con el servidor todo el tiempo que dure ese proceso. siendo el m6s importante que s610 un usuario puede tener acceso a las filas en cada momento. a la que se hace referencia como el u'ltimo gana. como 10s usados a mod0 de ejemplo en capitulos previos. se opera sin una conexion persistente con el servidor. Como se decia antes.NET no existe la opcion de usar una politica de bloqueo pesimista ya que. si varios usuarios modifican una misma fila. aunque generalmente no es aceptable en la mayoria de aplicaciones. Sus inconvenientes son muchos.

Original de la fila que tenemos en el programa no coinciden con 10s valores que existen en la base de datos. otra a1 comando ejecutado.Prograrnacidn de bases de datos con Visual Basic . "Libros"). una referencia a la fila afectada. El segundo parimetro que acompaiia a ese evento contiene un indicador de estado. Si no modificamos el valor de la propiedad Status. a1 menos en este primer acercamiento a la soluci6n final. sabremos que se ha producido un error que ha impedido la actualizacih de la fila. generados con el Explorador de servidores. no habihdose modificado ninguno de ellos porque se haya producido otra actualizacih en paralelo.mostrando asi las filas de la tabla en la cuadricula desde un primer momento. ErrorOcurred. un mensaje de error. mediante el cual puede saberse si se ha efectuado la actualizacih o producido un error. Raz6n: 10s valores DataRowversion.EventArqs) Handles btnActualizar. En la parte inferior del diseiiador puede ver la conexibn. refrescando el contenido del DataSet para obtener 10s cambios que pudiesen haberse ejecutado desde otros puestos: I _ I r P r i v a t e Sub btnActualizarpClick ( B y V a l s e n d e r As System. facilitando como pardmetro la tabla que tiene las filas modificadas. Cuando se pulse el bot6nActualizar procederemos a llamar a1 metodo Update ( ) del adaptador. B y V a l e As System. Fill (dsLibrosl. El RDBMS ejecuta la actualizacion y confirma a ADO.Click . Partimos disefiando un formulario como el que aparece en la figura 19. adaptador y conjunto de datos. A1 abrirse el formulario se ejecutara la sentencia SqlDataAdapterl. Podemos notificar el problema a1 usuario y modificar dicha propiedad. Vinculamos el DataGrid con la unica tabla del DataSet.Ob]ect.1. se utiliza un objeto CommandBuilder que se encarga de generar las sentencias de actualizacih y eliminaci6n de filas. se recorren las filas una a una y se ejecuta una sentencia UPDATE cada vez que se encuentre una cuyo estado indique que ha sufrido cambios.NET el &xitoo el fracaso. impidiendo la generaci6n de la excepci6n. aunque sin resolver el problema puesto que los cambios efectuados por el usuario que no se hayan podido escribir en el origen se perderan. con un DataGrid y un b o t h como unicos elementos de interfaz. Estas contienen todas las condiciones necesarias para garantizar el bloqueo optimista.y dejamos que la ejecucidn continue. En el momento en que se llama a1 mktodo Update ( ) de un adaptador de datos. En caso de que la propiedad RecordsAf fected sea cero y Status contenga el error Updatestatus. generindose a continuacih el evento Rowupdated del adaptador de datos.NET la segunda parte. - ~ I _ _ _ Veamos c6mo aprovechar el evento RowUpda ted para ofrecer informacih sobre el proceso de actualizaci6n. se produciri una excepcih. comprobando que 10s valores que tenia la fila originalmente son 10s que tiene en el momento de la actualizacih. etc.

Status = UpdateStatus. Item("Autor".Errors.Data.ErrorsOccurred Then MessageBox.Show(e. "Libros") End Sub nrchivo Edition Yer Proyecto enmar Depurar Datos Herrarmentas Ventana Aygda . Original) & vbCrLf & e.19. ByVal e A s System. Resolucidn de problemas de concurrencia s1.RowUpdated ~ - I f e. per0 no se desencadenarfi en ning6n momento el evento RowUpdated.L SqlDataAdapterl. DataRowVersion.SqlRowUpdatedEventArgs) Handles SqlDataAdapter1.SqlClient.Esto tan s610 ocurriri una vez por cada fila modificada. Item("Autor".1.Row.Current) ) . Aspect0 del formulario con la cuadricula y el boton Si no hemos cambiado ning6n dato. DataRowVersion._ t1rto- I/ 1 -. Fill (DsLibrosl. ejecutfindose el c6digo siguiente: Pr lDat ed(ByVa1 serider A s O b j e c t . - - - __ I Figura 19. Row.Message & vbCrLf & e. 10s datos de la cuadricula mostrarin cambios que otros clientes puedan haber efectuado.

2. SkipCurrentRow a la propiedad Status. que es la que pretendemos modificar a mod0 de ejemplo. Para provocar un error tendr6 que ejecutar dos copias del programa y cambiar la misma fila. o bien hacer alguna modificaci6n desde el Administrador corporativo.2. comprobamos si el estado indica la existencia de un error. Si ejecuta el programa. impidiendo la generaci6n de la excepci6n DBConcurrencyException a1 tiempo que se ignoran 10s cambios de la fila. efectcia cualquier cambio y pulsa el b o t h Actualizar todo ir6 bien. Observe el mensaje de error. No obstante. caso en el que mostramos por la consola el mensaje. por lo tanto.Status End I f End Sub = UpdateStatus. Por ultimo asignamos el valor Updates tat u s . el valor original que tenia la fila y el que nosotros pretendiamos darle en una de las columnas. se le obliga a.Programacidn de bases de datos con V i s u a l Basic . 1 89311534 1 84 415 1136 5 84 415 1324 4 84 4151332 9 84 415 1376 7 84 415 1351 1 84 415 1290 6 84 415 1231 4 84 41 5 1261 2 84 415 1255 8 84 415 1230 2 84 415 1202 7 8441511322 84 41 5 1145 4 User Inteilace Design lor Programmers SOLserver 2000 Guia ptactica para usuaiiosJBuilder 7 PiogramacionconVisual C# NET Ptogiamacion con Visual Studio NET ProgramacionconVisual Basic NET Gum practica paia U Q U ~ ~ I O S deVisual Basic Guia practica paia wuarios de Visual Studio Piogiamacion con Delphi 6 y Kylix Guia piactica pata usuams de Delphi 6 Manual avanzado Excel 2002 Gum practica paia U S U ~ ~ ~ O Excel 2002 de S GuiapracticapatausuariordeKylix JoelSpolsky Francisco Charte Francisco Charle Francisco Charle Fiancisco Chaite/Jorge Seriano Francisco Chaite Francisco Charte Francisco Charle lntioduccion a la piogiamacion Figura 19. . En esos casos nos encontraremos con una situaci6n como la de la figura 19. tras haber actualizado 10s datos que tenia en el DataGrid.NET e. 10s cambios que ha efectuado se perderdn.SKipCurrentRow Como puede ver. Al actualizar se ha encontrado un problerna de concurrencia El ejemplo anterior es titil porque notifica a1 usuario que ha surgido un problema de concurrencia y.

Fils. DatosActuale5 .Current 1 ~ ~ ~ MessaqeBoxButtons. es decir. Resolucidn d e problemas d e concurrencia volver a introducirlos si se quiere ejecutar la modificacih. Itern("IDL1bro") ) Dim M e n s a j e As String = String. se utilizaria el metodo Merge ( ) del conjunto de datos original para unirlo con el que acaba de recuperarse. preguntfindole si quiere sobrescribir la informacion que hay actualmente en la base de datos. la fila que ha provocado el error. " & "Valor original='{l}'. True1 SqlDataAdapterl. invoque a1 siguiente metodo Resolucion ( ) facilitando como pardmetro e. Row. Tomando como base el ejemplo del punto anterior. Fila.Autor. modifique el metodo asociado a1 evento Rowupdate para que. Nueva llamada a1 metodo Update ( ) del adaptador para provocar la nueva actualizacion.Forrnat("Va1or actual='{O]'. Valor propuesto='t2}'". DataRowVerslon. FilaOriginal . DialogResult.YesNo) = scribir cambios?".Yes Then - DsLibrosl. En caso afirmativo.FindByIDLibro( F l l a . el que habia originalmente y el que ha introducido el. Item("Autor".Orlglria1). facilitando como segundo parfimetro el valor True para preservar 10s cambios que haya hecho el usuario. Item( " A i i t ~ r " . Informar a1 usuario del valor actual. DataRowVersion.Update(DsLibrosl. en lugar de mostrar el mensaje de error.Libras.Libros) .19.Merge(DatosActuales. Podemos mejorar este comportamiento dando 10s pasos siguientes en caso de que se genere un error: Obtenci6n en un nuevo D a t a set con la informacion actual que hay en la base de datos.

pudiendo elegir que quiere hacer. Valor propuesto='Francisco Charte' l L /I W I 1 Figura 19. va a modificarse esa columna y no otra.NET E n d If E n d Sub Observe que se muestra tan s610 el valor de la columna Auto r. podriamos recorrer el conjunto de filas que tienen un error y mostrarlas todas a1 usuario de una sola vez.3. Otra posibilidad es no usar el evento Rowupdate sin0 interceptar el evento DBConcurrencyException a1 llamar a1 metodo Update ( ) . En la prActica. En la documentacion electronica de Visual Basic . Podria automatizarse la llamada a1 metodo Update ( ) del adaptador cada vez que se detectase un cambio de fila comprobando que en ella se han efectuado cambios. asumiendo que. Valor original='FranciscoCharte Ortega'.NET podra encontrar algunas alternativas. . en lugar de este simple mensaje seria mucho mAs adecuado preparar un formulario en el que el usuario pudiese ver todos 10s valores que el ha introducido y 10s que hay en la base de datos actualmente. teniendo que controlar nosotros 10s problemas que pudiesen surgir. I/ Valor actual='Francisco Charte Ojeda'. Al leerla se cuenta con esa referencia. Tambien debe tenerse en cuenta que este metodo. Mensaje d e notificacion y consulta del programa al encontrar un error d e concurrencia Este mecanismo de control de concurrencia es el adecuado cuando se opera con componentes DataSet y controles vinculados a el. se ejecuta asumiendo que va a pulsarse el b o t h Actualizar tras modificar cada fila. para realizar pruebas. no contaremos con 10s comandos de bloqueo optimista generados por 10s asistentes. ya que el usuario podria modificar varias filas. Si estamos usando otros medios. a1 ser invocado desde el metodo RowUpda te. Si &te se genera.Prograrnacidn de bases de datos con Visual Basic . y a1 actualizar habria que cambiarla siempre con la condicion de que no se haya modificado porque ello significaria que otro usuario la ha actualizado. en lugar de consultar una a una. como DataReader 0 ejecucion directa de consultas. Esto no tiene necesariamente que ser asi. como la insercion en todas las tablas de una columna que mantenga una referencia temporal de cuando se modifico por ultima vez la fila.

< .. . '~.:? .*. ' ~.... .*: a. '....*'..~ . . .f .'.*. x ... .. . '' L ."~.._. . % .

En la expresi6n pueden emplearse 10s habituales . pueden ser necesarios datos adicionales que pueden calcularse a partir de 10s datos de las columnas. No tiene sentido aiiadir esas columnas a las tablas de la base de datos. En la tabla L i b r o s tan s610 existen las tres primeras columnas. sin embargo. no siendo 16gico afiadir nuevas columnas en las tablas de la base de datos para almacenarlos. Suponga que necesita mostrar en un D a t a G r i d el titulo de cada libro. el IVA y el precio neto.Cuando se ejecuta un comando de seleccidn de datos. ya sea en la propia sentencia SQL o aiiadiendo una columna a1 D a t a T a b l e . En este capitulo ver6 c6mo puede definir esas columnas calculadas. ya sea obteniendo un Dat a R e a d e r o bien mediante un adaptador para generar un D a t a S e t . apareciendo el resultado como si fuese otra columna. En ocasiones. para evitar tener que calcular y aiiadir esos valores manualmente. ya que ocuparian un espacio innecesario al poder calcular sus valores. per0 no el IVA o el precio neto. el autor. as calcula as en la sentencia SQL La mayoria de RDBMS permiten la inclusi6n en la sentencia de selecci6n de operaciones sobre columnas existentes en las filas de datos. mediante c6digo. el precio. siempre obtenemos un conjunto de filas predefinidas en las tablas de la base de datos y con valores que est6n almacenados en ellas.

a1 no existir fisicamente en la base de datos.2. Para realizar una prueba sencilla y rdpida. la columna aparece a ojos de 10s D a t a y D a t a A d a p t e r como si de una columna m i s se tratase aunque. Precio * 0 .. eligiendo la opci6n Configurar adaptador de datos.20. seria una columna s610 de lectura. Precio. Haga clic con el b o t h secundario del rat6n sobre el adaptador de datos. Precio * 0 04 AS lVA FROM Librorl de maltas. deberia aparecer como se muestra en la figura 20.. tomando como base la columna P r e c i o ya existente: S E L E C T Titulo. Observe la introduccih de la columna IVA. Introduzca en el metodo asociado a1 evento L o a d del formulario la llamada a1 m6todo F i l l ( ) del adaptador. 0 Arrastre desde el Explorador de servidores la tabla L i b r o s de la base de datos hasta el disefiador. algunas funciones intriny secas. 0 4 A S I V A FROM L i b r o s A1 estar definida en la propia sentencia. dejdndola como puede verse en la figura 20. d&10s pasos siguientes: Reader Inicie una nueva aplicaci6n Windows. En la siguiente sentencia de ejemplo se calcula el IVA creando una nueva columna llamada IVA. como es logico. Pulse el b o t h Finalizar y genere el conjunto de datos a partir del adaptador. Modifique la sentencia de seleccih. Update v Delete spwfiguelainsmraonSelectde59Lo~lcedCeneradwdecawltaspxaB~ rafiramentela ccrsulta datoz dcbcriaca-r dadaptada en d aonpnto de dabs? . a1 ejecutar el programa.ELECT Ttulo.1. Autor. El formulario. Vincule el D a t a S e t con un D a t a G r i d . segun el RDBMS. 0 0 0 0 0 lenerar las instrucciones SQL La instruction Select re utilizarapara crear las instrucciones Insert. Modificamos la sentencia de seleccion del adaptador de datos . Figura 20. Precio. Tablas con columnas calculadas operadores aritm&ticos relacionales y.1. A u t o r .

Las propiedades que mbs nos interesarbn. AdemAs. esos nuevos Datacolumn no tienen necesariamente que representar a una columna de la base de datos. Con ellos es posible crear una nueva columna sin establecer propiedad alguna o bien. Como ya sabe. at A1 crear un Da t acolumn podemos usar distintos constructores sobrecargados que aceptan diferentes listas de par5metros. 10s objetos DataTable disponen de una coleccibn. siendo posible afiadir nuevos objetos Datacolumn segun se necesite.Prograrnacidn de bases de datos con Visual Basic . asignar valor a las mbs relevantes. compuesta de objetos Datacolumn. son las siguientes: . Lo mbs interesante. pudiendo. alojar una expresi6n. en este caso. En multiples ejemplos hemos recorrido esa colecci6n para mostrar todas las columnas de una tabla o conocer sus atributos. cada uno de 10s cuales representa a una columna recuperada de las tablas del origen de datos.2. en su lugar. por el contrario.NET Ttdo - Autor Precn I IVA 242 04208 0 4208 0420s 043 04208 043 09616 08416 16 14904 1 56 1 56 16 043 1 24 IDLhro 17 11 13 14 8 9 4 15 12 16 10 7 b Assembly Language Step by Step Guia piaclica para usuarios de Delphi 6 O Guia practica para U P U ~ ~ ~de PExcel 2002 Guia piactica para U S U ~ deSKylix ~ Guia praclica para U S U ~ ~ ~ de Visual Basic NET OS Guia practca para usuarios deVisual Studio NET Guia piactica para usuarios JBuilder 7 lntioduccion a la programacion Manual avanzado Excel 2002 Manual del rnicropiocesadar 80386 Programacioncon Delphi 6 y Kylir Piogramacion conVisual Basic NET ProgramacioncanV~sual NET C# Piogramacion con Visual Studio NET SOL selver 2000 User Interface Design for Programmers Jeff Dunternann Fiancisco Chaite Francisco ChattdM Jesus Luque Francisco Charte Francisco Charte Francisco Charte Francisco Charte Oleda Francisco Charte Francisco Charte Chrlr H Pappa&Wllkam H Murray Francisco Charle Francisco Charte Francisco Charte Francisco ChartdJorge Seriano Francisco Charte Opda Joel Spolsky 60 5 1052 10 52 1052 1075 1052 1075 2404 21 04 40 3726 39 39 40 1075 31 5 6 3 2 Figura 20. es que la colecci6n a la que apunta Columns no es estbtica. accesible mediante la propiedad Columns. El formulario mostrando 10s valores de la columna calculada Consulte la informacion de referencia del RDBMS que este usando para saber que operadores y funciones puede emplear en una sentencia de seleccion para crear columnas calculadas.

.

NET tablas que lo componen. que aparece como un recuadro en el disefiador. e introduzca directamente el nombre y tipo. Figura 20. Haga clic con el b o t h secundario del rat6n sobre el DataSet. 0 0 Escriba en la propiedad Expression la expresi6n de calculo. con lo que las nuevas columnas aparecerian como propiedades adicionales de esta.4.4). en este caso P re c io + IVA./ I1 I w= decimal I 0 DataSet 8 XML -_ -- --_ LlStO I t __ - I I. sino que tambien podemos introducir cambios.Programacidn de bases de datos con Visual Basic . Debe encontrarse en el diseiiador de esquemas (vkase figura 20. Tambikn puede escribir y seleccionar esos datos en la ventana Propiedades. Pulse en la ultima fila de la tabla. esos cambios se traducen automhticamente en modificaciones a la clase derivada de DataSet. Partiendo del anterior. brchivo kddo6n yer P_royecto Cenerar Depurar Ezquerna Herramlentas VeDtana Ayuda Libros Titulo Autor PEClD (Lrbros) string 0 b * IVA IDLibro Neto string decimal decimal int decimal ewnt (Predetermmado) (Predetermmado) (Predetermmado) Precio+IVA (Predetermmado) (Predeterminado) (Coleccion) 0 11 ReadOdY SubsbtL-tl5#GrOup Net0 (Predeterrnmado) true . o sus columnas. Ademas. d6 10s pasos siguientes para ver un sencillo ejemplo: 0 Elimine la sentencia introducida en el punto anterior con la que se creaba el Datacolumn con el precio neto. Modificarnos el esquema usando la ventana Propiedades . y elija la opci6n Ver esquema.en el diseiiador de formularios.

5. . ‘ColmnasCalculadas .Forms.A1 compilar y ejecutar el programa ver6 que obtiene exactamente el mismo resultado que tenia en la figura 20.rb* ‘ =. I.Ob>ect.NET [dkeliar] . F i l l (DsLibrosl. con la diferencia de que ahora no ha tenido que escribir c6digo alguno. ~ ~ ’sender Jz System.3.Microsoft Vkual Bast .Form P L ~ -tTc . F o r m l ~ L o a d ( E . Esta ventaja no la teniamos a1 crear el Datacolumn mediante c6digo. 9 i 3 F i k l i c : I s = Forml InhrLirc: System. Aparte est6 la ventaja de que la nueva columna aparece como una propiedad de d s l i b r o s . E ~l SqlDataAdapterl .Windows. "Libras") rj I a Item a ItemArray a IVA aRowError + RelectChanger a Rowstate a I-. Al modificar el esquerna se ha cambiado tarnbien la clase derivada de D a t a S e t Consulte la ayuda de la propiedad Expression de la clase Datacolumn para saber que operadores y funciones puede usar para crear sus expresiones. de tal manera que el editor de c6digo la muestra como un elemento m6s.Forml . tin 145 CoI 28 Car 28 IN5 Figura 20.

.

en la tabla L i b r o s .NET. por tanto. dispone de un tip0 image. tendremos que aiiadir a una de nuestras bases de datos una nueva columna. por ejemplo. Para empezar. no reconocen las columnas que contienen im6genes y. Esto permite. concretamente un formulario Windows con 10s datos de 10s libros. Casi todos 10s RDBMS cuentan con algun tip0 de columna que facilita el almacenamiento de imiigenes. en ocasiones.Aunque en las bases de datos actuales la mayoria de las columnas contienen texto o ncmeros. como puede ser la portada de un libro o bien una fotografia de un producto.NET. no introducen controles para mostrarlas ni 16gica para poder modificarlas. y ni siquiera puede enlazarse directamente con un control PictureBox. por ejemplo. Ya sabe que puede . que 10s clientes que acceden desde la Web puedan ver una imagen del objeto en que estiin interesados. tanto Windows como Web. no es extraiio que. SQL Server. Los asistentes para creaci6n de formularios de datos. Por eso el objetivo de este capitulo es mostrarle c6mo conseguir trabajar con imiigenes desde una aplicacion Visual Basic . per0 6ste no se corresponde con ningun tip0 de la plataforma . per0 su enlace y tratamiento de las aplicaciones no suele ser tan fiicil como cabria esperar en primera instancia. se quiera almacenar tambi6n alguna imagen. para almacenar la portada.

Si utiliza las Visual Database Tools para editar el contenido de la tabla. aiiadikndole. -I 'z i Edition Yer Proyecto Ea5e de datos Diagrarg iarchar varchar 50 50 v Columnas Descripct6n Valor predeterminado Formula E l R .1. La unica opcion..NET.sto JP 13 Figura 21..21. el valor original de la columna Portada ser6 DBNull en todas ellas. En este caso vamos a tomar. .Llbrosr Herramlentas VeEtana Aygda r. Almacenamiento y recuperacidn de imagenes modificar la estructura de las tablas directamente desde Visual Studio . ver6 que la columna Portada aparece siempre como <Binario> (v4ase figura 21.. como se aprecia en la figura 21. o incluso el Administrador corporativo.Llbrm : Tabb (MPRON. Si crea un DataSet con tipo . ' Libros . a1 tener ya la tabla una serie de filas. Permitiremos 10s valores nulos. una vez m6s. Definimos la nueva columna en la tabla L i b r o s Las columnas que almacenan imigenes. no siendo posible ni ver su contenido ni modificarlo.1. es crear un programa a medida que facilite esas operaciones. se tratan de forma similar desde Visual Basic .* .. la tabla Libros de SQL Server.NET. De hecho." .2). una columna llamada Portada de tip0 image. o cualquier otra informacion binaria.Base de datos de SQL Server zoo0 [disehr] !rchvo dbo. por tanto. por lo que no necesita recurrir a herramientas especificas del RDBMS.

Programacidn de bases de datos con Visual Basic . para facilitar el acceso a 10s datos.ByteO) C a t c h e As I n v a l l d C a s t E x c e p t l o n Throw New StrongTypir~qExce.3. I I User Interface Des Joel Spolsky 3 SOL Server 2000 Francisco Charte 0 1 Guia prictica para I Francisco Charte 0 1 Programaobncon \ Francisco Charte 1 Prograrnacioncon \ Francisco Chartella I Prograrnacioncon \ Francisco Charte 1 Guia prktlca para I Francisco Charte 1 Guia prbctica para I Francisco Charte I Prograrnacioncon [ Francisco Charte I Guia practca para I FrancrscoCharte 1 84-415-125-8 84-415-1230-2 Manual avanzado E Francisco Charte 1 84-415-1202-7 Guia prdctica para I Francisco ChartelP 1 Guia prbcttca para I Francisco Charte I 84-4 I 5-1I 32-2 Introduccdn a la pi Francmo Charte I 84-415-1 145-4 84-7615-234-5 Manual del microprr Chris H.26 lo..04 40 60.PortadaColumr~). Puede verlo en la figura 21.1136-5 84-4 15-1324-4 84-415-1392-9 84-415-1376-7 84-415-1351-1 84-415-1290-6 84-415-1291-4 84-415-1261-2 I Titulo I Autor dbo.2..ption ( "Nc s e F u e d e o b t e r i e r e l valor p o r q u e e s DBNull.75 10.52 10. simplemente arrastrandola desde el Explorador de servidores a un formulario y creando el conjunto de datos.libros :l a N5PIRON.tableLibros.75 10. e ) End Try End Get Set M e j Me. tanto en la representacih visual de la tabla como en la ventana Propiedades.52 37.NET tras afiadir la columna P o r t a d a de la tabla L i b r o s .Pappas&Wi 2 0-471-37523-3 Assembly Language Jeff Dunternann 1 31 10.Llbror) Precio IEditorial .75 39 40 39 10. La definicih de la propiedad P o r t a d a es la siguiente: P u b l i c P r o p e r t y Portada As B y t e 0 Get Tr Y R e t u r n CType(Me(Me. el generador de conjuntos de datos con tip0 produce una serie de propiedades.52 24. Port a d a C o l urnn ) End Set End P r o p e r t y = L'alue . Vera que el tipo de la columna es b a s e 6 4 B i n a r y .04 10. - w i l IDLibro IISBN 1-893115-94-1 84-415. t abl e l i b r o s .". una por columna. Edicion de la tabla en Visual Studio .5 Figura 21. 52 21.NET A partir de este esquema.

. ' .. .. . .. La columna en el editor de esquemas XSD Fijese en el tip0 de dato de la propiedad. . elimine el formulario y emplee el asistente para formularios de datos con el fin de generar una ventana que permita editar la tabla fila a fila.21. ...ataFuiml LdoFirr 1 Libros IDLibro ISBN Tdulo Autor . . L. &I . .xs X (Libros) int string string rtnng (Predeterrnmado) fixed (Predeterrninado) Editorial int ' n lla ble i (Predeterrninado) (Predeterrnmado) . Para obtener la portada.. .. ... . o modificarla.3. . a la hora de leer. o viceversa.. . Esto nos permitir6 afiadir f6cilmente un P i c t u r e B o x en el que mostrar la imagen. en lugar de usando un D a t a G r i d .xs O b d-tibtv... . . c k ] . t dsL&ros.. ''I Si prefiere basar el formulario en un D a t a G r i d . Diseiiaremos un formulario Windows en el que podamos ver la portada asociada a cada libro. que generar la imagen a partir de una secuencia de bytes. con controles individuales. tendra entOnCeS que COntrOlar la pulsacion sobre la columna correspondiente a la portada a fin de abrir una . Almacenamiento y recuperacidn de imdgenes . . asi como modificarla si es necesario.b ' ditibtos its dsLibros.. por lo tanto. si de lo que se trata es de modificar.... . un arreglo de tip0 B y t e .. . Partiendo de un proyecto estAndar. de datcs de esk d m t o Figura 21. .. tendremos.

Programacidn de bases de datos con Visual Basic . . h DataFormLvb [Diseiio]* I I : .. . . Arthvo Edition rer Proyecto Generar Depurar Datgs Herramlentas Debug VeEtana Aygda - JrY*33-. . .NET ventana secundaria con el P i c t u r e B o x . . creando para ello una nueva clase de columna que sea capaz de mostrar la imagen. . . . . . pudiendo obtenerla de dos formas distintas: recuperdndola de la columna P o r t a d a de una fila de la tabla L i b r o s 0. Inserte t a m b i h un componente O p e n F i l e D i a l o g y edite su propiedad F i l t e r para que facilite la selecci6n de archivos con grificos. a fin de introducir en el Area inferior izquierda un control P i c t u r e B o x con un b o t h debajo.. .Itado. ..:t ) i 3.4.On CkeckFileEusts CheckPathEasts CefaultExt DpenFileDialog 1 True True True True IIVOS Dereferenceiinks Titdo r------ grlficos I *. .. Tambien puede personalizar la cuadricula.4. . . . hacihdolo m6s alto. Extienda las dimensiones del formulario creado por el asistente.. directamente desde un archivo..en caso de que se pulse el b o t h que hay debajo. . . a lj !I Figura 21. 5howHelp ShOwReadOnly Title ialidateNam False True . Aspect0 del formulario tras introducir el P i c t u r e B o x y el B u t t o n En principio el Pi c t u r e B o x no contendr6 ninguna imagen. CddExtem.bm Filterirdex I Friend False False False False XnctialDrectw Modifiers Multirded ReadOnlyChecked RestoreDrector..... . como se puede ver en la figura 21. .

El truco est6 en crear un flujo de datos en memoria. Almacenamiento y recuperacidn de irnigenes ~____-_ . Este no puede vincularse directamente con la columna Portada de dslibros.IsPortadaNull Then 0 Dim I m a g e n As New MernoryStrearni ~ obldslibros. comprobamos si la columna Portada de esta fila es nula o no. recuerde que es un arreglo de tip0 Byte. " L i b r o s " ) . sino la indicada por el BindingManagerBase que corresponda. ya que 10s tipos no son compatibles. Private Sub o b j d s L i b r o s-P o s i t i o n C h a n q e d ( ) M e . per0 no podemos asignar directamente el valor de Portada. El metodo Positionchanged ( ) completo quedard como se muestra a continuacion. procederemos a eliminar el contenido actual del PictureBox. Primer0 necesitamos saber c u d es la fila actual de datos que est6 mostrindose en el formulario. mostriindolo como una superficie negra._ _ . un objeto MemoryStream. puede intentarlo abriendo la ventana DataBindings del PictureBox.BindingContext ( o b j d s l i b r o s . como 10s botones de navegacion. introduciremos en el todo el c6digo necesario. por tanto._ I "- ___-___ _ _ _ _ l _ - "-l_l_--^ ._ _ I ____ I I _ x __--. Tenemos.21.. Libros (BindinqContext( o b l d s l i b r o s . a la propiedad Image del PictureBox. P o s i t i o n t 1 ). y por lo tanto la propiedad I s PortadaNull devuelva True. que codificar el proceso de recuperacih de la imagen contenida en la columna para mostrarla en el PictureBox. invocan siempre a1 metodo Positionchanged ( ) . Teniendo la position. La primera sentencia es la generada por el asistente para actualizar la indicaci6n de fila actual. usando despues el metodo FromStream ( ) de la clase Image para mostrarla en el PictureBox. que contenga la secuencia de bytes alojada en la columna Portada. " L i b r o s " ) . B i n d i n g C o n t e x t (objdsLibros.Text = ( ( (Me.Count .- El c6digo generado por el asistente de creaci6n de formularios de datos se encarga de la vinculacih de todos 10s controles que hay en la ventana. per0 16gicamente no del PictureBox que hemos aAadido nosotros.Portada) .Position). puesto que no podemos mostrar la portada de cualquier fila del DataTable. T o s t r i n g " d e ' I ) t M e .Position I f N o t ob]dsLibros. " L i b r o s " ) . Aprovechando que todos 10s metodos que causan una actualizacih de 10s datos visibles en el formulario. Por ultimo.Libros(Pesiciori). en caso de que la columna Portada sea nula. T o S t r i n q ) ~ -I D i m P o s i c i o n = B i n d i r l g C o n t e x t (obldsLibros. "Libros") . Si no es nula tenemos una imagen a mostrar. 1blNavLocation.

R e a d ) - Di Ar ivo.( ) .NET mage. Archivo. Ya sabemos que su tipo es B y t e ( ) . podrb navegar por las filas de datos y observar que el P i c t u r e B o x siempre aparece como una superficie negra. FileName. FromSt ream ( I r n a g e n ) E i c t u r e B rxl . El metodo correspondiente a1 evento C l i c k quedaria tal y como se muestra a continuacion: Private Sub Buttonl~ClickiByVal s e n d e r As S y s t e m .FlleName) Dim A r c h i v o As New FileStream(OpenFileDia1ogl. Es logico. sin mbs. O b ] e c t . ya que ninguno de 10s libros cuenta actualmente con una portada en la base de datos. FileMode.Read ( I r n a g e n . 1 I _ _ _ _ _ _ I _ _ _ - Para llegar a tener alguna imagen en la base de datos.L e n g t h ) . como si fuese una secuencia de bytes.B l a c k ) End If End Sub Si ejecuta el programa tras introducir estos cambios.FrornFile(OpenFileDia1ogl. y asignar dicha imagen a la columna P o r t a d a de la actual fila de datos. tendremos que recuperar la imagen en memoria. C r e a t e G L a r h i c .Oper1. y despues asignarla a P o r t a d a . ~ P i c t u r e B o x l .r ’ l e a r ( c o l o r . La clase Image cuenta con un metodo F r o m F i l e ( ) capaz de recuperar la imagen del archivo y mostrarla en el P i c t u r e B o x . es nuestro objetivo. tendremos que responder a1 evento C l i c k del b o t h que hay bajo el P i c t u r e B o x con dos fines: mostrar la imagen seleccionada en el P i c t u r e B o x . Len . Los Datacolumn. simplemente a mod0 de informacih de retorno porque ello no indica que la imagen exista en la base de datos. por el contrario. I m a g e = Irnage. C l o s e ( ) ’ ivo.Programacidn d e bases de datos con V i s u a l Basic . no disponen de un metodo similar. FileAccess . Por lo tanto. asignar un nombre de archivo a la columna P o r t a d a . No podemos.

En la figura 21. Ejecute de nuevo el programa y asigne imagenes a varias filas de datos. i r d i r q C J n t e x t 1 H 7 b l d ~ L i h r o . El formulario con 10s datos y portada de u n libro . Figura 21.5 puede ver el formulario Windows mostrando una fila de datos.21. A continuacion pulse el b o t h Actualizar del formulario para guardar 10s cambios en la base de datos. P o r t a l a ~ = Imager) End I f End Sub La parte mas importante es la creacion del Filestream y lectura de la imagen en un arreglo Byte. Libror (Me.asignando 6ste a la columna Portada de la fila actual en la tabla Libros. No podrii ver las portadas abriendo directamente la tabla.NET a fin de enviarlas como parte de una piigina Web. incluida la portada del libro. per0 si ejecuta de nuevo el programa se recuperaran y apareceran en el formulario. Almacenamiento y recuperacidn de imagenes o b ] ( j s L i b r o s .5. " L i b r a s " ) . 5 . Igualmente podriamos obtenerlas desde una aplicacion A!SP. €" s i t i i i n ) .

.

Muchos miembros de las interfaces que es obligatorio implementar quedar6n sin funcionalidad. puede servirle como base para crear cualquier otro proveedor m6s completo. El cbdigo. haciendo posible su us0 desde cualquier aplicacion. pudiendo seleccionarse la carpeta de la que se desean obtener. Para conseguir eso es necesario crear a1 menos cuatro clases: una que gestione la conexion. el sistema de archivos. apareciendo como columnas el nombre completo de cada entrada y la fecha en que se cre6. Oracleclient y Odbc. una tercera que facilite la lectura unidirectional y.NET: Sqlclient y O l e D b . a mod0 de filas. Nuestro objetivo. las entradas existentes. por ultimo. Su origen de datos ser6 siempre el mismo. es posible crearlos tambikn para cualquier origen de datos.y que es posible instalar segun se vio en el capitulo dedicado a las conexiones de datos.NET sencillo.La version 1. ya que el proveedor no accede a una base de datos real y. InterBase o bien IBM DB2. otra que haga las veces de adaptador de datos. Cada una de esas clases implementar6 las interfaces genkricas que ya conocemos. a 10s que hay que sumar 10s dos que se han liberado posteriormente. es crear un proveedor de datos ADO. crear un proveedor especifico para trabajar con MySql. otra que ejecute 10s comandos. no se ofrecer6n funciones de actualizacion. Igual que se han creado proveedores especificos para SQL Server y Oracle. . adem6s. Seria posible. en este capitulo. no obstante.0 de la plataforma . por ejemplo.NET cuenta con dos proveedores ADO.

implementando la interfaz IDb Conne cti on. FileSystemClientCommand. 0 FileSystemClientDataAdapter. vb: Contendra la clase FileSystemC1 i entConne ction.NET. 0 S y s temclient Da taReader. Creacidn de proveedores ADO. Se en- cargar5 de controlar la conexi6n. La biblioteca de clases generada no estard firmada con una clave o nombre fuerte.Implementara FileSystemClientDataReader. Lpos de proyecto: flantllas: + J Otros proyectos 2 SoIucmes de Visual Studio j ljombre Ubuacion C k r r g r a solucion qge a ~ ApIcacion Web ASP NET Servoo Web Biblioteca de ASP NET conboles Web Proyecto para wear (lases que r e van a utibzar en otras aplicaciones I FlleSystemClient cerrar solucm El proyecto 5 1 creari en C \PBddVirualBesicNET\CapZZ\RleSystemClient Figura 22. vb:En su interior definiremos la clase FileSysternclientcommand.NET Para crear el proveedor ADO. por lo que no podr6 aiiadirla a1 GAC para emplearla desde cualquier proyecto . a1 compilar el proyecto. concretamente una Biblioteca de clases. dll. ser6 la clase encargada de actuar como adaptador de datos para poder llenar un DataSet a partir de un comando. Derivada de DbDa taAdap ter e implementando la interfaz IDbDataAdapter.facilitando el acceso a 10s datos de una fila y el avance unidi- reccional por las filas. Llamela FileSys temclient. se llamara Filesystemclient.que implementara la interfaz IDbCommand.1. como se ha hecho en la figura 22.1. La biblioteca obtenida. vb: Este m6dulo alojara la clase Filelas interfaces IDa taReader e IDataRecord. vb: Contendra la clase FileSystemClient Da t aAdap te r.22.NET tendrd que iniciar un nuevo proyecto Visual Basic . lniciamos el proyecto de biblioteca de clases A este proyecto aiiadiremos cuatro m6dulos de clase: FileSystemClientConnection. Eje- cutara el comando especificado ofreciendo un resultado.

Closed Para crear un objeto FileSys temClientConnection.Programacion de bases de datos con Visual Basic . No obstante. IndexOf ( " = " ) + 1 ) End S u b - . en este caso concreto. New ( ) End Sub Public Sub New (ByVal ConnectionString As S t r i n g ) MyBase. la clase debera contar con uno o m6s constructores. Su implementacibn seria la mostrada a continuaci6n: Public Sub N e w ( ) MyBase. Cr Implements I L h C on n e c t i o rl El hecho de implementar la interfaz IDbConnection nos obliga a codificar una serie de miembros. S u b s t r l n g ( ConnectionString. habitualmente lo primero que se hace es abrir una conexi6n con el origen de datos. independientemente de que su contenido sea o no funcional. para 10s cuales definiremos las siguientes variables: Private strConnectionSt ring As String Private strDataBdsr As Strin Private csState As ConnectionState = ConnectionState. Algunos de esos miembros son propiedades que tienen que mantener y facilitar datos. Por ello nos vamos a ocupar en primer lugar de esta clase. no tiene m& que usar la herramienta s n para generar la clave y firmar el m6dulo DLL para poder hacerlo. s u cabecera seria la siguiente: PU Inherits C o r n p iricintM . tambien un constructor que acepte como parametro la cadena de conexi6n.NET como hace con 10s otros proveedores. i e l .New() st strDataBase = ConnectionString. que no necesita par6metros y. Es habitual que siempre exista un constructor por defecto. propiedades y metodos. Cuando va a operarse con un cierto proveedor de datos. la cual ser6 la que implemente la interfaz IDbConnection.

Los partimetros establecidos con la cadena de conexibn. tal cual. ~ P u b l i c R e a d O n l y P r o p e r t y State ( ) As ConnectionState I m p l e m e n t s IDbConnect o r l . son datos accesibles mediante propiedades definidas en IDbConnection y que implementaremos asi: 11 E n d Set E n d Property P u b l i c R e a d O n l y P r o p e r t y Databas? ( ) As S t r i n g I m p l e m e n t s I D b C ~ r n n e t i o n . por ejemplo C: \Windows. A continuaci6n se extrae de ella el valor que sigue a1 signo =. Creacidn de pvoveedores ADO.22. asi como el estado en el que se encuentra la conexion. en una de las variables definidas a1 principio a tal efecto. El Linico partimetro que aceptar6 nuestro proveedor en la cadena de conexi6n serh D a t a Source. C h a ng P Data b a s e ~ st s t rCo r l n e c t i o n St r i nq E n d Sub = " Data Source= " & s t r Da t a B a s e . > j . . ~ . Database Get R e t u r n strDataBase End Get E n d Property .+ ~.NET Observe que la cadena de conexion se guarda. cerrada o abierta. . .siendo su valor el camino con el que se desea conectar. S t a t e Get Return csState End Get E n d Property Pub1 i c Sub Change Da t a b a s I ( B y V a l V a l u e As S t r i n g ) I m p l e m e n t s 1D b C o n n e c t o n . la propia cadena de conexi6n y la base de datos.

y adquiere sentido a1 utilizarse conjuntamente con comandos. en teoria base de datos. no hay problema en hacer el cambio en cualquier momento.Programacidn de bases de datos con Visual Basic . siendo precisa cerrarla y. simplemente. cuya finalidad es abrir y cerrar la conexi6n con el origen de datos. tras cambiar la cadena de conexibn. ya estti cretindose el vinculo entre conexi6n y comando. en la interfaz IDbConnection tambien aparecen 10s metodos Open ( ) y Close ( ) . y por ello. Con un proveedor de datos cltisico. no tendrfin funcionalidad alguna: Public ReadOnly Property ConnectionTimeoiut 1 ) As Integer Implements I DbCon n e c t i o ri . Me 1 A1 facilitar como segundo parhmetro a1 constructor del comando una referencia a la propia conexibn. volver a abrirla. La interfaz IDbConnection no define muchos mtis miembros que 10s que ya hemos implementado. o bien de llamar a ChangeDatabase ( ) . End Sub Public Sub close 1 ) Implements I D b C o r l r l r r t i End Sub El objeto FileSystemClientConnection no es muy util por si solo. Los que restan. sino que se limita a cambiar el estado del objeto que representa a la conexibn. En nuestro caso. gstos pueden crearse mediante el metodo Createcommand ( ) que implementaremos asi: PU on CreateCommand( ) A s I D b C o m m a r l d a t t. con el que debe conectar para obtener informaci6n. Como se ve a continuacih.NET En caso de modificarse la propiedad Connectionstring. no tienen sentido en nuestro proveedor. C o n n e ct i o nT i me o u t - . aunque estamos obligados a implementarlos.C o m m a rid " ~ Return New F i 1r S y s t emCl 1 ent Comma nd ( End Function " . se recompone la cadena de conexi6n y vuelve a extraer el camino con el que debe conectarse. nuestro proveedor realmente no abre ni cierra un archivo o una conexi6n con un servidor remoto. ese cambio no podria efectuarse de estar la conexi6n abierta. BeginTransaction ( ) y la propiedad ConnectionTimeout. Esto permitiri que el objeto FileSystemClientCommand sepa c u d es el camino. Ademtis de propiedades.

aunque implementaremos las propiedades necesarias para mantener esos datos. o un archivo. En realidad el comando sera siempre el mismo: obtener todas las entradas de directorio que existan en la carpeta establecida en el objeto FileSystemClientConnection. e c t i o r . por tanto. La siguiente clase que crearemos sera FileSystemClientCommand. B e q i rlT r a rI .22. el tip0 del comando o la cadena que lo defina.( ) A s I Db'r r a n s a c t 1 on Implements I D b C o r l n t c t~i rnr! .mientras que las dos versiones de BeginTransaction ( ) no hacen nada. No sera importante.NET Get Return 0 End Get End Property Public Overloads Function Beg i n T r a rl s .i c t i or. I.c a c t i I) n l ~ End Function La propiedad ConnectionTimeout siempre devuelve 0. habria que modificar el analisis de la cadena de conexion. Comenzamos por el principio. Con esto ya tenemos la clase que permitira conectar con el origen de datos. i t i o r l L e v e l ) As I D b T r s r l s a c t i o r l Implements I Db C o r. C o mp o n e r t 1 l Implements I D b C o m m a n d Private s t r C o m m a n d T e x t As String Private c t C o m m a n d T y p e As C o m m a n d T y p e Pr tion Friend d f O r i g e n As D i r e c t o r y I n f o . B e c j i n T r a ns a ct i o ri End Function Public Overloads Function B e g i n T r a r I s a c t i o n ( ByVal l e v e l As I s o 1 . Creacidn d e proveedores ADO. asi como la implementacih de 10s m6todos Open ( ) y Close ( ) para que realmente estableciesen la conexi6n con el origen. con 10s miembros de datos que tendra esta clase y que son 10s siguientes: Inherits C o m p o n e r t Mo d e 1 . De querer usarla para acceder a una base de datos. con la cual podremos definir y ejecutar comandos.

se actuar6 sobre este objeto. A1 ejecutar el comando. Por tiltimo tenemos la variable dfOrigen. Las tres propiedades siguientes facilitan tanto la obtenci6n como modificaci6n de esos parfimetros: Public Property C o m m a n d T e x t i ) As String Implements I D b C o m m a n d . sin efectuar ninguna comprobaci6n adicional sobre su validez. ya que no se emplean hasta la invocaci6n a uno de 10s mktodos ExecuteXXX ( ) . ByVal C o r i n e c t 1 o n As Fi 1e S ys t e m C l 1 e n t C o n n e c t 1on ) s t r C o rnm a nd T e x t = C o m n a n d T e x t r cnConnection = Connection End Sub Son 10s tres que podemos encontrar en 10s demfis proveedores.NET Tenemos sendas variables para almacenar el tip0 y texto del comando. n e w ( ) End Sub ( ) Public Sub New(ByVa1 C o m r n a n d T e x t As String) s t r C o m m a n d T e x t = ComrnandText End Sub Public Sub New(ByVa1 C o m r n a n d T e x t As String. C o m r n a n d T e x t Get Re turn s t r C o mma n d T e x t End Get SetiByVal V a l u e As String) strCommandText = Value ~ End Set End Property . segun verfi despuks. Act0 seguido implementaremos 10s distintos constructores de la clase.facilitando el acceso a 61 desde la clase FileSystemClientDataReader que crearemos en el punto siguiente. La conexi6n y tanto el tip0 de comando como su texto son parfimetros del comando que pueden ser modificados en cualquier momento. se limitan a guardar 10s parimetros facilitados en las variables que corresponden. Como puede ver. en este caso concreto tres: Public Sub New MyBase.Programacidn de bases de datos con Visual Basic . La variable cnconnection mantendrfi un enlace entre el comando y el objeto FileSystemclientconnection sobre el que actuarfi. que actuarfi como origen de datos. Observe que dfOrigen tiene el modificador Friend.

adem&. mejorando la clase FileSystemClientCommand. PU If Not c n C o n n e c t i o n Is Nothing And c n C o n r s e c t i o n . Get F 1 1e Sy st e m 1 rl f o s . o bien s610 las entradas que se ajustasen a un cierto patr6n.22. C o n n e c t Io Ii l Get Re turn c rl Ca n n e c t i o n End Get Set(ByVa1 V a l u r As I D b C o r ~ n e c t i o n ) cn Coriri e c. ExecuteNonQuery ( ) . State = C o r t r i e c t i o n S t a t e . Podriamos modificar esta implementacGn. e obteniendo el numero de entradas con la propiedad Length. C o r n r n a n d T y p e Get Return ctCornrnandType End Get SetiByVal V a l u e As CommandType) ctComrnandType = Value End Set End Property Public Property C o r ~ n e c t i o r (l ) As I D b C o n n e c t i o n Implements I DbCornm a r d . recuperamos las entradas del camino indicado con el mktodo Get Fi1 S ystem1n fo s ( ) . En este caso. que dicha conexi6n est6 abierta. Creacidn d e proveedores ADO. debe ejecutar el comando sin recuperar en realidad datos. a fin de que fuese posible seleccionar s610 las entradas de archivo o s610 las entradas de directorio. devolviendo tan s610 el numero de filas que se obtendrian.NET Publlc Property C o m m a n d T y p e ( ) As ComrnandType Implements IDbCommand. En . El primero. O p e n Then ~ Return d f 0r 1y e n . como puede verse a continuacibn.t 1nr. = CType ( Va 1u e .Antes se comprueba que tenemos un objeto de conexi6n asociado y. Fi 1 P S ys t e m C 1 1en t Co n rl e c t 1on ) End Set End Property ~ De 10s m4todos ExecuteXXX ( ) de la interfaz IDbCommand facilitaremos implementacion util para tres de ellos. L erlg th End If End Function Observe que no usamos para nada el tip0 de comando ni el texto.

por ejemplo utilizando 10s metodos GetFiles ( ) y GetDirectories ( ) en lugar de GetFileSystemInfos ( ) . Es precis0 afiadir.Programacidn de bases de datos con Visual Basic .filtrar las entradas obtenie das. Como se ve a continuacibn. debe facilitar un objeto que implemente las interfaces IDataReader e IDataRecord. a continuaci6n. el c6digo siguiente a1 mbdulo. Lo haremos ask ( ) A s IDataReader I f Not cnconnection I s Nothing And - cnConnection. aunque 10s m6todos y propiedades queden sin c6digo util. ignoramos el valor y sencillamente ejecutamos la primera versi6n del metodo.State = ConnectionState.ExecutePeader - Return ExecuteReaderO End Function Como ocurriera con la clase FileSystemClientConnection. devolviendolo como resultado. creamos un FileSys temClientDataReader asociado con este comando. por tanto. .Open Then onnection. como sabe. 6sta tambien esta obligada a implementar una serie de metodos aunque sin ninguna funcionalidad. El siguiente metodo que implementaremos sera ExecuteReader ( ) que. Dicho valor indicaria un comportamiento a1 que tendria que ajustarse el lector de datos. PU s Function ExecuteReaderi ByVal b e h a v i o r A s CommandBehavior) A s IDataReader Implements 1DbComrnand.NET esos casos habria que analizar el texto del comando y. El ultimo metodo util a implementar es la versi6n de ExecuteReader ( ) que acepta un valor CommandBehavior como parametro. en lugar de usar directamente la colecci6n facilitada por Get Fi1 Sys tem1 n fo s ( ) . Database) Return N e w Fi l e S y a t emCli e n t Da taReader ( M e ) End I f End Function Creamos el objeto DirectoryInfo utilizando el camino establecido en la conexi6n y.

22. Creacidn de proveedores ADO.ExecuteScalar Return Nothing End Function Public Function C r e a t e P a r a m e t e r O As I D b D a t a P a r a r n e t e r Implements I DbCornniand . P a r a r n e t e r s Get ~ - ( ) Implements IDbCornmand. P r e p a r e - End Get End Property Public Property T r a n s a c t i o n ( ) As I D b T r a n s a c t i o n Implements I DbComrna nd . C a n c e l .NET Public Function E x e c u t e s c a l a r 0 As Object Implements 1DbComrnand. T DbT r a n s a c t i o n ) End Get Set (ByVal V a l u e As I D b T r a n s a c t i o n ) End Set End Property Public Property U p d a t e d R o w S o u r c e O As U p d a t e R o w S o u r c e Implements 1 D b C o r n r n a n d . N o n e End Get Set(ByVa1 V a l u e As U p d a t e R o w S o u r c e ) End Set End Property Public Sub C a n c e l End Sub ( ) Implements IDbCornmand. CornrnandTirneout Get Return 0 End Get Set(ByVa1 V a l u e As Integer) End Set End Property Protected ReadOnly Property P a r a m e t e r s 0 As I D a t a F a r a r n e t e r C o l l e c t i o n Implements 1 D b C o r n r n a n d . C r e a t e Pa rarnet e r Return Nothing End Function Public Sub P r e p a r e End Sub Public Property C o m m a n d T i m e o u t ( ) As Integer Implements IDbCommand. T r a n s a c t i o n Get Return CType ( Nothing. U p d a t e d R o w S o u r c e Get Return U p d a t e R o w S o u r c e .

C o m p o n e n t Implements I D a t a R e a d e L Implements I D a t a R t c o r d Pr cs1t Private i R o w s As Integer Private f scCommand As F i 1 eSystemCli entCommand Tenemos dos variables enteras. La informacion ser6 recuperada del objeto DirectoryInf o creado por el comando. Con ella podremos ir recorriendo las filas de datos. iposition e iRows. no podra nunca crearse un lector de datos sin comando asociado. Asi. como en 10s puntos anteriores. f s cCommand almacenar6 la referencia a1 comando asociado a este lector. a1 que tenemos acceso por haberse declarado Friend en lugar de Private. Esta clase contar6 con un unico constructor que tomar6 como par6metro la referencia al comando asociado.L e n g t h iPosition End Sub = -1 Ademas de guarder la referencia a1 comando. Comenzamos. La primera contendr6 el ntimero de elementos obtenidos del m6todo Get FileSys temInf 0 s ( ) .NET El mgtodo ExecuteReader ( ) de la clase definida en el punto anterior devuelve un objeto FileSystemClientDataReader. que sera la siguiente: Pub1 1c C1 ass Fi 1 e Sy t e rnC'1 1 e r t Da t a Re ad c r ' l Inherits ComponentModpl . que mantendr6 la fila actual y el numero total de filas. stemClientCornmand) F i l e S y s t e m I n f 0 s . mientras que la segunda ser6 -1 de tal . cuya clase nos disponemos a implementar a continuacion. obteniendo el valor de cada una de las columnas.Programacidn de bases de datos con Visual Basic . damos un valor inicial a la variables iRows e iposition. con la declaracih de miembros de datos de la clase.

devolvemos True o False dependiendo de que queden o no mas filas de datos. += 1 End Function Una vez que estamos colocados en una fila de datos.Item Get ) Return GetValue(GetOrdina1 ( n a m e ) End Get End Property .Esta siempre toma como parametro el indice de la columna cuyo valor quiere obtenerse. mientras que la segunda recibirb. Incrementamos el valor de la variable iposition y.S l t l ) I . el paso siguiente serA recuperar el valor que almacena cada una de sus columnas. el nombre de la columna. Puesto que en la segunda versidn desconocemos dicho indice.Item Get Return G r t V a l u e ( 1 ) ' End Get End Property ~ Def au Property Item(ByVa1 n a m e As String) As Object Implements 1DataRecord. El metodo Read ( ) . Ninguno de 10s dos metodos accede directamente a la lista devuelta por GetFileSystemInfos ( ) .22. lo que tenemos es el nombre de la columna. h t a 2 1E. como se ve en el cddigo siguiente. Con este fin tendremos que implementar dos versiones diferentes de la propiedad 1tern. sino que utilizan el metodo GetValue ( ) de la propia clase FileSys temClientDataReader.NET forma que la primera llamada a1 metodo Read ( ) nos coloque realmente en la primera fila de datos. en lugar del indice. La primera tomara como parametro el indice de la columna. Para ello comparamos iPosition con iRows. De c Overloads ReadOnly Property I t e m ( ByVal 1 As Integer) As Object Implements IDatahecor?. es realmente sencillo. lo recuperamos mediante el metodo Getordinal ( ) . Creacidn d e proveedores ADO. a continuacih. Public Function R e a d ( ) As Boolean Implements IDdt i R r a d e r .

mientras que GetFieldType ( ) devuelve el tip0 en si. con el fin de obtener su valor. el nombre del elemento y su fecha de creaci6n. facilitaremos tan s610 dos columnas por fila: FullName y CreationTime.GetFieldType Return GetType ( System.St r i n g ) End Function GetDataTypeName ( ) facilita el nombre del tipo de dato. es decir. informaci6n que obtendriamos con 10s dos metodos mostrados a continuaci6n: ByVal 1 As Integer) cord. Tambien seri util saber qu6 tip0 de dato contiene cada una de esas columnas.Programacion de bases de datos con Visual Basic .NET Para facilitar a las dos propiedades anteriores el indice o nombre de una columna. una cadena con el tipo. primer0 necesitaremos saber cuintas columnas hay disponibles y cuiles son sus nombres. . que implementamos como se ve en el c6digo siguiente: PU Implements 1DataRecord.FlsldCount Get Return 2 End Get End Property Public Function GetName(ByVa1 1 As Integer) As String Implements I Data Keco rd . C7et Name Select Case 1 Case 0 Return " Fu 1 1Name " Case 1 Return " C re a t 1on T 1 me " Case Else Return Nothing End Select End Function Como puede verse. Estos datos son 10s que nos facilita la propiedad Fieldcount y el m6todo GetName ( ) .GetDataTypeName - End Function 1 Public Function GetFieldType(ByVa1 1 As Integer) As Type Implements 1DataRecord. es decir.

Get Fi 1 e S y s t e m I r) f o s ( i Select Case 1 Case 0 ' Return . en este caso. Su implementacibn. Public Function GetOrdinal(ByVa1 rlarne As String) As Integer Implements 1DataRecord. cuya finalidad es devolver el indice numerico correspondiente a una columna de la cual se facilita el nombre. Implements 1DataRecord. Lo implementamos asi: Public Function GetValues(ByVa1 v a l u e s 0 As Object) As Integer Implements 1DataRecord.GetOrdinal If riame = "FullNarne" Then Return 0 Else Return 1 End If End Function ~ El ultimo metodo citil a implementar en esta clase es Getvalues ( ) .GetValue 0 With f s cComma nd . Otro metodo empleado desde I tem es Getordinal ( 1.GetFileSystem1nfos ( ) (iPosition). d fOr 1 g e rl . es realmente sencilla puesto que s610 tenemos dos columnas y siempre son las mismas. Creat End Select End With End Function ( i Po 5 1 t 1 on 1 Utilizamos i Po s i t i o n como indice para acceder a la colecci6n devuelta por GetFileSystemInfos ().22. este no recibe como partimetro un indice numerico sin0 un arreglo de elementos O b j ect en el que debe retornarse el valor de todas las columnas de la fila actual. F u l l N Case 1 ' Return . Adem&.FullNarne ~ . Creacidn de proveedores ADO.GetValues ~ v a l u e s ( 0 ) = fscCornrnand. A diferencia de GetValue ( ) .NET Las dos versiones de la propiedad Item hacen us0 del metodo GetValue ( ) . h e acepta como partimetro el indice de la columna a obtener.usandoelhdicefacilitacomopartimetroaGetValue( ) para decidir si se devuelve la propiedad FullName o CreationTime.dfOrigen. el metodo devuelve un valor entero indicando el numero de elementos introducidos en el arreglo. devolviendo el valor que corresponda teniendo en cuenta que la fila actual de datos es iposition.

GetFileSysternIr~fos) ( (iPosition).CreationTime Return 2 End Function Por ultimo.GetOrdiria1 If name = "FullName" Then Return 0 Else Return 1 End If End Function Public Function GetSchemaTableO As DataTable Implements 1DataReader. Observe que gran parte de ellos son metodos GetXXX ( ) de la interfaz I D a t a R e c o r d .NET values ( 1 ) = fscComrnand. ya sin implementaciones titiles. metodos que recuperan el valor de una columna no con el tip0 original.Depth Get Return 0 End Get End Property Public ReadOnly Property IsClosed() As Boolean Implements 1DataReader. Public Function 6 e t O r d i n a l ( B y V a l name As String) As Integer Implements IDataRecord.GetSchemaTable Return New D a t a T a b l e O End Function Public ReadOnly Property Depth() As Integer Implements 1DataReader.dfOrigen.Programacidn de bases de datos con Visual Basic .IsClosed Get Return False End Get End Property - Public ReadOnly Property RecordsAffectedO As Integer Implements 1DataReader. debemos codificar 10s metodos mostrados a continuacih. sin0 con otro especificado.Close End Sub .RecordsAffected Get Return -1 End Get End Property Public Sub C l o s e ( ) Implements 1DataReader.

I n t 1 6 ) End Function Public Function GetInt32(ByVal i As Integer) As Ir~t32Implements IDataRecord.GetChar Return " " End Function Public Function GetChars(ByVa1 1 As Integer.GetBytes Return 0 End Function ~ Public Function GetChar(ByVa1 i As Integer) As Char Implements 1DataRecord. ByVal length As Integer) As Long Implements 1DataRecord. Int64 ) End Function Public Function GetFloat(ByVa1 i As Integer) As Single Implements 1DataRecord. ByVal b u f f e r 0 As Byte. ByVal fieldoffset As Long. Cveacidn de proveedores ADO.etByte Return 0 End Function ~ Public Function GetBytes(ByVa1 1 As Integer.etF3o>ledr1 (ByVal 1 As Integer) As Boolean Implements I Data Re co r3. ByVal fieldoffset As Long.22. G e t In t 1 6 t Return CType (Nothing. Int32 ) End Function Public Function GetInt64(ByVal i As Integer) As Int64 Implements IDataRecord. ByVal bufferoffset As Integer. Get Boo 1e a n Return False End Function Public Function GetByte(ByVa1 1 As Integer) As Byte Implements IDataRecord.GetFloat - .NextResult Return False End Function Public Function f. ByVal b u f f e r 0 As Char. ByVal bufferoffset As Integer. ByVal length As Integer) As Long Implements 1DdtdRecord.GetInt64 Return CType(Nothing.GetInt32 Return CType (Nothing.GetGuid Return CType(Nothing.GetChars Return 0 End Function ~ ~ Public Function Get-tiuid (ByVal i As Integer1 As Guid Implements 1DataRecord.NET Public Function N e x t R e s u l t O As Boolean Implements 1DataReader. G u i d ) End Function Public Function GetIntlb(ByVa1 1 As Integer) As III 1 6 Implements I Da t a Record .(.

t t D a t e T i m e Return CType(Nothing.r i i h l e Return CType (Nothing. ( . como en 10s casos anteriores. As F11 eSystemCl l e n t Command .-.. L a t ? T i m e ) End Function Public Function .__. c .. r t Da t a l Return Nothing End Function Public Function 1sDRN~ll(ByVal As Integer] As Boolean 1 Implements IDataRic... ___ .. ._I. 1 D5N111 Return False End Function _. As String Implements I D a t l h ~ rr i l .. La ultima clase que tenemos por implementar es la que actuar6 como adaptador de datos.. .. Decimal) End Function Public Function = ? t I l t i I ime (ByVal I As Integer) As Ddtrl i m p Implements 1 1 s t a h e c c t j . _..NET Return CType(Nothing. Comenzamos... .. ..... ....ttDatd(ByVal I As Integer) As 3 I [a t a R c a 3i I Implements I D a t d h e c I . e t i l . r j . Esta clase base se ocupa ya de la implementacih de gran parte de la funcionalidad del adaptador de datos. (._-._ . e t S t r i r ~ g Return CTypeiNothing. esta clase no estar6 derivada de CornponentModel sin0 de DbDataAdapter.. ( ~ e t D r c m a l i Return CTypelNothing..1 .Double) End Function Public Function (hrtStriilJ(ByVa1i As Integer.I.Programacidn de bases de datos con Visual Basic .. c . Single) End Function Public Function IhctDr 11ir 1 e (ByVal i As Integer) As Double Implements T D a t ~ R e c t i ~ .. por lo que el trabajo que tenemos que efectuar nosotros es relativamente breve y fAcil._. A diferencia de las anteriores. con la declaraci6n de miembros de datos: Public Class F i 1 e S y s t emCl i en t Da t aAdapt e t Inherits D b D a t a A d a p t e i Implements I Db Dd t aAJaF t e r Private f s c S e l e c t Cr>mrnanJ._. ___ .. String) End Function Public Function t t L r inil(ByVa1 1 As Integer) As Decimal Implements I1 i t a R r r j .. .

I n s e r t C o mma nd Get Return Nothing End Get Set(ByVa1 Value As IDbCornrnand) End Set End Property Public Property UpdateComrnand ( ) As IDbCornmand Implements 1 D b D a t a A d a p t e r . Creacidn de proveedores ADO. un tercero para actualizacih y el ultimo para eliminacih. Public Sub N e w ( ) MyBase.NET Una clase de adaptador de datos corriente dispondria de cuatro objetos Command. a1 no implementarse funciones nada m6s que de seleccih. el constructor por defect0 y otro que toma como parimetro el comando a partir del cual trabajar6 el adaptador. implementaremos la propiedad que permita obtener y modificar ese comando de seleccih: I Public Property S e l e c t C o m r n a n d ( 1 As IDbComrnartd Implements I D b D a t a A d a p t e r . Contaremos con dos constructores.New() End Sub ternClientCommand) fscSelectCornmand = CornmarJd End Sub Por ultimo. uno para seleccih. otro para insercibn. En nuestro caso. U p d a t e C o m m a n d - . sin c6digo util: Public Property I n s e r t C o m m a n d ( ) As IDbCornrnand Implements I D b Da t a A d a p t e r .22. S e l e c t C o m m a n d Get Return f s c S e l e c t C o m r n a n d End Get Set(ByVa1 Value As IDbCornmand) f s c Se 1e c t Comma rid = CType ( V a 1u e . contamos s610 con una variable de tipo FileSystemClientCommand. F11 e Sys t e m C 11en t Comma nd 1 End Set End Property El resto de 10s miembros que estamos obligados a implementar son 10s que aparecen a continuacih.

ByVal t a b l e M a p p i n g As Da t a T a b 1eMa p p i n g ) As RowlJ pd a t i ng Eve n t A r g s Return Nothing End Function ~ ~ - - - Protected Overrides Sub OnRowUpdating ( ByVal v a l u e As R o w U p d a t i n g E v e n t A r g s ) End Sub Protected Overrides Sub OnRowUpdated (ByVal v a l u e As R o w U p d a t e d E v e n t A r g s ) End Sub - Con esto se ha finalizado la clase del adaptador de datos y tambien el proveedor de datos.No sabremos si funciona o no adecuadamente hasta .NET Get Return Nothing End Get Set(ByVa1 V a l u e As I D b C o m m a n d ) End Set End Property Public Property D e l e t e C o m m a n d ( ) As IDbCommand Implements I DbDa t a A d a p t e r . ByVal t a b l e M a p p i n g As D a t a T a b l e M a p p i n g ) As R o w U p d a t e d E v e n t A r g s Return Nothing End Function Protected Overrides Function C r e a t e R o w U p d a t i n g E v e n t i ByVal d a t a R o w As DataRow. ByVal s t a t e r n e n t T y p e As S t a t e r n e n t T y p e . ByVal command As IDbCommand. tenemos el proveedor Filesy s temClient en un m6dulo DLL.Programacidn de bases de datos con V i s u a l Basic . ByVal command As IDbCommand. per0 suficiente para ser usado como ejemplo y como base para otros proveedores. En este momento. Del e t eCommand Get Return Nothing End Get Set(ByVa1 V a l u e As IDbCommand) End Set End Property Protected Overrides Function C r e a t e R o w U p d a t e d E v e n t i ByVal d a t a R o w As DataRow. Sencillo. ya que no facilita la selecci6n de datos distintos mediante consultas o la actuaIizaci6n. tras compilar el proyecto. ByVal s t a t e m e n t T y p e As S t a t e r n e n t T y p e .

.I_.. con el que obtendremos el numero de entradas de directorio que hay en una cierta carpeta. podemos invocar a ExecuteReader ( ) para obtener un lector de datos..... .. .. .NET que lo probemos.... .. ... Agregue a1 nuevo proyecto una referencia a1 primero.. A1 ejecutar el programa apareceria una pequefia ventana con ese numero...-. asoci6ndole el codigo siguiente: Definimos una conexi6n y un comando. l.. abrimos la conexi6n y usamos el metodo ExecuteNonQuery ( ) para obtener el numero de filas que recuperariamos con ese comando. Figura 22..... ... Numero de filas que se recuperarian con el comando .... ..2....... Para ello vamos a insertar en el formulario del proyecto afiadido a la soluci6n un b o t h ..........-... que es lo que vamos a hacer de inmediato.... como se ve en la figura 22... afiada un nuevo proyecto a la soluci6n.... . Creacidn de proveedores ADO.. para poder utilizar el proveedor simplemente importando el 6mbito FileSystemClient..... Sin cerrar el proyecto del proveedor. .......2. i t Comenzaremos por un ejemplo muy sencillo..22.I.l En vez de usar el metodo ExecuteNonQuery ( ) . A partir de ese momento lo utilizariamos como cualquier otro DataReader de 10s que conocimos en capitulos previos.... ._ . ........

afiada el c6digo siguiente antes de cerrar la conexi6n: 0 Dim 1 e -t ir As IL 3 t s R e i A i e r While L e c t r. A continuaci6n creamos el DataSet y lo llenamos con el metodo . en la lista deberia aparecer el nombre y fecha de creaci6n de cada una de las entradas de directorio existentes en la carpeta indicada por la conexion. como es el caso.3. de una clase de adaptador de datos. creamos el adaptador de datos a partir del comando previamente definido. Puede sustituir el Lis tBox por un DataGrid y el c6digo anterior por el siguiente: Dim I ) a t r i As New IDataStt ( ) Como puede ver.NET Inserte en el formulario un control Lis tBox.3 puede ver el ejemplo en ejecuci6n. En la figura 22. El L i s t B o x con 10s datos de las entradas de directorio Disponiendo.sualBasicNET 14/08/2002 12 44 A 1 1 11 Figura 22.Usando la conexion y el comando definidos en el ejemplo del punto previo. FileSystemClientDataAdapter. U N D % % m 2 0 0 2 10 12 26 UND 001 03/09/2002 16 44 32 cycled 31101 12002 8 50 14 tern Volume lnfutrnation 31 /01/2002 E 1 C \mrdownld Imp 21 /03/2001 10 13 52 C \Mi rniisica 07?08/2002 17 33 51 C iWINDOW5 08/08/2002 12 08 53 C \Documents and Settmgs 08/08?2002 12 C Vuchms de pmgrama 08/08/2002 12 12 C iPiograrn Files 03/08/2002 15 53 36 C \MIS docurnentos 09/08/2002 16 03 25 C ilnetprrb 10/08/2002 4 19 33 C WBuildw7 12/08/'2002 21 32 15 C \PBdN. no es necesario usar un DataReader para recuperar las filas de forma individual si lo unico que queremos es mostrarlas en un formulario.Programacidn lie bases de datos con Visual Basic . h e x i Ll End While ( ) A1 ejecutar el programa.

4. obteniendo el resultado que se puede ver en la figura 22.4. Por ultimo. El D a t a G r i d mostrando 10s datos recuperados mediante el adaptador . Creacidn de proveedores Al3O.NET Fill ( ) del adaptador. vinculamos el D a t a S e t con el D a t a G r i d .22. Figura 22. como hariamos en cualquier otro caso.

.

Para evitar que tengamos que escribir repetidamente esos bloques de sentencias. La creaci6n de un objeto DataSet.Microsoft. y 10s asistentes y elementos de Visual Studio . de us0 reiterado. es habitual que nos encontremos. llendndolo de datos con el metodo Fi11 ( ) de un adaptador.Despliegue la rama . definici6n de un Command asocihdolo con un DataAdapter e invocaci6n a su metodo Fill ( ) para obtener el DataSet.NET conocidos en capitulos previos.NET. por poner un ejemplo. bAsicamente. a partir de 10s datos de conexi6n y comando facilitados como par6metros. A pesar de todo.NET Framework y luego seleccione . en http : / / MSDN. ejecuta en un solo paso una cantidad de operaciones que en otras soluciones se efectuan manualmente. escribiendo una y otra vez bloques de cddigo similares: creaci6n del objeto Connection.Estos fragmentos de cbdigo. en 10s capitulos de la segunda parte ha ocurrido. corn.NET. como el Explorador de servidores. a1 ser cornpilado. El objetivo de este capitulo es mostrarle.N o cabe duda de que 10s componentes ADO. la funcionalidad de este paquete de ayuda para ADO. facilitan en gran medida nuestro trabajo. Microsoft nos ofrece un paquete de c6digo que. genera un ensamblado con multiples m6todos compartidos que son capaces de crear directamente un Data S et. son lo que Microsoft denomina bloques de aplicacidn o Application Blocks en su denominaci6n original. Puede obtener este paquete de la secci6n Downloads de MSDN.

. T a m b i h se crea en el menu del boton Inicio una carpeta. -http Ilwwwmsdn moos01 MSD1. Docunientation %!DISCUSSi NewSarouPs n ~ Enterprise Notification Serviil NET Show A._ - NET Show NET Does Wind ( I I I)! - @ Intemt Figura 23.368 04/16/2002 1 MSDN Subscriber Downloads I Welcome to Downloads 1 Component Development 1 Data Access and Databases '* ' ~ The Data Access Application Black encapsulates petformance and resource management best piadlces and can aasily be used as a building black in your own NET Last Updated: supparted: &Download N O 1 Graphics and Multimedia 1 Messaging and Collaboration 1 NET Development 1 NET Enterprise Sewers 1 NET Framework The NET Show Understand: . ni lo registra como ensamblado cornpartido.3. I application.1. simplemente copia en la carpeta indicada el cddigo fuente. establecemos el camino de destino (v6ase figura 23. Application Blocks para ADO. Data Access Application Block Size (bytes): 826.1. por lo que su descarga es relativamente rfipida. facilitada en un archivo de ayuda de Windows.2) y pulsamos el b o t h Next hasta poner en marcha el proceso de copia de archivos. La instalacidn no facilita el ensamblado en formato compilado.i Home > MSCII Dovmloadr NET Fiarnevorl.NET el elemento Data Access Aplication Block. 10s ejemplos y la documentacidn.23. tanto Visual Basic como C#. llamada Microsoft Applications Block for . Terrarium and F A\etive Server Pages NET Show LIVE1 From the I ODEC NET Data Provider 0 1Data Accessbwk. Aceptamos la licencia de uso. por lo que bastar6 con hacer doble clic sobre 61 para poner en marcha el proceso de instalacidn en nuestro sistema. El archivo no llega a1 megabyte.!". y la documentacidn. Seccion de MSDN donde se encuentra Data Access Application Block El paquete obtenido es autoinstalable. tal como se aprecia en la figura 23. segun se aprecia en el detalle de la figura 23.NET. .?~ Bkck Il-_. que facilita el acceso a1 cddigo de estos bloques de aplicacidn.ppllcat!on Arch Exception Management Appl -_ ___ Data Access Application Bloc Microsoft NET Data Provider NET Show.

Al disponer del codigo fuente.2. Se abrir6 Visual Studio . sin embargo.3. Corn nsarnblado Para poder utilizar este c6digo de ayuda. seria relativamente facil adaptarlo para operar con el proveedor que nos interese. Puede cerrar el proyecto y el entorno de Visual Studio .NET I- . Pulse la combinaci6n de teclas Control-Mayh-B. no siendo aplicables al resto de proveedores .Accesos directos al codigo y la docurnentacion Los metodos de ayuda definidos en este paquete de c6digo son utiles para trabajar con SQL Server. ya que el ensamblado obtenido podr6 ser utilizado indistintamente. para compilar el proyecto y obtener el correspondiente m6dulo DLL.NET con el proyecto elegido. En este momento tenemos . or for anyone wha uses ths cqutei OEvwvone @Just me Figura 23..Programacidn de bases de datos con V i s u a l Basic . Select Installation Folder I The nslaller w l nslall Merosdt Data Access Apdicatan Block Iw NET to the Idwngloldar To instdl 111 this fd& ckck 'Next" To instdl to a &hnnt foMer enter 1 bebw a chck "Browd' Eolder C Urchwos de programa\MicrosoftApplication Blocks for NET\Dala Bjwse Qisk Cost Instal Microsoft Data Access Application Block foi NET fw yoursetf. lnstalacion del paquete Microsoft Visual Studio NET a Data Access Application Block I Figura 23. o bien elija la opci6n GeneraPGenerar solucion. Abra el elemento Data Access Application Block del menu antes indicado.NET.NET si lo desea. lo primer0 que tenemos que hacer es compilarlo para generar el correspondiente ensamblado.NET o el c6digo C#. Da igual que use el c6digo Visual Basic .

dentro de estas dos clases: SqlHelper y SqlHelperParametercache. -I ~ - ~ - ~ _ I _ _ _ ~ _ _~ _ -_ ~- ~ ~ Para usar estos metodos desde una aplicacion propia.23. Todos 10s metodos del ensamblado que hemos obtenido aparecen como metodos compartidos. quiz6 le convenga instalar el ensamblado en la GAC abrikndolo en Visual Studio y aiiadikndole una clave para firmarlo con un identificador unico. Data.dll en el equipo de destino. Estos son 10s siguientes: ExecuteNonQuery ( ) : Ejecuta un comando devolviendo el numero de filas afectadas como un entero. un comando obteniendo un valor unico. . 10s mktodos de SqlHelperparameterCache tienen el objetivo de facilitar el almacenamiento de par6metros empleados con consultas y procedimientos almacenados. que puede ser afiadido a cualquier proyecto y distribuido simplemente copiando el m6dulo Microsoft .NET y podr6 afiadirlo directamente a sus proyectos. dll.Data. sin necesidad de localizar el m6dulo DLL. lo primer0 que tenemos que hacer es agregar una referencia a1 ensamblado Microsoft . es que &tos aceptan una cadena de conexion. ExecuteDataSet ExecuteReader Executescalar ( ) : Ejecuta un comando y devuelve un DataSet. En este caso el ensamblado apareceri en la lista de la p6gina .Para ello seleccione la opci6n Agregar referencia del proyecto y. resultando especialmente interesantes 10s de la primera. Por su parte. ya que no se trata de un ensamblado compartido que se encuentre registrado en la GAC. ( ) : Ejecuta ( ) : Ejecuta un comando y devuelve un DataReader. una cadena con el comando y devuelven el resultado. En caso de que vaya a usar 10s mktodos de SqlHelper y SqlHelperParametercache en multiples proyectos. Application Blocks para ADO. sin tener que crear objetos intermedios como el adaptador de datos o el objeto Connection.4.- -.ApplicationBlocks .NET un ensamblado local. pulse el b o t h Examinar para localizar y aiiadir el ensamblado como se ha hecho en la figura 23. o estdticos. un comando obteniendo un XmlReader. -___I_. ExecuteXmlReader ( ) : Ejecuta La diferencia que hay entre estos mktodos y algunos de 10s existentes en un objet0 Command con el mismo nombre.ApplicationBlocks.

3300. DataGridl. ~ ~.. F u . M d o w s .0. C:\Archivos de prograrna\Arc.D&a . C:\Archnos de prograrna\Arc.1.0. De manera aniloga se utilizarian 10s demis metodos.1.1.3300.0 Cryrtallnl'o5toreLib 1.Shared 9. tambien pueden emplearse objetos S q l c o n n e c t i o n y SqlCommand en caso de que 10s hubiesemos creado con anterioridad. 9. I Cancclar 1 Ayuda I Figura 23.Web 9.. C:\Archivos de prograrna\Arc C:\ArchvosdeprogramalArc C:\Archivos de progrma\Arc C:\Archvos de prograrna\Arc.0.... . C:\Archivos de prograrna\Arc. .. Basta una llamada a ExecuteDataSet ( ) para crear el conjunto de datos con la informaci6n deseada.0 CrystalEnterpraeLib 1. " .._. A p p l i c a t i o n B l o c s .1.. bastaria con invocar a 10s metodos con 10s parimetros adecuados.CrystalRepO. CornmandType. insertado componentes en el formulario o creado objetos intermedios..0.. . " S E L E C T * FROM L i b r o s " ) ~ Observe que no hemos arrastrado elemento alguno del Explorador de servidores.ExecuteDataset( " Da t a Sour ce=I rls pi ron .0 CrystalDecmns. como hariamos en cualquier otro caso.3300. ..3300.0 CrystalDecisions . Archivo C:\Archwor de programa\Mrro Aceptar .lArrhlun. rlr nrnnrnmil\irr .3300. A continuacibn. AAadimos una referencia al ensamblado ___ ..-_ ^ l _ _ _ _ _ _ _ l ..0 1.. Aunque en este caso se han usado cadenas de caracteres para definir el origen de datos y el comando.. para usar 10s metodos tendri que importar el AmbitoMicrosoft .0 CrystalDeC~~~Cms. D a t a aiiadiendo luego la correspondiente sentencia I m p 0 r t s a1 inicio del c6digo.NET ~~ ~~ ~ CRVsPackageLib 1. Suponiendo que hayamos insertado un DataGrid en un formulario. ~owonentes selecclonados: Microso t.. In i t i a 1 Cat a 1 og=Li b ro s . .Programacidn de bases de datos con Visual Basic .DataSource = SqlHelper. .0 CrystalDecisions ReportSource 9. .0 CrystalDecsions. r.0..ApphcationEkb. .0 CrystalKeyCodeLib TrvCtaIPIiinmMnrl h I n nn ...0. la sentencia siguiente mostraria en 61 la tabla Lib r o s completa. .9.. Us e r I D = s a ' I .0.0.~ ~ ~ ~ ~ ~ .1.. - Asumiendo que ya se ha aiiadido la referencia a1 ensamblado.4. C:\Archivor de prograrna\Arc C:\Archivos de prograrna\Arc..Text.

NET . sus tipos de datos. .6. Application Blocks para A D O N E T b 2 3 4 5 6 7 8 9 10 11 12 13 14 1 893115 94 1 8441511365 84 415 1324 4 84 41 5 1392 9 84 41 5 1316 7 84 415 1351 1 84 415 1290 6 84 415 1291 4 84 415 1261 2 84415 12558 84 415 1230 2 84 415 1202 7 8441511322 User Interface Design for PI Joel Spolsky SQLServerZOOO Fiancirco Ch Guia piaclica para usuaros Francisco Ch F m o r c o Ch Programacion conVisual C ProgramacionconVirual S I F i a r i f c o Ch ProgramacionCM Visual B F m a s c o Ch Gum practica paia usuario~ Fiancirco Ch Gum piactica p a a ~ ~ u a i i o sFiancirco Ch Fianciaco Ch Programacioncon Delphi 6 Gutapracllcapaia u~uaiios FianciicoCh Manual avanrado Excel 20 FiancifcoCh Guia piaclica para usudiio~ Ftancisco Ch Guiapraclicapaiausuaiior FianoscoCh 3 1 1 1 1 1 1 1 1 1 1 1 1 31 1 0 75 1 0 75 39 40 39 1 0 75 1 0 52 37 26 10 52 21 04 10 52 1052 Malrir Byte[] Malriz Byte[] Malw Byte[] Malrir Byte[] Malm Byte[) Malriz Byte[] (null] [null [null] [nun] [null] [null] (null Figura 23. Tambien encontrar6 en el fragmentos de c6digo de ejemplo sobre c6mo usar 10s metodos compartidos. Figura 23.us / dnbda/html/daab-rm. asp.5. asi como otras referencias. . en MSDN podemos encontrar documentaci6n adicional sobre el us0 de estas clases de ayuda. El DataGrld mostrando el contenido del DataSet devuelto por el metodo ExecuteDataSet ( ) Ademtis del archivo de ayuda que se obtiene a1 instalar el paquete. Se trata de un articulo (vease figura 23.6) en el que se describe esquemtiticamente la relaci6n entre 10s metodos y las clases. concretamente en h t tp : / / www .ms dn micros o ft com/1ib ra ry/en.23. Documentacion de Data Access Application Blocks for . etc.

..' .

Acronimos y significado ACID Atomicity. Motor de acceso a datos de la firma Borland. Conjunto de funciones que expone un sistema operativo para poder programarlo. consistencia. Institucion americana encargada de promocionar y supervisar estandares. ADO ADS1 Active Directory Services Interfaces American National Standards institute Application Programming Interface American Standard Code for Information Interchange Borland Database Engine ANSI API ASCII BDE . Conjunto de caracteres usado como estandar mundial para el intercambio de inforrnacion entre ordenadores. aislamiento y persistencia. Objetos ActiveX utilizados para el acceso a datos desde Visual Basic 6 y otras herramientas de desarrollo. Nombre con el que se conoce a las interfaces que facilitan el acceso a 10s servicios del Directorio activo. Isolation and Durability ActiveX Data Objects Propiedades que debe tener una transaccion y que hacen referencia a su individualidad. Consistency.

Columna de una tabla qlie hace referencia a una clave primaria de otra tabla. utilizado principalmente para clear aplicaciones de negocios. Glosario CLS Common Language Specification Especificacion creada por Microsoft para hacer posible la interoperabilidad entre distintos lenguajes de programacion en la plataforma . COBOL Common Business Oriented Language Component Object Model COM DAO DBA Data Access Objects Database Administrator DBMS Database Management System Data Control Language DCL DDL DLL Data Definition Language Dynamic Link Library DML DOM Data Manipulation Language Document Object Model DSN Data Source Name DTD Data Type Definition Foreign Key FK . Mecanismo de ODBC para asociar un nombre o almacenar en un archivo 10s parametros de conexion. Modelo de objetos usado por Microsoft desde la aparicion de Windows 95 para facilitar el us0 de componentes reutilizables. Sistema utilizado para definir la estructura de un documento XML. lo que coloquialmente se conoce como base de datos. Modulos.A . Parte de SQL compuesta de las sentencias que manipulan las estructuras de 10s datos. Clave externa. Uno de 10s lenguajes de programacion mas antiguos. Un modelo de objetos pensado para facilitar el acceso a documentos XML creando una imagen de ellos en forma de arbol jerarquico. conocidos como bibliotecas de enlace dinamico. Persona especializada que se ocupa de la administracion de la base de datos de una empresa. que contienen codigo compilado para ser usado desde las aplicaciones. Parte de SQL que comprende todas las sentencias de seleccion y manipulacion de datos.NET. Mecanismo de acceso a datos de Microsoft anterior a ADO. Parte de SQL que comprende 10s comandos de control usados para otorgar permisos y tareas similares. Apelativo con el que se conocen las aplicaciones para la gestion de datos.

Equivalente a DBMS. Lenguaje procedural derivado de SQL que se emplea en las bases de datos Oracle. Mecanismo de acceso a datos utilizado en el leng uaj e Java. Motor de base de datos compatible con SQL Server. Protocolo de transferencia de documentos HTML. ADO y ADO. Lenguaje estandar de marcas del que se derivan otros. Lenguaje en el que generan codigo todos 10s compiladores de lenguajes .Programacidn de bases de datos con Visual Basic . Tecnologia para la creacion y us0 de controladores de acceso a distintos origenes de datos. Componentes de acceso a datos de Microsoft. actualmente la mayoria de ellos lo son. HTTP JDBC LDAP MDAC MSDE MSlL ODBC OLE DB PK PLISQL Microsoft Data Engine Microsoft Intermediate Language Open Database Connectivity Object Linking & Embedding Database Primary Key Procedural Language/Structured Query Language Relational Database Management System Simple API for XML Sistema gestor de bases de datos Standarized General Markup Language Structured Query Language RDBMS SAX SGBD SGML SQL . Conjunto de funciones simples para el tratamiento de documentos XML. Mecanismo estandar de acceso a datos. DBMS relacional. Lenguaje utilizado en la practica totalidad de 10s RDBMS para la seleccion y manipulacion de datos y sus estructuras.NET. como HTML o XML. previo a DAO. Protocolo estandar para el acceso a servicios de directorio. Lenguaje para el diseAo de documentos que se publican en lo quese conoce coloquialmente como Web.NET. Un paquete compuesto de bibliotecas de enlace dinamico conteniendo servicios ADO y proveedores OLE DB.NET GAC HTML Global Assembly Cache HyperText Markup Language Hypertext Transfer Protocol Java Database Connectivity Lightweight Directory Access Protocol Microsoft Data Access Components Deposit0 donde se almacenan todos 10s ensamblados compartidos en la plataforma .NET. Clave primaria en una tabla.

.

.

no obstante. Estos. lo m i s recomendable es que Cree una carpeta en su disco y copie todo el contenido de E j emplos a ella. en cuyo interior se ha creado una carpeta para cada ejemplo de ese capitulo en concreto. Compruebe que tras la copia 10s archivos no tienen activo el atributo de solo lectura. . debe tener en cuenta que 10s proyectos se entregan como simples ejemplos. facilit6ndole asi el acceso a todo el c6digo sin necesidad de tener que teclearlo personalmente. por lo que no se otorga garantia alguna ni soporte de su funcionamiento. Apenas le ocuparin unos diez megabytes. Adem6s del c6digo fuente de 10s proyectos tambien se entregan kstos ya compilados.NET. entregada t a m b i h en el CD-ROM. En la carpeta E j emplos encontrar6 una subcarpeta por cada capitulo. Nuestro objetivo es facilitarle c6digo sobre el que pueda hacer pruebas y desarrollar sus propios proyectos.Este libro incorpora un CD-ROM en el que podr6 encontrar todos 10s ejemplos que se han descrito en sus capitulos. En caso de que tenga instalado en su sistema el product0 Visual Studio . nunca como aplicaciones de us0 final. Para evitar la dependencia del CD-ROM.NET en alguna de sus versiones. no pueden ser ejecutados directamente desde Windows a menos que se tenga instalada la plataforma Microsoft . En cualquier caso.NET. ya cuenta tambikn con la plataforma .

NET. desamollando d%stmtoshpos de aplicaciones con el aracias al entornc RAD de Visual Shrdro -NET que cornparten todos 10s it Curso de Delphi (11) Curso de Delphi (I) ASP free. .-.NET compder preview (1ngle5) Web Services Interoperabrhtv Orgamzabon (Inggs) '" 1p-r'r-7 y l . 16 de Septiembre de 2002 . Sede web de Torre de Babel . Tambien puede accedera la consola de administracion de IIS y crear un nuevo directorio virtual de aplicacion que apunte directamente a la carpeta en la que estan 10s ejemplos. . Esa raiz suele ser c : \InetPub\wwwroot. abrihdolos desde Visual Studio . De no hacerlo asi no podr6 acceder a 10s ejemplos Web desde Internet Explorer correctamente.com [Inalkl ConnechonsStrigs~com(Ingles) Recuperar inforrnaci6n de hpos en ejecucion (Castellano) Delphi for . Confenido del CD-ROM Los proyectos de consola y formularios Windows puede usarlos directamente..-.cambiando la letra por la que corresponda. "$ -- ~ __ Figura B. Los de formularios Web.B.NET ljltinios articuios y recurs05 Curso de Delphi (m) Sewicms de componentes en Wmdows 2000 ..1. por el contrario. Esta gwa practica es una forma rBpida de conocer el nuevo lenguap C#. en lugar de copiar estos a la raiz del sitio Web por defecto. tendr6 que copiarlos en carpetas dentro de la raiz que est4 utilizando Internet I n formation Server. unes.4 sesiones activas i u l t ~ m a actuaisrartan 12/sep/02 11:45) nirertnrin . presentado por Mlcrosoft en febrero de 2002.. I RsCurOS Pcrtam No(otrla¶ Artkubs Glosario Llbmd Guia practica para usuarios d e Visual Studio .COM+ .

articulos y desde donde puede ponerse en contact0 con 61 en caso de que encuentre algun tip0 de problema. http: //www. el autor mantiene una sede. De igual forma. podri encontrar informaci6n adicional. No olvide que para comprender las t6cnicas te6ricas es fundamental la prictica y que. su contenido o bien el del libro que tiene en sus manos. En la web de Anaya Multimedia. asi como el enlace necesario para solicitar ayuda.com. llamada Torre d e Babel.con datos sobre 6ste y otros libros.AnayaMultimedia. en la direcci6n http: //www. Tanto la editorial como el autor de este libro se ponen a disposici6n del lector para cualquier problema que pudiera encontrar en el us0 del CD-ROM.corn.fcharte. aunque se facilite el c6digo para que no tenga que introducirlo manualmente. en caso de que la hubiera. es importante que lo examine cuidadosamente y que lo utilice para experimentar. introduciendo cambios y usandolo como base para sus propios ejemplos. .Prograrnacidn de bases de datos con Visual Basic .NET Por lo demis no es necesario ningun paso adicional para poder usar 10s ejemplos.

SqlTypes. 50 ALTER TABLE . 302 . 261 DataTable. 372 DataList. 166 AddNew() . 168 AllowDelete .Glosario. 501 AllowDBNull .Glosario. 155 System. 54 ALTER VIEW . 154 System. 501 ADS1 .SQL.Data.Data.Glosario. 61 ASCII . 59 ANSI .Datacolumn.Data.SQL.OracleClient.DataRowCollection. 154 System. 276 ALTER .Data. 56 Ambitos Microsoft.Glosario. 501 Appendchild0 . 501 API . 165.Common. 380 Attributes .Data. 501 ASE'. 372 DataBinder.SQL. 154 System.XmlNode. 155 AND .Transact-SQL.DataView. 166 ACID . 155 System. 55 ORDER BY.Data.Dataview.NET AutoPostBack. 375 DataBindO. 501 Add() . 154 System.Dataview. 303 ASC CREATE INDEX.Glosario. 380 Repeater.Data. 250 A Acceptchangeso DataSet.XmlNode.OleDb.SQL. 276 ADO .Dataview. 276 AllowEdit .@@IDENTITY. 276 AllowNew . 169.SqlClient.Odbc.Glosario.

Form. 406 ChangeDatabaseO IDbConnection. 161. 438 complexType . 167 DataRowView. 70 SQL. 203 COM . 406 CancelEdit() DataRow.Glosario. 52 char . 169 ChildNodes . 218 SingleRow. 502 ComboBox . 217 StoredProcedure.IDbTransaction. 379 PositionChanged. 502 COBOL .Windows. 302 ChildRelations . 377 BindingManagerBase CurrentChanged. 379 System. 176 CLS . 276 Casesensitive . 379 Refresh(). 68 BEGIN TRANSACTION Transact-SQL.DataRelation. 161. 168 AutoPostBack .Connectionstate. 218 CommandText IDbCommand. 218 KeyTnfo. 62 BDE . 220 COMMIT TRANSACTION Transact-SQL.PL/SQL.ASP. 218 SingleResult.Transact-SQL.Connectionstate.XmlNode.NET. 502 ColumnMappings ITableMapping. 217 CommandType IDbCommand. 218 Default. 67 ChildColumns .DataRelation. 501 BEGIN . 379 ResumeBindingO. 176 c CancelCommand . 178 CHAR PLJSQL.fndice alfabe'tico AutoIncrement . 232 TableDirect. 436 Commit() . 176 CloseConnection CommandBehavior. 158 IDbConnection.Datacolumn.Transact-SQL. 161. 169 Close() IDataReader.Glosario. 165. 438 BETWEEN . 379 SuspendBindingsO. 218 SchemaOnly.IDbConnection.Datacolumn. 370 CommandBehavior CloseConnection.DataGrid. 167 DataRowView.Forms.Glosario. 68 Broken . 209 SchemaOnly. 156 ColumnName .DataGridItem.Controles.WHERE. 218 Closed . 59 BFILE . 167. 436 BeginEdit() DataRow.Transact-SQL. 237 Cells . 67 binary . 70 bigint . 125 . 276 BeginTransactionO .DataTable. 378 BREAK . 67 Bindingcontext .Transact-SQL. 375 AVGO . 178.Glosario. 166 ChildTable .Transact-SQL.SELECT. 161. 161. 454 Columns DataTable.XSD.DataSet. 236 OleDbSchemaGuid.

379 cursor .Data.Constraint. 165 Unique. 168 ConstraintCollection System.IDbCommand. 54 CREATE PROCEDURE PL/SQL. 303 Createparameter . 379 Position. 72 CREATE INDEX ASC. 370 ListBox. 176 IDbConnection.SQL. 165. 167 System.IDbConnection. 454 Defaultvalue. 502 DataAdapter System.ASP.SQL. 370 DataGrid.Common.Data.Control.SQL.Data. 277 CreateNavigatorO . 236 CONTINUE . 176 Open. 216 CreateDataViewO DataViewManager.Data. 176 Closed. 176 ConnectionTimeout IDbConnection. 454 MaxLength. 159 Database . 50 CREATE FUNCTION . 168 ColumnName.CurrencyManager.PL/SQL. 69 CREATE ROLE .SQL.Glosario. 370 Controles ComboBox. 65 CREATE USER . 176 IDbCommand. 178 Constraint ConstraintName. 72 Transact-SQL. 161.NET Conceptos DataReader. 379 COUNT() . 161 IDbTransaction.Windows. 67 D DAO . 141 Connecting Connectionstate. 178.SQL.Programacidn de bases de datos con Visual Basic .ASP. 176 Connecting. 454 DataType. 168 . 161. 370 TextBox.IDbConnection. 165 ConstraintName . 370 Count . 176 Executing. 168 System. 55 Createcommand() . 378 Current . 168 Constraints . 176 Fetching. 168 AutoIncrement. 372 DataBindings . 370 Da taColumn AllowDBNull.NET. 438 Connectionstate Broken. 65 CREATE VIEW .Transact-SQL. 372 DataBinder .Forms.Transact-SQL.SELECT. 306 Currentchanged BindingManagerBase. 379 System.NET.XmlNode. 144 DataSet. 50 DataBindO . 226 CurrencyManager Count. 55 DESC. 167. 167.DataTable.XPathNodeIterator. 177 DATABASE . 168 Expression. 61 CREATE .DataBindings. 55 SQL. 176 Connectionstring IDbConnection. 68 Control .

141 DataSetName. 169 DataRelationCollection System. 165.Conceptos.ListBox.NET. 376 DataList ASP. 241 System. 277 EnforceConstraints. 167 HasErrors. 260 Rejectchangeso. 406 DataKeyField . 169 ParentColumns.DataGrid. 167 GetColumnsInError(). 164.Data. 260 XmlDataDocument. 276 CancelEdit(). 236 Constraints.Data. 169 ChildTable.Data. 169 System. 163 Tables.h d i c e alfabe‘tico DataColumnMapping System. 165. 406 System. 406 DataGridItem Cells. 167 CancelEdit().Common. 166 DataRowVersion System.Data. 156 DataGrid CancelCommand. 156 DataSetName .Data. 156 Datasource . 406 Controles. 406 Updatecommand. 166 ChildRelations. 166 . 166. 310 DataSetColumn IColumnMapping. 164 DataSetTable .ListBox. 380 ItemTemplate. 286 NewRow(). 165 Rejectchangeso. 260 WriteXmlSchema(). 166 PrimaryKey.ITableMapping. 277 DefaultViewManager.Common. 375 DataReader . 165.Data.DataSet. 164 DataViewManager. 165. 167 Item. 169 ParentTable. 164 ReadXmlO. 236 System. 165 Relations. 166 ParentRelations. 166 Rowstate. 276 EndEdit(). 406 EditItemIndex. 165. 166 EndEdit().Data. 276 DataSet Acceptchangeso. 261 Casesensitive. 168 Haschangeso. 236 Defaultview. 167 DataRowView BeginEdit(). 237 Conceptos. 167 Delete().Data. 165 ReadXmlSchema(). 167 Hasversion(). 276 System. 156 DataColumnMappingCollection System. 370 DataKeyField. 144 DataRelation ChildColumns.Add(). 165.Forms. 165 DataRowCollection . 406 ItemIndex. 376 Editcommand. 164. 166 Columns. 236 WriteXmlO.Windows. 372 DataTable AcceptChangesO. 164 DataRow BeginEdit(). 279 GetChildRows(). 381 DataMember .

Programacidn de bases de datos con Visual Basic . 159 DbDataPermission System. 169. 169. 502 DECIMAL . 502 DOUBLE PRECISION . 454 DataValueFieId .Glosario. 70 decimal . 70 Transact-SQL. 61 DirectoryEntry System.NET RowDeleted.Glosario. 279 DefaultViewManager . 272 System.Data. 67 DECLARE PL/SQL. 163 DBMS .Glosario. 168 Defaultview .DirectoryServics. 134 DirectorySearcher System. 55 ORDER BY. 164 DataTableMapping System. 276 Sort. 281 Item. 169.Common.Glosario. 169.Transact-SQL.Datacolumn.PL / SQL. 502 DCL . 165 DataTableCollection System. 70 SQL. 372 DLL .ListBox.CommandBehavior.ListBox. 375 DataView AddNew(). 169. 276 AllowEdit. 277 DataViewSettings. 52 DBA . 276 Delete(). 271 DataViewManager CreateDataViewO. 276 Deletecommand IDbDataAdapter. 67 Default . 237. 156 DataTextField .ListBox. 236 Select(). 277 DELETE SQL.Common.Data. 276 RowFilter. 166 Rows. 277 StateFilter.PL / SQL.DataSet. 168 DESC CREATE INDEX. 165.PL/SQL.Glosario. 169 System. 156 DataTableMappingCollection System.Common.Data. 163 DbDataPermissionAttribute System. 70 . 502 DDL .Datacolumn. 169 RowStateFilter. 56 UPDATE. 277 DATE PL/SQL. 281 FindRows(). 65 Delete() DataRow. 271 DataViewSettings DataViewManager. 72 Defaultvalue . 167. 502 DocumentElement XmlDocument. 159 DeleteRule Foreignconstraint.Data. 134 DisplayMember . 276 AllowNew.Common. 502 DbDataAdapter System. 166 RowDeleting. 277 System. 169.Common.Glosario.Data.Data. 169. 218 DEFAULT .Glosario. 502 DML .DataTable.Data. 302 DOM .Data. 166 Dataview. 276 Find().DirectoryServics. 169. 166.Data. 277 DataSet. 276 AllowDelete. 375 DataType .

281 Firstchild .DataTable. 52 float .Transact-SQL.SQL. 157 GetByte() . 310 GetFloatO . 218 SqlHelper.XmlNode. 406 element .SQL. 168 UpdateRule. 50 DROP INDEX .Data. 286 GetColumnsInError() . 219 SqlHelper. 496 ExecuteNonQuery () IDbCommand.DataGrid.IDataRecord. 464 G GAC . 157 GetChildRows() .IDataAdapter.XSLT. 68 EndEdit() DataRow.Dataview. 502 FLOAT PLISQL. 71 for-each . 167 GetDeleteCommand() SqlCommandBuilder. 176 Expression . 71 Transact-SQL.Transact-SQL. 496 Executescalar() IDbCommand. 219 ExecuteReaderO IDbCommand. 377 FROM . 502 E Editcommand . 56 DSN .DataRow. 496 Executing . 95 ExecuteDataSetO .SqlHelper. 54 DROP VIEW . 169.Datacolumn. 58 FromStreamO . 307 FOREIGN KEY . 68 ELSIF . 496 ExecuteOracleNonQuery() OracleCommand. 157 Fill() . 496 ExecuteXmlReader() SqlCommand.Connectionstate.XSD. 159.SQL. 168 System. 176 Fieldcount .IDataRecord.Glosario.Dataview. 202 .Glosario. 168 EXECUTE . 219 ExecuteOracleScalar() OracleCommand. 218 SqlHelper. 169. 157 GetInsertCommand() SqlCommandBuilder.Glosario.fndice alfabktico DROP .Connectionstate. 168 Form .Glosario. 126 ELSE PLISQL. 167 DataRowView.IDataAdapter. 163 GetElementFromRow() XmlDataDocument.Bindingcontext. 302 FK . 239 Fillschema() . 503 GetBoolean0 . 71 END . 67 FOR . 53 Foreignconstraint DeleteRule. 276 Enforceconstraints . 218 SqlHelper.PictureBox.IDataRecord.PLISQL. 247 Find() . 163 GetOleDbSchemaTable() OleDbConnection.SQL. 70 SQL.PL / SQL. 281 FindRowsO . 55 DROP TABLE .SQL.DataSet.IDataRecord.SQL.DataGrid.Transact-SQL. 406 EditItemIndex . 454 Fetching . 502 DTD .

158 Getoraclestring0 OracleDataReader. 504 URL. 503 JDBC. 158 GetOracleNumberO OracleDataReader.SQL. 503 SQL. 503 HTTP.SELECT. 164 HasChildNodes .Glosario. 502 COM. 502 DAO. 504 VBA. 502 GAC. 502 DBMS. 503 SAX. 502 DOM. 502 DCL. 62 H Haschangeso . 310 GetSchemaTableO IDataReader. 501 BDE. 157 Getupdatecommand() SqlCommandBuilder. 504 GRANT . 501 ADSI. 158 GetRowFromElement() XmlDataDocument.XmlNode. 502 DDL. 209 GetSqlByteO . 302 HasErrors .SqlDataReader. 503 MSDE.SqlDataReader.DataSet. 158 GetSqlDoubleO . 503 LDAP. 503 PLISQL. 501 ANSI. 504 UDL. 163 Glosario ACID. 503 HTTP . 503 RDBMS. 502 DTD.SqlDataReader.System.NET GetOracleBinaryO OracleDataReader. 65 GROUP BY . 503 IBindingList . 167 HTML . 503 OLE DB. 503 MSIL.Data. 502 COBOL. 504 XSD. 504 XSLT. 503 SGML. 167 Hasversion() . 501 ADO. 504 XSL. 502 DSN.DataRow. 503 ODBC. 158 Getstring() . 502 DML. 501 CLS. 504 W3C. 502 FK. 504 WWW.IDataRecord. 501 API. 503 MDAC. 503 HTML. 158 GetSqlStringO . 502 DBA. 275 IColumnMapping . 502 DLL.DataRow.Glosario. 504 XML. 503 PK. 503 T-SQL.Programacidn d e bases de datos con V i s u a l Basic . 504 URI. 501 ASCII. 503 SGBD.

159. 157 System. 206 INSERT . 438 System. 157 IDbCommand CommandText. 217 Properties. 438 Connection. 161. 59 INDEX .SQL. 161. 176 ConnectionTimeout. 68 image .Data. 445 SelectCommand. 157 GetFloat(). 51 INFORMATION-SCHEMA Transact-SQL. 156 IColumnMappingCollection System. 218 Executescalar(). 161. 119 SUSPEND. 161. 178. 159 IDbTransaction Commit(). 57 InsertAfterO . 239 Fillschema(). 232 System. 176 Connectionstate. 178 Close(). 161. 157 GetBooleanO. 158. 161. 161 Createparameter. 176 System. 158 GetSchemaTableO. 157 RecordsAffected. 438 IsolationLevel. 176 ConnectionString.SQL. 161. 159 RowUpdated. 161. 161.WHERE. 161. 159. 226 ExecuteNonQuery(). 222 Read(). 414 Updatecommand.XmlNode. 52 InterBase RETVAL. 438 Rollback(). 241 IDataReader Close(). 156 System. 239 MissingSchemaAction. 414 IDbDataAdapter Deletecommand. 414 IDbConnection BeginTransactionO. 217 Connection. 159 Insertcommand. 159 int .Data. 414 Update().Data. 67 IN . 157 System.Data. 159.Transact-SQL. 217 CommandType. 71 Transact-SQL. 303 InsertBefore() . 178. 56 INSERT INTO . 209 NextResultO. 119 . 159. 157 Getstring(). 414 IDataRecord Fieldcount.fndice aljabe'tico DataSetColumn. 161. 161. 437 IF PL/SQL.Data. 239 System. 177 Open().Data.Data.SQL. 216 Database.XmlNode. 159 System.Transact-SQL. 178 Createcommand(). 157 Item. 156 IData Adapter Fill().Data. 218 ExecuteReaderO. 438 ChangeDatabaseO. 303 Insertcommand IDbDataAdapter. 156 SourceColumn. 67 INTEGER . 157. 157 GetByte(). 247 MissingMappingAction. 118 SET TERM. 218 Parameters. 161.Data.SQL. 176.

Data. 302 MAX() .DataGridItem. 303 NodeType .DataList. 62 MaxLength .SELECT. 372 DataTextField.Glosario.Glosario. 158.IDataReader.SQL.SQL. 303 LDAP .Glosario.SELECT.Transact-SQL. 162 .Glosario. 503 Microsoft.Odbc Ambitos. 162 OdbcCommandBuilder System. 302 NATURAL . 59 ListBox Controles. 503 MSIL . 375 Datasource. 167 MDAC .CommandBehavior. 239 MissingSchemaAction IDataAdapter. 302 NOT . 372 ValueMember.Data. 302 LOOP .Xm1. 169.Odbc. 163 OdbcConnection System. 70 NewRowO .PL / SQL.Datacolumn.XmlNode. 71 Name . 503 LIKE . 158 MINO . 156 SourceTable.XmlNode. 62 MissingMappingAction IDataAdapter.NET IsolationLevel IDbTransaction.Glosario.XmlNode. 166 NextResultO . 375 DataValueField.XmlNode.WHERE.Data. 306 MSDE . 406 ItemTemplate .Proxramacio'n de bases de datos con Visual Basic .Odbc.Glosario. 57 ODBC . 503 K KeyInfo . 218 L Lastchild . 156 Item DataRow. 157 ItemIndex .DataTable. 372 Load() . 67 MoveNextO XPathNodeIterator. 59 NOT NULL . 375 DisplayMember. 503 JDBC . 159 OdbcDataReader.Data. 166 DataView. 370 DataMember.XmlDocument. 276 IDataRecord.PL/SQL. 52 NULL . 155 OdbcDataAdapter.Data. 161. 381 IXPathNavigable System. 239 money .Odbc. 438 ITableMapping ColumnMappings. 156 ITableMappingCollection System. 156 System. 222 Nextsibling .Data.SQL. 503 OdbcCommand System. 156 DataSetTable.

Data.OracleClient.IDbConnection.XmlNode.OleDb. 71 FLOAT.Data.DataRelation. 161. 61 P Parameters . 71 ELSlF. 303 ParentRelations . 176 OPEN .OleDb.SQL.IDbCommand.Data. 219 System.OleDb.OracleClient. 162 OLE DB . 71 LOOP.Data.Data.FromStreamO. 72 DATE.Odbc. 202 System. 162 OleDbDataAdapter System.OracleClient. 70 OPEN. 71 Glosario. 162 OracleDataAdapter System. 158 OdbcTransaction System. 203 Tables.Data.Data. 109 Open() .Data. 61 SQL.DataTable.DataRelation. 464 PK . 163 OracleConnection System. 169 PictureBox . 162 OleDbCommandBuilder System.OleDb.Data. 70 DEFAULT.Glosario. 70 FOR.PL / SQL.OleDb. 61 DESC.Data.OleDb.Glosario. 162 ORDER BY ASC.OracleClient. 169 ParentNode . 158 OleDbSchemaGuid Columns. 162 Open . 503 PL / SQL BFILE. 158 System.indice alfabitico OdbcDataAdapter Microsoft. 70 DECIMAL. 158 Getoraclestring().Data.Odbc. 163 OleDbConnection GetOleDbSchemaTable().OracleClient. 158 OracleTransaction System. 70 CHAR. 503 OleDbCommand System. 219 ExecuteOracleScalar(). 70 . 176 OR .Data. 159 OdbcDataReader Microsoft. 70 ELSE. 159 OleDbDataReader System. 70 CREATE FUNCTION. 503 IF. 203 Procedures. 203 Table-Constraints.Odbc. 71 NATURAL. 59 OracleCommand ExecuteOracleNonQuery(). 162 OracleCommandBuilder System. 166 ParentTable .Data. 159 OracleDataReader GetOracleBinaryO. 72 CREATE PROCEDURE. 72 DOUBLE PRECISION.Connectionstate. 158 GetOracleNumber(). 109 POSITIVE.OracleClient. 217 ParentColumns . 203 Procedure-Parameters. 203 OleDbTransaction System.Data. 70 DECLARE. 203 Views.Data.

PL 1SQL. 118 REVOKE . 203 Properties .Dataview. 218 SELECT AVG().DataTable. 260 RecordsAffected . 169 ROWID . 71 VARCHAR.SQL. 65 ROLLBACK TRANSACTION Transact-SQL.ASP.SQL. 166 Relations . 163 S RDBMS . 379 Positionchanged BindingManagerBase. 165 ReadXmlSchema() . 380 Replacechild() . 157 REF CURSOR . 503 Read() .Data.SQL. 303 PRIMARY KEY .DataSet. 161. 70 STRING.XmlNode. 72 Transact-SQL.PL/SQL. 379 RejectChanges() DataSet.DataSet.Dataview.Windows. 62 MINO. 503 Schemaonly CommandBehavior. 61 Select() DataTable.Data. 62 COUNT(). 165 PROCEDURE .DataTable.IDbTransaction. 166 RowFilter . 378 ResumeBindingO BindingManagerBase.PL / SQL.Glosario. 237. 241 RowStateFilter . 62 MAX().DataRow. 71 Position . 203 Procedures OleDbSchemaGuid.IDbCommand. 236 RowState . 303 SAX . 445 RowUpdatedEventArgs System. 303 Repeater .XmlNode.Common. 164. 62 SQL. 232 PropertyManager System. 166 RowDeleting . 236 Removechild() .NET REF CURSOR. 61 GROUP BY.IDataReader.IDbDataAdapter. 56 SUM(). 70 PreviousSibling . 70 SIGNTYPE.DataTable. 72 ROWID.CurrencyManager. 438 RowDeleted .SQL.Common.DataSet.BindingManagerBase. 165. 109 REFERENCES . 379 RETURN PLISQL. 70 Rows .Forms. 209. 166. 163 RowUpdatingEventArgs System. 109 RETURN. 53 Refresh() . 70 THEN. 436 Rollback() . 165. 69 RETVAL . 306 SelectCommand IDbDataAdapter.Glosario. 52 PrimaryKey . 379 POSITIVE . 272 XPathNavigator. 276 Rowupdated .Programacidn de bases de datos con Visual Basic .NET. 70 WHILE. 157 ReadXml() . 166. 159 . 51 Procedure-Parameters OleDbSchemaGuid.InterBase.XmlNode. 165 DataTable.IDataReader.DataTable.

CommandBehavior.fndice alfabe'tico SelectNodes() . 163 Getupdatecommand( ). 162 SqlCommandBuilder GetDeleteCommand().CommandBehavior. 58 Glosario. 51 REFERENCES.InterBase. 64 SET TERM . 158 System. 55 DROP TABLE. 303 SET .Data. 54 CREATE ROLE. 52 TRIGGER. 156 SourceTable . 56. 65 CREATE USER. 65 INDEX.SQL.SqlClient. 51 INSERT. 277 SourceColumn . 70 SingleResult . 159 SqlDataReader GetSqlByteO. 52 UPDATE. 50 CREATE INDEX. 53 REVOKE. 56 INSERT INTO.XmlNode. 56 AND. 163 System. 503 GRANT. 59 SqlCommand ExecuteXmlReader(). 496 ExecuteNonQuery(). 158 GetSqlStringO. 54 ALTER VIEW. 50 DROP INDEX.Data. 163 SqlConnection System. 57 INTEGER.SqlClient. 50 ALTER TABLE. 52 FOREIGN KEY. 158 GetSqlDouble(). 52 NULL. 50 TIME. 52 VIEW. 56 FLOAT. 64 VALUES. 496 ExecuteReaderO.Glosario. 61 PRIMARY KEY.Transact-SQL. 59 CHAR.Data. 218 SingleRow . 54 DROP VIEW. 52 TABLE. 496 .ITableMapping. 503 SIGNTYPE . 219 System.PL / SQL. 52 PROCEDURE.SqlClient. 163 GetInsertCommand(). 119 SGBD . 503 SGML . 52 smallint . 52 DELETE. 57 OR. 218 SMALLINT . 169.SqlClient. 65 CREATE VIEW. 56 SMALLINT. 55 DATABASE.Data. 162 SqlDataAdapter System. 59 NOT NULL. 65 SELECT. 57 VARCHAR.IColumnMapping.UPDATE. 52 NOT. 59 ORDER BY. 50 DATE. 56 DROP. 51 WHERE.SqlClient.Glosario. 53 FROM.Data. 158 SqlHelper ExecuteDataSetO. 67 Sort . 51 UNIQUE. 496 Executescalar().Dataview. 156 SQL ALTER. 52 CREATE.

162 System. 275 IColumnMapping.NET ExecuteXmlReader(). 157.SqlClient Ambitos.Prograrnacidn de bases de datos con Visual Basic . 162 SqlCommandBuilder. 496 SqlTransaction System. 159 OleDbDataReader. 158 SqlTransaction. 162 OleDbCommandBuilder. 169.PL / SQL. 167 DataRowView. 162 OdbcCommandBuilder.Data. 414 IDbConnection. 163 OleDbConnection. 165 DataRelation. 156 Uniqueconstraint. 169 DataRelationCollection.Data.DirectoryServices . 168 System. 119 SuspendBindingsO BindingManagerBase. 161. 276 DataSet.Data. 161. 271 DataViewManager. 159 OracleDataReader. 414 IDataReader. 159 DbDataPermission. 163 SqlConnection. 163 OdbcConnection. 70 SUM() . 159. 437 ITableMapping.SqlTypes . 414 IDbDataAdapter.Ambitos. 156 DataColumnMappingCollection.Odbc OdbcCommand. 271 ForeignConstraint. 165 DataTableCollection. 176. 155 System. 168 ConstraintCollection. 162 OleDbDataAdapter. 158 OleDbTransaction. 162 SqlDataAdapter. 163 OracleConnection.Data. 414 IDataRecord.InterBase.SqlClient. 159 DataColumnMapping.OleDb Ambitos. 164 Dataview. 156 IColumnMappingCollection. 161. 165 DataRowVersion. 156 IDataAdapter. 154 SqlCommand. 232 STRING . 163 DbDataPermissionAttribute. 156 ITableMappingCollection. 414 IDbTransaction. 379 System.163 RowUpdatedEventArgs. 154 DataAdapter. 159. 162 OracleDataAdapter. 162 OracleCommandBuilder. 158 OracleTransaction. 61 SUSPEND .Common Ambitos. 164 DataRow.Data. 154 Constraint. 156 DataTableMappingCollection.SELECT. 156 DbDataAdapter.CommandType. 168 IBindingList.OracleC1ient Ambitos. 162 System. 163 RowUpdatingEventArgs.Dataview.Data. 155 OracleCommand. 162 System. 165 Datacolumn. 162 OdbcTransaction. 157 IDbCommand.156 DataTableMapping.Da ta Ambitos. 162 System. 163 DataTable. 162 StateFilter . 163 System. 159 SqlDataReader.Data. 154 OleDbCommand. 169 StoredProcedure .

436 CONTINUE. 378 System.CommandType. 236 OleDbSchemaGuid. 299 XmlValidatingReader. 298. 67 Table-Constraints OleDbSchemaGuid. 68 CREATE PROCEDURE. 504 Unique .Windows. 68 BEGIN TRANSACTION.Datacolumn. 306 System. 307 text . 168 UNIQUE . 68 EXECUTE. 67 table.Glosario. 67 BREAK. 296 XmlTextReader.Xs1. 297 XPathNavigator. 67 DECLARE.System.Xml. 378 CurrencyManager. 299 XmlReader. 71 TIME . 67 IF. 129 template .Forms BindingManagerBase. 134 System. 68 char. 378 DataGridItem. 306 XPathNodeIterator. 436 bigint. 504 U UDL . 67 binary. 308 T TABLE .SQL. 406 PropertyManager. 220 Tables DataSet.Controles. 302 XmlNodeReader. 134 DirectorySearcher. 50 table . 436 smallint. 67 COMMIT TRANSACTION.fndice alfabe'tico DirectoryEntry. 68 END. 164.Xm1 IXPathNavigable.Xml.XSLT. 67 INFORMATION-SCHEMA.PL/SQL.SQL. 370 THEN . 67 RETURN. 297 XmlNode. 308 XslTransform. 308 TRIGGER . 203 TableDirect .XML. 68 image. 95 float. 302 XmlDocument. 67 ELSE.Data. 52 Transact-SQL @@IDENTITY.SQL.Transact-SQL. 69 ROLLBACK TRANSACTION. 67 varchar. 168 . 299 XmlWriter.250 BEGIN. 302 XmlDataDocument.XPath XPathDocument. 69 cursor. 67 WHILE. 203 targetschema . 52 Uniqueconstraint . 68 Transform() . 302 System. 51 T-SQL .SQL. 206 int.Xs1 Transform(). 67 varbinary. 67 decimal. 67 text.Glosario. 67 money. 67 TextBox .Xml.Transact-SQL.System.

ListBox.OleDbSchemaGuid. 406 IDbDataAdapter. 59 LIKE. 310 GetRowFromElement(). 64 Update() .Glosario. 310 GetElementFromRow().IDataAdapter. 159.Glosario. 57 varbinary .Xm1. 372 value-of . 165.Xm1.Xm1.Transact-SQL. 303 Firstchild.Glosario.DataSet. 299 V ValidationType XmlValidatingReader. 504 targetschema.Xm1. 303 SelectNodes(). 302 ChildNodes. 68 .Foreignconstraint. 504 URL .System. 302 XmlDocument DocumentElement. 504 X XML Glosario. 302 Nextsibling. 303 Removechild(). 303 InsertBeforeO.SQL.System.Xm1. 297 XmlNode Appendchild().Xm1. 303 System.XmlNode. 168 URI . 67 VBA . 310 System. 303 Lastchild. 299 XmlReader . 65 SET. 303 Replacechild(). 159 UpdateRule . 260 WriteXmlSchema() . 51 Views . 241 Updatecommand DataGrid.DataSet. 67 V ARCH AR PL/SQL. 303 NodeType. 303 PreviousSibling. 64 SQL. 165. 302 Value. 129 XmlDataDocument DataSet. 59 WHILE PLISQL.SQL. 302 CreateNavigatorO.XSLT. 52 varchar . 504 WHERE BETWEEN. 203 W3C . 307 VALUES . 302 HasChildNodes. 303 Attributes. 296 XmlTextReader . 300 Value .System. 70 SQL.Glosario. 302 ParentNode. 504 VIEW . 302 InsertAfterO. 303 Name.Glosario. 504 WriteXmlO . 302 Load(). 59 SQL. 59 IN. 260 WWW . 56 SQL. 302 XmlNodeReader .Transact-SQL. 302 System.NET UPDATE DELETE.Programacidn de bases de datos con Visual Basic . 71 Transact-SQL. 302 ValueMember .

Glosario.Xml.XPath. 300 XmlWriter . 306 System. 299 ValidationType. 306 MoveNextO. 306 XPathNodeIterator Current. 307 XslTransform System.Xs1. 504 XSL .Xm1.System. 298.fndice alfabe'tico XmlValidatingReader System. 306 XSD complexType. 307 value-of. 308 . 307 Glosario. 125 element. 302 XPathDocument System.Xml. 297 XPathNavigator Select().Xml. 504 template. 306 System. 504 XSLT for-each.XPath.Xml.XPath. 126 Glosario.Xm1.