Está en la página 1de 504

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 publi-
camente, 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
Soluciones de acceso a datos .............................................................................................. 20
ADONET ................................................................................................................................ 20
Visual Studio .NET ............................................................................................................... 21
Objetivos de este libro ......................................................................................................... 21
Estructura del libro ............................................................................................................... 22
Ayuda a1 lector ...................................................................................................................... 24

.
Parte I Sentar las bases................................................................................... 25

1. Terminologia y conceptos ............................................................................. 26
Origenes de datos ................................................................................................................. 27
Bases de datos ........................................................................................................................ 29
DBMS y RDBMS .............................................................................................................. 29
Arquitectura cliente/ servidor ........................................................................................... 30
Arquitecturas n-tier .............................................................................................................. 32
Servicios de acceso a datos ................................................................................................. 33
Proveedores y controladores ............................................................................................. 33
Lenguajes de comunicaci6n ................................................................................................ 34

fndice de contenidos

Estructura de 10s datos ........................................................................................................ 36
Entidades y atributos ..................................................................................................... 36
Dominios y restricciones ............................................................................................... 37
Identidad de una entidad .............................................................................................. 37
Relaciones entre conjuntos de entidades ................................................................... 38
Indices ................................................................................................................................ 39
Vistas .................................................................................................................................. 40
Procedimientos almacenados ....................................................................................... 40
Normalizaci6n .................................................................................................................. 41
Transacciones ................................................................................................................... 41
XML .......................................................................................................................................... 43
Resumen .................................................................................................................................. 43

.
2 SQL y sus dialectos ....................................................................................... 44
iQu6 es SQL?.......................................................................................................................... 46
Partes de SQL ................................................................................................................... 46
Derivados de SQL ........................................................................................................... 47
Ejecuci6n de sentencias SQL ........................................................................................ 47
DDL .......................................................................................................................................... 48
Creaci6n de una base de datos ..................................................................................... 51
Creaci6n de tablas ........................................................................................................... 51
Modificaci6n y borrado de tablas ............................................................................... 54
Otras operaciones de definici6n de datos ................................................................. 54
DML .......................................................................................................................................... 56
Inserci6n de datos ........................................................................................................... 57
Recuperaci6n de datos ................................................................................................... 58
Alias de tablas ............................................................................................................ 58
Selecci6n de filas ........................................................................................................ 59
Condicionales complejos .......................................................................................... 59
Orden de las filas ....................................................................................................... 61
Expresiones y funciones de resumen .................................................................... 61
Agrupamiento ............................................................................................................. 62
Enlaces entre tablas ................................................................................................... 62
Consultas dentro de consultas ............................................................................... 63
Actualizacibn de datos ................................................................................................... 64
Eliminaci6n de datos ...................................................................................................... 65
DCL ........................................................................................................................................... 65
Derivados de SQL ................................................................................................................. 66
Transact-SQL .................................................................................................................... 66
Variables y tipos de datos ....................................................................................... 67
Evaluaci6n de expresiones ...................................................................................... 68
Condicionales y bucles ............................................................................................. 68
Codificaci6n de procedimientos almacenados ................................................... 69
PL / SQL .............................................................................................................................. 69

Programacidn de bases de datos con Visual Basic .NET

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

.
3 Origenes de datos .......................................................................................... 74
Origenes locales y remotos ................................................................................................. 75
Microsoft Access ................................................................................................................... 76
Definicion de las tablas .................................................................................................. 77
Relaci6n entre las tablas ................................................................................................ 79
Introducci6n de datos .................................................................................................... 79
Simplificar la selecci6n de editorial ............................................................................ 81
SQL Server .............................................................................................................................. 83
Creaci6n de la base de datos ........................................................................................ 84
Definici6n de las tablas .................................................................................................. 85
Relacidn entre las tablas ................................................................................................ 87
Introducci6n de datos .................................................................................................... 89
Us0 de la base de datos de ejemplo ............................................................................ 90
Definici6n de una vista .................................................................................................. 91
Definir procedimientos almacenados ......................................................................... 93
Ejecuci6n de procedimientos almacenados .............................................................. 95
Oracle ....................................................................................................................................... 96
Creaci6n de la base de datos ........................................................................................ 97
Definicion de las tablas .................................................................................................. 98
Introducci6n de datos .................................................................................................. 104
Definici6n de una vista ................................................................................................ 105
Definir funciones y procedimientos almacenados ................................................ 106
Ejecuci6n de funciones y procedimientos ............................................................... 110
InterBase ................................................................................................................................ 111
Creaci6n de la base de datos ...................................................................................... 113
Definicidn de las tablas ................................................................................................ 115
Introduccidn de datos .................................................................................................. 116
Definici6n de una vista ................................................................................................ 117
Definir procedimientos almacenados ....................................................................... 118
Ejecuci6n de procedimientos almacenados ............................................................ 120
Microsoft Excel .................................................................................................................... 120
Creaci6n de un nuevo libro ........................................................................................ 121
Definici6n de la estructura .......................................................................................... 121
Introducci6n de datos .................................................................................................. 123
XML ........................................................................................................................................ 125
Definici6n de la estructura de documento .............................................................. 125
Creaci6n del documento XML ................................................................................... 128
Directorio activo .................................................................................................................. 133

Acceso a1 Directorio activo ......................................................................................... 133
Resumen ................................................................................................................................ 134

Parte I1. ADO.NET ......................................................................................... 137
..
4 . Introduccion a ADO.NET .......................................................................... 138
Objetivos del modelo ADO.NET ..................................................................................... 139
Representach interna en XML ...................................................................................... 141
Ausencia de cursores de datos ........................................................................................ 143
Cursores de lectura ....................................................................................................... 144
Soluci6n multiprop6sito .................................................................................................... 144
Configuraci6n de 10s clientes ........................................................................................... 148
Resumen ................................................................................................................................ 150

.
5 Modelo de objetos ....................................................................................... 152
Estructura del modelo de objetos ................................................................................... 153
Ambitos con nombre de ADO.NET ................................................................................ 154
Interfaces para 10s proveedores ...................................................................................... 155
Asociaci6n de columnas y tablas ............................................................................... 156
Acceso a filas de datos ................................................................................................. 156
Adaptadores de datos .................................................................................................. 159
Conexiones, comandos y transacciones ................................................................... 160
Detalles sobre 10s proveedores ........................................................................................ 161
Otras clases comunes y especificas ........................................................................... 162
Clases independientes del origen de datos .................................................................. 163
Conjuntos de datos ....................................................................................................... 164
Tablas ................................................................................................................................ 165
Filas ................................................................................................................................... 166
Columnas ......................................................................................................................... 167
Restricciones ................................................................................................................... 168
Relaciones ........................................................................................................................ 168
Vistas de datos ............................................................................................................... 169
Resumen ................................................................................................................................ 170

. . . al origen de datos
6 Conexion ........................................................................ 172
Obtencion e instalaci6n de proveedores adicionales ................................................. 173
D6nde obtener 10s proveedores ................................................................................. 174
Instalaci6n del proveedor ............................................................................................ 174
Generalidades sobre la conexi6n ..................................................................................... 176
Cadena de conexi6n ...................................................................................................... 176
Apertura y cierre de la conexi6n ............................................................................... 177
Propiedades informativas ........................................................................................... 178
Cadenas de conexi6n .......................................................................................................... 178

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

Selecci6n del controlador ............................................................................................ 178
Identificacibn del servidor u origen de datos ........................................................ 181
Base de datos inicial ..................................................................................................... 181
Parimetros de seguridad ............................................................................................ 181
Propiedades exclusivas ................................................................................................ 183
En la prictica ........................................................................................................................ 183
Conexi6n con Microsoft Access ................................................................................. 183
Conexi6n con Microsoft Excel .................................................................................... 185
Conexi6n con SQL Server ............................................................................................ 186
Conexi6n con InterBase ............................................................................................... 188
Conexi6n con Oracle 8i ................................................................................................ 189
Conexiones ODBC mediante DSN .................................................................................. 193
Tipos de DSN ................................................................................................................. 194
Creaci6n de un DSN ..................................................................................................... 194
Us0 del DSN con ADO.NET ....................................................................................... 196
Archivos UDL ...................................................................................................................... 197
Resumen ................................................................................................................................ 199

.
7 Informacibn de esquema de la base de datos .......................................... 200
iQu6 es la informaci6n de esquema? ............................................................................. 201
Origenes OLE DB ................................................................................................................ 202
Tabla de resultados ....................................................................................................... 203
En la practica .................................................................................................................. 204
Otros origenes ...................................................................................................................... 206
En la practica .................................................................................................................. 206
Informaci6n sobre columnas ............................................................................................ 209
En la practica .................................................................................................................. 210
Resumen ................................................................................................................................ 212

. . . de datos
8 Recuperacion ................................................................................ 214
Generalidades sobre 10s comandos ................................................................................ 215
Asociaci6n entre comando y conexi6n ..................................................................... 216
Definicion del comando a ejecutar ............................................................................ 217
Ejecuci6n del comando ................................................................................................ 217
Lectura de 10s datos ........................................................................................................... 219
Recuperar el contenido de una tabla ........................................................................ 220
Varios conjuntos de datos ........................................................................................... 222
Ejecuci6n de sentencias de selecci6n ........................................................................ 223
Sentencias con parhmetros .......................................................................................... 226
Recuperaci6n de un solo valor ................................................................................... 228
Manipulacidn de datos ...................................................................................................... 228
Otras operaciones ................................................................................................................ 229
Recuperaci6n de una vista ......................................................................................... 230

fndice de contenidos

Ejecuci6n de un procedimiento almacenado .......................................................... 231
Resumen ................................................................................................................................ 233

9. Conjuntos de datos ..................................................................................... 234
Generalidades sobre conjuntos de datos ....................................................................... 235
Tablas y relaciones ........................................................................................................ 236
Selecci6n de datos ......................................................................................................... 237
Generalidades sobre adaptadores de datos ................................................................. 237
Creaci6n de un adaptador de datos ......................................................................... 238
Obtenci6n de 10s datos ................................................................................................. 239
Actualizaci6n de datos ................................................................................................. 241
En la prActica ........................................................................................................................ 243
Recuperaci6n de datos ................................................................................................. 244
Informaci6n de esquema ............................................................................................. 246
Manipulaci6n de 10s datos .......................................................................................... 250
Definici6n de conjuntos de datos .................................................................................... 253
Creaci6n de tablas. columnas y relaciones ............................................................. 253
Insertion de datos ......................................................................................................... 255
Consulta de estructura y contenido .......................................................................... 256
Almacenamiento local ........................................................................................................ 258
Escritura de esquema y datos .................................................................................... 260
DiffGrams ........................................................................................................................ 261
Lectura del conjunto de datos .................................................................................... 264
Resumen ................................................................................................................................ 267

.
10 Relaciones y vistas ..................................................................................... 270
Filtrado y ordenaci6n de un DataTable ......................................................................... 272
Generalidades sobre DataView y DataViewManager ............................................... 274
Funcionamiento de un DataView .............................................................................. 276
Funcionamiento de un DataViewManager ............................................................. 277
En la pr6ctica ........................................................................................................................ 278
Multiples vistas sobre una misma tabla .................................................................. 278
La vista por defect0 de una tabla .............................................................................. 279
Busqueda de datos en una vista ................................................................................ 281
Edici6n de datos en la vista ........................................................................................ 284
Us0 de un DataViewManager .................................................................................... 286
Resumen ................................................................................................................................ 289

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

Programacidn de bases de datos con Visual Basic .NET

Mecanismos de manipulaci6n de documentos XML ............................................ 296
Selecci6n de datos con XPath ..................................................................................... 297
Transformaci6n con XSLT ........................................................................................... 297
El Eimbito System.Xm1........................................................................................................ 298
Lectura secuencial de documentos XML ................................................................. 298
Manipulacibn de documentos XML con DOM ...................................................... 301
Navegaci6n por el documento mediante XPath .................................................... 305
Transformaci6n de documentos ................................................................................ 307
XML y AD(l.NET ................................................................................................................ 309
La clase XmlDataDocument ........................................................................................ 310
Creaci6n del DataSet a partir del documento XML ............................................. 311
Generaci6n del documento XML a partir del DataSet ......................................... 312
Resumen ................................................................................................................................ 314

Parte I11. Visual Studio .NET........................................................................ 317
12. Capacidades de datos en Visual Studio .NET ...................................... 318
Ediciones de Visual Studio .NET .................................................................................... 319
Posibilidades de acceso ..................................................................................................... 321
Productos integrados en el paquete ............................................................................... 322
Posibilidades de disefio ..................................................................................................... 322
Una visi6n general .............................................................................................................. 324
Resumen ................................................................................................................................ 325

13. Herramientas visuales de datos ............................................................... 326
El Explorador de servidores ............................................................................................ 328
Definir una nueva conexi6n ........................................................................................ 328
Registrar un nuevo servidor ....................................................................................... 331
Apertura y cierre de conexiones ................................................................................ 332
Creaci6n de nuevas bases de datos .......................................................................... 333
Edici6n de datos .................................................................................................................. 334
Navegar por las filas ..................................................................................................... 336
Selecci6n de datos ......................................................................................................... 336
Modificacibn, inserci6n y eliminaci6n ..................................................................... 340
Agrupaci6n de 10s resultados .................................................................................... 341
Edici6n de informacion de esquema .............................................................................. 343
Creaci6n y modificaci6n de tablas ............................................................................ 343
Disefio de vistas ............................................................................................................. 346
Edici6n de procedimientos almacenados y funciones ......................................... 347
Componentes de acceso a datos ...................................................................................... 350
Preparaci6n de la conexi6n ......................................................................................... 351
Definici6n de comandos ............................................................. :................................ 352
Definici6n del adaptador de datos ........................................................................... 354

fndice de contenidos

Creaci6n del conjunto de datos ................................................................................. 355
Diseiio de una sencilla interfaz .................................................................................. 356
Creaci6n automtitica de componentes ........................................................................... 358
El asistente de configuraci6n de adaptadores ....................................................... 358
Comprobaci6n del adaptador de datos ................................................................... 362
Generaci6n del conjunto de datos ............................................................................. 362
Conjuntos de datos con tip0 ....................................................................................... 363
Aun m6s simple ............................................................................................................. 365
Resumen ................................................................................................................................ 366

.
14 Componentes con vinculacih a datos ................................................... 368
Tipos de vinculaci6n .......................................................................................................... 369
Vinculaci6n simple ........................................................................................................ 370
Vinculaci6n con mtiltiples filas de una columna ................................................... 374
Vinculaci6n con mtiltiples filas y columnas ........................................................... 376
Enlace a datos en formularios Windows ...................................................................... 377
Posici6n actual en una lista de datos ........................................................................ 378
Control de la vinculaci6n ............................................................................................ 379
Componentes enlazables ............................................................................................. 379
Enlace a datos en formularios Web ................................................................................ 380
Vinculos s610 de lectura ............................................................................................... 380
Navegaci6n con componentes simples .................................................................... 381
Actualizaci6n del origen .............................................................................................. 385
Resumen ................................................................................................................................ 386

.
15 Formularios de datos ................................................................................ 388
El asistente para formularios Windows ........................................................................ 389
Selecci6n del DataSet .................................................................................................... 390
Definici6n de la conexi6n ............................................................................................ 391
Selecci6n de 10s elementos de origen ....................................................................... 391
Definir la relacion entre las tablas ............................................................................ 392
Selecci6n de columnas .................................................................................................. 393
Elegir el diseiio del formulario .................................................................................. 395
Personalizaci6n del diseiio .......................................................................................... 396
Antilisis del c6digo generado ..................................................................................... 397
El asistente para formularios Web .................................................................................. 401
Antilisis del c6digo generado ..................................................................................... 402
Aiiadir capacidades de edici6n .................................................................................. 404
Inserci6n de 10s enlaces de edici6n ..................................................................... 404
Eventos y elementos de un DataGrid ................................................................. 405
C6digo asociado a 10s eventos ............................................................................. 406
Actualizaci6n del origen de datos ....................................................................... 408
Resumen ................................................................................................................................ 410

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

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

.

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

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

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

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

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

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

n .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

o bien la utilidad de SQL interactivo del RDBMS con que cuente.2). por ejemplo Microsoft Access (v6a- se figura 2. es necesario que dichos datos existan ya en la base de datos y. no entraremos en este momento en detalles sobre c6mo usar una herramienta u otra. Esto implica que algunas sen- tencias SQL puedan necesitar ligeros cambios segun la base de datos sobre la que vaya a ejecutarse. En cualquier caso. Figura 2. sino que nos centraremos en la sintaxis de SQL. es muy variable. Desde Microsoft Access es posible definir consultas mediante asistentes.4). sin mbs. 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. Esta puede ser el Analizador de consultas SQL de SQL Server (v6ase figura 2. es precis0 definir las estructuras que 10s . ya que permiten la ejecucion de un subconjunto del lenguaje SQL. el Interactive SQL de InterBase (v6ase figura 2. en el pr6ximo capitulo conocera algunas de ellas.S Q L y sus dialectos Puede usar una base de datos de escritorio.3) o bien el SQL*Plus Worksheet de Oracle 8i (v6ase figura 2.2. para ello.1. normalmente se toma como referencia SQL-92 y SQL3.1).

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

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

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

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

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

para aiiadir un nuevo elemento. a1 ser fisicamente las que alojan la informacih. algo que es obvio si la columna se elimina. tipos y opciones. a la hora de crear una tabla en una base de datos. consiste en hacerlo a partir de 10s datos que ya existen en otra tabla. En cualquier caso. tras la cual dispondremos la palabra ADD. corno en el ejemplo anterior. Para crear un indice utilizaria la siguiente sintaxis: CREATE INDEX NombreIndice ON NombreTabla(Co1umna) . sino de una consulta SQL que recuperaria de otra tabla o tablas 10s datos con 10s que se generaria la nueva tabla. 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. o DROP si queremos eliminar- lo. en- tre ellos 10s indices y las vistas. desde aiiadir o eliminar una columna o una restriccibn hasta modificar la definicih original de la columna para cambiar el tipo. Si deseamos eliminar una tabla completa. Las modificaciones a una tabla pueden ser de distintos tipos. la sentencia la iniciaremos con ALTER TABLE N o m b r e T a b l a . 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. para modificarlo. S Q L y sus dialectos Otra posibilidad. ALTER. En este caso el comando CREATE TABLE nombre iria seguido no de una lista de columnas.2 . t a m b i h existen otros elementos de us0 comun.

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

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

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

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

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

'Steven Jobs') AND Precio BETWEEN 3 0 AND 5 0 AND T i t u l o L I K E 'Visual%' . Con el operador LIKE podemos efectuar comparaciones no absolutas entre 10s valores de una columna y un valor dado 0. dicho de otra forma. si queremos obtener todos aquellos libros cu- yo precio se encuentre entre 30 y 50 euros podemos utilizar una consulta como la siguiente: SELECT ISBN.TWEEN 3 0 AND 5 0 No olvide que todas estas expresiones simples pueden combinarse. facilita la busque- da de un cierto patron entre 10s valores de una columna. el patron a buscar. como I N . 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. S Q L y sus dialectos WHERE pueden emplearse elementos adicionales que nos permiten crear condicio- nales realmente complejas. T i t u l o FROM L i b r o s WHERE P r e c i o BE. 'Tit 111o FROM Libros WHERE A u t o r I N ('Bill Gates'. dando lugar a consultas mucho mds elaboradas. a la derecha del operador. Sirve co- mo ejemplo la mostrada a continuacion: S E L E C T 1S BN . 'Paul A l l e n ' . Por ejemplo: SELECT ISBN. Por ejemplo. mediante 10s operadores logicos. 'Steven J o b s ' ) En esta consulta se seleccionan todos 10s titulos escritos por 10s tres autores in- dicados entre parhtesis. Por ejemplo: SELECT ISBN. LIKE y BETWEEN. mucho m6s flexibles. entre comillas simples. Por ultimo tenemos BETWEEN. ' P a u l Allen'. 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. evit6ndonos asi la construccion de tres condicionales con el operador = unidos mediante AND. sin necesidad de especificar el titulo completo. Tras el operador L I K E debemos facilitar. 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'. 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.2. A 10s operadores relacionales cldsicos hay que aiiadir otros.

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

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

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

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

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

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

. bigint. ya que &te opera siempre sobre datos almacenados en una tabla de la base de datos. que utilizaremos tam- bikn a1 efectuar una asignaci6n a la variable o recuperar su valor. en el segundo. en contraposici6n a otros productos como DB2 u Oracle. smallint.varbinary e image). 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 @. co- mo hariamos en Visual Basic. va ganando cuota de mercado en lugar de perderla. la soluci6n debases de datos de Mi- crosoft para pequeiias instalaciones que no requieren la potencia de SQL Server. En realidad MSDE es el nticleo de SQL Server per0 con menos capacidad de co- nexiones y proceso.NET cada DBMS. cadenas de caracteres ASCII (char. decimal.incluso. permitiendo el almacenamiento de un conjunto de resultados. La versi6n de la que nos ocupamos en este apartado es la implementada en SQL Server.NET y que. evaluando expresiones y efectuando operacio- nes. Prograrnacion de bases de datos con Visual Basic . Dicho valor puede ser un valor constante. es precis0 contar con un medio de almacenamiento temporal con el que no cuenta SQL. fechas (datetime y smalldatetime). en el primer caso. entre otros). Dos tipos especial- mente interesantes son table y curs or. Para poder procesar 10s datos. varchar y text). Este lenguaje es aplicable tambien a MSDE. cadenas de caracteres Unicode (nchar. money y float..nvarchar y ntext) y secuencias de datos binarios (binary. En Transact-SQL podemos definir variables de distintos tipos. de un conjunto de datos. mientras que en la segunda contamos el numero de filas que hay en la tabla Libros y guardamos el resultado en la variable. o el recorrido secuencial. Declarada la variable. el resultado de una expresi6n 0. 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. el resultado de la ejecuci6n de una consulta. tenemos a nuestra disposici6n tipos numericos enteros y con parte decimal de distintas precisiones (int. fila a fila. otra variable. En cuanto a1 ti- PO. A conti- nuaci6n 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 . . el RDBMS de Microsoft que acompaiia a las ediciones superiores de Visual Studio . la asignaci6n de un valor se efectua mediante la senten- cia SELECT.

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

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. como va a ver brevemente en 10s puntos siguientes. evaluar expresiones. codificar condicionales y bucles. es posible facilitar un pariirnetro. El lenguaje PL/SQL es a Oracle lo que Transact-SQL a SQL Server. Programacidn de bases de datos con Visual Basic . se obtendria como resultado un nGmero. lo cierto es que sus posibilidades son b6sicamente las mismas. Para crear un procedimiento almacenado se utiliza la sentencia CREATE PROCE- DURE. concretamente el c6digo de una editorial. se declararian 10s pardmetros necesarios para invocar a1 procedimiento. mientras que en caso contrario se totalizan 10s titulos de la editorial indicada. Mediante PL / SQL es posible declarar variables. por ejemplo. A1 ejecutarse este proce- dimiento almacenado. que se encarguen de efectuar sobre la base de datos las operaciones adecuadas. almacen6ndose con un nombre en la base de datos. etc. es la posibilidad de crear procedimientos almacenados. segGn se apuntaba anteriormente. devolvihdose el resultado mediante la sentencia RETURN. desde Visual Basic. desen- cadenadores y funciones.NET Codificacicin dc proccdi icntos alinaccna Una de las razones fundamentales de la existencia de Transact-SQL. es decir. Obviamente. es distinta. bloques de c6digo que. que retor- nen uno o varios conjuntos de resultados 0.incluso. y de manera opcional. crearse un procedimiento almacenado a1 que facilitando una serie de pardmetros se encarga- se de insertarlos en sus respectivas tablas. Aunque la sintaxis. tras la cual dispondriamos el nombre del procedimiento y la palabra AS. el lenguaje mediante el cual pueden codificarse procedimientos almacenados. llamando NumTitulos. Antes de &ta. De no hacerlo. el procedimien- to devuelve el nGmero total de titulos que hay en la tabla. Las sentencias de implementaci6n se introducirian en un bloque B E G I N / END. 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. es posible crear procedimientos mucho mds complejos. Podria. operar sobre ellas. Vamos a seguir exactamente el .

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

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

el tip0 a devolver mediante RETURN . Suponiendo que desedsemos codificar el mismo procedimiento almacenado N u m T i t ul o s usado como ejemplo anteriormente. ELSE S E L E C T COUNT ( I S B N ) I N T O N FROM L . a utilizar sentencias DDL para definir estructuras de datos bdsicas. suponen un extenso campo de estudio y aplica- ci6n sobre el tratamiento de datos en sistemas como SQL Server u Oracle. la lista de pardmetros que recibird el procedimiento.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 . cambiando PROCEDURE por F U N C T I O N e in- dicando a1 final de la cabecera. Ha aprendido. como las tablas. 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 habi- tuales B E G I N y END. el lenguaje SQL. RETTJRN N . BEGIN I F I D E d i t o r i a l =.2. en su lugar. en general. . 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. implementarlo como funcidn. En caso de que necesitemos devolver un resultado tenemos dos opciones: defi- nir un pardmetro de salida en la lista de argumentos del procedimiento 0. S Q L y sus dialectos de c6digo que podemos ejecutar a demanda desde las herramientas de adminis- traci6n o bien desde aplicaciones externas. y 10s deriva- dos de cada RDBMS. Nuestro objetivo era introducirle en ese campo. El funcionamiento y resultado de la ejecuci6n de esta funci6n seria como el des- crito antes para el procedimiento almacenado Transact-SQL. END. Estos pueden tener un valor por de- fecto. opcionalmente y entre parhtesis. no obstante. La creacion de un procedimiento almacenado se inicia con CREATE PROCEDURE seguido del nombre del procedimiento y. END I F . en particular. 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 . de lo contrario se retorna el numero total de titulos. A continuaci6n se dispone la palabra Is. antes de la palabra 1s. Si facilitamos un c6- digo de editorial se obtiene el n ~ m e r ode titulos con que cuenta. aunque apenas araiiando el mundo de po- sibilidades existentes en el. especificado mediante la palabra clave DEFAULT. Como ha podido ver en este capitulo. DML para manipular esos datos y DCL para otorgar y denegar privilegios a 10s usuarios.

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

.'. ....

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

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

~ .NET I I I I Y I Figura 3. creando la base de datos. Figura 3.. . 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." ~ __ Dado el paso anterior. . Crearnos una base de datos Access en blanco . . . . ~ . ~ . mientras que a la derecha se enumeran las opciones que en ese mo- mento hay disponibles en la categoria seleccionada..2. encontrarh una ventana similar a la de la figura 3.2.. . ." ~ ~ ~ . Ventana de trabajo sobre la base de datos .1. Prograrnacidn de bases de datos con Visual Basic.

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

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

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

por no haberse creado previamente en la tabla E d i t o r i a l e s . Programacidn de bases de datos con Visual Basic . 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 . Compruebe que si introduce un c6digo de edito- rial que no exista.7. totalmen- te imprescindible para trabajar con la tabla L i b r o s . Introdu- cidos 10s datos.NET Tab para ir avanzando de una columna a la siguiente y de una fila a otra. En este momento tenemos algunas editoriales en la tabla E d i t o r i a1e s. aparece un mensaje de error como el de la figura 3. Figura 3. Figura 3. introduciendo 10s datos de algunos libros que tenga a mano. creando .7. Esto es la integridad referencial.6.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 da- tos Access con alguna informacih ~ t i para l utilizarla desde ADO.NET. cerramos la ventana para retornar a1 cuadro de didogo de tareas.

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

un servi- dor disponible en varias ediciones en el que es posible utilizar un lenguaje. Para operar sobre MSDE. SQL Server es un completo RDBMS. Visual Basic . indices. en caso de que no disponga de SQL Server. etc. MSDE es el motor de SQL Server pero.com/spain/servidores/ sql/productinfo/evaluate. para programar procedimientos almacenados y desencadenadores. Programacidn de bases de datos con Visual Basic .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. ofreciendo el mejor rendimien- to posible. a diferencia de kste. . Como se indic6 en el capitulo previo. en http: //www. vistas. Es una buena opcion si desea probar este producto. Transact- SQL. asp. valida du- rante 120 dias. no dispone de las herramientas de administracih que vamos a usar en 10s puntos siguientes.microsoft. aparte de poder definirse tablas. I Puede solicitar una version de evaluacion de Microsoft SQL Server.NET cuenta con un provee- dor ADO. En este ejemplo se utiliza la version 2000 del producto operando sobre un sistema Windows XP Professional.

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

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

despliegue la lista adjunta a1 apartado ldentidad para seleccionar el valor S i (no disponible para duplicacion): Por ultimo. en la parte infe- rior. 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.13) aparece el va- lor inicial que tomara esta colurnna. actuando como atributo identidad de cada fila y clave primaria. pulse el b o t h Establecer clave principal. asi como el increment0 que se aplicara a cada fila sucesiva. Titulo y A u t o r : Seleccione el tipo v a r c h a r y deje la longitud por defecto. . tenemos un campo autoincrementado que actua como identificador unico. Seleccione de nuevo la opci6n Nueva tabla para proceder con la creacidn de la tabla L i b r o s . Observe que en la parte inferior (vkase figura 3. En este caso el tip0 v a r c h a r no aporta beneficio alguno ya que un ISBN siempre tiene esa longitud. Desactive la opci6n Permitir valores nulos. 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. Figura 3. obligando asi a introducir siempre el ISBN del libro. Los atributos de la colurnna IDEdi t o r i a l le convierte en el atributo de identi- dad de cada fila. 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. dejando el resto de parametros con sus valores por defecto. En definitiva.12. que es lo que nos interesa en este momento.

Programacidn de bases de datos con Visual Basic . Contendr6 el identificador de la editorial. per0 no cierre aun la ventana. y la columna Editorial de la ta- bla que est6 crekdose. en caso de haberla cerrado.14 (puede volver a ella.Active la opci6n Actualizar en cascada 10s . y seleccionan- do luego la opci6n Diseiiar tabla) pulse el b o t h Administrar relaciones. abrihdo- se inicialmente la p6gina Relaciones. a la izquierda. procediendo asi a la creaci6n de una nueva relaci6n. tal y como se aprecia en la figura 3. En este momento tenemos definidos todos 10s atributos de la tabla Libros.en el panel derecho del Administrador corporativo. En la parte inferior seleccione la columna I DEdi to- rial de la tabla Editoriales. Pulse el b o t h Nueva que hay debajo de la lista combinada Relacion seleccio- nada. Se abrir6 el cuadro de diilogo Propiedades con todas las propiedades de la tabla.NET 1 Figura 3. Se crea autom6ticamente un nombre para esta relaci6n. 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 nu- 10s. haciendo clic con el b o t h secundario del ratdn sobre la tabla Libros. Precio: Elija el tip0 de dato money.13.14. que es Libros. Relacion entre las tablas Encontrandose a6n en la ventana mostrada en la figura 3. para lo cual estableceremos despu6s la relaci6n adecuada.

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

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

de introducirse un c6digo inexisten- te obtendremos un mensaje de error (vkase figura 3. facilite el nombre con el que desea adjun- tarla en su sistema y la cuenta del usuario que figurard como propietario. 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 . . pulse el bot6n Comprobar y. Introduzca el camino y nombre de la base de datos. Figura 3. siguiendo las indicaciones dadas en 10s puntos previos. MOF de la b a r de datosque r va a a M a Cap-03 bbms-Data MDF s PBDDUsualBasicNET~~mplos I 1- I-Nombres ongnaksde lo5 arch UxmM adud de los achvos I Figura 3.17) y la operaci6n de inserci6n no se Ilevard a cabo. finalmente. Como ocurria con Access. Elija la op- ci6n Todas las tareas>Adjuntar bases de datos.17. 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. abriendo el cuadro de didlogo que puede verse en la figura 3. el proceso es algo m6s complejo. Abra el Administrador corporativo de SQL Server. De manera an6loga puede introducir 10s datos de algunos libros. sin embargo. 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.18. abra el servidor local y haga clic con el b o t h secundario del raton sobre la carpeta Bases de datos. no basta con abrirla como haria en Microsoft 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.18. Para utilizarla.

Dicha vista devolverd las editoriales y 10s titulos que les corresponden. el ultimo que aparece en la barra de botones. Vamos a definir una vista que. i. Una de esas posibilidades es la definici6n de vistas. Los pasos a dar son 10s indicados a continuacih: 1. lniciamos la creacion de una nueva vista 2. . 7 * . 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. L - gib.r12 Figura 3.. SQL Server es un RDBMS con todas las posi- bilidades que tienen estas aplicaciones. estableciendo una relaci6n entre ambas tablas. posibilidades algunas inexistentes en Mi- crosoft Access. Haga clic sobre el b o t h Agregar tabla. Seleccione las tablas . inicialmen- te vacias.19. El us0 de las vistas ahorra a las aplica- ciones y usuarios la composici6n de consultas mds o menos complejas para poder obtener 10s datos que necesitan. objetos que se almacenan en la base de datos y ejecutan a demanda de las aplicaciones cuando 6s- tas las abren como si se tratasen de tablas. nos serviri para conocer 10s pa- sos que habriamos de dar en cualquier caso.19. Apa- receri una ventana con varias secciones. aunque simple. como la de la figura 3.NET vista Como se apuntaba anteriormente. Programacidn de bases de datos con Visual Basic . . _ _ _ _ ~- - r 1 . para abrir el cuadro de didlogo Agregar tabla.

Utilice el panel que aparece debajo del diagrama para establecer criterios de busqueda u ordenacion. con su relacion. 4. Aparecen las dos tablas. Pulse el b o t h Cerrar pa- ra volver a la ventana anterior que. Pulse el b o t h Ejecutar.3 . desplegar la lista de la colum- na Orden asociada a la P r e c i o para que 10s datos se ordenen ascendente- mente por el precio.20. Haga clic con el boton principal del rat6n sobre las casillas que aparecen a la izquierda de las columnas Nombre. en este momento.20. mostrar6 el aspect0 de la figura 3. 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. 5. por ejemplo que el precio est6 en un cierto rango. Puede modificar 10s criterios y el orden segun le interese. Aiiadimos las tablas a la vista 3. T a m b i h puede introducir condiciones de busqueda. el resultado. De esta manera las selecciona como columnas para el resultado final. En la base de datos de ejemplo no existen criterios y el orden es el obtenido por defecto. 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. como se ve en la figu- ra 3. Figura 3. en la tabla E d i t o r i a l e s .21. es decir. identificado con un signo de admiracion. y T i t u l o y P r e c i o . para pro- bar la vista y obtener. Observe c6mo esas columnas aparecen en el panel que hay debajo del diagrama y t a m b i h en la consulta SQL. Puede. en la tabla L i b r o s . . en la parte inferior. de m6s baratos a m6s caros. por ejemplo.

21. un blo- que de c6digo con un nombre. Si hace doble clic sobre ella. Programacidn de bases de datos con Visual Basic .NET > BEWEEN 10. ya que un procedimiento almacenado es. Cornprobarnos el resultado de ejecutar la vista 6. todos 10s elementos creados en la base de datos SQL Server han si- do generados mediante asistentes que se han encargado de producir las sentencias SQL adecuadas. veri aparecer una ventana de propiedades con el c6digo Transact-SQL utilizado para crear la vista. A1 crear un procedimiento almacenado. desde el propio Administrador corporativo de SQL Server. 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 . haciendo clic sobre ella con el b o t h secundario del ra- t6n y seleccionando la opci6n Abrir vista>Devolver todas las filas. . Puede ejecutar la vista en cualquier momento. sin embargo. no tendremos m i s reme- dio que escribir el cbdigo.75AND 40 dbo Libros ON dbo Edtormles IDEdibrial = dbo Libros Editwial WHERE (dbo Libros Pieao EFliVEEN10 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. n S Hasta ahora. en el panel derecho del Ad- ministrador corporativo. enviindolas a1 servidor para su ejecuci6n. en si.

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

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

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

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

formando asi un identificador Gnico.28). asi como el SID o identificador 16gico. Para este ejemplo.OraHome8l de nuevo de la lista de programas y seleccione la opci6n Database AdministratiowDBA . En el paso siguiente podrfi elegir entre una base de datos Tipica y otra Perso- nalizada. Este puede tardar un cier- to tiempo y finalizar6 con un mensaje de confirmacihn. En el siguiente cuadro de di5logo debe introducir el nombre global para la base de datos. Act0 seguido apare- cer6 una pequefia ventana (v6ase figura 3.26. 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. La base de datos OracleEi se identiftca inequivocamente mediante un Nombre de Base de Datos Global.3. el siguiente paso serfi la definici6n de las tablas que la formarh. tras lo cual se pone en marcha el pro- ceso de creaci6n propiamente dicho (v6ase figura 3. almacenado en el CD-ROM del producto. lo cual siempre es m6s lento. Origenes de datos Pulse el b o t h Siguiente dejando seleccionada la opci6n Crear una base de da- tos. mientras que el segundo es un identificador simple. El primer0 se suele componer del nombre de la base de datos mAs un dominio. Abra la carpeta Oracle . Deje seleccio- nada la opci6n Copiar 10s ficheros de base de datos existentes del CD y pulse el b o t h Siguiente una vez m6s. IC S Una vez tenemos la base de datos creada y en marcha. llamaremos libros a la base de datos. Oracle puede crear una base de datos nueva copiando las estructuras bfisicas de un modelo ya existente. o bien crean- do dichas estructuras a partir de cero.26. Deje marcada la primera opci6n y pulse de nuevo el b o t h Siguiente.27) en la que se indica el identificador de la base y 10s datos de las cuentas asociadas. como en 10s casos previos. como se ve en la 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.

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

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

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

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

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

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

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

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

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

como en este caso. sin0 un conjunto de datos resultante de una consulta. Es decir. tendremos que utilizar un par6metro de salida. haga doble clic sobre la funcibn. 2. Seleccionar el esquema donde se alojar6 la funcih. Escribir el c6digo de la funci6n en el apartado Source.40. y corrija cualquier error que pu- diera existir en el c6digo. Origenes de datos 1. A1 pulsar el b o t h OK se compilar6 el c6digo y crear6 la funci6n. como hicieramos en el segundo pro- . contiene errores.por el contrario. Si lo que pretendemos devolver no es un valor unico.3 . Crearnos la funcion NUMTITULOS Esta funci6n devuelve un resultado unico. De no ser asi. 3. asign6ndole el valor a devolver en lugar de utilizar la sentencia RETURN. 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. en este caso SCOTT. Si queremos crear un procedimiento almacenado que haga lo mismo. itorla IN INTEGER IIEFALlLT 0) N NIIXEEF. Introducir en la parte superior el nombre de la funcidn.40. Seleccione la carpeta FunctionsSCOTT para localizarla y compruebe que en la columna de la derecha aparece la indicaci6n Valid. dejaremos la pareja de parentesis con el pardmetro de entrada y el resto del c6digo. exceptuando la cabe- cera CREATE FUNCTION NUMTITULOS que ya se da por asumida. de tip0 OUT. para abrir la ventana mostrada en la figura 3. Pulsando el b o t h Compile podr6 saber si la funcion es v6lida 0. lo cual es perfectamente posible. NUMTITULOS en este caso.

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

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

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

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

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

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

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

En InterBase no existe un tip0 de dato con increment0 automatico. existe la posibilidad de crear una secuencia.47. 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 . como extraer el c6digo DDL o acceder a su ventana de propiedades. No obstante. Abriendo su menti emergente podri efectuar diversas tareas. Creacion de la tabla Editoriales desde Interactive SQL Tras ejecutar las dos sentencias puede cerrar la ventana de Interactive SQL. Al igual que en Oracle. y utilizarla en un desencadenador para dar valores unicos a una columna. llamada generador en el caso de InterBase. Volvemos a IBConsole para proceder a la introducci6n de datos en nuestras ta- blas. FOREIGN K E Y (Editorial) R E F E R E N C E S Editoriales(IDEditoria1) I hentrkakd3 AutoMy'oN Figura 3. 2 ) .3 . Haga doble clic sobre la tabla Editoriales. para abrir la ventana de propie- . Ve- ra que las tablas aparecen en la carpeta Tables de IBConsole. no obstante.

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

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

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

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

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

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

por ello. 6 7 Figura 3. sera deducido por ADO. aunque esos datos fuesen 10s ti- tulos o nombres de las propias columnas. tenemos un libro Excel con una estructura similar a las tablas creadas previamente en Oracle o Access. claves. Prograrnacidn de bases de datos con Visual Basic . etc. las relaciones.NET a partir del conte- nido que tengan las celdillas. sin embargo.53.NET Completados estos pasos. no tenemos mds que utilizar las teclas del cursor para situarnos en la celdilla . Usando exactamente el mismo m4todo escribiriamos la informacih de cada fi- la. no es un libro sobre Excel. etc. por ejemplo. sin mds. a1 contar con caracteristicas como el autocompletado. 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. por lo cual obviaremos toda esa funcionalidad y nos limitaremos a introdu- cir 10s datos. a1 escribir 10s titulos de las columnas. la introduccih de datos resulta muy sencilla. ya hemos introduci- do varios datos en cada una de las hojas del libro. Excel no es un RDBMS y la mayoria de estos aspectos no se contemplan. la creacidn automatics de secuencias. El tip0 de cada una de las columnas. Como habra observado. h t e . En el punto anterior. no he- mos indicado en punto alguno el tip0 de 10s datos.

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

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

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

x s d xmlns:mstns="http://tempuri . xsd" e 1eme rl t Fo rmDe f a u 1t = " q u a I i t i ed " xml r.NET El ultimo paso ser6 la inserci6n en la superficie de un e l e m e n t . se conocen como elementos. o r g / l i b r o s . Vi- sualmente el esquema quedaria como puede apreciarse en la figura 3.8 " ?> < x s :s c h e m a i d = " L i b r o s " targetNamespace="http: //tempuri. en el entorno XML. 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> . 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 va- riable. Guarde el documento L i b r o s xsd. x s d " x m l n s : x s = " h t t p : / /www. a1 que llamare- mos L i b r o s . 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 . 0 " e n c o d i ng= " u t f. E d i t o r i a l y L i b r o son tipos de datos. Programacidn de bases de datos con Visual Basic . c) r g / L i bro s . . el elemento L i b r o s hace las veces debases de datos. De esta forma. 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 . a partir de 10s cuales se pueden crear otros o bien declararse variables que. 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 . mien- tras que 10s subelementos indicados serian las tablas que habria en su interior. serviri para establecer la estructura de 10s documentos XML que ac- tuarian como bases de datos. alojado en un archivo inde- pendiente. o r g / L i b r o s . El c6digo del esquema es el siguiente: < ? xml v e r s i o rI= " 1 .w3. esquema que.57. s = " ht t p : / / t e m p u r i .

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

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

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.52</Precio> </Libras> <Libras> <IDLibro>7</IDLibro> <ISBN>84-415-1290-6</SSBN> .JesGs Luque</Autor> <Editorial>l</Editorial> <Frecio>l0.52</Precio> </Libras> <Lib rc s> <IDLibro>l2</IDLibro.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.26</Precio> </Libras> <Libras> <IDLibro>8</1DLibro> <ISBN>84-415-1291-4</ISBN> <TItulo>Guia pr2ctica para usuarios de Visua Studio .3. <ISBN>84-415-1202-7</ISBN> <TItulo>Guia prdctica para usuarios d e Excel 2002</TItulo> <Autor>Francisco Charte/M.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.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.NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0. Origenes de datos <Auto r>Franc i s co Chart e < / Autor> <Editorial>l</Editorial> <Precio>24.

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 # .NET</TItulo> <Autor>Francisco Charte</Autor> <Editorial>l</Editorial> <Precio>l0.NET <TItulo>Guia prictica para usuarlos d e Visual Basic .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> <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.75</Precio> </Libras> <Editoriales> <IDEditorial>l</IDEditorial> .75</Precio> </Libras> <Libros> <IDLibro>b</IDLibro> <ISBN>84-415-1351-1</ISBN> <TItulo>Programacihn c o n Visual Basic . Prograrnacidn de bases de datos con V i s u a l Basic .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.

75 3 84 415-1324-4 Guia practica para usuarm JBuilder Francisco Charte 1 10. 1 5 < / D i r e c c i o r i > </Editoriales> < E d i t o r .04 12 84 415 1202 7 Guia practica para usuarios de Excel Francisco Charte/M.conteniendo el esquema y el documento XML desarrollados como ejemplo en este punto. 1 a p 1a rlt 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.75 18 84 415-1291-4 Guia practica para usuarios de Visua Francisco Charte 1 10.75 4 84-415-1392-9 Programacioncon Visual CX .15 84-7615-234-5 Manual del microprocerador 80386 Chris H.58.52 113 84 415-1132-2 Guia practica para usuarioz de Kylix Francisco Charte 1 10.NET Francisco Charte 1 39 .3 .i a 1e s > <IDEditorial>2</IDEditorial~ <Nornbre>McGraw-Hill</Nombre> < D i r e c c i o ri>E d i f i c i o Va 1r e a 1t y .52 I 14 84-415-1145-4 Introduccion a la programacidn Francisco Charte 1 24.04 .7 84 415 1290-6 Guia practica para usuarios de Visua Francisco Charte 1 10.lesu 1 10.xsd . 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. Introduccion de datos en el documento XML En la carpeta de ejemplosde este capitulo encontrara 10s arChivosLibros .Pappas&William 2 40 Y Figura 3.52 111 84-4151230 2 Manual avanzado Excel 2002 Francisco Charte 1 21.nml* I 1 1 x 2 84-4151136 5 SQL Server 2000 Francisco Charte 1 10.26 10 84-415-1255-8 Guia practica para usuarios de Delp Francisco Charte 1 10.52 19 84-415-1261-2 Programacioncon Delphi 6 y Kylix Francisco Charte 1 37.NE Francisco Charteilorge 5 1 40 6 84-415-1351-1 Prograrnacion con Visual Basic . y L i b r o s xml. .NET Francisco Charte 1 39 I5 84-415-13767 Programacioncon Visual Studio .

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

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

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

.

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

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

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

ge- nerando 10s comandos apropiados de inserci6n actualizacih o eliminacidn. dedicado al estudio de 10s conjuntos de datos.NET Servidor de aplicaciones t I XML I Internet/lntranet Cliente Windows Cliente ligero (web) Cliente Linux Figura 4. conocera algunos detalles sobre 10s DiffGrams.1. En el noveno capitulo. operaciones que se registran temporalmente en forma de DiffGrarns. . modifi- car y eliminar informacih. lntvoduccidn a ADO. Estos sirven para resolver posteriormente con el origen de datos. 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. Es posible insertar.4.

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

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

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

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

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

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

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

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

.

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

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

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

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

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

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

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

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

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

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

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

no obs- tante.NET. Modelo de objetos elementos. ya sea de insercibn. afectando al conjunto de datos. tabla. 0 Relations: Si el conjunto de datos cuenta con varias tablas. 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. Ya que estas clases son de us0 final. una clase en torno a la que exis- ten muchas otras de las que depende. relaci6n o restriccion. Este nombre normalmente se establece en el momen- to de la creacion del objeto DataSet. Estos son: DataSetName: Cada conjunto de datos cuenta con un nombre que le identi- fica. En el noveno capitulo conocer6 con detalle la forma de trabajar con la clase Data S e t y otras relacionadas con ella. Como se indica en la propia ayuda de Visual Studio . La propiedad Tables es una referencia a una colecci6n Da- taTableCollection en la que se encuentran todas las tablas que forman el DataSet. mientras que esta propiedad permite tanto obtenerlo como cambiarlo. Su us0 en la practica. facilit6ndolo como par6metro a1 cons- tructor. la columna. de igual forma que una tabla. Esta propiedad es una referencia a un ob- jet0 DataRelationCollection que aloja todas esas referencias. puede estar compuesto de varias tablas. se dejar6 para m6s adelante. Mediante la propiedad Tables es posible acceder a las tablas de datos. entre ellas ne- cesariamente existirAn relaciones. en 10s puntos siguientes se abordan con algo m6s de profundidad. cada una de las cuales esta representada por un objeto DataTable. se representa con una clase disponible en el 6mbito System. por ahora nos limitaremos a mencionar sus miembros m6s relevantes. obtenerse a partir de un origen de datos mediante el correspondiente adaptador de datos. por tanto. 0 Haschanges ( ) : Devuelve True en caso de que haya alg6n cambio en el conjunto de datos.5. modificaci6n o eliminaci6n. lo que resulta mucho m6s corriente. Data. Un DataSet puede crearse mediante codigo 0.NET. Estos . El conjunto de datos. no tendremos que conocer despuks imple- mentaciones especificas por proveedor. el componente Da- ta s e t es un elemento fundamental de ADO. Las operacio- nes se efectuan en las filas y columnas de cada tabla. vista o procedimiento almacenado tiene un identificador Linico. a fin de que las conozcamos lo suficiente como para PO- der usarlas en 10s ejemplos de posteriores capitulos.

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

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

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

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

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

cl ses. Modelo de objetos II DataTable II DataTable DataSet Figura 5. 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. compuesta cada una de ellas de filas. 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. 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. A1 finalizar la lectura de este capitulo posiblemente se sienta confundido abrumado. Esto no debe preocuparle.5.5. ya que toda esa informaci6 .

nos servird para. Este conocimiento. profundizar en el estudio de cada interfaz o clase en particular. El objetivo del capitulo era familiarizarle con todos 10s elementos mencionados.NET. Prograrnacidn de bases de datos con Visual Basic . 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. que ird afianzando a medida que siga leyendo. ponikdolas ya en prdctica mediante el desarrollo de algunos ejemplos simples per0 demostrativos.NET la puede encontrar rdpidamente en la referencia de la ayuda de Visual Studio .

.

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

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

Instalacion del proveedor ADO.M€TDataFravdef Figura 6.ber ~ ~ %.351 0 MSDN subscr.NET Data Provider for Oracle The MrcroraftC NET Framework Data Provider for Oracle IS an add on S n e (bytes]: 1.NET F F Microsoft .1. Miuosoftaade .2.NET para Oracle . Programacidn de bases de datos con Visual Basic . component ~ to~ the Microsoft ~ NET Frameworkthat i ~ provides ~ accessd to an ~ Last “Pdated: 07J17J2002 Oracle database using the Oracle Call Interface (OCI) as provided by 0 Wel~ometo Downloads Oracle Client software Oracle St Release 3 (8 1 7) Client or later must be supported: NO CDmpOnentDeYelopment I3 Data Access and Databases 1 installed for this o r w i d e r to funaion &Download NET Framework 0 NET show Terrarium and 0 Adive Sewer Pages 0 NET Show LIVE’ From the 0 ODBC NET Data Provider 0 NET Show NET Dwr Win< 0 NET Show Inside the C Figura 6. 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.

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

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

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

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

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

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

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

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

ri e c t 1 3 nT 1 m e o u t ) r 5 3 1 e .4. " & "Data Source-\PBddVisualBasicNET\Capp03\Libros.WriteLine ("CunnectionString='" & ConnOleDb. asi como el nombre cornpleto de kste.nidb" Console. Lbgicamente. .0. Dependiendo .WriteLine ("Se h a establecido la conexion" 1 Console. observe como se establece la cadena de conexi6n asignhdola a la propiedad Connections t ring.Habria conseguido exactamente el mismo resultado facilitando esa cadena como par6metro a1 construc- tor de OleDbConnection.OLEDB. Da t a b a c e ) Co h CorlnOleDb.Co r. si en su sistema el archi- vo est6 en otro punto deber6 modificar el valor de Data Source. > Dim CorlnOleDb As New OleDbConnection ( ) C n n n O 1 e ~ b .ConnectiorlStrlng & 'I "'1 Co rls o 1e . El resto del c6digo est6 incluido en un bloque Try/Catch.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. Conexidn a1 origen de datos Module Module1 Sub M a i n ( ) .C Else ' End I f Catch ' sole. 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. recogiendo asi cual- quier excepci6n que pudiera generarse a1 llamar a1 metodo Open ( ) .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 . Fijese en c6mo se indica el camino en el que est6 el archivo. Tras crear un objeto OleDbConnection. W r i t e L i n e ( I' Da t a b a s e= " & Co nn 01 e Db . incluyendo la extensi6n.

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

que ser6 nuestro caso. Conexidn a1 origen de datos A1 ejecutar el proyecto. . como acaba de ver- se en 10s dos puntos previos. En el equipo donde va a ejecutarse la aplicaci6n debe haberse instalado el software cliente de SQL Server. Tanto Access como Excel son origenes de datos a 10s que se accede localmente. como puede verse.2000 o MSDE. De ahi que la conexi6n sea bastante sencilla. tras efectuar las modificaciones indicadas. bien en el mismo ordenador donde va a ejecutarse la aplicaci6n o en un or- denador remoto al que se tenga acceso mediante una infraestructura de red.5. el resultado deberia ser como el de la figura 6. comunicarse con un servidor que se encargue de efectuar fisicamente la manipula- ci6n de 10s datos. 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. Figura 6.NET y la ultima versi6n de 10s MDAC. La unica diferencia. sin necesidad de utilizar un software cliente para. debe estar en funcionamien- to. es el valor de Conne c t i onS t r i n g .5. 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 .6. ya sea 7. a trav4s de protocolos de red. Para poder conectar con nuestra base de datos SQL Server deben darse 10s si- guientes requisitos: 0 El servidor SQL Server.

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

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

Debe- r6 cambiar esto si modific6 la clase o desea usar una cuenta distinta para conectar. lo cierto es que resulta un product0 . seleccionar la opcion Agregar referencia y aiiadir una referencia a di- cho ensamblado para que el codigo siguiente funcione. " & ~ "Server=localhost. dll no se aAade automaticamente al crear u n proyecto Visual Basic. O d b c .gdb. Prograrnacidn de bases de datos con Visual Basic . no difiere de la explicada en el punto ante- rior para SQL Server. el software cliente instalado en el ordenador donde vaya a utilizarse la aplicacidn y la configuracibn correcta de red para comunicar cliente con servidor.NET para ODBC. Fijese en yue se utiliza la cuenta SYSDBA con la clave de acceso que tiene por defecto. O d b c . la configuraci6n para poder conectar con nuestra base de datos InterBase. como si ocurre con el que contiene 10s ante- riores proveedores de datos. O}. en la configuraci6n utilizada para desarrollar este ejemplo. 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 . A pesar de que la facilidad de us0 del RDBMS Oracle ha ido mejorando de ver- si6n a versibn. D a t a . " & "Database=\PBddVisualBasicNET\Cap_03\Libros. Por lo demis.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 . Asumiendo que la configuraci6n es la correcta. Los cambios a efectuar en el c6digo serian 10s siguientes: 0 Importar el 6mbito M i c r o s o f t . 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.7. D a t a ." & "UID=SYSDBA. siendo precis0 tener el RDBMS en funcionamiento. Inter- Base 6. El ensamblado M i c r o s o f t . En este caso. ya sea en el equipo local en un servidor. 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. el programa deberia producir una respuesta como la mostrada en la figura 6. asi que tendra que abrir el menu emergente del proyecto. donde se encuentra el provee- dor ADO.5 est6 ejecutandose en el mismo ordenador donde se ejecuta el programa. hasta llegar a las actuales 8i y 9i. creada en el tercer capitulo.

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 an-
teriores, pero, para que funcione, es precisa una preparacidn preliminar configu-
rando 10s servicios en el software cliente.

I C:WBddVbua8aricN~CaP~06\o1texlonOdbc\bin\onewionOdbc exe -101 x

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 apli-
caci6n 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 di-
cha m6quina es precis0 instalar el software cliente de Oracle, debidamente configu-
rado para comunicarse con el servidor.
Durante la instalaci6n del software cliente, en mi caso se ha instalado el de Ora-
cle 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 pul-
sar 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 nues-
tro 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 comuni-
cacidn 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 a1 Asistente de Conflguractrin de Red de
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 si-
guiente 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 de-
beria 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 13
informacion facllltada
Detalles
____I__
~ ~ l l l l _ l _ ~ _ _ _ l _ _
~ ___ll-

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 crea-
das 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 ha-
ya definido o le haya indicado su administrador de bases de datos.

Por tiltimo, antes de volver a1 inicio del asistente, tendri que introducir el nom-
bre de servicio local para acceder a esta configuracih. Introduzca Libros y pul-
se 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 re-
ferencia 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 cade-
na de conexibn, entregada a1 constructor, seria "Data Source=Libros ;
User ID=scott; Password=tiger".
0 Habria que eliminar el acceso a las propiedades Database y Connection-
Timeout que mostr6bamos m6s abajo, ya que el proveedor Oracle carece de
ellas, pudiendo mostrar en su lugar el contenido de la propiedad Server-
Version.

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 con-
figuration 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 acce-
derse, 10s unicos par6metros adicionales que se necesitan son el nombre de usua-
rio y la clave.
Si en la comprobaci6n de conexi6n efectuada con el asistente no tuvo proble-
mas, 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 hubie-
se que efectuar, por ejemplo por cambiar el RDBMS de un servidor a otro, implica-
ria una modificaci6n del cbdigo, recompilaci6n y redistribucih de la aplicacih.
Hay disponibles distintas alternativas para evitar este potencial problema, co-
menzando 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 di-
ferentes de DSN:
De usuario. La informacih se almacena en el registro de Windows, concre-
tamente 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.
0 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.
Elegir un tip0 u otro depended directamente de las necesidades de cada proyec-
to. 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, debe-
r6 aparecer un cuadro de di6logo similar a1 de la figura 6.12. La p6gina Contro-
ladores 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 ven-
tana que aparece, con una lista de todos 10s controladores, el controlador Microsoft
Access Driver (*.mdb), haciendo doble clic sobre el. Entonces verii la ventana Con-
figuration 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 ca-
so bastard con pulsar el b o t h Seleccionar y facilitar el camino y nombre del archi-
vo de Microsoft Access que ya habiamos empleado anteriormente como ejemplo.

400601900 Wansoft1
400601900 MmosoftI
400601900 Marsdt
400601900 Marsoftl
1000200 t&msoftI
1000005 IBPhoenu
2 01 22 01 No rnrXCi
400601900 Marsoft1
T&
& kce= rmm) 400601900 t&msoftl[d
1- w

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

WknpaadepSgna 15 T ~ A S I W W ~

rw- rT*ibw _____ ,

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 apli-
cacibn, 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 figu-
ra 6.14. Ha conectado con Microsoft Access mediante ODBC facilitando s610 el nom-
bre de un DSN.
Observe que ahora la propiedad Database facilita el camino en el que se en-
cuentra 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 c6-
digo 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 conec-
tabamos, 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 Propie-
dades 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 sde diredono d
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 op-
c 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 Pro-
perties, en la lista que aparece en el sire, central de la ventana.
0 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.

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 CO-
nexion 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 es-
te 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 ca-
da uno de 10s proveedores ADO.NET es posible conectar virtualmente con cual-
quier 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 In-
terBase, pero tambie'n a dBase, Paradox, Sybase, DB2, MySQL y, en general, cual-
quier base de datos.
Ahora que ya conocemos la sintaxis general de las cadenas de conexih, asi co-
mo 10s miembros de la interfaz IDbConnection que permite abrir, cerrar y com-
probar 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.

.

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

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

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

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

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

Oracledispone de tablas similares. Estas ta- blas pueden ser consultadas. 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. Como intermediario tendriamos que usar un adaptador de datos.. etc.. DB2. Recurra a la documentacion del product0 particular en el que este interesado. Este es un tema del que nos ocuparemos mas adelante.. ninguno de 10s proveedores ADO.. MySQL. algunas de las columnas existentes son TABLESPACE-NAME. como TABLES. . Informacidn de esquema de la base de datos Como se indicaba antes. .NET cuenta con me- dios propios para recuperar la informacih de esquema del origen de datos si ex- ceptuamos lo que acabamos de ver en el punto anterior. En el caso de U S E R TABLES. " . 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. como cualquier otra tabla. . siempre que se cuente con 10s permisos adecuados. Pode- mos ejecutar la sentencia S E L E C T * FROM I N F O R M A T I O N SCHEMA. Tendriamos que definir la cadena de conexi6n con la base de datos. : La obtencion de informacion de esquema de otros RDBMS. ejecutar una sentencia SQL y recoger el resultado que. se efectua de manera similar. etc. . como si ejecutasemos cualquier sentencia SQL de recupe- raci6n de informacih. Ambos RDBMS. . 1lamadasusER TABLES. utilizando sus respectivos pro- veedores. como InterBase. TABLE NAME y TABLE TYPE.l______. en el que existen diversas tablas..-. . cuentan con una serie de tablas especia- les en las que almacenan la informacih de esquema de la base de datos. COLUMNS. por ejemplo._. etc.___~-~.r. 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 ( ) . mediante una sentencia S E L E C T ."I-- Veamos c6mo podemos crear un pequedo programa que nos muestre por conso- la la lista de tablas existentes en las bases de datos SQL Server y Oracle que crea- mos en el tercer capitulo. . . R O U T I N E S . U S E R VIEWS. U S E R CATALOG. _ . en caso necesarioTpara filtrar el resatado. SQL Server y Oracle. .:. con- cretamente en el noveno capitulo. seria un objeto DataTable.~ _ll. . . . PCT -FREE y PCT -USED. son TABLE CATALOG. respec- tivamente. TABLE-NAME. relativas a las tablas.7. .____-_--. -. TABLES. tendriamos que utilizar las sentencias Transact-SQL o PL / SQL. para recuperar todas las tablas de la base de datosTAlgunas de las colum- nas de datos devueltas._ll__-_l_. . como en el caso de Excel . Para recuperar la lista de tablas de una base de datos SQL Server u Oracle. que procediesen..

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

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

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

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

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

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

la recuperaci6n de informa- ci6n 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 . vistas o procedimientos almacenados que entregan esa informaci6n de esquema. 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.3. En el capitulo siguiente conoceremos con m6s detalle esta interfaz y las implementaciones que efectuan 10s diversos provee- dores. no tene- mos m6s que consultar la documentaci6n de referencia y localizar las tablas.NET Server y Oracle. Programacidn de bases de datos con Visual Basic . Figura 7.

.

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

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

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

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

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

con el valor CommandType.Data.4. Recuperacidn de datos Recuperar el contenido de una tabla Partamos. en este ca- so un OleDbCommand. md b " 1 ~ D i m Comando As OleDbCornrnarld = Conexion. TableDirect en la propiedad CommandType y el nombre de la tabla en CommandText. Tab1 e D i r e c t xt = N rnbreTabla D i m Ltct ~ ) As r 0let)bDat~aReader = Cornando.OleDb Module Module1 Sub M a i n ( ~ u e s t r a T a b l a("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 . C . Ejecutado el comando. ExecuteReader ( ) Dim I n d i i P As Byte Fo Next Con5ole. no tendriamos m5s que recuperar las filas en el interior de un bucle controlado por el valor de retorno del mktodo Read ( ) del OleDbDataReader. 'I & ~ " Da t a 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 .8. Suponiendo que deseamos mostrar el contenido de las tablas de nuestra base de datos Access.0.FieldCount . con el m6todo ExecuteReader ( ) . podriamos servirnos del c6digo siguiente: Imports System.C r e a t eComrnand ( ) r )rnand ) .Write(Lector. Read ( ) For Indice = 0 To Lector.1 Console. ya en la prActica.WriteLine(vbCrLf & New String("=".OLEDB.GetValue(1ndice) & vbTab) Next . 6 0 ) ) While Lector. con uno de 10s supuestos mris simples: recuperar todo el contenido de una tabla.rnmandType = LornmandType. Con este fin ejecutariamos un comando. Jet.

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

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

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

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

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

puede contener pardmetros cuyo valor se desconoce en el momento de expresar la propia consulta. el nombre y valor del partimetro. no obstante.-._l"" .-_x_-^_-. lo que sig- nifica que siempre se ejecutan igual y obtienen 10s mismos resultados.-. datos que usando el metodo indicando antes se entregarian a1 constructor de la clase P a r a - m e t e r adecuada..-.... usa el caracter @ para denotar la existencia de un parametro sustituible.. ..__ Las sentencias SQL usadas en 10s ejemplos anteriores son constantes. 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 . 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 ( ) . Los objetos que implementan IDbCommand disponen de la propiedad P a r a - meters. lo que se conoce normalmente como parimetros sustituibles. Este necesita como argument0 el objeto que representa a1 parimetro.. Observe. comentada brevemente antes. por ello._____ .." ~ _ _ ) ."_. por ejemplo. En la sentencia anterior se ha precedido C o d E d i t o r i a l con dos puntos. sintaxis adecuada p a r a o r a c l e 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. _.. como se indico anteriormente. un objeto que seri depen- diente del proveedor. pudiendo afiadirse 10s parimetros que se necesiten mediante el metodo Add ( ) . pore1 con- trario. En principio esa lista est6 vacia..-____ _x . Nota La sintaxis para indicar la existencia de un parametro difiere de un proveedor a otro. Este devuelve un objeto del tip0 adecuado.I .8. Por eso el precio se trata como un Double. Una senten- cia.^__I_. no teniendo mis que asignar. que habrd que definir en algun momento antes de eje- cutar la sentencia. C o d E d i t o r i a l . el proveedor deduce el tip0 de 10s datos a partir del con- tenido de las celdillas. Recuperacidn de datos Al acceder a Excel. tener que reconstruir la sentencia SQL segtin cada caso. _-.. usando sus propiedades. 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 us0 de este tip0 de pardmetros puede permitirnos adaptar nuestra consulta a las indicaciones del usuario sin. .. que mantiene la lista de parimetros nece- sarios para la ejecuci6n del comando. El p r o v e e d o r s q l c l i e n t .

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

ver6 aparecer el ncmero de titulos que corresponden a ese c6digo.6. 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. Recuperacio'n de datos el c6digo necesario para mostrar el c6digo y nombre de cada una de ellas. Si ejecuta ahora el programa. h e devuelve directamente el resultado. En ocasiones. Resultado) Hemos eliminado la declaraci6n del DataReader y la llamada a1 metodo Clo- se ( ) . hay que apuntar que un .ExecuteScalar0 Console. que ahora ejecutaremos asi: Dim Resultado As Integer = Cornando. por ejemplo una suma. e introduce el c6digo de una editorial. contador o algdn otro cdcu- lo.8. el resultado de una sen- tencia de consulta ser6 dnico. atos Aunque el titulo de este capitulo hace referencia expresa a la recuperaci6n de datos. sin necesidad de recorrer filas ni columnas.CornrnandText = "SELECT COUNT(*) FROM Libros " L - "WHERE Editorial=:CodEditorial" A continuaci6n se solicita el c6digo de editorial a1 usuario e introduce como pa- r6metro en el comando. facili- tando asi la selecci6n. aunque podriamos utilizar ExecuteReader ( 1.WriteLine("Esa editorial tiene { O l titulos". resulta m6s fdcil y eficiente utilizar el m6todo ExecuteScalar ( ) . Partiendo del ejemplo del punto anterior. Figura 8. En casos asi. modifique la consulta dej6ndola asi: Comando. y a este tema se dedica la mayor parte del mismo.

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

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

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

StoredProcedure a la propiedad Command- Type del comando.8. segun devuelva un conjunto de datos. definien- do la conexion. ejecutariamos el comando con ExecuteReader ( ) . como ya sabe. 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 = Comando. Hecho esto. como puede verse. P a d R l y h t ( 2 5 ) & vbTab & " T i t u l o s " & vbCrLf & New String("=". creando el comando y abriendo la conexion. 0 Aiiadir a la propiedad properties 10s par6metros que el procedimiento al- macenado pudiera necesitar. por lo que no nece- sitamos saber nada nuevo para ejecutar uno de 10s procedimientos almacenados que tenemos en nuestra base de datos. Tomando como base el ejemplo previo. ExecuteReader ( ) Dim I n d i c e As Byte C o n s o l e . ExecuteSca- lar ( ) o ExecuteNonQuery ( ) .-25}" & vbTab & vbTab & "{1. y modificamos a par- tir de la asignacion de la sentencia SQL. 5 0 ) ) While Lector. lntente ejecutar el procedimiento almacenado NumTitulos. Hemos usado previamente 10s tres m&odos. L e c t o r ( " N o m b r e " ) . La lectura de ese conjunto de datos. W r i t e L i n e ( " N o m b r e " .5}". .Read ( 1 ("{0. 0 Asignar el nombre del procedimiento almacenado a la propiedad Command- Text. Recuperacidn d e datos 0 Asignar el valor CommandType. no difiere de lo que ya conociamos. 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 nu- mero de titulos con que cuenta. un solo va- lor o nada. obtendria el numero de filas afectadas por la operation. mantenemos la primera parte. En este ultimo caso. facilitando 10s parametros necesarios y recogiendo el resultado unico que devuelve.

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

.

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

Mediante objetos D a t a R e l a t i o n . multiples tablas. Cada tabla se compone. Independientemente de esto. Estas clases. a1 tratar las herramien- tas del entorno para el trabajo con datos. afiadir nuevos elementos a las colecciones. mientras que con la coleccion Columns tenemos a nuestro alcance la informaci6n de esquema de cada columna: nombre. En este capitulo utilizaremos siempre conjuntos de datos genericos. respectivamente. pueden recuperarse mediante un adaptador de datos o bien definirse con c6digo. las colecciones de tablas y relaciones se definen autombticamente. etc. 10s conjuntos de datos tan s6- lo cuentan con una clase: D a t a S e t . es decir. exis- tiendo tambien. restricciones y relaciones. Los conocerb en un capitulo posterior. o bien definirse mediante c6digo. En esta clase pueden existir. Cuando se llena un D a t a S e t a partir de un origen de datos. a1 tiempo. Estas. mediante un adap- tador. la posibilidad de resolver 10s cambios con el ori- gen de datos del que se extrajo la informaci6n. mientras que la segunda define la relaci6n entre tablas en caso de que el conjunto est4 compuesto por varias. Cada una de ellas mantiene una referencia a una colecci6n de objetos. Me- diante la colecci6n Rows podemos acceder a 10s datos que contienen las filas. sin embargo. segun se apunta- ba en el quinto capitulo. La tabla tambien puede contar con una colecci6n de objetos C o n s t r a i n t especificando las restricciones aplica- bles a 10s datos. el contenido del conjunto de datos puede almacenarse y recuperarse localmente. alojados en la propiedad R e l a t i o n s . de filas y columnas. Si bien en principio no existen clases derivadas de D a t a S e t. es decir. crear nuevas tablas y relaciones en el interior del D a t a S e t . objetos de la clase D a t a S e t . . mediante un adaptador. Nada nos impide. Es algo que veremos en la prbctica posteriormente. con sus filas y columnas. de la clase D a t a T a b l e . como es 16gic0. derivadas de D a t a S e t . representadas por las colecciones Rows y Columns. 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. serian conjun- tos de datos con comprobaci6n de tipos que facilitarian el acceso a 10s datos com- probando.9. se establecen 10s enlaces entre las tablas que forman parte del D a t a S e t . 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 . a1 igual que el contenido del resto del D a t a S e t . Conjuntos de datos implementaciones especificas para cada proveedor. Un conjunto de datos puede obtenerse a partir de un origen de datos. Visual Studio . Aunque podriamos crear estas clases manualmente.NET dispone de asistentes que se ocupan de hacerlo. 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 . que Gstos Sean de 10s tipos apropiados. La primera es importante ya que nos permite recuperar y modificar la informaci6n almacenada en el conjunto de datos. como ya sabe. tipo.

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 Data-
R e l a t i o n . Puede recurrirde nuevo a el si es que necesita recordaralgun pun-
to 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 se-
lecci6n 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 en-
tre mayusculas y minusculas. Este comportamiento est6 controlado por la propie-
dad 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 re-
cuperar 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 imprescindi-
bles 10s adaptadores de datos, introducidos tambien en el quinto capitulo. Un
adaptador de datos actua como intermediario entre el origen de datos, con depen-
dencias de cada product0 particular, y el D a t a S e t , que tiene una estructura total-
mente independiente.

9. Conjuntos de datos

La relaci6n entre 10s distintos elementos relacionados con adaptadores de da-
tos, 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&, tam-
bien tienen en comun la implementacih de la interfaz IDbDataAdapter.

/
-elo
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 ta-
Adapter, 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 ser-
vir 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 co-
nexion ni tiene un comando de recuperaci6n de datos. Seria precis0 asignar
posteriormente un objeto Command a la propiedad SelectCommand, faci-
litando un comando de selecci6n ya asociado a una conexi6n.
U n objeto Command. El adaptador se crea ya asociado a1 comando que se en-
trega 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 selec-
ci6n, 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 apro-
piado, estableciendo todas sus propiedades.

A diferencia de lo que ocurria con 10s lectores de datos, un adaptador no re-
quiere 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 de-
finido, para ejecutarlo y obtener 10s datos en el DataSet no tenemos m6s que in-
vocar 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 in-
terior se crearia, con el resultado de la sentencia de seleccibn, un DataTable lla-
mado 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 va-
lor que tengan las propiedades MissingMappingAction y MissingSchema-
Action 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 es-
quema que pudiera derivarse del origen, pudiendo tomar uno de 10s cuatro valo-
res indicados en la tabla 9.2.

9. Conjuntos de datos

Tabla 9.1. Valores posibles de la propiedad MissingMappingAction

Valor Comentario

MissingMappingAction.Ignore Los datos no coincidentes se ignoran
MissingMappingAction.Error Se genera un error en caso de encontrar
datos no coincidentes
MissingMappingAction. Passthrough Todo dato no coincidente se agrega a1
DataSet

Tabla 9.2. Valores posibles de la propiedad MissingSchemaAction

Valor Comentario

MissingSchemaAction.Ignore Se ignora la inforrnacion de esquerna
adicional
MissingSchemaAction.Error Producir un error en caso de que se en-
cuentre inforrnacion adicional
MissingSchemaAction.Add La nueva inforrnacion se aiiade a la ya
existente en el DataSet
MissingSchemaAction.AddWithKey Lo misrno que el anterior, per0 aiiadien-
do 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 mo-
mento con el contenido del Data S et, incorporando, ademis, informacih de es-
quema relativa a las columnas que forman la tabla.

Si se llama al metodo Fill ( ) facilitando un DataSet vacio, alg0 muy ha-
bitual, 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 pro-
piedades Sean esos y no otros. Podria ocurrir, sin embargo, que tuviesemos un
DataSet con una cierta estructura ya definida, caso en el cual podria intere-
sarnos recuperar informacion en 10s DataTable ya existentes, sin aiiadir na-
da. 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 recu-
pera por defecto, deseamos tambikn que se obtenga la relativa a las columnas cla-
ve, 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 aque-
llas 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 fi-
las 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 sen-
tencia de insertion, actualizacion o borrado. Estas sentencias se encontrar6n almace-
nadas 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 ( ) , GetUp-
datecommand ( ) y GetDeleteCommand ( ) que, como puede suponer, devuelven
las referencias a 10s Command ya preparados.

Component 1
I I I
OdbcCommandBuilder
I
OleDbCommandBuilder

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 sim-
ple 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 resulta-
do 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 mo-
delo de objetos empleado para acceder a un origen de datos, llenarlo con informa-
ci6n 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 Ila-
mar a1 metodo Update ( ) , el DataAdapter haria us0 del CommandBuilder pa-
ra 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 es-
tad0 de cada DataRow de la tabla para determinar si necesita 0 no ser actua-
lizada. 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 Ila-
mar 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 operacio-
nes 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, conti-
nuaremos 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 pre-
parar 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
de cada tabla que contenga el Da 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 da-
tos, en este caso SQL Server, que procesa las dos sentencias SQL facilitadas de ma-
nera 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, den-
tro 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, excep-
ci6n hecha de SQL Server. El mismo resultado anterior podria conseguirse usando
dos adaptadores de datos independientes, uno para cada comando, y sendas lla-
madas 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 meto-
do Fill ( ) el nombre que deseamos dar a 10s DataTable. Otra opcidn seria aria-
dir 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 esta-
blecido ninguno, y el nombre que deseamos dar a1 DataTable.En cualquier caso,
a1 ejecutar el programa tras estos cambios el resultado sera practicamente identi-
co, 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 infor-
macidn de esquema (el nombre de las columnas) y de datos contenidos en las ta-
blas. 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, lon-
gitud maxima, valor por defecto, etc. No se obtienen, por el contrario, las restric-
ciones 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.

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

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

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

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

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

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

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

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

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

Para verlo en la practica. 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 . muy similar a1 usado en un ejemplo anterior.NewKow( ) 1 e r A t e( " N ~ ~ r n b r e " ) " F i l i ~ ~ i Fr i~r l ~o "~ . recibe como parimetro una referencia a un D a t a S e t y muestra por la consola su estructura. por ejemplo.te("Telefor. se producira la correspondiente excepci6n. 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. y facilitado el contenido de las tablas que lo componen. r t _ _ I -- Independientemente de c6mo se haya creado la informacion de esquema del D a t a S e t . 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 . r i a l .icier. vamos a aiiadir a1 programa compuesto por 10s dos bloques de c6di- go previos. a1 que llamaremos InformacionEsquema ( ) . introducidos en el metodo Main ( ) .9. A d A ( E n t r a d a ) I'acierlte = Pdcientes. ROWS . Ocu- rrir6 esto si. 12" P. dos metodos adicionales. 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 refe- rencia a un paciente inexistente. el metodo para obtener esa informacion y contenido son 10s mismos que ya conocemos. RI ds . implicita o explicitamente. ROWF. 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. El c6digo de este metodo. El pri- mero.r~r")= " 1 2 3 4 5 6 789'' P a c i e n t e s . " ) = " P e r . 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 ) .

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

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

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

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

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

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

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

.

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

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

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

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

.

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

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

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

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

Programacidn de bases de datos con V i s u a l Basic . bAsicamente. implementan la interfaz IBin- dingLis t que hace posible la vinculaci6n con componentes de interfaz.2 se ha representado esquemiiticamente la base de estas dos clases y la implementacih de la citada interfaz. Relacion de las clases DataView y DataViewManager . actualizando la informaci6n mostrada a1 usuario.2. 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. relacionadas entre si. Ambas clases. usaremos la clase DataViewManager en lugar de Dataview. Un ob- jet0 DataViewManager consiste. en el interior de un DataSet. Gracias a ella es posible.1. por ejemplo. la notificaci6n de cambios por parte de la vista de da- tos a 10s componentes de interfaz. MarshalByValueComponent IBindingList Figura 10. En caso de que tengamos m~ltiplestablas.NET Figura 10. DataView y DataViewManager. En la figura 10. en una colecci6n de Dataview. pudiendo aplicarse cada uno de ellos a un DataTable del DataSet.

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

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

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.10. como en todos 10s ejemplos previos. con algunos ejemplos sencillos per0 demostrativos. Relaciones y vistas Como siempre. apren- derzi a crear vistas y enlazarlas con componentes de interfaz sin necesidad de es- cribir codigo alguno. ___ Nuestro primer ejemplo tiene el objetivo de conseguir un resultado identico a1 del programa de la figura 10. de un nuevo proyecto de tip0 Aplicacion de consola usando el lenguaje Visual Basic . "Libros") D i m VistaTotal A s New - DataView(Datos.A partir de este punto nos centraremos en ver c6mo utilizarlas en la przictica.Tdblesi"llbros"). A partir de ahi. en 10s capitulos dedicados a1 us0 de las herramientas de Visual Studio . Data RowView y Da t aVi ewS e tting.NET. D i m Datos AS New DataSet ("MlsDatos") AdaptadorLibriJs. Nos sirve. - " 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. DataViewRowState. 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 " . "Titulo".. CIr l e x i b r l . .1. empiezan los cambios. itial C a t a l i " U S C . la primera parte en la que se definia la conexion.Da taVi ewMana ge r. por tanto. en la documentaci6n de Visual Studio . ~ID=sa. el adaptador de datos y se creaba el Data S e t con la informacion de la tabla L i b r o s . per0 usando multiples vistas sobre la misma tabla en lugar de emplear el metodo Select ( ) de 6sta. Da taView. Posteriormente. . como se ve en el c6digo si- guiente.CurrentRows) . Sub I 4 a i n ( ) Di ect i o n ! - .NET.F i l l (Datos.NET encontrarh la infor- maci6n de referencia relativa a cada uno de 10s miembros de las clases menciona- das.

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

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

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

W r i t e L i r i e ( " { 0.DefaultView.61".10.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 . ColurnnNarne) Next C o n s o l e . D e f a u l t v i e w ( I n d i c e ) "Editorial"). MiTabla. D e f a u l t v i e w ) . Relaciones y vistas Imports S y s t e m . M i T a b l a . I n i t i a l Catalog=Libros.ReadLirle ( ) MiTabla." & Columrla.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 .Tables("Libros") D i m Columna As DataColumn D i m NornbreColumna As String D i m ValorBuscado As String Cons o 1e . - MiTabla. F i n d ( ValorBuscado ) If I n d i c e <> -1 Then Console. ? Corlsole.DefaultView(Indice) "Titulo"). W r i t e ( " I n t r o ~ u z ~ea l nc mbrc de l 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. 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. - MiTabla. D e f a u l t V i e w ( 1 n d i c e ) "Precio") 1 End If End Sub . D a t a . " & - "U s er I D= s a .S3rt = NombreCclumna M u e s t r a F i l a s ("Todas las filas". 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 Def a u l tView . W r i t e L i n e (vbTab & " . 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. C o l u m n s C o n s o l e . C o n e x i o n ) r .5 0 1 { r 3 1 {2..

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

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

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

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

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

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

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

.. .~ .

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

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

. Wointei.1. 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 .lSSUeS feedback 1mwxmLxinclude Lornrnents i i h K information Ss! Proposed Recommendationissued 10 August 2001 . and Nariieswaces. Prograrnacidn de bases de datos con Visual Basic . see Nearby XML Protocol XML Schema XML Querf XLink. XML Base DOM PDF CSS YSL XHTML ~ _ MathML SMlL _ Sianature and Canonicalization XML Working Drafts Follow the links above for details about the drafts issued by the XML Query...ML Activitv Stateniwt explains the W3Cs work on this topic in more detail For related work. XML Schema. S e d e del W3C dedicada al lenguaje XML . 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 Figura 11. W3C RecommendationFeb '98. XML /nc/usims j%/nziudel Last Call working dmtt issued16 May2001 reauirernents section of original proposal worlang group XML Core . 1 a p 1ant a < / Di re cc ioTi> </Editoriales> </Libras> Extensible Markup Language (XML) Core Drafts Develowei Discussion EwntslPubs (translationsl Software Test Sulte BX!!ma& The Extensible Markup Language (XML) is the unlversal format for structured documents and data on the Web \\ML en f 0 nuinrs explains XML briefly The base specifications are XML 1 0.Jan '99 The . and XML Linlang WGs The documents listed below are the working drafts issued by the YML Core working group .NET </Libras> <Libras> <IDLibro>G</IDLibro> <ISBN>84-415-1351-l</ISBN> <TItulo>Prograrnacihn con Visual Basic .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.

o bien un esquema XSD. X M L Los documentos XML deben estar bien formados y ser viilidos. T i t . haciendose referen- cia a el desde el documento XML mediante la marca < ! DOCTYPE>. Una DTD es un documento. A pesar de que a partir del contenido de un documento XML. 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-. las DTD y 10s esquemas XSD. Que un documento XML sea o no viilido dependerii. si deseamos estar seguros de que 10s datos introducidos tienen 10s tipos adecuados y que la es- tructura es siempre la correcta. si bien en este aspec- to las limitaciones son bastante importantes. segundo. sin importar cuiiles Sean ni su longitud. como el mostra- do en el punto anterior. Estos elementos. seria el siguiente: <!ELEMENT L i b r e r i a ( L i b r o s . es relativamente fiicil deducir su estructura. todos 10s atributos se introducen entre comillas dobles y el documen- to cuenta con un solo elemento raiz en el que estan incluidos todos 10s demas. El fragment0 anterior. conocido como DTD. A u t o r . en el que se describe la estructu- ra de 10s elementos de un documento XML. Un documento est6 bien formado si todas las marcas de apertura cuentan con sus respectivas mar- cas de cierre. E d i t o r i a l . de que este bien formado y. ISBN. no basado en XML. P r e c i o )> <:!f<LEMENT I D L i b r r .11. por ejemplo a1 no contar con tipos de datos mas especificos ya que en #PCDATA entra cualquier secuencia de caracteres. ( # P C D A T A ) :' < ! 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. definiendo una estructura similar a la del documento XML previo. primero. en un archivo con extensi6n d t d . por lo que un analizador XML podria leerlo y extraer datos sin mayores problemas. es un documento bien formado. 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 .ria It ) > < ! KLEMENT E d I t (3r i a 1 ( I DEdi t o r i a 1.El inconveniente de las DTD es que no siguen la sintaxis propia de XML y no son demasiado flexi- bles. se utilizan para vali- dar documentos XML y verificar que son apropiados para la aplicaci6n que debe procesarlos. por ejemplo. Un ejemplo de DTD. fistas son normas del propio lenguaje XML y que.mbrc ( # P C D A T A ) > < !ELEMENT Direction ( # P C D A T A ) > Esta definici6n puede colocarse a1 inicio del propio documento XML o bien al- macenarse separadamente. tendremos que servirnos de un documento de de- finici6n de tipos. debe cumplir cualquier docu- mento XML. por tanto.i r l o . que su estructura concuerde con la definida en una DTD o es- quema XSD. Norrtbr e . asi como su tipo. .

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

.

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

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

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

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

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

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

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

.

Este lenguaje. . C u r r e r l t . para seleccionar 10s datos. gracias a XSLT.8. -- Los documentos XML pueden ser transformados en documentos de otro tipo. con instrucciones de pro- ceso XSLT tales como template. 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 . El proceso se basa en la cons- trucci6n de una plantilla XSLT que. Prograrnacio'n de bases de datos con Visual Basic . Re c u 1t a d o . C o u n t 1 While R e . 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. Writ e L i r ~ ie" i 0 J " . Load ( " L i b r o s . segun se anotaba en un punto previo. M c v e N e X t i ) Con sole . Va 1ue ) End While End Sub End Module Figura 11. Select ( " / I .. u l t a d o .. En esa plantilla se combinan expresiones XPath. for-each o value-of.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 . Lista de titulos de la editorial con codigo 1 __ __ -I_^_ __. se encuentra definido en especificaciones del W3C y . como to- do lo relacionado con XML. tras ser procesada por el analizador XSLT.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 . ge- nera el nuevo documento a partir de la informaci6n de origen. Rei 1 1 1t 41.

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

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

el us0 de XPath o XSLT pueden ser mejores opciones. y. bfisicamente. como GetElementFromRow ( ) o GetRowFromElement ( ) .51 hIaiiual aLanzado Excel 1001 1 1 04 Guia piactica pata us~iaiiohde Delphi 6 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 .5. El constructor de la clase tambien puede tomar como parfimetro un Data S et.9. 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. 10. como recuperar un documento XML y recorrerlo. y algunos metodos. consul- tas SQL y generar 10s documentos mediante ASF'. Burqueda Fa. El caso inverso tambien puede darse. Podriamos usar vistas. Documento HTML generado a partir de la transformacion XSLT Segun se aprecia en la figura 11. Podemos obtener un documento XML desde una aplicacion externa. manipular su contenido como si se tratase de un conjunto de tablas de datos.NET pero. 11. que facilitan la obtencion de un elemento XML perteneciente a una cierta fila del Da- taset o viceversa. por ejemplo a traves de Internet. &rihiio Edcian yer Faioitos !erramentar a/& I . crefindose la vinculacion entre conjunto de datos y documento XML de manera inmediata. en ciertos casos. A 10s miembros heredados. Cap-1 liiransfolmacion bm eeiultado ~ . . ~ 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 . ~~~ 1____ HPC _ _ _ ~ Figura 11. .'5 L'aei Interface Dshigii for Propianinisrs 31 EQL \ m e i 2000 10 -5 IL--------- LItO ~ ___. . XmlDataDocument afiade un propiedad. Xml DataDo cument es una clase derivada de XmlDocument por lo que. X M L DataSet para su presentacion a traves de la Web. DataSet. ya contamos con todos 10s miembros de &a y sabemos. mediante la sin- cronizacion con un DataSet. en principio.

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

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

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

La posibilidad de enviar conjuntos de datos en formato XML tambien es util en- tre aplicaciones .Count) E n d While E n d Sub E n d Module A1 ejecutar el programa. Resultado. con el fin de que se aplique una transformaci6n generando una tabla HTML con 10s datos de 10s libros. Como ha podido ver en este capitulo.11. ver$ en un primer momento. y asumiendo que la conexi6n con el origen de datos es satisfactoria. con gran simplicidad. 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 .Puede ampliar el programa. y viceversa. 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. la integraci6n entre XML y ADO. como se aprecia en la parte inferior de la figura 11. especialmente en 10s ultimos puntos.WriteLine("Hay { O } t i t u l h s " & vbCrLf.NET. ya que 10s conjuntos de datos pueden producir flujos de datos XML adecuados para ser remitidos a aplicaciones externas. Los bene- ficios que se obtienen son muchos.NET es tan estrecha que 10s conjuntos de datos pue- den tratarse como documentos XML. invirtihdose el proceso cuando es nuestra aplicaci6n la que actua como receptora.NET.11. Tras pulsar Intro se enumeraran 10s titulos de 10s li- bros pertenecientes a la primera editorial. que no trabajan con ADO. o basarse en 61 para crear otro. como aparece toda la informaci6n por la consola en formato XML.

Figura 11.11. invirtihdose el proceso en el destino.NET remoto.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 . En casos asi el conjunto de datos se convierte en XML para ser transmitido por la red.

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. como se ha demos- trado en el ultimo punto.11. . En ocasiones una busqueda de datos. X M L Por ultimo. no hay que menospreciar la posibilidad de emplear tkcnicas como XPath y XSLT sobre informacih almacenada en un Data S e t.

.

.

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

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

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

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

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

A medida que vaya conociendo todos 10s elementos.NET estuviese disponible.12. Capacidades de datos e n V i s u a l Studio . veri c6mo una parte impor- tante del c6digo que en 10s ejemplos de capitulos previos introduciamos manual- mente. o a cualquier origen para el que exis- ta un proveedor OLE DB.NET nativos para Oracle y ODBC aparecieron despues de que Visual Studio . vistas. Vinculaci6n de conjuntos de datos y vistas con componentes de interfaz Windows y Web. desde el Explorador de servidores. acceder a una base de datos Oracle usando el pro- veedor OLE DB correspondiente.NET. vistas y procedimientos almacenados. en las ediciones superiores. adaptadores de da- tos y objetos D a t a S e t con comprobaci6n estricta de tipos. en 10s capitulos siguientes se abordard el us0 de las herramien- tas visuales de datos y muchos de 10s componentes que pueden vincularse con un D a t a S e t. introduciendo el us0 del Asistente para formularios de datos. Us0 de 10s diversos asistentes de Visual Studio . Nada nos impide. puede accederse nativamente a un servidor SQL Server para operar sobre el. etc. I Asumiendo que estamos trabajando con una de las ediciones Enterprise de Vi- sual Studio . Diseiio de formularios de visualizaci6n y edicidn de datos tanto para inter- faces basadas en Windows como para clientes Web.NET para la generacih semi-automAtica de comandos SQL para la creaci6n y modificacih de con- sultas. Diseiio. por ejemplo para definir una conexibn. 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. Generaci6n automatica de conexiones a origen de datos. sin embargo. procedimientos almacenados. D a t a V i e w 0 similar para facilitar la presentaci6n y manipulacih por parte del usuario final. por ello desde el Explorador de servidores.NET Los proveedores ADO. un adaptador de datos o un conjunto . de nuevos elementos tales como tablas. observando el resultado desde el propio entorno de Visual Studio . aunque en el codigo despues utilicemos el proveedor O r a c l e C 1i e n t .NET sin necesidad de recurrir a la herra- mienta de administracidn propia de cada producto. per0 no puede hacerse lo mismo con Oracle.

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

.

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

.

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

El nombre con el que aparecerd la nueva conexi6n. tras crearla. sin necesi- dad de usar el software cliente de Oracle.NET. al desplegarla en el Explorador de soluciones. en el Explorador de servido- res. Tras crear una conexion con un RDBMS es posible que. En 10s ejemplos de capitulos previos el servicio era L i b r o s . en caso de que ya no le sirva. asi como el nombre de usuario y la clave. como se aprecia en la figura 13. finalmente. aparece una ventana solicitandole la identificacion. lntroduzca el mismo nombre de usuario y clave que us6 a1 definir la conexion. Herramientas visuales de datos Figura 13.3. podra tanto modificar sus parametros como eliminarla. introduciendo en la pAgina Conexion el nombre del servicio local Oracle que cre6 con el software cliente. 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.4. . 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 . pulse el b o t h Aceptar para finalizar la definici6n de la conexi6n.13. A1 desplegarla ya tenemos acceso a todo el conte- nido de la base de datos desde el propio entdrno de Visual Studio . Usando el menu emergente asociado a una conexion.

A partir de ese momento. Programacidn de bases de datos con Visual Basic .4. Por ello.6. En la ventana que aparece. podr6 operar sobre el nuevo servidor de forma remota. simple- mente introduzca el nombre de la maquina 0. segun puede verse en la figura 13. 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. Si tenemos nuestro servidor ejecutandose en el mismo equipo donde estamos usando Visual Studio . he de registrar lnspiron como servidor adicional. para usar desde Visual Studio . similar a la mostrada en la figura 13. tendremos que registrarla como un nuevo servidor.Sermos de Crystal + ‘9 Sei. 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. @ dimension + & Colas de mensajes + a Contadores de rendimiento + @. no tenemos m6s que desplegar dicho nodo para acce- der a las bases de datos.NET + Diagramas debase de dabs + ‘$Tablas + & smonimos + i& v1stas + B Procedtmientos ahacenados + b Funomes + Espafieoones del paquete + @ Cuerpos de paquete . siempre que en dicha otra maquina tenga las credenciales apropiadas.5. directamen- te su direcci6n IP.NET. mientras que SQL Server lo hace en otro llamado Inspiron. Servidores .NET las posibilidades de diseiio que me ofrece el Explorador de servidores. Visual Studio . si SQL Server se encuentra en una ma- quina distinta.NET se ejecuta en un ordenador llamado Dimension. He- cho esto tengo un acceso completo al servidor SQL Server que se encuentra en esa otra maquina.idores SQL Server Figura 13. aunque se encuentre a miles de kil6metros. no necesita- mos definir una conexi6n para acceder a 61. En mi configuraci6n particular. Regirbos de eientos + % Sermos + f. si lo prefiere y la conoce. En caso contrario. En ella se aprecia c6mo se ha conectado con el servidor y desplegado la base de datos L i b r o s . Los servidores SQL Server aparecen como elementos en el nodo Servidores SQL Server del equipo donde se encuen- tren. . en la que apare- cen varias carpetas.

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

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

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

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

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

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

Puede pulsar el b o t h Mostrar panel de diagrama. Herramientas visuales de datos I) Figura 13.13. como en el caso anterior. Una alter- nativa es pulsar el b o t h Mostrar panel SQL y editar directamente la sentencia SQL que se desea ejecutar. posiblemente no necesitemos tener visibles todas las columnas. tendri .13. 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. para abrir un esquema visual en el que se aprecia la relacidn entre ambas tablas y.%to Figura 13. puede marcar y desmarcar las columnas que desea tener visibles. Agregamos la tabla E d i t o r i a l e s . el primer0 contando desde la izquierda. sin0 simplemente efectuar alguna comproba- cidn.12. Para ver el resultado. ade- mAs.

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

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

.16.NET neradas. per0 sin llegar a pulsar el b o t h Ejecutar consulta para evitar. estableciendo asi un criterio de ordenacih. 0 Abra el Panel de diagrama y seleccione de la tabla Editoriales la colum- na IDEdit o rial. 0 Pulse el b o t h Agregar tabla y seleccione la tabla Editoriales. la eliminacih de 10s datos. por ejem- plo. 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.Teniendo &a seleccionada. Modificamos el tipo de sentencia SQL Si tiene como parte de la consulta alguna expresi6n de resumen. y asumiendo que aun no ha abierto ninguna tabla. Partiendo desde el Explorador de servidores. pulse el b o t h Orden ascen- dente. puede agrupar las filas de datos segun el valor de una cierta columna para obtener un resultado agrupado. I __ - INTO Editonales Editonales = Edtoriales i M I a Figura 13.

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

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

puede activar la opci6n Generar automaticamente secuencia de co- mandos de cambio al guardar para que. est6 relacionin- dose la tabla TABLA3. con la tabla TABLA1. Herramientas visuales de datos desea. que tuviksemos seleccionada en ese momen- to. En ella podemos establecer la relaci6n que esta tabla tenga con otra. este b o t h nos llevar6 a la p6gina Relaciones de la ventana de propiedades de la tabla.18. Podemos tanto modificar la estructura de una tabla existente como crear nuevas tablas Figura 13. o columnas. En la figura 13. se genere autom6ticamente esa secuencia de comandos cuando haya finalizado el diseiio. De esta manera se crea una clave externa. en la secuencia de comandos SQL.que presumiblemente va a registrar movimientos de cuentas.19. una restriccih de clave primaria y otra que impide la introduccih de valores nulos.21. I Figura 13.13. sin necesidad de volver a pulsar este b o t h . . y las relacio- nes existentes entre ellas. 0 Relaciones: En caso de que estemos disefiando multiples tablas.que contiene 10s datos de cada cuenta. por ejemplo. Esto produce. 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.

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

La primera permi- te modificar la definicion de una vista existente. . Puede desplegar la carpeta Vistas de la ba- se de datos SQL Server u Oracle y hacer doble clic sobre la vista LibrosPorEditorial que se habia creado como ejemplo en un capitulo previo. Herramientas visuales de datos 0 Administrar restricciones Check: El 6ltimo de 10s botones nos lleva a la PA- gina Restricciones CHECK de la misma ventana de propiedades (vease figu- ra 13. mientras que ahora lo hacemos todo desde el propio en- torno de Visual Studio . o a cualquier otra. Recuerde que en el tercer capitulo usdbamos herramientas especificas para efectuar estas tareas. tras cerrar las ventanas de disefio y responder afirmativamen- te a la pregunta de si se desean guardar 10s cambios. veremos dos opciones especialmente utiles: Diseiiar vista y Nueva vista.22).22. per0 mostrando el resultado de la consulta que define la vista. mientras que la segunda crea una nueva vista. Verd que el resultado es una cuadricula de datos. como la de una tabla. podemos editar su contenido como con cualquier otra tabla. Si abrimos el menu emergente asociado a esa vista. en la que podemos definir restricciones adicionales que pudieramos necesitar. Figura 13. Creadas las tablas.13. 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 .NET.NET como si de una tabla normal se tratase.

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

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

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

13. Herramientas visuales de datos

Si utiliza la opcion Nuevo procedimiento almacenado para crear nuevos proce-
dimientos, 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 da-
tos 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 uni-
ca novedad es que en lugar de crearlos mediante cbdigo, como en capitulos pre-
vios, 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, Oracle-
Connection 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 Microsoft Data Odbc Miaosoft.Data.Odbc (1.0.3300.G)
mOleDbCommand System Data OleDb Svrtem.Data (1.0.3M0.0)
OleDbCommandBuilder System Data OleDb System.Data (1.0.3M0.0)
~OleobComecbon System Data OleDb System.Data (1.0.3M0.0)
mOleDboataAdapter System Data OleDb Svrtem.Data (1.0.3M0.0) I
OpenFileDialog System hindows Foimr System.Wmdows.Fams (1.0.330.0)
OOradeCommand System Data OradeClient System.Data.OradeClient (1.0.3330.0)
DradeCommandBuilder System Data OradeClient System.Data.OradeCbent (l.G.3M0.0)
mOradeConnecbon System Data OradeClient System .Data .OradeClient (1 .0 ,3300 .0)
OradeDataAdapter System Data OradeClient System .Data .OradeClient (1 .0 ,3330 .0)
. . . - -
. -.. . . fY’

7
I

- - __ .--. . . ...I !.>I

I/ 1 II

I/
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 co-
mando, 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 com-
ponente 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 venta-
na 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 Nue-
va conexion para abrir el cuadro de diilogo Propiedades de vinculo de datos y de-
finir las propiedades de la conexi6n.

El componente Sqlconnection se comporta practicamente de forma identi-
ca a OleDbConnection,de tal forma que la propiedad connectionstring
tambien muestra la lista desplegable con la opcion Nueva conexion. Los com-
pOnenteS OracleConnection y OdbcConnection, por el contrario, no dis-
ponen 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 Connec-
tionst 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 ade-
cuado. En este ejemplo mantendremos 10s nombres por defect0 que tienen 10s com-
ponentes a1 ser insertados.
Tras la inserci6n del componente de conexibn, y asignaci6n de un valor apro-
piado a Connectionstring, para abrir la conexidn usariamos el componente co-
mo 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 li-
bro 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 automatica-
mente la variable, y las propiedades del comando se establecen visualmente. Nos
encontraremos, no obstante, con exactamente las mismas propiedades que ya co-
nocimos 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 coman-
do con la conexi6n.

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

0 CommandType: Esta propiedad tambikn tiene asociada una lista de opcio-
nes, 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 coman-
do 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 co-
noci6 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 diseiia-
dor de Visual Studio .NET sin0 como una ventana independiente.

Lbgicamente, podemos definir tantos comandos como necesitemos para efec-
tuar 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 herra-
mientas, 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 obser-
va la ventana Propiedades ver6 algunas como SelectCommand, TableMappings
o MissingSchemaAction, que ya conoce de capitulos previos. Despliegue la lis-
ta adjunta a SelectCommand y elija del nodo Existente el unico elemento disponi-
ble. 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 aso-
ciaremos 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 estable-
cer una correspondencia entre las columnas del origen de datos y las que exis-
tiran 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 ejem-
plo, 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,resultan-
do 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 rela-
ciones, 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 abri-
mos 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 de-
recha, 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 me-
diante 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 dispo-
nible. Despliegue la lista adjunta a la propiedad Datasource y seleccione el ele-
mento 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.

________ - E
A
~

0Wndow
Tw, Left
0Wndow 8
IAmworkspace M
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 ejem-
plos de capitulos previos y el resultado obtenido que, en este caso, seria el de la fi-
gura 13.34. Una rejilla en la que podemos navegar por 10s datos.

Frarcisco Cbarte M esvs L L w e 12 52
Frarcisco Charte

FraTx-iscu'Itsrte
IntrodLccior a la programion Farcisco Charte
Marual a.anzado Grcel :W2 Frapcisco Charte
F,lawal &I microrrocesador 33386 Ckris H Pappas&'Allialr H Murra, Ill 40
Programaacn C G Oelph ~ 6, K , h Frarcisco Charte
P r o g a r x i o r c w t/lsbal b s i c NET Frarcisco Chide
Frsrcisco Chide
sLal Studio NET

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 median-
te el us0 de la ventana Propiedades, ahorramos una cantidad importante de traba-
jo 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 mues-
tra el resultado de una consulta SQL, sin necesidad de recorrer filas, acceder a co-
lumnas y acciones similares mediante c6digo.
No obstante, el trabajo puede simplificarse atin mAs mediante la creaci6n automi-
tica de parte de 10s componentes que, en 10s anteriores puntos, hemos ido inser-
tando 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 inser-
t6 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 asis-
tente en marcha.
La primera ventana que aparece es simplemente indicativa, bastando con pul-
sar 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 cono-
cemos. 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 op-
ciones 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 selec-
ci6n 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 almace-
nado para obtener 10s datos, otro para actualizar, otro para insertar y otro
para borrar, utiliz6ndolos cuando sea necesario. De esta forma las senten-
cias SQL ya se encontrarin compiladas en el RDBMS y el rendimiento ser6
superior.

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

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

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

.

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

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

. . e incluso un procedimiento almacenado.~.. . asistentes y la posibilidad de arrastrar elementos. En ocasiones.13.. ....NET cuenta con potentes herramientas para el trabajo con bases de datos... 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. incluido el control DataGrid que hemos usado en el ejemplo de este capitulo._. simplificando tareas como la edici6n local de datos o informacion de esquema.. Lo unico que tiene que hacer es abrir el menu emergente del adaptador y elegir la op- cion Generar conjunto de datos. pueden tomarse desde el Cuadro de herramientas. Los componentes que en capitulos previos creAbamos mediante codigo. gracias a las opciones. ....I_.~.. . _. Una vez que sabemos c6mo conectar con 10s origenes de datos y definir adap- tadores.. el entorno de Visual Studio . -.. Como ha podido ver en este capitulo. Tambien puede arrastrar hasta un diseiiador cualquiera de las conexiones que tenga predefinidas en la rama Conexiones de datos del Explorador de servido- res.... en el capitulo proximo veremos c6mo co- nectar esos elementos con controles de interfaz.~__. comandos y conjuntos de datos. la depura- cion de procedimientos almacenados SQL Server desde el propio entorno. .NET facilita. la mayor parte del proceso de configuracih puede efectuarse automAticamente.. que facilita su ejecuci6n. caso en el que se crea un SqlCommand. . directamente desde el Explorador de servidores hasta un diseiiador. asimismo. tal como se ha visto en 10s ultimos puntos. comandos y conjuntos de datos.... . insertarse en un diseiiador y personalizarse mediante la ventana Propiedades. En lugar de una tabla puede arrastrar una vista. como 10s adaptadores de datos.. creando y configurando automaticamente un objeto OleDbConnection... incluso cuando se opera sobre un origen de datos remoto.. .. obteniendo el mismo resulta- do. Ya tiene todo el trabajo anterior hecho en dos ope- raciones de raton. Visual Studio ...__' .__...I. como las tablas y vistas._.. .I__.. o equivalente. Herramientas uisuales de datos de datos SQL Server y la suelta sobre el formulario Windows? HAgalo y comprue- be como se configura automAticamente el adaptador de datos y la conexi6n..

.

En el capitulo siguiente nos centraremos en el disefio de formularios de datos empleando estos controles. Es mucho m6s habitual la elaboracion de interfaces de usuario basadas en venta- nas. no es precisamente el mecanis- mo 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. La presentaci6n y solicitud de datos a travks de la consola. Mediante la vinculaci6n a datos. El objetivo de este capitulo es introducir 10s conceptos de vinculacih a datos. Aunque podriamos. tambikn mediante ccidigo. mediante cbdigo. accesi- bles desde un cliente como Internet Explorer. automatizando la presentacih y recuperaci6n de cambios. o data-binding. o bien las interfaces Web. recuperar 10s cambios efectuados por el usuario para transmitir- 10s a1 origen de datos. segun que el control sea Windows o Web y tambien dependiendo de que . asi como 10s controles m6s interesantes en este aspecto. La vinculaci6n entre 10s origenes de datos y 10s controles puede ser de varios tipos. ejecut6ndose por ejemplo sobre Windows. es posible enlazar una vista. ta- bla o conjunto de datos con uno o varios controles de interfaz. De esta forma nuestro trabajo se reduce en gran medida. ya Sean Windows o Web. empleada en 10s ejem- plos de 10s capitulos de la segunda parte del libro. lo cierto es que la mayor parte de ese proceso puede auto- matizarse gracias a la existencia de la vinculaci6n a datos en ciertos componentes.

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

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

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

.y.NET terativo.. . encargkdose 6sta de to- dos 10s controles hijo que contiene.. ..... BackCdor I BorderColM I BwderSMe Borderwidth + 0 Editorial Columns + 0 IDLibro I CssClasr Enabled + U Preoo + Y + Font Figura 14. Programacidn de bases de datos con Visual Basic ...“. ‘fti S d e o a r la popedad que desea mlarar. . .... puede invocarse a1 mismo metodo de la ptigina. . Vinculacion de multiples propiedades del mismo control . . . .... . . . .. .”.. ...a+&.. (Nmsuno) (Nmguno) [Nmguno) (Nwno) Wmguno) @nguno: pimguno) (Nmguno) (Niguno) (Nmguno) WrnSUnQ! (Nmguno) (Nmguno) (Nmguno) (Nmguno) iblinguno) DsLibrosl Libios Tltulo (Nmguno) “mguno) INnauno) Figura 14. .3. ..... -. cmtmuaom. .. . ... 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.......... ..... . ..... .. . ... ..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~ de a c e p r w n d i z a d o ma solbr m ewesh de enlace.. .. .T.NET .... . . .. .2..

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

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

sino con una vista o una tabla completa.52 Francisco Charte 1 3T. ISBN &tor Mtorial Precio PI Spnlik. 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. en caso de que &te sea un D a t a S e t . a diferencia de 10s anteriores. tan solo tiene que cambiar las propiedades de vinculacion de la lista. por tanto. . no se enlazan con una columna en particu- lar. Frarcisco Ctarte 10-5 Frarcisco Ctarte 1 1:. La primera hard referencia a1 origen de datos y. Aunque el comportamiento de ambos controles D a t a G r i d difiere bastante. 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 . Componentes con vinculacion a datos Este mismo ejemplo puede aplicarse con un L i s t B o x en un formulario Win- dows.6. La tercera categoria de componentes estd compuesta exclusivamente por el con- trol D a t a G r i d que. mostrando. manteniendo el resto igual. adem&. vi- sualmente hablando.6 y 14. con la propiedad D a t a K e y F i e l d .esm L w u s 1 lC5i Frarcisco Charte 1 IC 52 Francisco Cbarte 1 24 9 Ill i 43 Figura 14.NET cuenta. la segunda seleccionar6 entonces una de sus tablas o vistas. pudiendo facilitar el acceso a tablas completas de in- formation. Independientemente de que usemos el D a t a G r i d de formularios Windows o formularios Web.7. tiene la capacidad de mostrar multiples filas y columnas. la misma informacion a1 vincularse a1 mismo origen de datos.26 Frar=isco Ctarte 1 1352 Francisco Charte 1 21 34 Frarciscc CbarteM . 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'. son muy similares. 3. como es logico.14. Estos controles. k Francisco Charte 1 30 Fraruaco Charle-orix Seiiaro 1 1% Francisco Charte 1 39 Frarcieco Charte 1 10 7 : Frarcisco Ctane 1 10.

Todos 10s formularios Windows cuentan con un objeto Bindingcontext. Ya sabemos c6mo enlazar cualquier componente Windows con un origen de datos. cuya finalidad es . aunque es posible personalizarlo para incluir enlaces y botones que hagan po- sible la manipulacion de la informacion. puesto que s610 conocen el valor de una columna en una determinada fi- la. a1 que podemos acceder mediante la propiedad del mismo nombre. no tienen nocion de la fila en la que se encuentran en el conjunto de datos.7.NET Figura 14. 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. median- te DataBindings. Programacidn de bases de datos con Visual Basic . Los controles que se vinculan con una sola columna. DataSource y DataMem- ber. se&n 10s casos. Es el propio formulario el encargado de crear 10s elementos necesarios para ase- gurar la sincronizacih entre 10s distintos controles que puedan estar vinculados con datos. desde el momento en que se inserta en un formulario. usando para ello la propiedad DataBindings. impidiendo que cada uno de ellos muestre el valor de una columna en filas distintas. el equivalente para formularios Web se comporta como una tabla HTML estatica.

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

.-. En cuanto a posicion se refiere. . si bien CurrencyManager sustituye algunas implementaciones por otras mds especificas.___^__I__x. mientras que la segunda es un indice con base 0. RadioButton y Button... es fdcil afiadir a un formulario 10s controles de navegacion cl6sicos para que el usuario pueda ir fila a fila por el con- junto de datos. _. Esto significa que es una propiedad heredada por to- dos 10s controles Windows y que. El mktodo Refresh ( ) provoca la actualization de todos 10s controles enlaza- dos con el origen a1 que representa el objeto BindingManagerBase. TrackBar y ScrollBaroDateTimePicker.. ya usado previa- mente.__I.. Algunos de ellos son el propio TextBox. x_I. . Existe. impi- diendo a1 usuario trabajar de forma c6moda._(^. efectudndose las comprobaciones en el momento en que el vinculo vuelva a establecerse... tales como CheckBox.._. por su naturaleza. se producen cuando uno de 10s valores vinculados ha cambiado. La propiedad DataBindings que se citaba en un punto previo. Conociendo tan s610 estas dos propiedades.Windows . Programacidn de bases de datos con Visual Basic ._ .-. podemos virtualmente vincular cual- quier propiedad de cualquier control con una columna de un origen de datos. 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. A1 suspender la vinculacion 10s con- tenidos de 10s controles pueden modificarse sin limitaciones.. . la primera indica el nu- mero de filas existentes en el conjunto. contando con propiedades que nos permiten conocer y modificar dicha PO- sicion. un conjunto de controles que. En cuanto a 10s eventos Currentchanged y PositionChanged. mientras que SuspendBinding ( ) y ResumeBinding ( ) desactivan y reactivan la vinculacion. y con 10s eventos CurrentChan- ged y PositionChanged. con 10s cuales podemos establecer un cierto control sobre la vinculacion. Como puede suponer. ll_ll ~ _ _ _ ~ _ ^ _ Todos 10s derivados de BindingManagerBase disponen de 10s tres mktodos Refresh ( ) . SuspendBinding ( ) y ResumeBinding ( ) .. por tanto. . estfi definida en la clase Control de System. mientras que el segundo noti- fica una modificacion de la propiedad Position.NET datos. La mayor parte de 10s miembros de esta clase son heredados de Binding- ManagerBase. a1 enlazar un TextBox con una columna de una tabla. no obstante.--.__... _^__I . se prestan m6s a la vinculacion.-. Forms. Cada clase derivada facilita una implementation espe- cifica de estos miembros.10s controles PictureBox. las dos propiedades de mayor inter& que tiene esta clase son Count y Position. . todos 10s derivados de ButtonBase.para la visualization de imigenes. por lo que el valor mdximo serd el indicado por Count menos 1.-.” ____^.

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

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

por ejemplo. dato que podemos obtener facilmente de la propie- dad Count de la tabla. asi como la posici6n actual. debe efectuarse a mano. por lo que el mecanismo para mantener la posici6n actual y para sincronizar 10s contro- les vinculados queda completamente en nuestras manos. de forma que estkn accesibles durante el tiempo que el usuario est6 traba- jando sobre la pigina. En segundo lugar. La vincu- laci6n entre tabla y controles. independientemen- te del valor que tuviera la variable de posicion creada anteriormente. T i t u l o . el control mostraria siempre el titulo de la primera fila. Lo primer0 que necesitamos es saber cuiintas filas existen en la tabla a la que van a vincularse 10s controles.Ubltce el enlace simple para enlazar con un elernento dedab5 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. por tanto.14. La soluci6n m6s fdcil es usar la propiedad Session para crear sendas variables y guardar dichos valores. Tambien necesitamos un medio para almacenar ese valor. La buena noticia es que codificar esa funcionalidad no resulta excesivamente complejo. "TlbAo") A Figura 14.8. tenemos que asignar de alguna forma 10s valores de las co- lumnas de la tabla a 10s controles que haya en la pfigina. Si asignamos a la propie- dad Text de un TextBox la expresi6n d s L i b r o s l . Componentes con vinculacidn a datos 5eleccime la propiedad we derea enbzar A conbnuaci6nn. 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 . L i b r o s ( 0 ) .

9. Inserte en el formulario dos controles TextBox y dos Button. Inserte desde el Explorador de servidores la tabla L i b r o s de uno de 10s ori- genes que tenga disponibles.Object. L o a d .ca para u s u a r b s de Visual Stodio NET Programanirn con Delph 6 y Kyhx Guia przicticaparausuasiosde Detpbi 6 h. que quedaria asi: P r i v a t e Sub Page-LoadiByVal s e n d e r As System. Genere el DataSet a partir del adaptador de datos.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. Haga doble clic sobre el formulario para abrir el m6todo correspondiente a1 evento Load. generado cada vez que se llama a1 metodo DataBind ( ) del control o de la pzigina donde estii insertado. por ejemplo SQL Server. Usa lutedace Design for Programmers SQL Servcr 2000 Gum practrca para u s u a ~ ~JBuilda s 7 P r o g r d con Visual C# NET Programa&n con J'tsual Shtdto NET Rogsaa~cib con V i Basic NET Gum pracbca para usuams de Vtsual Basic NET Guia przict. E v e n t A r g s ) H a n d l e s M y B a s e .NET. 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. - B y V a l e As S y s t e m .NET esas asignaciones? En el momento en que el control reciba el evento DataBinding. Programacio'n de bases de datos con V i s u a l Basic .

Cstos recuperan el valor actual de Position y lo actualizan. E v e n t A r g s ) Handles B u t t r ! n l . O b j e c t . a su vez. r o i i r ~ t Se-sion("Position") = I) 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 . T e x t = D s L i b r o s l . T e x t = D s L i b r o s 1 .Autor End Sub Observe que la inicializacibn de las variables Position y Count se efectua s610 la primera vez que se abre la phgina. ~L li b r u s . 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 .Libras ( S e s s i o n ( " P o s i t i o n " ) ) . E v e n t A r g s ) Handles B u t t o n 2 . abra el mktodo correspondiente a1 evento DataBinding de uno de 10s TextBox. C l i c k Dim Eori t 1 !n As I S e s i i o n ( C o u n t ) . ByVal e As S y s t e m . Obi e c t . invocando a continuaci6n a1 mktodo DataBind ( ) de la p6gina que. L i b r o s ( S e s s i o n ( " P o s i t i o n " ) ) . y no cada vez que se pulsa uno de 10s bo- tones. O b ] e c t .14.1 Then P o s i t i o n += 1 ' Sessi ~ n ( " P o s i t i o r ~ " = ) Poiition 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 . Componentes con vinculacidn a datos Sessicrl ("Cirunt" 1 = D s L i b ~ u . ~ ByVal e As S y s t e m . 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 " ) = tosition DataBind ( ) ' End If End Sub Por ultimo. provoca el evento . T e x t B o x l . T i t u l o T e x t B o x 2 .

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

.

.

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

Deje elegida la primera opcibn.. e intro- duzca el nombre que desea dar a1 conjunto de datos. bastando con pulsar el b o t h Siguiente > para dar el primer paso. de tal forma que. El primer paso del asistente nos permite. indicdndonos cud1 es su finalidad. tanto crear un nuevo conjunto de datos como w a r uno que ya existiese en el proyecto. . Formularios de datos I 0Elernentos de proyecto local 3 Interfaz de usuario 3 Codigo DataSet Arthivo XML Esquema XML Y oat95 2 Web a Utilidad Archivo XSLT As[stente p a famukbs . 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. que en 10s capitulos de la segunda parte efectudbamos mediante cbdigo. 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 .2. Seleccicin del En nuestro caso partimos de un proyecto inicialmente vacio. La primera pdgina del asistente es tan s610 informativa.. usando para ello dos controles D a t a G r i d . En este conjunto de datos. a1 seleccionar una editorial en el primero. tal como se aprecia en la figura 15. ya que todo ese trabajo lo efectuard el asistente. ni tomar las tablas desde el Explorador de servidores y arrastrarlas so- bre un formulario. Todo ese trabajo. ser5 ejecutado por el asistente. 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. asi como un objeto D a t a R e l a t i o n para relacionarlas. por ejemplo d s l i b r o s .1. tal como veremos despuks.15. aparezcan automdticamen- te en la rejilla de detalle 10s titulos que correspondan. se introducirdn las tablas E d i t o r i a l e s y L i b r o s . No necesitamos definir una conexibn. Figura 15.

cuya ventana se muestra en la figura 15. proyecto un conju&o de dabs ya defintdo o uno propt~dwradopos un mwcio Web. en el Explorador de servidores. En su caso.2. de 10s elementos de origen Para crear nuestro formulario podemos partir de tablas. En este paso del asistente el cuadro de diilogo esti dividido en dos paneles. Si tenemos una conexion definida que nos sea util. cualquiera de 10s que cre6 en el tercer capitulo. todos 10s elementos que han podido encontrarse a travds de la . El de la izquierda nos muestra las tablas. no tenemos m6s que desple- gar la lista que aparece a la izquierda para elegirla. Es la tarea del paso siguiente del asistente. para lo cual es precis0 facilitar una conexion. o bien crearse a prop6sito en ese mismo momento. procedimientos almacenados que devuelven resultados. en general. Tambidn puede optar por conectar con un origen de datos distinto. De no ser dse el caso. co- mo es logico. la conexi6n seri otra diferente dependiendo de d6nde estd ejecutdn- dose SQL Server o bien MSDE. Esta puede encontrarse predefinida. etc. Seleccionamos crear un nuevo conjunto de datos xi6 El DataSet tiene que recuperar la informaci6n de un origen de datos. 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. ZQu6 conjunto de dabs derea utitizar? F pear INI nuevo conJUnt0 de datos denommado: ldsLlbrosl Figura 15.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.3. vistas y. vistas. pulsaria- mos el b o t h Nueva conexidn y definiriamos la nueva conexion con el cuadro de didlogo que ya conocemos de capitulos previos. Programacidn de bases de datos con V i s u a l Basic . De forma dhzmathra.

inicialmente vacio. por ejemplo.15. mediante cddigo. Forrnularios d e datos conexidn definida en el punto previo. ZQu6 mne&indebe utllbarel asi+twte? I S r l Nueva L o n e ~ . A cambio. Ciertos pasos del asistente dependen de 10s elementos que se elijan aqui. sin embargo. un D a t a S e t a partir de sendos coman- dos para obtener el contenido de dos tablas. En el panel de la derecha. algo que no seria preciso si hubiesemos seleccionado una vista o un procedimiento almacenado.3. Cuando creAbamos. que ahora aparecen en el panel de la derecha en lugar de ha- cerlo en el de la izquierda. usando para ellos 10s botones que hay en la parte central. podria ser necesario fa- cilitar una lista de parametros de entrada. irAn apareciendo 10s elementos que seleccionemos.4. un paso imprescindible era el estable- . hemos elegido del origen las tablas Edi- t o r i a l e s y Libros. Pulse el b o t h Siguiente > una vez m& para continuar en el punto siguiente... 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. n Figura 15. deberemos definir una relacion entre ellas. Al haber seleccionado dos tablas. Seleccion de una conexion con el origen de datos Como puede verse en la figura 15.

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

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 se basan en dares c m e s enfze l a tabtas. !atabbs benen una r W ptinopal-detdfe &Ztd! t a b b y cofunmas dese&nasbar en el fonnubrb? Tabla de &etaks: i l-.5. en la pr6ctica.6. A%. agreguela a la lrsta de relaaones uWaando el W n de Recha Nomkre: &elaoones: IFKLibrosEditorial Tabla primaria: TaMa s e c & a n a : Editor ia les ILibros paves: IDEditorial Figura 15. Seleccion de las columnas a usar en el disefio del formulario Para nuestro formulario de ejemplo dejaremos marcadas todas las columnas aunque. a conbnw&~. podrian desmarcarse algunas como IDEditorial. w s f z a m& de una tabla en d fwdario.l ILibros i CQ!UKWW: Figura 15. 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 i”=” 5. un Mmbre a la nueva r e k & bs tabla6 y los campos de daves primanos y secundanosy.IDLibro o Editorial. .

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. en la parte inferior de la ventana (vkase figura 15.NET ____ El tiltimo paso del asistente nos permite elegir el disefio que deseamos darle a1 formulario. En caso de utilizarse controles individuales.7. Si elegimos usar reji- llas de datos.7) estaran accesibles mAs o menos apartados. tan s610 podemos indicar si queremos que se afiada a1 formulario un b o t h para cancelar todos 10s cambios o no. facilitando la insercih. edici6n y borrado en la misma rejilla de datos. como un b o t h para recuperar 10s datos y otro para ejecutar la actua- lizaci6n.Cancela lo5 cambios de to& lo5 relpsbos d d conjunto de datos 51selecciona conboles ir~lividualees. para mostrar la informaci6n fila a fila. marcando las opciones de este paso del asistente. que es lo que nos interesa en este caso. Elegir el estilo de presentacion $re. como T e x t B o x y CheckBox.otros que se incluyen por defecto.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. podremos elegir 10s botones que se afiadirAn para tareas de edici6n. mostrando solo una fila en cada momento. Dependiendo de la opci6n por la que optemos. Prograrnacidn de bases de datos con V i s u a l Basic . el formulario contara tambikn con. 0 Registro unico en controles individuales: Se usan controles de interfaz tipi- cos. .ssrzP Puede mosb-ar un unico reqab-o cada vez o mosfar todos I icdmo &sea Rlostrar ks datos? F lodo5 lo5 regisbos &e la cuadricula r Regrstro i r ~ en o conboles rndrvrduales ZQmS wntrdes adicionakr desea para el fonnuhrio? R m-celar tudo . 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.

modificando titulos y disposicih de 10s botones o 10s DataGrid. 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.15.-__-. aiiadiendo nuevos elementos para realzar la interfaz. L6gicamente puede personali- zar dicho disefio. A1 pulsar el b o t h Finalizar del asistente 6ste se cerrar6 y nos encontraremos con nuestro formulario. __. * -__.8. con su aspect0 por defecto. dos adaptadores de datos y el D a t a S e t .-____.8 puede ver el formulario en el entorno de Visual Basic . 10s componentes de acceso a datos que ha generado el asistente: uno para la conexion. ForrnularloAsstpnte (1 IUClOn FmdabAsiotente References 3 Assernblylnfc vb dstibras nsd a hnhbrm rb .r ob)diiibras % OlrDbConnemonl boleDbDataAdaprer1 b OleDbDataAdapter2 Figura 15. El formulario en el entorno de disefio Nota Observe. ___ ___-I_ . etc. Forrnularios de datos ___ .NET tras 10s cambios. . En la figura 15. en la parte inferior del area de diseiio. En nuestro caso nos he- mos limitado a modificar el ancho del segundo DataGrid.

. El bloque de c6digo que hay detr5s del C a t c h est6 diseiiado para que introduzcamos nuestro control de errores persona- lizado.dsLlbros( ) T rY Me. 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 . Analicemos brevemente ese c6digo para saber exactamente qu4 ocurrir6 a1 eje- cutar el programa. ya que el asistente lo que hace es mostrar el posible error en una ventana. controlando una posible excepcion.Ob]ect.__ -_I__ . el asistente tambien ha generado el c6digo necesario para recuperar 10s datos. . E x c e p t i u r i .NET i .. Me5 5 a q t ) End T r y End Sub Lo unico que se hace es invocar a1 metodo LoadDataSet ( ) del propio formu- lario. ..* < ' . Lo habitual es que se pulse el boton Cargar que provoca la eje- cuci6n 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. hi r1j J w c . r1ic-C T rY C y s t em. . _ _ _ . actualizarlos y cancelar 10s cambios efectua- dos.A-lstente. Tras abrirse el formulario este permanecerti vacio esperando una acci6n por parte del usuario. 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~.FillP3taSet (ob]DdtaSetTemp) Catch e Fi 11 Dd t aSet As Sys t e m . F Jim'.. ~ - B y V a l e As S y s t e r n . 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 . Mes s a n e B )x . '...$ ! e L c ad.~ Ademas de todos 10s controles que pueden verse en el formulario. Prograrnacidn de bases de datos con Visual Basic . Antes de ejecutar el programa tendra que abrir la ventana de propiedades del proyecto y establecer el formulario recien generado como elemento de inicio. Stlo. con sus propiedades debidamente establecidas.

.

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

El metodo UpdateDataSource ( ) .15. 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 s. 1 it F rl t e . is L 1b rrr s ) T rY . b e t C h a r ~ g e s . hay cambios pendientes de consolidar. usando para ello el metodo Getchanges ( ) del dsLi- b r o s . ( ) Catch e U p d a t e As S y s t e r n . B 1 r d i rig C o n t e x t ( '1)b jd sL i br (2s .B i r d i n g C o n t e x t j ODj d s L i b r o s . A continuaci6n se recuperan. d c I. A c c e p t C t i a n g e c . Tras comprobar que. Forrnularios de datos Me. "Libros" j . se llama a1 mbtodo UpdateDataSource ( ) y combinan 10s cambios en el conjunto de datos a1 que estdn vinculados 10s controles. ~ Fo L mi 1 1a L 1oA. se encarga de abrir de nuevo la conexi6n e invocar a1 metodo Update ( ) de cada adaptador. recibiendo como pardmetro la lista de cam- bios. en un DataSet temporal. finalizando asi cualquier operaci6n de edici6n que pu- diese haber en curso. " E d i t o r i a 1 e s " ) . 10s cambios que se han efectuado en el formulario.dCiJ r r e n t E d i t ( ) Me. Observe c6mo se utiliza la propiedad Bindingcontext del formulario explicada en el capitulo previo. 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 . 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 BindingMa- nagerBase de cada tabla. Er. I b L I o b l 3 s L i b r o s . facilitando la informaci6n a1 origen de datos. E r d r u r r e r i t E d i t [ ) oblDataSetChdnyes CType[objJrLibr b . efectivamente.

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

ByVal e As System.-- El c6digo de este formulario ASl'.15. lo cual no es de extraiiar ya que no existen capacida- des de edici6n. Formularios de datos IDEditorhl Nombre DireccIon hlostrar detalles 0 abC abC hlostrx detalles 1 abC abC Mostrar detdles 2 abC abC Mostrar detdles 3 abC abC abC ~ _ _ _ ~ p - 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_II.SelectedIr4dex = -1 Me.EventArgs) Handles buttonLoad.masterDataGrid.masterDataGrid.LoadDataSet ( ) Me.NET es tambien mAs simple que el generado para el formulario Windows. 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. D a t a B i n d ( ) .Object.Click T rY Me.

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

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

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

.

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

tras pulsar el enlace Actualizar. asi que el identificador del libro se encuen- tra en la segunda y 10s demiis datos en las siguientes. asi que necesitaremos aiiadir un b o t h o enlace para que dicha actualizacion se efectue a demanda. insertare- mos 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. en el DataSet.per0 si comprueba el origen de datos. Si ejecuta el programa en este momento. ii 2 811 ___ -__-_ No tiene sentido actualizar la informaci6n con el origen cada vez que se modi- fique una columna. ~ . Tenemos que actualizar el origen de datos. Como se aprecia en la figura 15. o simplemente sale del programa y vuelve a ejecu- tarlo.Ob]ect. &tos permanecen ahi. Los recuperamos asignando- 10s a las columnas de la fila en el Data S e t.15.13. comprobara que esos cambios se pierden. verii que puede efectuar cambios y que. Forrnularios de datos la que contiene 10s enlaces de edition.

Cllck Catch Exceprlon As E. per0 he- mos optado por algo mucho m6s directo. R e s p o r i s e . . se escriben 10s cambios en el origen de datos complethdose el ciclo que le permitir6 editar la informacih desde un nave- gador Web. Recuperamos la referencia al DataSet y lo usamos directamente como parhmetro del mktodo Update ( ) del segundo adap- tador de datos. Prograrnacidn de bases de datos con Visual Basic .xcrptlnn P a g e .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. si lo comprueba. es el mismo. W r l t e ( E x c e p c l >n. El efecto.NET B y V a l e As System.

En resumen. Windows o Web. 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. principalmen- te conjuntos de datos. Ha podido ver que el asistente para formularios Web genera menos funciona- lidad que el equivalente para Windows. Formularios de datos Tomando como base todo el proceso descrito. 10s capitulos de esta tercera parte le han facilitado gran parte de la informaci6n que necesitari para crear interfaces de usuario. con controles vinculados a 10s elementos que conoci6 en la segunda parte. mediante 10s cuales pueden generarse for- mularios con controles vinculados a datos tanto en aplicaciones Windows como en aplicaciones Web. le ha servido para conocer dos de 10s asistentes m&spotentes con que cuenta el entorno. tablas y vistas.NET relacionados con el acceso a datos.15. . Este ultimo capitulo dedicado a1 estudio de 10s elementos de Visual Studio . Le resultara un buen ejercicio para conocer mas detalles sobre D a t a - G r i d . El proceso de actualizacion con el origen de datos le servira tal cual esta. puede aAadir al miSmODataGrid la posibilidad de eliminar cualquiera de sus filas y tambien la de aAadir filas nuevas.

.

.

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

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

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

.

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 selec-
cionado. Tambien se crea el adaptador de datos especifico. Observe que la crea-
ci6n 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 satisfactoriamen-
te 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 co-
nexidn, 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 con-
junto 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 sim-
ples 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 adapta-
dor, siempre se llama Table.

P r i v a t e Sub VincularRe]illa ( )
DataGrid1.DataSource = dsDatos
Da t a G r 1 d 1 . D a t aM emb e r = " T ab 1 e "

End Sub

No necesita ninguna preparacih adicional para ejecutar este proyecto, asumien-
do que tiene instalado el proveedor para Oracle y que ha afiadido la correspon-
diente 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 fi-
gura 16.1, debiendo seleccionarse una de las tres conexiones disponibles e intro-
ducirse 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 introdu-
cida 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, pric-
ticamente el triple, a1 tener que codificar la apertura y el resto de acciones de ma-
nera especifica para cada proveedor.

Programacidn de bases de datos con Visual Basic .NET

Anaya Multimedia Assembly Language Step-by-step Jeff Duntemann 60.5
Anaya Multimedia Guia pradica para usuarios de Delphi 6 Francisco Charte 10.52
Anaya Multimedia Guia pradica para usuarios de Excel 2002 Francisco Charte/M Jesus Luque 10.52
Anaya Multimedia Guia practica para usuarios de Kylix Francisco Charte 10.52
Anaya Multimedia Guia practica para usuarios de Visual Basic NET Francisco Charte 10.75
Anaya Multimedia Guia pradica para usuarios de Visual StudicI NET Francisco Charte 10.52
Anaya Multimedia Guia pradica para usuarios JBuilder 7 Francisco Charte 10.75
Anaya Multimedia lntroduccidn a la programacion Francisco Charte 24.04
Anaya Multimedia Manual avanzado Excel 2002 Francisco Charte 21.04
McGrawHiII Manual del microprocesador 80386 Chris H Pappas&William H Murr 40
Anaya Multimedia Programacion con Delphi 6 y Kylix Francisco Charte 37.26
Anaya Multimedia Programacion con Visual Basic NET Francisco Charte 39
Anaya Multimedia Programacion con Visual C# NET Francisco Charte Ojeda 39
Anaya Multimedia Programacion con Visual Studio NET Francisco Charte/Jorge Serrano 40
Anaya Multimedia SQL Sewer 2000 Francisco Charte Oleda 10.75
Apress User Interface Design for Programmers Joel Spolsky 31

Figura 16.2. El programa en ejecucion

El RDBMS de Oracle es el miis utilizado a escala mundial, especialmente en sis-
temas 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 Ora-
cle no resulta un RDBMS fiicil de instalar ni administrar, tarea que suele quedar
encomendada a administradores de bases de datos especializados en este produc-
to. 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 ejecutin-
dose 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 traba-
jar 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 inter-
venciones 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, de-
ber5 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 que-
remos 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 que-
remos 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 habitual-
mente 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 op-
ciones 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 bo-
t6n 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 apa-
rece 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 iden-
tificador 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
lndsia uoa base de dabs Masi DpCmnal prrconfQur& la% OpUDnw
Iss ufildadea y el scftwsre basrco 6el clente w e un
D Sred
S ~ N ~ C Dde

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 @madswfa 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 em-
plear, 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 ~ aL ~t ar ~x -111 x l - i r w ~3 E i j
... ....

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 pa-
ra 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 cual-
quier 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 dis-
tintas herramientas. Se iniciarfi el servidor HTTP de Oracle (una versi6n personali-
zada 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 ten-
dremos 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. poniendo en marcha un servicio Windows que ser6 el que atienda las solicitudes de conexi6n.8.1 Figura 17. Programacidn de bases de datos con Visual Basic .NET r6n del CD-ROM 10s archivos de una base de datos tipo.1 Requutos de Espaclo L401urnen C\Necesarios 1 U l G B Disponibies 28 42GB +?@dancedReplication 9 0 1 1 1 Figura 17. Proceso de copia de archivos y configuracion . Oracb9i Database 9. Resumen previo al inicio del proceso de instalacion 'instairno Oracle Complete DSS Starter Daiatmse 9 0 1 0.0.7.1.

. Ya tie- ne 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. el SID y la contraseiia de las cuen- tas SYS y SYSTEM.17. 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 Contra- seiias. Apareceri la de confirmacion de fin de instalacion del instalador universal de Oracle. Pulse de nuevo el b o t h Salir. Pulse el boton Salir de esa ventana. Acceso a Oracle desde V i s u a l Basic .10.9.NET Herramientas de Configuracion r3ce en curso Oracle Intelligent agent pendiente Figura 17. veri aparecer una pequeiia ventana indic6ndole el nombre global.

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

Acceso a Oracle desde Visual Basic .NET. . emplean distintos medios de comunicacih entre cliente y .17.__ -. -~ 08 del Ststema O p r a b v o Adrninistradwes de Bases de Datos del Sisterna Operc Opeiadorer de Bases de Datos d d Sistema operadores de Bases de DatOr del Ststerna Operabbc 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. por lo tanto. que hemos usado en todos 10s ejemplos de 10s capi- tulos previos en 10s que se utilizaba la base de datos Oracle creada en el tercer ca- pitulo. si no quiere emplear 4ste. Puede crear su propio esquema y personalizarlo. una hoja de cdculo Excel o comunicarnos con un servidor SQL Server sin necesitar ningun software adicional. es posible ac- ceder a multiples origenes de datos sin necesidades adicionales. es reconocida en el propio servidor con el nom- bre de servicio L i b r o s ] M&va proon Yec Eavontos Ven_tana A& __ -. No es posible. Desde un sistema en el que se instale la plataforma Microsoft . . scott. como tablas. sin embargo. indispensa- ble para ejecutar cualquier aplicaci6n creada con Visual Basic .12. Existe un esquema por defecto. vistas o procedimientos almacenados. generada por el asistente. Consola de adrninistracion de Oracle Cada base de datos cuenta con una serie de esquemas en 10s que se alojan 10s distintos elementos. especialmente cuando son de diversos fabri- cantes y.NET inicial. . Esto significa que podemos usar una base de datos Access. ya que t a m b i h se instalan 10s MDAC. una comunicacion directa con todos 10s productos RDBMS disponibles en el mercado.NET.

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

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

.

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

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

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

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

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

Clear() . O b ] e c t . creando a continuaci6n una vista en la que aparezcan s610 10s titulos de la editorial cuyo c6digo se haya introducido en el TextBox. bisicamente. enlazamos esa vista con el DataGrid. Eso es. Finalmente.sacciones". 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 . ~ B y V a l e As S y ~ t e m . C o u n t > 0 Virta(O). D a t a S o u r c e . Upd a t e ( V I s t a . Commit ( ) Else ' Transaccion. Tab L e ) "Trar.Delete() End W h i l e sq De S g 1[lat a A d a p t e r 1 . El proceso de eliminacih de las filas es sencillo.Rollback ( ) E n d If DsLibrosl. 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 . per0 delimitando la operacion dentro de una transacci6n y confirmtindola o revoc6ndola segun lo que responda el usua- rio a una ~ l t i m apregunta de confirmacibn. Control de transacciones I g L i b r o s . lo que vamos a hacer a1 pulsar el b o t h Eliminar. 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. YesNo) = D i a l o g R e s u l t . MessageBoxButtons. 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 . 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 1s e n d e r As S y s t e r n . Datasource = V i s t a E n d Sub Como puede ver. Yes T h e n T r a n s a c c i o n . que mostraria las filas que van a eliminarse en caso de que pulsemos el b o t h Eliminar. llenamos el DataSet usando el adaptador de texto.18.

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

..* A .

El objetivo de este capitulo es mostrarle. s e g ~ ha n podido verse en el capitulo previo. pos- teriormente. Puede darse el caso. impidiendo a1 segundo usuario hacer cambios en una fila cuyo estado ha cambiado desde que la recuperd en el Data S e t. sin perder directamente 10s cambios que haya efectuado el usuario per0 sin escribir tampoco 10s cambios so- bre el origen perdiendo la informacibn que otro cliente haya introducido. de que varias aplicaciones cliente. con un ejemplo. e bloqueo y actualizacion A la hora de codificar una aplicacidn en la que van a obtenerse datos que. otro usuario intenta modificar esa fila. hay que elegir una politica de bloqueo y de . ya cambiada o inexistente? Por defec- to se genera una excepcidn. por tanto. 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.NET utiliza una politica de blo- queos optimista. El empleo de transacciones asegura la integridad de 10s datos. e s t h mostrando la misma informacidn e. incluso. per0 no resuelve por si solo 10s problemas de concu- rrencia que pueden presentarse. deben ser actualizados. cdmo responder a esta situacidn para poder resolverla de forma satisfactoria. generalmente en distintos orde- nadores distantes entre si. iQu6 ocurre si un usuario modifica o elimina alguna de esas filas y. ADO. Por defecto. permi- tan a1 usuario modificarlos. a continua- cibn.

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

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

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

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

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

como DataReader 0 ejecucion directa de consultas. Otra posibilidad es no usar el evento Rowupdate sin0 interceptar el evento DBConcurrencyException a1 llamar a1 metodo Upda- te ( ) . En la documentacion electronica de Visual Basic . I/ Valor actual='Francisco Charte Ojeda'. En la prActica. pudiendo elegir que quiere hacer.NET podra encontrar algu- nas alternativas. para realizar pruebas. . no conta- remos con 10s comandos de bloqueo optimista generados por 10s asistentes. se ejecuta asumiendo que va a pulsarse el b o t h Actualizar tras modificar cada fila. podriamos recorrer el conjunto de filas que tienen un error y mostrarlas todas a1 usuario de una sola vez. teniendo que controlar nosotros 10s problemas que pudiesen surgir.3. Si estamos usando otros medios. Tambien debe tenerse en cuenta que este metodo. Valor original='FranciscoCharte Ortega'. ya que el usuario po- dria modificar varias filas. asumiendo que. como la insercion en todas las tablas de una columna que man- tenga una referencia temporal de cuando se modifico por ultima vez la fila.NET E n d If E n d Sub Observe que se muestra tan s610 el valor de la columna Auto r. va a modificarse esa columna y no otra. en lugar de consultar una a una. y a1 actualizar habria que cambiarla siem- pre con la condicion de que no se haya modificado porque ello significaria que otro usuario la ha actualizado. Al leerla se cuenta con esa referencia. 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. 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. a1 ser invocado desde el me- todo RowUpda te. Prograrnacidn de bases de datos con Visual Basic . Valor propuesto='Francisco Charte' /I l L W I1 Figura 19. Si &te se genera. 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. Esto no tiene necesariamente que ser asi.

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

ya que ocuparian un espacio innecesario al poder calcular sus valores. ya sea en la propia sentencia SQL o aiiadiendo una columna a1 D a t a T a b l e . no siendo 16gico afiadir nuevas columnas en las tablas de la base de datos para almacenarlos. per0 no el IVA o el precio neto. En la tabla L i b r o s tan s610 existen las tres pri- meras columnas. En ocasiones. Suponga que necesita mostrar en un D a t a G r i d el titulo de cada libro. el autor. En la expresi6n pueden emplearse 10s habituales . para evitar tener que calcular y aiiadir esos valores manualmente. En este capitulo ver6 c6mo puede definir esas columnas calculadas. No tiene sentido aiiadir esas co- lumnas a las tablas de la base de datos. 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. pueden ser ne- cesarios datos adicionales que pueden calcularse a partir de 10s datos de las co- lumnas. sin embargo. el IVA y el precio neto. siempre ob- tenemos un conjunto de filas predefinidas en las tablas de la base de datos y con valores que est6n almacenados en ellas. apareciendo el resulta- do como si fuese otra columna. ya sea obteniendo un Da- t a R e a d e r o bien mediante un adaptador para generar un D a t a S e t . Cuando se ejecuta un comando de seleccidn de datos. el precio. mediante c6digo.

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

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

.

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

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

.

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

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

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

. Diseiiaremos un formulario Windows en el que podamos ver la portada asocia- da a cada libro..... . .. .. un arreglo de tip0 B y t e .b d-tibtv. con controles individuales. Almacenamiento y recuperacidn de imdgenes .. ''I Si prefiere basar el formulario en un D a t a G r i d ... ' .3. a la hora de leer..ataFuiml c k ] doFirr 1 b ' ditibtos . Para obtener la portada. Figura 21.. . &I . por lo tanto. Esto nos permitir6 afiadir f6cil- mente un P i c t u r e B o x en el que mostrar la imagen. .xs dsLibros.... 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. tendremos. . ..21. asi como modificarla si es necesario. si de lo que se trata es de modificar. its t dsL&ros.. o viceversa. o modificarla. Partiendo de un proyecto es- tAndar.. . La columna en el editor de esquemas XSD Fijese en el tip0 de dato de la propiedad... que generar la imagen a partir de una secuencia de bytes.... . . . en lugar de usando un D a t a G r i d . tendra entOnCeS que COntrO- lar la pulsacion sobre la columna correspondiente a la portada a fin de abrir una .. .. . LL..xs O X Libros (Libros) IDLibro int ISBN string Tdulo string (Predeterrnmado) Autor rtnng fixed Editorial int (Predeterrninado) ' ni lla ble (Predeterrninado) (Predeterrnmado) de datcs de esk d m t o .

creando para ello una nueva clase de columna que sea capaz de mos- trar la imagen. Tambien puede personalizar la cua- dricula. como se puede ver en la figura 21. . . .. .. . 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. .. DpenFileDialog1 CddExtem. a lj !I Figura 21. . . directamente des- de un archivo. . .i:t ) 3.4.Itado. False 5howHelp False ShOwReadOnly False Title ialidateNam True . hacihdolo m6s alto. 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.NET ventana secundaria con el P i c t u r e B o x . h DataFormLvb [Diseiio]* I I : . Programacidn de bases de datos con Visual Basic .bm XnctialDrectw Modifiers Friend Multirded False ReadOnlyChecked False RestoreDrector. JrY*33-. .. Inserte t a m b i h un com- ponente 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 selec- ci6n de archivos con grificos..On True CkeckFileEusts True CheckPathEasts True CefaultExt Dereferenceiinks True Titdo r-----. Filterirdex IIVOS I grlficos I *. .. . ... . Extienda las dimensiones del formulario creado por el asistente. Arthvo Edition rer Proyecto Generar Depurar Datgs Herramlentas VeEtana Aygda Debug . .. . pudiendo obtener- la 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. .. .en caso de que se pulse el b o t h que hay debajo. .4. .

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

FrornFile(OpenFileDia1ogl.Read ( I r n a g e n .( ) . 1 I _ _ _ _ . La clase Image cuenta con un metodo F r o m F i l e ( ) capaz de recuperar la ima- gen del archivo y mostrarla en el P i c t u r e B o x . y asignar dicha imagen a la columna P o r t a d a de la actual fila de datos. C r e a t e G L a r h i c . Programacidn d e bases de datos con V i s u a l Basic .Oper1.L e n g t h ) Archivo. Por lo tanto. FromSt ream ( I r n a g e n ) E i c t u r e B rxl . 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 ne- gra. O b ] e c t . R e a d ) Di ivo. C l o s e ( ) ’ . 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 . asignar un nombre de archivo a la columna P o r t a d a . ten- dremos 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 Ar .FlleName) Dim A r c h i v o As New FileStream(OpenFileDia1ogl. simplemente a mod0 de informacih de retorno porque ello no indica que la imagen exista en la base de datos. sin mbs. Ya sabemos que su tipo es B y t e ( ) . FileAccess . ivo. ~ P i c t u r e B o x l . I m a g e = Irnage.r ’ l e a r ( c o l o r .NET mage. - FileMode. Es logico. No podemos. y despues asignarla a P o r t a d a . Los Datacolumn. tendremos que recuperar la imagen en memoria. _ _ I _ _ _ - Para llegar a tener alguna imagen en la base de datos. como si fuese una secuencia de bytes. no disponen de un metodo similar.B l a c k ) End If End Sub Si ejecuta el programa tras introducir estos cambios. FileName. por el contrario. es nuestro objetivo. ya que ninguno de 10s libros cuenta actualmente con una portada en la base de datos.

Ejecute de nuevo el programa y asigne imagenes a varias filas de datos.5 puede ver el formulario Windows mostrando una fila de da- tos.NET a fin de enviarlas co- mo parte de una piigina Web. 5 . En la figura 21.H i r d i r q C J n t e x t 1 ~ 7 b l d ~ L i h r o . Almacenamiento y recuperacidn de imagenes o b ] ( j s L i b r o s . Figura 21.21. El formulario con 10s datos y portada de u n libro . incluida la portada del libro.5. No podrii ver las portadas abriendo directamente la tabla.asignando 6ste a la columna Portada de la fila actual en la ta- bla Libros. €" s i t i i i n ) . A con- tinuacion pulse el b o t h Actualizar del formulario para guardar 10s cambios en la base de datos. per0 si ejecuta de nuevo el programa se recuperaran y apareceran en el formulario. " L i b r a s " ) . Igual- mente podriamos obtenerlas desde una aplicacion A!SP. 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.

.

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

a1 compilar el proyecto. ser6 la clase encargada de actuar como adapta- dor de datos para poder llenar un DataSet a partir de un comando. dll. Creacidn de proveedores ADO. La biblioteca obtenida.NET Para crear el proveedor ADO. 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. 0 FileSystemClientDataAdapter. vb: Este m6dulo alojara la clase File- S y s temclient Da taReader. vb:En su interior definiremos la clase File- Systernclientcommand. lniciamos el proyecto de biblioteca de clases A este proyecto aiiadiremos cuatro m6dulos de clase: FileSystemClientConnection. como se ha hecho en la figura 22.que implementara la interfaz IDbCommand. La biblioteca de clases generada no estard firmada con una clave o nombre fuer- te. vb: Contendra la clase FileSystem- Client Da t aAdap te r. vb: Contendra la clase FileSystem- C1 i entConne ction.1. implementando la interfaz IDb Conne cti on. FileSystemClientCommand. se llamara Filesystemclient. por lo que no podr6 aiiadirla a1 GAC para emplearla desde cualquier proyecto .1. 0 FileSystemClientDataReader. Eje- cutara el comando especificado ofreciendo un resultado.Implementara las interfaces IDa taReader e IDataRecord. concretamente una Biblioteca de clases.NET. Lpos de proyecto: flantllas: + J Otros proyectos 2 SoIucmes de Visual Studio j 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 ljombre I FlleSystemClient Ubuacion C kqrgregar a solucion cerrar solucm ~ El proyecto 5 1 creari en C \PBddVirualBesicNET\CapZZ\RleSystemClient Figura 22. Llamela FileSys temclient. Se en- cargar5 de controlar la conexi6n.22.NET tendrd que iniciar un nuevo proyecto Visual Basic .

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

en una de las variables definidas a1 principio a tal efecto. . 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 co- nexi6n y la base de datos. ~ 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 . A continuaci6n se extrae de ella el valor que si- gue a1 signo =. . > j . tal cual. El Linico partimetro que aceptar6 nuestro proveedor en la cadena de conexi6n serh D a t a Source. Creacidn de pvoveedores ADO. cerrada o abierta. Database Get R e t u r n strDataBase End Get E n d Property . por ejemplo C: \Windows. son datos accesibles mediante propiedades definidas en IDb- Connection 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 . Los partimetros establecidos con la cadena de conexibn.siendo su valor el camino con el que se desea conec- tar.NET Observe que la cadena de conexion se guarda. 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 = " Data Source= " & s t r Da t a B a s e E n d Sub . ~ . asi como el estado en el que se encuentra la conexion. .+ ~.22.

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

con la cual podremos definir y ejecutar comandos. habria que modificar el analisis de la cadena de conexion. asi como la implementacih de 10s m6todos Open ( ) y Close ( ) para que realmente estableciesen la conexi6n con el origen. I. No sera importante. aunque implementaremos las propiedades necesarias para mantener esos datos. C o mp o n e rlt 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 . con 10s miembros de datos que tendra esta clase y que son 10s siguientes: Inherits C o m p o n e r1 t Mo d e 1 . 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. 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 .22.( ) 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! . En realidad el comando sera siempre el mismo: obtener todas las entradas de directorio que existan en la carpeta esta- blecida en el objeto FileSystemClientConnection.NET Get Return 0 End Get End Property Public Overloads Function Beg i n T r a rl s . La siguiente clase que crearemos sera FileSystemClientCommand. el tip0 del comando o la cadena que lo defina. B e q i rlT r a rI . Con esto ya tenemos la clase que permitira conectar con el origen de datos. Creacidn d e proveedores ADO.i c t i or. por tanto. De querer usarla para acceder a una base de datos. Comenzamos por el principio.mientras que las dos versiones de BeginTransaction ( ) no hacen nada. e c t i o rl .c a c t i I) n End Function La propiedad ConnectionTimeout siempre devuelve 0. o un archivo.

La conexi6n y tanto el tip0 de comando como su texto son parfimetros del co- mando que pueden ser modificados en cualquier momento. Observe que dfOrigen tiene el modificador Friend. se limitan a guardar 10s parimetros facilitados en las variables que correspon- den. 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 . ya que no se emplean hasta la invocaci6n a uno de 10s mktodos ExecuteXXX ( ) . Por tiltimo tenemos la variable dfOrigen. Act0 seguido implementaremos 10s distintos constructores de la clase. 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 . Programacidn de bases de datos con Visual Basic . 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. - 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 mrn a n d T e x t cnConnection = Connection End Sub Son 10s tres que podemos encontrar en 10s demfis proveedores. La va- riable cnconnection mantendrfi un enlace entre el comando y el objeto File- Systemclientconnection sobre el que actuarfi. sin efectuar ninguna comprobaci6n adicional sobre su validez.facilitando el acceso a 61 desde la clase FileSystemClientDataReader que crearemos en el punto si- guiente. se actuar6 sobre este objeto. segun verfi despuks. Como puede ver.NET Tenemos sendas variables para almacenar el tip0 y texto del comando. que actuarfi como origen de datos. A1 ejecutar el comando. en este caso concreto tres: Public Sub New ( ) MyBase.

L erlg th End If End Function Observe que no usamos para nada el tip0 de comando ni el texto. C o n n e c t Io Ii 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. En este caso. O p e n Then Return d f 0r 1y e n . 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 . 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 im- plementacion util para tres de ellos. a fin de que fuese posible seleccionar s610 las entradas de archivo o s610 las entra- das de directorio. 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 rld . En . Get F 1 1e Sy st e m 1 rl f o s . = CType ( Va 1u e . como puede verse a continuacibn. obteniendo el numero de entradas con la propiedad Length. Creacidn d e proveedores ADO. debe eje- cutar el comando sin recuperar en realidad datos.NET Publlc Property C o m m a n d T y p e ( ) As ComrnandType Implements IDbCommand. ExecuteNonQuery ( ) .Antes se comprueba que tenemos un objeto de conexi6n asociado y. adem&. recupe- ramos las entradas del camino indicado con el mktodo Get Fi1e S ystem1n fo s ( ) .22. que dicha conexi6n est6 abierta. o bien s610 las entradas que se ajustasen a un cierto patr6n. devolviendo tan s610 el numero de filas que se obtendrian. State = C o r t r i e c t i o n S t a t e .t 1nr. El primero. mejorando la clase FileSystemClientCommand. Podriamos modificar esta implementacGn.

el c6digo siguiente a1 mbdulo. aunque 10s m6todos y propiedades queden sin c6digo util.filtrar las entradas obteni- das. creamos un FileSys temClientDataReader asociado con este comando. 6sta tambien esta obligada a implementar una serie de metodos aunque sin ninguna funciona- lidad. devolviendolo como resultado. Lo haremos ask ( ) A s IDataReader I f Not cnconnection I s Nothing And - cnConnection. Dicho valor indicaria un comportamiento a1 que tendria que ajustarse el lector de datos. ignoramos el valor y sencillamente ejecutamos la primera versi6n del metodo. por ejemplo utilizando 10s metodos GetFiles ( ) y GetDirectories ( ) en lugar de GetFileSystemInfos ( ) . por tanto.ExecutePeader Return ExecuteReaderO End Function Como ocurriera con la clase FileSystemClientConnection. 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 co- nexi6n y. a continuaci6n. El siguiente metodo que implementaremos sera ExecuteReader ( ) que. en lugar de usar directamen- te la colecci6n facilitada por Get Fi1e Sys tem1 n fo s ( ) .Open Then onnection. como sabe. El ultimo metodo util a implementar es la versi6n de ExecuteReader ( ) que acepta un valor CommandBehavior como parametro. .NET esos casos habria que analizar el texto del comando y. Como se ve a con- tinuacibn.State = ConnectionState. debe facilitar un objeto que implemente las interfaces IDataReader e IDa- taRecord. PU s Function ExecuteReaderi ByVal b e h a v i o r A s CommandBehavior) A s IDataReader - Implements 1DbComrnand. Es precis0 afiadir. Programacidn de bases de datos con Visual Basic .

T r a n s a c t i o n Get Return CType ( Nothing. 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 . 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. C a n c e l End Sub .NET Public Function E x e c u t e s c a l a r 0 As Object Implements 1DbComrnand. C r e a t e Pa rarnet e r Return Nothing End Function Public Sub P r e p a r e ( ) Implements IDbCornmand. 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 .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 . 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 .22. Creacidn de proveedores ADO. 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 ( ) Implements IDbCornmand. P a r a r n e t e r s Get 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 .

mientras que la segunda ser6 -1 de tal . La informacion ser6 recuperada del objeto DirectoryInf o creado por el comando. con la declaracih de miembros de datos de la clase. f s cCommand almacenar6 la referencia a1 comando asociado a este lector. Programacidn de bases de datos con Visual Basic . cuya clase nos disponemos a im- plementar a continuacion. que mantendr6 la fila ac- tual y el numero total de filas. 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. obteniendo el valor de cada una de las columnas. Con ella podremos ir recorriendo las filas de datos.L e n g t h iPosition = -1 End Sub Ademas de guarder la referencia a1 comando. stemClientCornmand) F i l e S y s t e m I n f 0 s . La primera contendr6 el ntimero de elementos obteni- dos del m6todo Get FileSys temInf 0 s ( ) . a1 que tenemos acceso por ha- berse declarado Friend en lugar de Private. Comenzamos.NET El mgtodo ExecuteReader ( ) de la clase definida en el punto anterior devuel- ve un objeto FileSystemClientDataReader. que sera la siguiente: ' t e rnC'1 1 e rl t Da t a Re ad c r Pub1 1c C1 ass Fi 1 e Sy Inherits ComponentModpl . iposition e iRows. Asi. como en 10s puntos anteriores. Esta clase contar6 con un unico constructor que tomar6 como par6metro la re- ferencia al comando asociado. damos un valor inicial a la varia- bles iRows e iposition. no podra nunca crearse un lector de datos sin comando asociado.

Con este fin tendremos que implementar dos versiones diferentes de la propiedad 1tern. a continuacih.NET forma que la primera llamada a1 metodo Read ( ) nos coloque realmente en la pri- mera fila de datos. el nombre de la columna.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.Item Get Return GetValue(Ge