Sie sind auf Seite 1von 431

ILCOMP

INSTITUTO LATINOAMERICANO DE COMPUTACION



Contenido
Qu es la plataforma .NET? Cmo trabaja el Framework .NET? .................................................................... 2
.NET Framework en contexto ......................................................................................................................... 3
Caractersticas de Common Language Runtime ............................................................................................. 3
Biblioteca de clases de .NET Framework ........................................................................................................ 4
Qu es Visual Studio .NET? ............................................................................................................................... 6
Novedades en Visual Studio 2008 ...................................................................................................................... 6
Nuevo en la versin del lanzamiento original de Visual Studio 2008 ............................................................. 7
Soluciones y proyectos ....................................................................................................................................... 8
Contenedores: soluciones y proyectos ........................................................................................................... 8
Elementos: archivos, referencias y conexiones de datos ............................................................................... 8
Propiedades del proyecto............................................................................................................................... 8
Visual Studio: Paseo rpido del entorno de desarrollo integrado (IDE) ........................................................... 11
Entorno de desarrollo integrado .................................................................................................................. 11
Sistema de proyectos ................................................................................................................................... 11
Editores y diseadores ................................................................................................................................. 12
Herramientas de compilacin y depuracin ................................................................................................. 15
Herramientas de implementacin ................................................................................................................ 18
Documentacin de productos ...................................................................................................................... 20
Cuadro de herramientas ............................................................................................................................... 20
Forma de uso ............................................................................................................................................ 20
Ventana Propiedades ................................................................................................................................... 21
Proyecto de aplicacin de consola. .................................................................................................................. 22
Proyecto de aplicacin Windows. .................................................................................................................... 22
Proyecto de biblioteca de clases. ..................................................................................................................... 22
Proyecto de aplicacin Web. ............................................................................................................................ 23
Lo nuevo en 2.0 ............................................................................................................................................ 23
Introduccin a Pginas ASP.NET ................................................................................................................... 23
Introduccin a los Controles de Servidor de ASP.NET .................................................................................. 25
Comprendiendo los conceptos de programacin ............................................................................................ 26
Qu es la programacin dirigida por eventos? ........................................................................................... 26
Clases: planos para construir objetos ........................................................................................................... 26
Clases y objetos ............................................................................................................................................ 26
Encapsulacin ............................................................................................................................................... 27
Herencia ....................................................................................................................................................... 27
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Miembros compartidos ................................................................................................................................ 28
Sombrear ...................................................................................................................................................... 28
Fundamentos de la herencia ........................................................................................................................ 28
La palabra clave MyBase .............................................................................................................................. 29
La palabra clave MyClass .............................................................................................................................. 29
Qu son las propiedades, mtodos y eventos? .......................................................................................... 30
Propiedades .................................................................................................................................................. 30
Mtodos ....................................................................................................................................................... 30
Eventos ......................................................................................................................................................... 31
Trabajando con formularios de Windows ........................................................................................................ 31
Cmo crear un formulario ............................................................................................................................ 32
Cmo establecer valores a propiedades de un formulario .......................................................................... 33
Cmo llamar a mtodos ............................................................................................................................... 35
Cmo manejar eventos de formulario ......................................................................................................... 35
Formularios modales y no modales .............................................................................................................. 36
Formularios MDI ........................................................................................................................................... 36
Crear formularios principales MDI ........................................................................................................... 36
Crear formularios MDI secundarios.......................................................................................................... 37
Determinar el formulario secundario MDI activo .................................................................................... 38
Organizar formularios MDI secundarios ................................................................................................... 39
Trabajando con controles ................................................................................................................................. 39
Cmo agregar controles a un formulario ..................................................................................................... 39
Cmo establecer propiedades de los controles ........................................................................................... 40
Cmo agregar cdigo a los eventos de los controles ................................................................................... 40
Cmo usar la funcin MessageBox ............................................................................................................... 41
Ejemplos: .................................................................................................................................................. 41
Show ............................................................................................................................................................. 42
Dando estilo al cdigo ...................................................................................................................................... 42
Convenciones de nombres ........................................................................................................................... 42
Cmo dar formato y documentar el cdigo ................................................................................................. 43
Introduccin a VB ............................................................................................................................................. 44
Tipos de datos en .Net .................................................................................................................................. 44
Hay clases y estructuras adicionales disponibles en .NET Framework. .................................................... 44
Tipos de valores y tipos de referencia ...................................................................................................... 44
Los tipos de datos tienen Miembros ........................................................................................................ 44
Tipos de datos en VB .................................................................................................................................... 45
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Tipos de datos declarados ........................................................................................................................ 45
Variables (declaracin, mbito y uso) .......................................................................................................... 46
Uso ............................................................................................................................................................ 46
Asignar valore ........................................................................................................................................... 46
Variables y propiedades ........................................................................................................................... 46
Declaracin de variables ............................................................................................................................... 47
Niveles de declaracin .............................................................................................................................. 47
Declarar el tipo de datos .......................................................................................................................... 47
Inferencia de tipo de variable local .......................................................................................................... 47
Declarar caractersticas ............................................................................................................................ 47
mbito en Visual Basic ................................................................................................................................. 48
Eleccin de mbito ................................................................................................................................... 50
Niveles de Acceso en Visual Basic ................................................................................................................ 50
Public ........................................................................................................................................................ 50
Protected .................................................................................................................................................. 51
Friend........................................................................................................................................................ 51
Protected Friend ....................................................................................................................................... 51
Private ...................................................................................................................................................... 51
Caracteres de Tipo y Literales....................................................................................................................... 52
Caracteres de tipo de identificador .......................................................................................................... 53
Caracteres de tipo de literal ..................................................................................................................... 53
Literales hexadecimales y octales ............................................................................................................ 54
Tipos de valor y tipos de referencia ............................................................................................................. 54
Tipos de valor ........................................................................................................................................... 54
Tipos de referencia ................................................................................................................................... 54
Elementos que no son tipos ..................................................................................................................... 54
Trabajar con el tipo de datos Object ........................................................................................................ 55
Resumen de tipos de datos de Visual Basic .................................................................................................. 55
Constantes .................................................................................................................................................... 56
Partes ........................................................................................................................................................ 56
Comentarios ............................................................................................................................................. 56
Ejemplo ..................................................................................................................................................... 57
Comentarios ................................................................................................................................................. 58
Intrucciones Option ...................................................................................................................................... 59
Option Explicit .......................................................................................................................................... 59
Option Strict ............................................................................................................................................. 60
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Option Infer .............................................................................................................................................. 61
Option Compare ....................................................................................................................................... 62
Operadores bsicos ...................................................................................................................................... 63
Prioridad de Operadores .............................................................................................................................. 65
Reglas de prioridad ................................................................................................................................... 65
Orden de prioridad ................................................................................................................................... 65
Asociatividad ............................................................................................................................................ 66
Espacios de nombre ..................................................................................................................................... 66
Evitar los conflictos de nombres .............................................................................................................. 67
Evitar los conflictos de nombres .............................................................................................................. 67
Nombres completos ................................................................................................................................. 67
Espacio de nombre o funcin My ................................................................................................................. 68
Realizar tareas con My.Application, My.Computer y My.User................................................................. 69
Instancias de objeto predeterminadas proporcionadas por My.Forms y My.WebServices .................... 70
Desarrollo rpido de aplicaciones con My.Resources y My.Settings ....................................................... 70
Cmo My depende del tipo de proyecto .................................................................................................. 70
Manipulacin de cadenas y nmeros ............................................................................................................... 72
Clase String ................................................................................................................................................... 72
Comentarios ............................................................................................................................................. 72
Ejemplos de String.Format ........................................................................................................................... 75
Estructuras de datos ......................................................................................................................................... 77
Structure ....................................................................................................................................................... 77
Cmo declarar una estructura .................................................................................................................. 77
Variables de estructura ............................................................................................................................ 78
Acceso a valores de estructura ................................................................................................................. 78
Estructuras y otros elementos de programacin ..................................................................................... 79
Estructuras y clases ...................................................................................................................................... 80
Similitudes ................................................................................................................................................ 80
Diferencias ................................................................................................................................................ 81
Instancias y variables ................................................................................................................................ 81
Estructuras de decisin .................................................................................................................................... 82
Operadores de comparacin y lgicos ......................................................................................................... 82
Operadores de comparacin .................................................................................................................... 82
Ejemplo ..................................................................................................................................................... 84
Operadores lgicos ................................................................................................................................... 87
Estructuras de decisin ................................................................................................................................ 90
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Construccin If...Then...Else ..................................................................................................................... 90
Construccin Select...Case ........................................................................................................................ 91
Construccin Try...Catch...Finally ............................................................................................................. 91
Cmo: Ejecutar instrucciones en funcin de una o varias condiciones ........................................................ 91
If .................................................................................................................................................................... 92
Select Case ................................................................................................................................................. 94
Partes ........................................................................................................................................................ 94
Funciones Iif & If ........................................................................................................................................... 95
Ciclos................................................................................................................................................................. 96
Bucles While ............................................................................................................................................. 96
Bucles Do .................................................................................................................................................. 96
Bucles For ................................................................................................................................................. 96
Bucles For Each ......................................................................................................................................... 96
Instruccin For Each...Next ........................................................................................................................... 98
Instruccin Do Loop ................................................................................................................................ 101
While End While ...................................................................................................................................... 103
Exit .............................................................................................................................................................. 104
Procedimientos y funciones ........................................................................................................................... 105
Sub (Declaracin, definicin y uso) ............................................................................................................ 106
Cmo: Llamar a un procedimiento que no devuelve un valor ............................................................... 107
Function (Declaracin, definicin y uso) .................................................................................................... 108
Crear un procedimiento que devuelve un valor ..................................................................................... 109
Para devolver un valor mediante la instruccin Return ......................................................................... 110
Para devolver un valor mediante Exit Function o End Function............................................................. 110
Manejador de excepciones ............................................................................................................................ 110
Control estructurado de excepciones .................................................................................................... 111
Control no estructurado de excepciones ............................................................................................... 111
Cmo elegir cundo usar control estructurado o no estructurado ........................................................ 111
Tipos de errores .......................................................................................................................................... 112
Depuracin de cdigo fuente ..................................................................................................................... 113
Interrumpir la ejecucin ......................................................................................................................... 113
Iniciar la ejecucin .................................................................................................................................. 113
Elegir un proyecto de inicio .................................................................................................................... 114
Puntos de interrupcin ........................................................................................................................... 114
Manejo de excepciones .............................................................................................................................. 115
Control estructurado de excepciones .................................................................................................... 116
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Clase de excepcin de Visual Basic ......................................................................................................... 119
Controles WinForm ........................................................................................................................................ 120
Label ............................................................................................ 120
Ejemplos ................................................................................................................................................. 121
TextBox ....................................................................................... 121
Ejemplos ................................................................................................................................................. 122
ComboBox .................................................................................. 123
ListBox ........................................................................................................................................................ 124
Ejemplos ................................................................................................................................................. 124
Button ...................................................................................... 124
Ejemplos ................................................................................................................................................. 125
DateTimePicker ......................................................................... 125
Propiedades principales ......................................................................................................................... 125
Mostrar una fecha con un formato personalizado ................................................................................. 125
Para mostrar un formato personalizado ........................................................................................... 126
Para agregar texto al valor con formato ........................................................................................... 126
Establecer y devolver fechas .................................................................................................................. 126
Para establecer el valor de fecha y hora del control ....................................................................... 126
Para devolver el valor de fecha y hora .............................................................................................. 127
GroupBox .................................................................................. 127
Ejemplo ................................................................................................................................................... 127
Panel .......................................................................................... 128
Ejemplos ................................................................................................................................................. 128
Checkbox .................................................................................. 129
Ejemplos ................................................................................................................................................. 129
RadioButton ............................................................................. 130
Ejemplos ................................................................................................................................................. 130
CheckedListBox ......................................................................... 131
Ejemplos ................................................................................................................................................. 132
Componentes WinForm ................................................................................................................................. 135
ErrorProvider .............................................................................. 135
Propiedades principales ......................................................................................................................... 135
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Mostrar iconos de error para la validacin de formularios .................................................................... 136
ColorDialog ............................................................................. 136
Cambiar la apariencia del componente ColorDialog de formularios Windows Forms ........................... 136
Para elegir un color utilizando el componente ColorDialog ................................................................... 137
FontDialog ............................................................................. 137
Ejemplos ................................................................................................................................................. 137
OpenFileDialog ......................................................................... 137
Ejemplos ................................................................................................................................................. 138
SaveFileDialog ......................................................................... 138
Ejemplos ................................................................................................................................................. 139
PrintDialog ............................................................................ 139
Ejemplos ................................................................................................................................................. 139
FolderBrowserDialog ................................................................... 140
Statusbar .................................................................................. 145
Ejemplos ................................................................................................................................................. 145
NotifyIcon .................................................................................. 146
Ejemplos ................................................................................................................................................. 146
MenuStrip .................................................................................. 148
Ejemplos ................................................................................................................................................. 149
ContextMenuStrip ....................................................................... 150
Ejemplos ................................................................................................................................................. 151
Tooltip ...................................................................................... 153
Ejemplos ................................................................................................................................................. 154
Programacin Orientada a Objeto ................................................................................................................. 155
Introduccin a los objetos en Visual Basic.................................................................................................. 155
Clases: como planos para objetos .......................................................................................................... 156
Clases y mdulos .................................................................................................................................... 158
Duracin de los objetos: cmo se crean y destruyen ............................................................................. 158
Utilizar constructores y destructores ..................................................................................................... 159
Administracin de recursos .................................................................................................................... 160
Determinar el tipo de objeto .................................................................................................................. 161
Cmo: Declarar un objeto usando un inicializador de objeto ................................................................ 162
Cmo: Utilizar la nueva palabra clave .................................................................................................... 163
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Propiedades, campos y mtodos de clases ................................................................................................ 164
Propiedades y procedimientos de propiedad ........................................................................................ 164
Comparacin de procedimientos de propiedades y campos ................................................................. 166
Mtodos de una clase ............................................................................................................................ 166
Propiedades y mtodos sobrecargados ................................................................................................. 167
Invalidar propiedades y mtodos ........................................................................................................... 168
Reemplazar modificadores ..................................................................................................................... 170
Miembros compartidos en Visual Basic.................................................................................................. 170
Cmo: Agregar campos y propiedades a una clase ................................................................................ 172
Cmo: Establecer y recuperar propiedades ........................................................................................... 173
Cmo: Realizar acciones con mtodos ................................................................................................... 174
Cmo: Pasar objetos a procedimientos .................................................................................................. 175
Cmo: Obtener acceso a miembros compartidos y no compartidos de un objeto ................................ 176
Relaciones entre objetos ............................................................................................................................ 176
Herencia en Visual Basic ............................................................................................................................. 177
Fundamentos de la herencia .................................................................................................................. 177
Cmo: Crear clases derivadas ................................................................................................................. 179
Cundo utilizar la herencia ..................................................................................................................... 180
Cmo: Heredar de una clase en Visual Basic .......................................................................................... 181
Polimorfismo .............................................................................................................................................. 181
Polimorfismo basado en la herencia ...................................................................................................... 181
Polimorfismo basado en la interfaz ........................................................................................................ 182
Interfaces en Visual Basic ........................................................................................................................... 183
Informacin general sobre interfaces .................................................................................................... 184
Definicin de interfaz ............................................................................................................................. 184
Palabra clave Implements e instruccin Implements ............................................................................. 184
Cundo se deben utilizar interfaces ....................................................................................................... 186
Cmo: Crear e implementar interfaces .................................................................................................. 186
Eventos y controladores de eventos .......................................................................................................... 187
WithEvents y la clusula Handles ........................................................................................................... 189
AddHandler y RemoveHandler ............................................................................................................... 189
Cmo: Agregar eventos a una clase ....................................................................................................... 190
Cmo: Provocar un evento (Visual Basic) ............................................................................................... 190
Cmo: Crear un evento y un controlador (Visual Basic) ......................................................................... 190
Cmo: Escribir controladores de eventos .............................................................................................. 191
Delegados de Visual Basic .......................................................................................................................... 192
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Los delegados y el operador AddressOf ................................................................................................. 192
Cmo: Invocar un mtodo delegado ...................................................................................................... 193
Colecciones en Visual Basic ........................................................................................................................ 194
Administrar grupos de objetos ............................................................................................................... 195
Cmo: Agregar, eliminar y recuperar los elementos de una coleccin .................................................. 195
Cmo: Recorrer en iteracin una coleccin de Visual Basic ................................................................... 197
Expresiones lambda .................................................................................................................................... 198
Tipos annimos .......................................................................................................................................... 203
Mtodos de extensin (Visual Basic) ...................................................................................................... 207
Cmo: Escribir un mtodo de extensin ................................................................................................ 213
Introduccin a SQL Server 2005 ..................................................................................................................... 214
Reseas de RDBMS ..................................................................................................................................... 214
Exploracin de SSMS .................................................................................................................................. 216
Nuevas funciones de las secuencias de comandos ................................................................................ 216
Caractersticas del Explorador de objetos .............................................................................................. 216
Principales ventanas y su funcionalidad ................................................................................................. 217
Tipos de datos ............................................................................................................................................ 217
Categoras de tipos de datos .................................................................................................................. 218
Creacin de base de datos y tablas Usando SSMS .................................................................................. 218
Crear una base de datos ......................................................................................................................... 218
Crear y modificar tablas.......................................................................................................................... 219
Propiedades de la tabla .......................................................................................................................... 219
Tablas temporales .................................................................................................................................. 219
Modificar tablas ...................................................................................................................................... 220
Sentencia DML (Lenguaje de Manipulacin de Datos) ............................................................................... 220
SELECT .................................................................................................................................................... 220
INSERT y SELECT INTO ............................................................................................................................ 222
SELECT INTO ........................................................................................................................................... 224
UPDATE ................................................................................................................................................... 224
DELETE .................................................................................................................................................... 226
ADO.NET ......................................................................................................................................................... 227
Arquitectura de ADO.NET ........................................................................................................................... 228
Proveedores de datos de .NET Framework (ADO.NET) .............................................................................. 229
Objetos principales de los proveedores de datos de .NET Framework ...................................................... 230
.Proveedor de datos de .NET Framework para servidor SQL Server (SqlClient) ......................................... 231
Ejemplos de cdigo de ADO.NET ................................................................................................................ 231
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Ejemplos del proveedor de datos de ADO.NET ...................................................................................... 231
Recuperacin y modificacin de datos en ADO.NET .................................................................................. 232
Conectar con un origen de datos (ADO.NET) ......................................................................................... 233
Establecer la conexin (ADO.NET) .......................................................................................................... 233
Conexin a SQL Server ............................................................................................................................ 233
Cadenas de conexin (ADO.NET) ............................................................................................................ 234
Generar cadenas de conexin a partir de archivos de configuracin .................................................... 234
Cadenas de conexin SqlClient ............................................................................................................... 235
Comandos y parmetros (ADO.NET) .......................................................................................................... 236
Ejecutar un comando (ADO.NET) ........................................................................................................... 236
Configurar parmetros y tipos de datos de parmetros (ADO.NET) ...................................................... 238
Usar parmetros con SqlCommand y con un procedimiento almacenado ............................................ 241
Modificar datos con procedimientos almacenados (ADO.NET) ............................................................. 242
Obtener un nico valor de una base de datos (ADO.NET) ..................................................................... 243
Actualizar datos en un origen de datos (ADO.NET) ................................................................................ 244
Realizar operaciones de catlogo (ADO.NET) ......................................................................................... 245
Recuperar datos mediante DataReader (ADO.NET) ............................................................................... 245
Recuperar varios conjuntos de resultados con NextResult .................................................................... 246
Rellenar un objeto DataSet desde un objeto DataAdapter (ADO.NET) .................................................. 247
Parmetros DataAdapter (ADO.NET) ..................................................................................................... 248
Realizar operaciones por lotes mediante DataAdapters (ADO.NET) ...................................................... 251
Utilizar la propiedad UpdateBatchSize ................................................................................................... 251
Transacciones y simultaneidad (ADO.NET) ................................................................................................ 253
Transacciones locales (ADO.NET) ........................................................................................................... 254
Transacciones distribuidas (ADO.NET) ................................................................................................... 256
Trabajo con System.Transactions ........................................................................................................... 256
Inscripcin automtica en una transaccin distribuida .......................................................................... 256
Inscripcin manual en una transaccin distribuida ................................................................................ 256
Transacciones promocionadas en SQL Server 2005 ............................................................................... 257
Configuracin de transacciones distribuidas .......................................................................................... 257
Integracin de System.Transactions con SQL Server (ADO.NET) ........................................................... 257
Creacin de transacciones promocionadas ............................................................................................ 258
Situaciones de uso de transacciones promocionadas ............................................................................ 258
Uso de TransactionScope ....................................................................................................................... 258
Datasets de ADO.NET ..................................................................................................................................... 261
DataSets, DataTables y DataViews (ADO.NET) ........................................................................................... 262
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Crear un DataSet (ADO.NET) .................................................................................................................. 263
Agregar DataTable a DataSet (ADO.NET) ............................................................................................... 263
Distinguir maysculas de minsculas ..................................................................................................... 263
Agregar DataRelations (ADO.NET) .......................................................................................................... 264
Navegar por DataRelations (ADO.NET) .................................................................................................. 264
Combinar contenido de DataSet (ADO.NET) .......................................................................................... 265
Nombres de tabla y espacios de nombres ............................................................................................. 265
Copiar contenido de DataSet (ADO.NET) ............................................................................................... 268
DataTables (ADO.NET) ................................................................................................................................ 269
Crear DataTable (ADO.NET) .................................................................................................................... 270
Agregar columnas a la DataTable (ADO.NET) ......................................................................................... 270
Crear columnas de expresin (ADO.NET) ............................................................................................... 271
Crear columnas AutoIncrement (ADO.NET) ........................................................................................... 272
Definir claves principales (ADO.NET) ...................................................................................................... 272
Restricciones de DataTable (ADO.NET) .................................................................................................. 273
UniqueConstraint ................................................................................................................................... 274
Manipular datos en DataTable ............................................................................................................... 274
Agregar datos a DataTable ..................................................................................................................... 275
Ver datos en DataTable .......................................................................................................................... 275
El mtodo Load ....................................................................................................................................... 277
Editar DataTable ..................................................................................................................................... 279
Estados de fila y versiones de fila ........................................................................................................... 280
Eliminar DataRow ................................................................................................................................... 282
AcceptChanges y RejectChanges ............................................................................................................ 282
DataViews (ADO.NET) ................................................................................................................................. 283
Crear DataView (ADO.NET)..................................................................................................................... 283
Ordenar y filtrar datos (ADO.NET) .......................................................................................................... 284
DataRows y DataRowViews (ADO.NET) .................................................................................................. 285
Buscar filas (ADO.NET) ............................................................................................................................ 285
Modificar objetos DataView (ADO.NET) ................................................................................................. 287
Administrar DataViews (ADO.NET) ......................................................................................................... 288
LINQ ................................................................................................................................................................ 289
Introduccin a LINQ en Visual Basic ........................................................................................................... 289
From (Clusula, Visual Basic) .................................................................................................................. 292
Select (Clusula, Visual Basic) ................................................................................................................. 292
Where (Clusula, Visual Basic) ............................................................................................................... 292
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Order By (Clusula, Visual Basic) ............................................................................................................ 292
Join (Clusula, Visual Basic) .................................................................................................................... 293
Group By (Clusula, Visual Basic) ........................................................................................................... 293
Group Join (Clusula, Visual Basic) ......................................................................................................... 293
Aggregate (Clusula, Visual Basic) .......................................................................................................... 293
Let (Clusula, Visual Basic) ..................................................................................................................... 294
Distinct (Clusula, Visual Basic) .............................................................................................................. 294
Skip (Clusula, Visual Basic) .................................................................................................................... 294
Skip While (Clusula, Visual Basic).......................................................................................................... 294
Take (Clusula, Visual Basic) ................................................................................................................... 294
Take While (Clusula, Visual Basic)......................................................................................................... 295
Cmo: Consultar una base de datos usando LINQ (Visual Basic) ........................................................... 296
Cmo: Llamar a un procedimiento almacenado usando LINQ (Visual Basic) ......................................... 298
Cmo: Modificar datos en una base de datos usando LINQ (Visual Basic) ............................................ 299
Cmo: Combinar datos con LINQ usando clusulas Join (Visual Basic) .................................................. 302
Cmo: Ordenar una coleccin usando LINQ (Visual Basic) .................................................................... 308
Cmo: Filtrar los resultados de consultas usando LINQ (Visual Basic) ................................................... 310
Cmo: Hacer el recuento, la suma o el promedio de datos usando LINQ (Visual Basic) ........................ 311
Cmo: Buscar los valores mximo y mnimo en el resultado de una consulta usando LINQ (Visual Basic)
................................................................................................................................................................ 313
Cmo: Devolver el resultado de una consulta con LINQ como tipo especfico (Visual Basic) ................ 314
LINQ to DataSet .......................................................................................................................................... 316
Informacin general de LINQ to DataSet ................................................................................................ 317
Cargar datos en DataSet ......................................................................................................................... 319
Cmo: Crear un proyecto LINQ to DataSet en Visual Studio .................................................................. 320
Consultas en LINQ to DataSet................................................................................................................. 321
Consultar DataSets (LINQ to DataSet) .................................................................................................... 324
Consultas de tabla nica (LINQ to DataSet)............................................................................................ 324
Consultas entre tablas (LINQ to DataSet) ............................................................................................... 326
Consultar DataSets con establecimiento de tipos .................................................................................. 327
Comparar DataRows (LINQ to DataSet).................................................................................................. 327
Crear DataTable desde una consulta (LINQ to DataSet) ......................................................................... 329
Mtodos genricos Field y SetField (LINQ to DataSet) ........................................................................... 336
Enlace de datos y LINQ to DataSet ......................................................................................................... 337
Crear un objeto DataView (LINQ to DataSet) ......................................................................................... 338
Crear DataView desde una consulta LINQ to DataSet ............................................................................ 338
Filtrar con DataView (LINQ to DataSet) .................................................................................................. 340
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Ordenar con DataView (LINQ to DataSet) .............................................................................................. 344
Consultar la coleccin DataRowView en un objeto DataView ............................................................... 347
ADO.NET Entity Framework ........................................................................................................................... 349
Introduccin a Entity Framework ............................................................................................................... 349
Generar un modelo Entity Data Model ...................................................................................................... 352
Trabajar con datos de entidad.................................................................................................................... 354
Consultar objetos ................................................................................................................................... 355
Informacin general de Servicios de objeto (Entity Framework) ............................................................... 356
Consultar datos como objetos (Entity Framework) .................................................................................... 358
Consultas de objeto [Entity Framework] ................................................................................................ 358
Dar forma a los resultados de la consulta (Entity Framework) .............................................................. 360
Mtodos del generador de consultas (Entity Framework) ..................................................................... 362
Trabajar con objetos (Entity Framework) ................................................................................................... 365
Agregar, modificar y eliminar objetos (Entity Framework) .................................................................... 366
Guardar los cambios y administrar la simultaneidad (Entity Framework) ............................................. 369
Restricciones referenciales (Entity Framework) ..................................................................................... 370
Administrar el contexto del objeto (Entity Framework) ............................................................................. 371
Asociar objetos (Entity Framework) ....................................................................................................... 371
Administrar conexiones en Servicios de objeto (Entity Framework) ..................................................... 372
Administrar transacciones en Servicios de objeto (Entity Framework) ................................................. 373
Desasociar objetos (Entity Framework) ................................................................................................. 374
LINQ to Entities ........................................................................................................................................... 375
Informacin general de LINQ to Entities ................................................................................................ 376
LINQ y el Entity Data Model ................................................................................................................... 377
Cmo crear un proyecto de LINQ to Entities en Visual Studio ............................................................... 377
Flujo de ejecucin de LINQ to Entities .................................................................................................... 379
Consultas en LINQ to Entities ................................................................................................................. 381
Operadores de consulta estndar en las consultas de LINQ to Entities ................................................. 384
Expresiones en consultas de LINQ to Entities......................................................................................... 386
Expresiones constantes .......................................................................................................................... 387
Expresiones de comparacin .................................................................................................................. 387
Comparaciones de NULL ......................................................................................................................... 390
Expresiones de inicializacin .................................................................................................................. 392
Propiedades de navegacin .................................................................................................................... 394
Asignacin de funciones y llamadas a mtodos de CLR ......................................................................... 395
Terminologa de Entity Framework ........................................................................................................ 395
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Crystal Reports ............................................................................................................................................... 399
Nuevas caractersticas en Crystal Reports Basic para Visual Studio 2008 .................................................. 399
Por qu se utiliza una herramienta de creacin de informes? ................................................................. 400
Qu es Crystal Reports? ............................................................................................................................ 400
Qu es Crystal Reports para Visual Studio? .............................................................................................. 401
Crystal Reports Designer incrustado .......................................................................................................... 401
Controles de visores de informes ............................................................................................................... 401
Modelo de objetos CrystalReportViewer ................................................................................................... 402
Modelo de objetos ReportDocument......................................................................................................... 402
Creacin de Informes ................................................................................................................................. 403
Diseo del Crystal Report Designer incrustado .......................................................................................... 404
Informacin general de las secciones de los informes ............................................................................... 404
Encabezado de informe .......................................................................................................................... 404
Encabezado de pgina ............................................................................................................................ 404
Detalles ................................................................................................................................................... 405
Pie de informe ........................................................................................................................................ 405
Pie de pgina .......................................................................................................................................... 405
Secciones de informes adicionales ......................................................................................................... 405
Caractersticas de la seccin de informes ................................................................................................... 406
Dar formato a secciones de informe .......................................................................................................... 406
Explorador de campos ................................................................................................................................ 406
Barras de herramientas de Crystal Reports ................................................................................................ 407
Men Crystal Reports ................................................................................................................................. 407
Ficha Vista previa ........................................................................................................................................ 408
Orgenes de datos admitidos ...................................................................................................................... 408
Elaboracin de informes a partir de conjuntos de datos ADO.NET ............................................................ 409
Seleccionar una base de datos ............................................................................................................... 409
Definir tablas virtuales basadas en un comando/consulta SQL ............................................................. 410
Cambiar la ubicacin del origen de datos .................................................................................................. 411
Vincular tablas de bases de datos .............................................................................................................. 412
Insertar campos de base de datos .............................................................................................................. 412
Objetos de campo y de texto ..................................................................................................................... 413
Insertar y mover campos ........................................................................................................................ 413
Ajustar el tamao de los campos ........................................................................................................... 413
Eliminar campos ..................................................................................................................................... 413
Mostrar nombres de campo ................................................................................................................... 414
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

Agregar encabezados de campo............................................................................................................. 414
Insertar objetos de texto ........................................................................................................................ 414
Insertar campos de base de datos en objetos de texto ......................................................................... 415
Rotar texto .............................................................................................................................................. 415
Insertar campos especiales ........................................................................................................................ 415
Ordenar datos............................................................................................................................................. 416
Dar formato a datos ................................................................................................................................... 417





ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 2 | P g i n a

Qu es la plataforma .NET? Cmo trabaja el Framework .NET?
.NET Framework es un componente integral de Windows que admite la creacin y la ejecucin de la
siguiente generacin de aplicaciones y servicios Web XML. El diseo de .NET Framework est enfocado a
cumplir los objetivos siguientes:
Proporcionar un entorno coherente de programacin orientada a objetos, en el que el cdigo de los
objetos se pueda almacenar y ejecutar de forma local, ejecutar de forma local pero distribuida en
Internet o ejecutar de forma remota.
Proporcionar un entorno de ejecucin de cdigo que reduzca lo mximo posible la implementacin
de software y los conflictos de versiones.
Ofrecer un entorno de ejecucin de cdigo que fomente la ejecucin segura del mismo, incluso del
creado por terceras personas desconocidas o que no son de plena confianza.
Proporcionar un entorno de ejecucin de cdigo que elimine los problemas de rendimiento de los
entornos en los que se utilizan secuencias de comandos o intrpretes de comandos.
Ofrecer al programador una experiencia coherente entre tipos de aplicaciones muy diferentes,
como las basadas en Windows o en el Web.
Basar toda la comunicacin en estndares del sector para asegurar que el cdigo de .NET
Framework se puede integrar con otros tipos de cdigo.
.NET Framework contiene dos componentes principales: Common Language Runtime (CLR, motor en
tiempo de ejecucin) y la biblioteca de clases de .NET Framework. EL CLR es el fundamento de .NET
Framework. El motor en tiempo de ejecucin se puede considerar como un agente que administra el cdigo
en tiempo de ejecucin y proporciona servicios centrales, como la administracin de memoria, la
administracin de subprocesos y la interaccin remota, al tiempo que aplica una seguridad estricta a los
tipos y otras formas de especificacin del cdigo que fomentan su seguridad y solidez. De hecho, el
concepto de administracin de cdigo es un principio bsico del motor en tiempo de ejecucin. El cdigo
destinado al motor en tiempo de ejecucin se denomina cdigo administrado, a diferencia del resto de
cdigo, que se conoce como cdigo no administrado. La biblioteca de clases, el otro componente principal
de .NET Framework, es una completa coleccin orientada a objetos de tipos reutilizables que se pueden
emplear para desarrollar aplicaciones que abarcan desde las tradicionales herramientas de interfaz grfica
de usuario (GUI) o de lnea de comandos hasta las aplicaciones basadas en las innovaciones ms recientes
proporcionadas por ASP.NET, como los formularios Web Forms y los servicios Web XML.
.NET Framework puede alojarse en componentes no administrados que cargan al Common Language
Runtime en sus procesos e inician la ejecucin de cdigo administrado, con lo que se crea un entorno de
software en el que se pueden utilizar caractersticas administradas y no administradas. En .NET Framework
no slo se ofrecen varios hosts de motor en tiempo de ejecucin, sino que tambin se admite el desarrollo
de estos hosts por parte de terceros.
Por ejemplo, ASP.NET aloja el motor en tiempo de ejecucin para proporcionar un entorno de servidor
escalable para el cdigo administrado. ASP.NET trabaja directamente con el motor en tiempo de ejecucin
para habilitar aplicaciones de ASP.NET y servicios Web XML, que se tratan ms adelante en este tema.
Internet Explorer es un ejemplo de aplicacin no administrada que aloja el motor en tiempo de ejecucin
(en forma de una extensin de tipo MIME). Al usar Internet Explorer para alojar el motor en tiempo de
ejecucin, puede incrustar componentes administrados o controles de Windows Forms en documentos
HTML. Al alojar el motor en tiempo de ejecucin de esta manera se hace posible el uso de cdigo mvil
administrado (similar a los controles de Microsoft ActiveX), pero con mejoras significativas que slo el
cdigo administrado puede ofrecer, como la ejecucin con confianza parcial y el almacenamiento aislado de
archivos.
En la ilustracin siguiente se muestra la relacin de Common Language Runtime y la biblioteca de clases con
las aplicaciones y el sistema en su conjunto. En la ilustracin se representa igualmente cmo funciona el
cdigo administrado dentro de una arquitectura mayor.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 3 | P g i n a

.NET Framework en contexto

En las secciones siguientes se describen con ms detalle los componentes y caractersticas principales de
.NET Framework.
Caractersticas de Common Language Runtime
Common Language Runtime administra la memoria, ejecucin de subprocesos, ejecucin de cdigo,
comprobacin de la seguridad del cdigo, compilacin y dems servicios del sistema. Estas caractersticas
son intrnsecas del cdigo administrado que se ejecuta en Common Language Runtime.
Con respecto a la seguridad, los componentes administrados reciben grados de confianza diferentes, en
funcin de una serie de factores entre los que se incluye su origen (como Internet, red empresarial o equipo
local). Esto significa que un componente administrado puede ser capaz o no de realizar operaciones de
acceso a archivos, operaciones de acceso al Registro y otras funciones delicadas, incluso si se est utilizando
en la misma aplicacin activa.
El motor en tiempo de ejecucin impone seguridad en el acceso al cdigo. Por ejemplo, los usuarios pueden
confiar en que un archivo ejecutable incrustado en una pgina Web puede reproducir una animacin en la
pantalla o entonar una cancin, pero no puede tener acceso a sus datos personales, sistema de archivos o
red. Por ello, las caractersticas de seguridad del motor en tiempo de ejecucin permiten que el software
legtimo implementado en Internet sea excepcionalmente variado.
Adems, el motor en tiempo de ejecucin impone la solidez del cdigo mediante la implementacin de una
infraestructura estricta de comprobacin de tipos y cdigo denominada CTS (Common Type System, Sistema
de tipos comn). CTS garantiza que todo el cdigo administrado es autodescriptivo. Los diferentes
compiladores de lenguajes de Microsoft y de terceros generan cdigo administrado que se ajusta a CTS. Esto
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 4 | P g i n a

significa que el cdigo administrado puede usar otros tipos e instancias administrados, al tiempo que se
aplica inflexiblemente la fidelidad y seguridad de los tipos.
Adems, el entorno administrado del motor en tiempo de ejecucin elimina muchos problemas de software
comunes. Por ejemplo, el motor en tiempo de ejecucin controla automticamente la disposicin de los
objetos, administra las referencias a stos y los libera cuando ya no se utilizan. Esta administracin
automtica de la memoria soluciona los dos errores ms comunes de las aplicaciones: la prdida de
memoria y las referencias no vlidas a la memoria.
Adems, el motor en tiempo de ejecucin aumenta la productividad del programador. Por ejemplo, los
desarrolladores pueden crear aplicaciones en el lenguaje que prefieran y seguir sacando todo el provecho
del motor en tiempo de ejecucin, la biblioteca de clases y los componentes escritos en otros lenguajes por
otros colegas. El proveedor de un compilador puede elegir destinarlo al motor en tiempo de ejecucin. Los
compiladores de lenguajes que se destinan a .NET Framework hacen que las caractersticas de .NET
Framework estn disponibles para el cdigo existente escrito en dicho lenguaje, lo que facilita
enormemente el proceso de migracin de las aplicaciones existentes.
Aunque el motor en tiempo de ejecucin est diseado para el software del futuro, tambin es compatible
con el software actual y el software antiguo. La interoperabilidad entre el cdigo administrado y no
administrado permite que los desarrolladores continen utilizando los componentes COM y las DLL que
necesiten.
El motor en tiempo de ejecucin est diseado para mejorar el rendimiento. Aunque Common Language
Runtime proporciona muchos servicios estndar de motor en tiempo de ejecucin, el cdigo administrado
nunca se interpreta. Una caracterstica denominada compilacin JIT (Just-In-Time) permite ejecutar todo el
cdigo administrado en el lenguaje mquina nativo del sistema en el que se ejecuta. Mientras tanto, el
administrador de memoria evita que la memoria se pueda fragmentar y aumenta la zona de referencia de la
memoria para mejorar an ms el rendimiento.
Por ltimo, el motor en tiempo de ejecucin se puede alojar en aplicaciones de servidor de gran
rendimiento, como Microsoft SQL Server e Internet Information Services (IIS). Esta infraestructura
permite utilizar cdigo administrado para escribir lgica empresarial, al tiempo que se disfruta del superior
rendimiento de los mejores servidores empresariales del sector que puedan alojar el motor en tiempo de
ejecucin.
Biblioteca de clases de .NET Framework
La biblioteca de clases de .NET Framework es una coleccin de tipos reutilizables que se integran
estrechamente con Common Language Runtime. La biblioteca de clases est orientada a objetos, lo que
proporciona tipos de los que su propio cdigo administrado puede derivar funciones. Esto ocasiona que los
tipos de .NET Framework sean sencillos de utilizar y reduce el tiempo asociado con el aprendizaje de las
nuevas caractersticas de .NET Framework. Adems, los componentes de terceros se pueden integrar sin
dificultades con las clases de .NET Framework.
Por ejemplo, las clases de coleccin de .NET Framework implementan un conjunto de interfaces que puede
usar para desarrollar sus propias clases de coleccin. stas se combinarn fcilmente con las clases de .NET
Framework.
Como en cualquier biblioteca de clases orientada a objetos, los tipos de .NET Framework permiten realizar
diversas tareas de programacin comunes, como son la administracin de cadenas, recoleccin de datos,
conectividad de bases de datos y acceso a archivos. Adems de estas tareas habituales, la biblioteca de
clases incluye tipos adecuados para diversos escenarios de desarrollo especializados. Por ejemplo, puede
utilizar .NET Framework para desarrollar los siguientes tipos de aplicaciones y servicios:
Aplicaciones de consola.
Aplicaciones GUI de Windows (Windows Forms).
Aplicaciones de Windows Presentation Foundation (WPF).
Aplicaciones de ASP.NET.
Servicios web.
Servicios de Windows.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 5 | P g i n a

Aplicaciones orientadas a servicios utilizando Windows Communication Foundation (WCF).
Aplicaciones habilitadas para el flujo de trabajo utilizando Windows Workflow Foundation (WF).
Por ejemplo, las clases de Windows Forms son un conjunto completo de tipos reutilizables que simplifican
enormemente el desarrollo de interfaces GUI para Windows. Si escribe una aplicacin Web Form de
ASP.NET, puede utilizar las clases de formularios Web Forms.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 6 | P g i n a

Qu es Visual Studio .NET?
Visual Studio es un conjunto completo de herramientas de desarrollo para la generacin de aplicaciones
web ASP.NET, Servicios Web XML, aplicaciones de escritorio y aplicaciones mviles. Visual Basic, Visual C# y
Visual C++ utilizan todos el mismo entorno de desarrollo integrado (IDE), que habilita el uso compartido de
herramientas y hace ms sencilla la creacin de soluciones en varios lenguajes. Asimismo, dichos lenguajes
utilizan las funciones de .NET Framework, las cuales ofrecen acceso a tecnologas clave para simplificar el
desarrollo de aplicaciones web ASP y Servicios Web XML.
Novedades en Visual Studio 2008
Proyectos de Smart Device
Aplicaciones conectadas ocasionalmente. Visual Studio proporciona herramientas para crear aplicaciones
de Smart Device que se conectan ocasionalmente mediante SQL Server Compact y Microsoft
Synchronization Services para ADO.NET (Dispositivos) versin 1.0.
Controles y componentes de Power Packs. Los controles y componentes de Microsoft Visual Basic Power
Packs 3.0 que anteriormente estaban disponibles para descarga se incluyen ahora en Visual Studio 2008 SP1.
Los Power Packs se pueden usar en proyectos de aplicacin de Windows Forms en Visual Basic y en Visual
C#.
Se incluyen con los Power Packs un nuevo control DataRepeater adems de las versiones actualizadas de los
controles Line y Shape anteriores, el componente PrintForm y la Biblioteca de compatibilidad Printer.
DataRepeater. El nuevo control DataRepeater permite utilizar controles estndar de formularios Windows
Forms para mostrar filas de datos en un contenedor desplazable. Este control proporciona ms flexibilidad
que los controles estndar de cuadrcula.
Controles de lneas y formas. Los controles Line y Shape constituyen un conjunto de tres controles grficos
que permiten dibujar lneas, valos y rectngulos en formularios y contenedores en tiempo de diseo. Estos
controles ayudan a mejorar fcilmente el aspecto de la interfaz de usuario. Los controles Line y Shape
encapsulan muchos de los mtodos grficos incluidos en el espacio de nombres System.Drawing para que
pueda dibujar las lneas y formas en un paso nico sin tener que crear objetos grficos, lpices y pinceles.
Puede crear efectos de grficos complejos, como rellenos de degradado, estableciendo simplemente
algunas propiedades. Estos controles tambin proporcionan eventos como clic y doble clic de modo que
pueda responder a los usuarios finales e interactuar con ellos.
Componente PrintForm. El componente PrintForm est diseado para imprimir fcilmente un formulario
Windows Forms tal y como lo hara en Visual Basic 6.0. Con el uso del componente PrintForm puede una vez
ms disear un formulario Windows Forms tal y como desea, y permite a los usuarios imprimir el formulario
como un informe rpido.
Biblioteca de compatibilidad de impresoras. La Biblioteca de compatibilidad Printer permite actualizar los
proyectos que usan el objeto Printer y la coleccin Printers de Visual Basic 6.0 sin necesidad de volver a
escribir la lgica de impresin. No tiene ms que aadir una referencia a la biblioteca, declarar un objeto
Printer y realizar algunos pequeos cambios de sintaxis para que el proyecto pueda imprimir usando la
coleccin Printers y el objeto Printer como en Visual Basic 6.0. Esta versin incorpora un nuevo mtodo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 7 | P g i n a

Write en el objeto Printer. El nuevo mtodo permite imprimir texto sin necesidad de usar un retorno de
carro forzado, como la sintaxis de punto y coma que usa el mtodo Print en Visual Basic 6.0.
Distribucin de Power Packs. Tambin se incluye un paquete de inicio que permite redistribuir fcilmente
los Power Packs de Visual Basic con una aplicacin. Esto permite incluir los Power Packs en un proyecto o
proyecto de instalacin de ClickOnce tan solo con hacer clic en una casilla.
Compatibilidad de .NET Framework Client Profile. Visual Studio 2008 SP1 admite el nuevo .NET Framework
Client Profile, un subconjunto de la biblioteca redistribuible de .NET Framework que se optimiza para los
escenarios de cliente. stas son algunas de las ventajas de Client Profile:
Un programa previo, con solo 200 K, permite una respuesta rpida a la direccin URL de instalacin
de una aplicacin.
Una interfaz de usuario personalizada integrada permite empaquetar la aplicacin junto con Client
Profile para una experiencia de instalacin sin problemas.
Un pequeo tamao de archivo de 26,5 MB ayuda a conseguir una instalacin rpida.
Implementacin ClickOnce. La implementacin ClickOnce incluye las siguientes caractersticas:
Compatibilidad para publicar manifiestos sin firmar.
Mejoras en el cuadro de dilogo Opciones de publicacin. Estas mejoras incluyen compatibilidad
para configurar las opciones siguientes:
o Asociaciones de archivo.
o URL del error, que especifica un sitio web que se muestra en los cuadros de dilogo que
aparecen durante las instalaciones de ClickOnce.
o Nombre del conjunto de aplicaciones, que especifica el nombre de la carpeta del men
Inicio en la que se instalar la aplicacin.
o Excluir URL del proveedor de implementacin, que especifica si se excluye la direccin URL
del proveedor de implementacin del manifiesto de implementacin.
Nuevo en la versin del lanzamiento original de Visual Studio 2008
Entorno de desarrollo integrado (IDE) - Migracin de la configuracin
Si ha instalado Visual Studio 2005 y Visual Studio 2008 en el mismo equipo, cuando inicie por primera vez
Visual Studio 2008, podr migrar la mayor parte de la configuracin de Visual Studio 2005. Los fragmentos
de cdigo y los complementos de otro fabricante no se pueden migrar de forma automtica y se deben
volver a instalar manualmente para su uso en Visual Studio 2008. Si no ha instalado Visual Studio 2005 y
Visual Studio 2008 en el mismo equipo, an puede migrar manualmente la configuracin de Visual Studio
2005 para su uso en Visual Studio 2008.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 8 | P g i n a

Soluciones y proyectos
Visual Studio dispone de dos contenedores que le ayudan a administrar eficazmente los elementos
necesarios para el desarrollo, como referencias, conexiones de datos, carpetas y archivos. Estos
contenedores se denominan soluciones y proyectos. Asimismo, Visual Studio proporciona carpetas de
soluciones para organizar proyectos relacionados en grupos y, a continuacin, llevar a cabo acciones en esos
grupos de proyectos. El Explorador de soluciones, una interfaz para ver y administrar estos contenedores y
sus elementos asociados, forma parte del entorno de desarrollo integrado (IDE).
Contenedores: soluciones y proyectos
Las soluciones y los proyectos contienen elementos en forma de referencias, conexiones de datos, carpetas
y archivos necesarios para crear la aplicacin. Una solucin puede contener varios proyectos y un proyecto
normalmente contiene varios elementos. Estos contenedores permiten sacar partido del IDE mediante las
siguientes tareas:
Administrar la configuracin de la solucin en su totalidad o dividida en proyectos individuales
Utilizar el Explorador de soluciones para controlar los detalles de la administracin de archivos y
centrarse al mismo tiempo en los elementos que constituyen la labor de desarrollo.
Agregar elementos tiles a varios proyectos de la solucin o a la solucin sin tener que hacer
referencia a dichos elementos en cada proyecto.
Trabajar en diversos archivos, independientes de soluciones o proyectos
Elementos: archivos, referencias y conexiones de datos
Los elementos pueden ser archivos y otras partes del proyecto como referencias, conexiones de datos o
carpetas. En el Explorador de soluciones los elementos pueden organizarse de varias formas:
En forma de elementos del proyecto, es decir, elementos que componen el proyecto, tales como
formularios, archivos de cdigo fuente y clases de un proyecto del Explorador de soluciones. La
organizacin y la presentacin dependern de la plantilla de proyecto que se seleccione, as como
de cualquier modificacin que se realice.
En forma de elementos de la solucin para archivos que se aplican a la solucin en su totalidad en
la carpeta Elementos de la solucin del Explorador de soluciones.
En forma de varios archivos que no estn asociados a ningn proyecto ni a ninguna solucin y que
pueden mostrarse en la carpeta Archivos varios.
Propiedades del proyecto
El proyecto es el punto de inicio para la creacin de aplicaciones, componentes y servicios en Visual Studio
2008. El proyecto acta como un contenedor que administra el cdigo fuente, las conexiones de datos y las
referencias. Un proyecto se organiza como parte de una solucin, que puede contener mltiples proyectos
dependientes entre s. Los temas de esta seccin describen las diferentes tareas relativas a la creacin y la
administracin de proyectos de Visual Basic.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 9 | P g i n a

Propiedades de la aplicacin: Las propiedades generales de la aplicacin que describen la aplicacin y su
comportamiento, como el tipo de aplicacin, el objeto inicial e informacin del ensamblado, se establecen
en la pgina Aplicacin del Diseador de proyectos. En la pgina Aplicacin pueden realizarse las tareas
siguientes:
Especificar informacin de ensamblado
Especificar una pantalla de presentacin para una aplicacin
Controlar eventos de aplicaciones
Cambiar el nombre de un ensamblado
Cambiar el espacio de nombres de una aplicacin
Cambiar el tipo de aplicacin
Cambiar el objeto inicial de una aplicacin
Especificar el icono de una aplicacin
Habilitar estilos visuales
Especificar el comportamiento de las instancias para una aplicacin
Habilitar la autenticacin de usuario personalizada
Especificar el comportamiento de cierre de una aplicacin
Propiedades de compilacin. Las propiedades de compilacin que definen el comportamiento del
compilador, como las advertencias del compilador, las optimizaciones y las constantes de compilacin se
establecen en la pgina Compilacin del Diseador de proyectos. En la pgina Compilacin pueden realizarse
las tareas siguientes:
Habilitar o deshabilitar las advertencias del compilador
Configurar optimizaciones del compilador
Configurar opciones del compilador
Cambiar la ubicacin de compilacin para una aplicacin
Generar documentacin XML para un proyecto
Registrar un componente para interoperabilidad COM
Configurar las constantes de compilacin
Optimizar una aplicacin para un tipo especfico de CPU
Especificar una direccin base para un archivo DLL
Especificar eventos de compilacin (Visual Basic)
Propiedades de depuracin. Las propiedades de depuracin que definen el comportamiento de depuracin,
como la accin inicial, las opciones de inicio y la depuracin remota se establecen en la pgina Depuracin
del Diseador de proyectos. En la pgina Depuracin pueden realizarse las tareas siguientes:
Cambiar la accin de inicio para depurar la aplicacin
Establecer las opciones de inicio para depurar la aplicacin
Habilitar la depuracin remota
Habilitar la depuracin de cdigo no administrado
Habilitar la depuracin de servidor SQL Server
Referencias. La pgina Referencias del Diseador de proyectos se utiliza para ver, agregar y quitar
referencias y espacios de nombres importados para su proyecto. En la pgina Referencias pueden realizarse
las tareas siguientes:
Hacer referencia a espacios de nombres y componentes
Agregar o quitar referencias en Visual Studio (Visual Basic)
Agregar o quitar espacios de nombres importados (Visual Basic)
Quitar referencias no utilizadas (Visual Basic)
Establecer la propiedad Copy Local de una referencia
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 10 | P g i n a


ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 11 | P g i n a

Visual Studio: Paseo rpido del entorno de desarrollo integrado
(IDE)
En este tema se proporciona informacin general breve de muchas de las funciones y herramientas incluidas
en Visual Studio para el desarrollo de aplicaciones.
Entorno de desarrollo integrado
La gama de productos de Visual Studio comparte un nico entorno de desarrollo integrado (IDE) que se
compone de varios elementos: la barra de herramientas Men, barra de herramientas Estndar, varias
ventanas de herramientas que se acoplan u ocultan automticamente a la izquierda, parte inferior y a la
derecha, as como en el espacio del editor. Las ventanas de herramientas, mens y barras de herramientas
disponibles dependen del tipo de proyecto o archivo en el que est trabajando.
Figura 1: IDE con la configuracin de desarrollo general aplicada

Dependiendo de la configuracin aplicada y de las subsiguientes personalizaciones que haya realizado,
variar la colocacin de las ventanas de herramientas y de otros elementos en el IDE. Puede cambiar la
configuracin mediante el Asistente para importar y exportar configuraciones.
Puede desplazarse y acoplar ventanas con facilidad mediante el rombo de gua visual u ocultar
temporalmente las ventanas utilizando el comando Ocultar automticamente.
Puede utilizar el modelo de automatizacin de Visual Studio para automatizar y extender el IDE.
Sistema de proyectos
Las soluciones y los proyectos contienen elementos en forma de referencias, conexiones de datos, carpetas
y archivos necesarios para crear la aplicacin. Un contenedor de tipo solucin puede contener varios
proyectos y un contenedor de tipo proyecto normalmente contiene varios elementos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 12 | P g i n a

El Explorador de soluciones muestra soluciones, sus proyectos y los elementos incluidos en dichos
proyectos. En el Explorador de soluciones, puede abrir archivos para editar, agregar nuevos archivos a un
proyecto y ver las propiedades de las soluciones, proyectos y elementos.
Figura 2: Explorador de soluciones

Editores y diseadores
El editor y los diseadores que utilice dependern del tipo de archivo o documento que est creando. El
Editor de texto es el procesador de textos bsico del IDE, mientras que el Editor de cdigo es el editor de
cdigo fuente bsico.
Otros editores, como el Editor CSS, el Diseador HTML y el Diseador de pginas Web, comparten muchas
de las funciones del Editor de cdigo, junto con mejoras especficas en el tipo de cdigo o de marcado
admitido.
Los editores y diseadores normalmente tienen dos vistas: una vista de diseo grfica y la vista de cdigo
subyacente o vista de cdigo fuente. La vista de diseo le permite especificar la ubicacin de los controles y
otros elementos en la interfaz de usuario o la pgina web. Puede arrastrar con facilidad un control desde el
Cuadro de herramientas y colocarlo en la superficie de diseo.


Figura 3: Diseador de pginas Web, vista Diseo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 13 | P g i n a


La vista Cdigo fuente muestra el cdigo fuente del archivo o documento. Esta vista admite ayudas de
codificacin como IntelliSense, secciones de cdigo plegables, Refactorizacin e insercin de fragmentos de
cdigo. Otras funciones incluyen el ajuste automtico de lnea, los marcadores y la visualizacin de nmeros
de lnea, por citar algunos.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 14 | P g i n a

Figura 4: Diseador de pginas Web, vista Cdigo fuente

Algunos editores, como el Diseador de pginas web y el Diseador HTML, tambin proporcionan una vista
hbrida que le permite ver la vista del grfico y del cdigo de un archivo simultneamente. Esta vista se llama
la Vista dividida.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 15 | P g i n a

Figura 5: Diseador de pginas web, Vista dividida

Herramientas de compilacin y depuracin
Visual Studio proporciona un slido conjunto de herramientas de compilacin y depuracin. Con las
configuraciones de compilacin puede seleccionar los componentes que se van a generar, excluir los que no
se van a generar y determinar cmo se van a generar los proyectos seleccionados y en qu plataforma.
Puede tener configuraciones de compilacin para soluciones y para proyectos.
Cuando genera, est comenzando el proceso de depuracin. La compilacin de la aplicacin le ayuda a
detectar errores de compilacin. Estos errores pueden deberse a una sintaxis incorrecta, a palabras clave
mal escritas o a divergencias entre los tipos. La Resultados (Ventana) muestra estos tipos de errores.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 16 | P g i n a

Figura 6: Ventana Resultados con informacin de compilacin

Despus de generar la aplicacin, puede utilizar el depurador para detectar y corregir problemas como
errores lgicos y semnticos que se descubren en tiempo de ejecucin. En el modo de interrupcin, puede
examinar las variables locales y otros datos pertinentes utilizando herramientas como Ventanas de variables
y Memoria (Ventana).

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 17 | P g i n a

Figura 7: Formulario de Visual Basic en el modo de interrupcin
Figura 8: Ventanas
de herramientas de depuracin

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 18 | P g i n a

La Lista de errores (Ventana) muestra errores, advertencias y otros mensajes relacionados con la
depuracin.

Herramientas de implementacin
Visual Studio proporciona dos estrategias de implementacin diferentes: ClickOnce y Windows Installer. Con
la implementacin de ClickOnce, publica la aplicacin en una ubicacin centralizada y el usuario instala o
ejecuta la aplicacin desde esa ubicacin. La implementacin de Windows Installer permite empaquetar la
aplicacin en un archivo setup.exe y distribuir ese archivo entre los usuarios; ellos ejecutan el archivo
setup.exe para instalar la aplicacin. Para ver una comparacin detallada, consulte Elegir una estrategia de
implementacin.
ClickOnce permite implementar rpidamente aplicaciones mediante el Asistente para publicacin.

Figura 9: Asistente para publicacin

La implementacin de Windows Installer proporciona mayor flexibilidad para implementar aplicaciones.
Varios editores, como el Editor de acciones personalizadas y el Editor de la interfaz de usuario, permiten
personalizar Windows Installer para satisfacer sus necesidades de implementacin. Para crear un archivo de
instalacin bsico, utilice el Editor del sistema de archivos, para especificar qu elementos desea
implementar.


ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 19 | P g i n a

Figura 10: Editor del sistema de archivos



ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 20 | P g i n a

Documentacin de productos
Puede tener acceso a la Ayuda presionando F1 en el IDE, as como a travs de la tabla de contenido, ndice y
bsqueda de texto completo. Puede utilizar la Ayuda instalada localmente o MSDN en pantalla y otros de
recursos en pantalla para obtener ayuda.

Figura 11: Pgina de bsqueda de la Ayuda


Cuadro de herramientas
El Cuadro de herramientas muestra los iconos de los elementos que puede agregar a los proyectos Visual
Studio. El Cuadro de herramientas est disponible en el men Ver. Puede acoplarlo y fijarlo como abierto o
establecerlo en Ocultar automticamente.
Cada icono del Cuadro de herramientas se puede arrastrar y colocar en una superficie de vista de diseo; o
bien, copiarse y pegarse en un editor de cdigo dentro del entorno de desarrollo integrado (IDE) de Visual
Studio. Cualquier accin agrega el cdigo bsico para crear una instancia del elemento del Cuadro de
herramientas en el archivo del proyecto activo.

Forma de uso
El Cuadro de herramientas es un control de rbol deslizante que se comporta de forma parecida al
Explorador de Windows, pero sin lneas de conexin ni cuadrcula. Se pueden expandir varios segmentos del
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 21 | P g i n a

Cuadro de herramientas (denominados "fichas") simultneamente, y el rbol completo se desplaza en la
ventana Cuadro de herramientas. Para expandir cualquier ficha del Cuadro de herramientas, haga clic en el
signo ms (+) situado al lado de su nombre. Para contraer una ficha expandida, haga clic en el signo menos (-
) situado al lado de su nombre.

El Cuadro de herramientas muestra los iconos de los elementos que puede agregar a los proyectos. Cada vez
que regresa a un editor o diseador, el Cuadro de herramientas se desplaza automticamente a la ficha y el
elemento seleccionados ms recientemente. Al desplazar el foco a un editor o diseador diferente o a un
proyecto diferente, la seleccin actual del Cuadro de herramientas tambin se desplaza.

Nota: Ningn elemento del Cuadro de herramientas se muestra mientras se editan las aplicaciones de la
Consola, porque stas se suelen disear sin ninguna interfaz grfica de usuario.

Puede personalizar el Cuadro de herramientas reorganizando los elementos de una ficha o agregando
elementos y fichas personalizados. Para agregar o quitar elementos del Cuadro de herramientas, utilice
Elegir elementos del cuadro de herramientas (Cuadro de dilogo): Visual Studio. Entre los elementos que
pueden estar disponibles como iconos del Cuadro de herramientas se incluyen los componentes de la
biblioteca de clases de .NET Framework, los componentes COM, los controles de formularios Windows
Forms y Web Forms, los elementos HTML y los espacios de nombres XML.

Ventana Propiedades
Utilice esta ventana para ver y cambiar las propiedades y eventos en tiempo de diseo de los objetos
seleccionados que estn localizados en editores y diseadores. Tambin puede utilizar la ventana
Propiedades para editar y ver las propiedades de los archivos, proyectos y soluciones. Esta ventana est
disponible desde el men Ver.

La ventana Propiedades muestra distintos tipos de campos de edicin, segn las necesidades de una
propiedad determinada. Entre estos campos de edicin se incluyen cuadros de edicin, listas desplegables y
vnculos a cuadros de dilogo de editor personalizado. Las propiedades que se muestran en gris son de slo
lectura.

Nombre de objeto Enumera el objeto u objetos actualmente seleccionados. Slo son visibles los
objetos del editor o diseador activos. Cuando se seleccionan varios objetos,
slo aparecen las propiedades comunes a todos los objetos seleccionados.
Por categoras Enumera por categoras todas las propiedades y valores de propiedades para el
objeto seleccionado. Puede contraerse una categora para reducir el nmero de
propiedades visibles. Cuando se expande o contrae una categora, se ve un signo
ms (+) o menos (-) a la izquierda del nombre de la categora. Las categoras
estn ordenadas alfabticamente.
Alfabtica Ordena alfabticamente todas las propiedades y eventos en tiempo de diseo
de los objetos seleccionados. Para editar una propiedad no atenuada, haga clic
en la celda situada a su derecha y escriba los cambios.
Pginas de propiedades Muestra los cuadros de dilogo Pginas de propiedades o Diseador de
proyectos del elemento seleccionado. Pginas de propiedades muestra un
subconjunto, el mismo o un supraconjunto de las propiedades disponibles en la
ventana Propiedades. Utilice este botn para ver y editar propiedades
relacionadas con la configuracin activa del proyecto.
Propiedades Muestra las propiedades de un objeto. Muchos objetos tambin tienen eventos
que se pueden ver utilizando la ventana Propiedades.
Eventos Muestra los eventos de un objeto.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 22 | P g i n a

Panel de descripcin Muestra el tipo de propiedad y una breve descripcin de la propiedad. Se puede
activar y desactivar la descripcin de la propiedad utilizando el comando
Descripcin del men contextual

Proyecto de aplicacin de consola.
La plantilla de proyecto Aplicacin de consola agrega los elementos necesarios para crear una aplicacin de
consola. Las aplicaciones de consola se disean habitualmente sin interfaz grfica de usuario (GUI) y se
compilan en un archivo ejecutable. Puede interactuar con una aplicacin de consola si escribe las
instrucciones en el smbolo del sistema. En respuesta a sus entradas, la aplicacin puede devolver
informacin, tambin en el smbolo del sistema. Con este intercambio directo de entrada y salida, las
aplicaciones de consola constituyen una forma extraordinaria de obtener informacin sobre las tcnicas de
programacin sin la capa agregada de una GUI.

La plantilla agrega automticamente las referencias y archivos de proyecto como punto de partida para la
aplicacin.

Proyecto de aplicacin Windows.
La base de la mayor parte de soluciones que impliquen formularios Windows Forms se crearn con las
plantillas de proyecto de Aplicacin para Windows. Resulta sencillo crear un proyecto mediante el entorno
de desarrollo integrado (IDE).

La plantilla de proyecto de aplicacin para Windows de Visual Basic pone el fundamento para una aplicacin
estndar para Windows. La plantilla agrega automticamente las referencias y archivos de proyecto
esenciales para utilizarlos como punto de partida para la aplicacin.

Para crear un proyecto de aplicacin para Windows
1. En el men Archivo, elija Nuevo y haga clic en Proyecto.
2. En el panel Tipos de proyecto, elija el lenguaje de programacin que desea utilizar.
3. En el panel Plantillas, elija Aplicacin para Windows para proyectos de Visual Basic.
Nota:
En el cuadro Nombre, asigne al proyecto un nombre nico, que indique cul es el propsito de la
aplicacin. En el cuadro Ubicacin, escriba el directorio en el que desee guardar el proyecto o haga
clic en el botn Examinar para navegar hasta l.
4. Se abrir el Diseador de Windows Forms, que mostrar el formulario Form1 del proyecto creado.

Proyecto de biblioteca de clases.
Puede utilizar la plantilla Biblioteca de clases para crear rpidamente clases y componentes reutilizables que
pueden compartirse con otros proyectos. La plantilla agrega automticamente las referencias y archivos
esenciales del proyecto.

Las clases y los componentes son unidades de cdigo reutilizable. Para crear un componente, se empieza
con una clase. Una clase se convierte en un componente cuando se ajusta a un estndar para la interaccin
con componentes. Este estndar se proporciona a travs de la interfaz IComponent. Cualquier clase que
implemente la interfaz IComponent es un componente. Tales estndares permiten que los programadores
conecten rpidamente componentes entre s para crear programas mayores. Common Language
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 23 | P g i n a

Specification (CLS) describe el modo en que pueden interactuar los componentes creados para Common
Language Runtime.

Proyecto de aplicacin Web.
Lo nuevo en 2.0

Clases Compiladas Dinmicamente - Adems de colocar las clases precompiladas en el
directorio Byn, ASP.NET 2.0 nos permite colocar ficheros fuente de clases compartidas en
el directorio App_Code, donde sern compilados dinmicamente como pginas ASPX.
Cdigo Simplificado detrs de las Pginas - Los ficheros "code-behind" de ASP.NET 2.0
utilizan una nueva caracterstica llamada clases parciales, que permitesn que dichos
ficheros de "code-behind" sean compilados dinmicamente con sus pginasa ASPX
asociadas en un slo tipo de clase. Esto significa que no necesitaremos declarar variables
miembro para cada control en la pgina de code-behind, lo cual simplifica en gran manera
el mantenimiento de sitios que usan esta tcnica de separacin de cdigo.
Varios Controles de Servidor Nuevos - ASP.NET 2.0 incluye unos 50 nuevos controles, lo
cual hace que crear elemntos comunes de UI en nuestras pginas web sea ms fcil que
nunca. Por ejemplo, los controles de Datos simplifican los escenarios de acceso a datos, los
de Login aaden seguridad al site, los de Navegacin permiten la navegacin por el site, y
los de WebPart permiten crear fcilmente pginas web personalizadas.
Nueva Sintaxis de Expresin Declarativa - La sintaxis de expresin declarativa en ASP.NET
2.0 nos permite substituir la configuracin de la aplicacin, las cadenas de conexin, y los
recursos de localizacin en nuestras pginas antes de que sean analizadas y ejecutadas.

En esta seccin hablaremos sobre stas y otras caractersticas de aplicaciones ASP.NET bsicas.

Una aplicacin web en ASP.NET es un conjunto de pginas, controles, mdulos de cfigo, y servicios, todos
ellos ejecutandose en un solo directorio de aplicacin de un servidor web (normalmente IIS). ASP.NET hace
que resulte muy sencillo crear las aplicaciones web dinmicas que podemos encontrar hoy en da por toda la
Internet. Nos proporciona un modelo simple de programacin basado en el Framework .NET y varios
controles y servicions ya incluidos que permite crear la mayor parte de los escenarios que encontramos el
gran parte de las aplicaciones, con poco cdigo y esfuerzo. En esta seccin demostraremos los elementos
bsicos de una aplicacin web que utilizaremos en el resto de la gua de inicio rpido, incluyendo:

El Framework para Pginas ASP.NET (Formularios Web)
Controles de Servidor Web y HTML
Mdulos o Montajes de Cdigo Compartido

Esta seccin tambin explica unas pocas de las mejoras hechas a los bloques de creacin de aplicaciones en
ASP.NET 2.0 frente a versiones previas de ASP.NET.

Introduccin a Pginas ASP.NET

El Framework para pginas con formularios Web de ASP.NET es un modelo de programacin de tiempo de
ejecucin con un lenguaje escalable y comn, que puede usarse en el servidor para generar dinmicamente
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 24 | P g i n a

pginas Web. Pensado como una evolucin lgica de ASP (ASP.NET proporciona compatibilidad de sintaxis
con las pginas existentes), el Framework de pginas ASP.NET ha sido especficamente diseado para
solucionar algunas deficiencias claver del modelo previo. De forma particular, proporciona la habilidad de
crear y utilizar controles UI reutilizables que pueden encapsular una funcionalidad comn y, por tanto,
reducir la cantidad de cdigo que el desarrollador tiene que escribir, la habilidad de los desarrolladores para
estructurar de forma clara las pginas en un estilo ordenado (no cdigo "spaghetti"), y la habilidad de las
herramientas de desarrollo de proporcionar un potente soporte de diseo WISIWIG para las pginas (el
cdigo ASP existente en opaco para las herramientas).sta seccin del tutorial proporciona un breve
resumen del cdigo de alto nivel de algunas de las caractersticas bsicas de las pginas ASP.NET. Las
siguientes secciones tratarn ms a fondo detalles ms especficos.
Escribiendo nuestra primera pgina ASP.NET
Las pginas ASP.NET son ficheros de texto con la extensin .aspx. Las pginas consisten en cdigo y marcas y
son compiladas y ejecutadas dinmicamente en el servidor para producir una traduccin para el navegador
(o dispositivo) cliente. Se pueden desplegar a travs de un rbol de directorios raz de IIS. Cuando un
navegador hace una peticin de un recurso .aspx, la rutina ASP.NET analiza y compila el fichero a una clase
del Framework .NET. Esta clase puede ser utilizada para procesar dinmicamente peticiones entrantes.
(NOTA: el fichero .aspx se compila nicamente la primera vez que es accedido; la instancia compilada se
reutiliza en las sucesivas peticiones).

Una pgina ASP.NET puede ser creada simplemente cambindole la extensin de un fichero HTML por la
extensin .aspx (no hace falta modificar el cdigo). Por ejemplo, el siguiente ejemplo nos demuestra una
sencilla pgina HTML que recoge un nombre de usuario y una preferencia de categora y luego realiza un
postbak del formulario a la pgina que lo origina cuando se hace clic sobre el botn:

Intro1.aspx

Importante: Notad que no pasa nada cuando se hace clic en el botn Lookup. Esto es debido a que la pgina
.aspx slo contiene HTML esttico (no tiene contenido dinmico). Por lo tanto, el mismo HTML es enviado
de vuelta al cliente en cada viaje de la pgina, lo que resulta en una prdida de los contenidos de los campos
del formulario (el "textbox" y el "drop-down list") entre peticiones.

Aadiendo Cdigo Simple a una Pgina
ASP.NET proporciona compatibilidad de sintaxis con pginas ASP ya existentes. Esto incluye el soporte para
los bloques de renderizado de cdigo del tipo <% %> que se pueden meter entre el contenido HTML en un
fichero .aspx. Estos bloques se ejecutan de forma descendente en el momento del "renderizado".

El siguiente ejemplo demuestra como los bloques de renderizamiento <% %> se pueden utilizar para hacer
un bucle sobre un bloque de cdigo HTML (incrementando el tamao de la fuente en cada pasada):

Intro2.aspx

Importante: a diferencia de ASP, el cdigo utilizado en los bloques <% %> de arriba es en realidad compilado
(no interpretado utilizando un motor de script). Esto conlleva una mejora en el rendimiento en tiempo de
ejecucin.

Los desarrolladores de pginas ASP.NET pueden utilizar los bloques <% %> de cdigo para modificar
dinmicamente la salida HTML tanto como pueden hacerlo actualmente con ASP. Por ejemplo, el siguiente
ejemplo demuestra como los bloques <% %> de cdigo pueden usarse para interpretar los resultados que
nos enva un cliente.

Intro3.aspx
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 25 | P g i n a


Importante: a pesar que los cdigos <% %> proporcionan una forma potente de manipular a la medida la
salida de texto devuelto por una pgina ASP.NET, no nos proporcionan un modelo "limpio" de programacin
HTML. Como nos ilustra el ejemplo de arriba, los desarrolladores que slo usen bloques <% %> tienen que
administrar el estado de las pginas en cada iteracin del bucle e interpretar los valores que se envan.

Introduccin a los Controles de Servidor de ASP.NET

Adems de cdigo y marcas, las pginas ASP.NET pueden contener controles de servidor, que son objetos
programables del lado del servidor que tpicamente representan un elemento UI en la pgina, como un
textbox o una imagen. Los controles de servidor participar en la ejecucin de la pgina y producen sus
propias etiquetas para el navegador cliente. La principal ventaja de los controles de servidor es que
permiten a los desarrolladores obtener un comportamiento y un renderizado complejo a partir de
componentes sencillos, reduciendo as dramticamente la cantidad de cdigo necesaria para crear una
pgina Web dinmica. Otra ventaja de los controles de servidor es su facilidad para personalizar su
comportamiento o renderizado. Los controles de servidor muestran propiedades que pueden ajustarse bien
de forma declarativa (en la etiqueta) o bien de forma programada (con cdigo). Los controles de servidor (y
la pgina en si) tambin tienen eventos que los desarrolladores pueden controlar para realizar acciones
especficas durante la ejecucin de la pgina, o en respuesta a una accin del lado del cliente que enve la
pgina al servidor (un "postback"). Los controles de servidor tambin simplifican el problema de mantener el
estado durante diferentes idas y venidas del servidor, manteniendo sus valores de forma automtica en
sucesivos postbacks.

Los controles de servidor se declaran en un fichero .aspx mediante etiquetas propias o etiquetas HTML
intrnsecas que contienen el atributo runat="server". Las etiquetas HTML intrnsecas son manejadas con uno
de los controles del "namespace" System.Web.UI.HtmlControls. A cualquier etiqueta que no corresponda a
uno de los controles se le asigna el tipo System.Web.UI.HtmlControls.HtmlGenericControl.

El siguiente ejemplo utiliza cuatro controles de servidor: <form runat=server>, <asp:textbox runat=server>,
<asp:dropdownlist runat=server>, y <asp:button runat=server>. En tiempo de ejecucin estos controles de
servidor generan de forma automtica el contenido HTML.

Intro4.aspx

Importante: Observar que los controles de servidor mantienen de forma automtica entre viajes al servidor
cualquier valor insertado en el lado del cliente. Este estado del control no se almacena en el servidor (en
lugar de eso se almacena en un campo <input type="hidden" de formulario que se enva y devuelve en las
diferentes peticiones). Obsevar adems que no es necesario ningn script del lado del cliente.

Adems de soportar controles estdares de entrada HTML, ASP.NET permite a los desarrolladores utilizar
controles personalizados ms ricos en sus pginas. Por ejemplo, el siguiente ejemplo demuestra como el
control <asp:adrotator> se puede utilizar para mostrar dinmicamente "ads" cambiantes en la pgina.

Intro5.aspx

Manejando Eventos de Controles de Servidor
Cada control de Servidor de ASP.NET es capaz de mostrar un modelo de objeto conteniendo propiedades,
mtodos y eventos. Los desarrolladores de ASP.NET utilizan este modelo de objeto para modificar de forma
limpia e interactuar con la pgina.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 26 | P g i n a

El siguiente ejemplo nos demuestra como un desarrollador de pginas ASP.NET puede controlar el
eventoOnClick del control <asp:button runat=server> control para manipular la propiedad Text del control
<asp:label runat=server>.

Intro6.aspx

Este ejemplo simple es equivalente en funcionalidad al ejemplo "Intro3" mostrado anteriormente en esta
seccin. Sin embargo, cabe observar la mayor limpieza y simplicidad del cdigo en la versin basada en
controles de servidor. As como veremos posteriormente en el tutorial, el Framework de pginas ASP.NET
tambin muestra gran variedad de eventos a nivel de pgina, que podemos controlar para escribir cdigo
que se ejecute en un momento determinado durante el procesado de la pgina. Ejemplos de estos eventos
son Page_Load y Page_Render.

Comprendiendo los conceptos de programacin
Qu es la programacin dirigida por eventos?
La programacin dirigida por eventos es un paradigma de programacin en el que tanto la estructura como
la ejecucin de los programas van determinados por los sucesos que ocurran en el sistema o que ellos
mismos provoquen.
Para entender la programacin dirigida por eventos, podemos oponerla a lo que no es: mientras en la
programacin secuencial (o estructurada) es el programador el que define cul va a ser el flujo del
programa, en la programacin dirigida por eventos ser el propio usuario --o lo que sea que est accionando
el programa-- el que dirija el flujo del programa. Aunque en la programacin secuencial puede haber
intervencin de un agente externo al programa, estas intervenciones ocurrirn cuando el programador lo
haya determinado, y no en cualquier momento como puede ser en el caso de la programacin dirigida por
eventos.
El creador de un programa dirigido por eventos debe definir los eventos que manejar su programa y las
acciones que se realizarn al producirse cada uno de ellos, lo que se conoce como el administrador o
manejador de evento. Los eventos soportados estarn determinados por el lenguaje de programacin
utilizado, por el sistema operativo e incluso por eventos creados por el mismo programador.
En la programacin dirigida por eventos, al comenzar la ejecucin del programa se llevarn a cabo las
inicializaciones y dems cdigo inicial y a continuacin el programa quedar bloqueado hasta que se
produzca algn evento. Cuando alguno de los eventos esperados por el programa tenga lugar, el programa
pasar a ejecutar el cdigo del correspondiente administrador de evento. Por ejemplo, si el evento consiste
en que el usuario ha hecho click en el botn de play de un reproductor de pelculas, se ejecutar el cdigo
del administrador de evento, que ser el que haga que la pelcula se muestre por pantalla.
Clases: planos para construir objetos
Las clases son representaciones simblicas de objetos; describen las propiedades, campos, mtodos y
eventos que forman objetos de la misma forma que los planos describen los elementos que componen un
edificio. As como un plano puede utilizarse para crear varios edificios, una nica clase puede utilizarse para
crear tantos objetos como sea necesario. Del mismo modo que un plano define qu partes de un edificio son
accesibles a las personas que lo utilizan, las clases tambin pueden controlar el acceso de los usuarios a los
elementos de objetos a travs de la encapsulacin.
Clases y objetos
Los trminos clase y objeto se utilizan a veces indistintamente, pero en realidad, las clases describen la
estructura de los objetos, mientras que los objetos son instancias de clases que se pueden utilizar. Cada
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 27 | P g i n a

instancia es una copia exacta pero diferente de su clase. Puesto que un objeto es una instancia de una clase,
la accin de crear un objeto se denomina creacin de instancias.
Con la analoga de plano, una clase es un plano y un objeto es un edificio construido a partir de ese plano.
Normalmente, al cambiar los datos en un objeto, no se cambian los datos en ningn otro objeto. (La
excepcin la constituyen los miembros compartidos, miembros de clase declarados con el modificador
Shared, que existen de forma independiente de las instancias especficas de una clase).
Encapsulacin
La encapsulacin es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las
clases proporcionan una de las formas ms comunes de encapsular elementos. En el ejemplo siguiente, la
clase BankAccount encapsula los mtodos, campos y propiedades que describen una cuenta bancaria.
Sin la encapsulacin, debera declarar diferentes procedimientos y variables para almacenar y administrar la
informacin de la cuenta bancaria, y sera difcil trabajar con ms de una cuenta bancaria a la vez. La
encapsulacin permite utilizar datos y procedimientos de la clase BankAccount como una unidad. Puede
trabajar con varias cuentas bancarias al mismo tiempo sin confusin, puesto que cada cuenta se representa
mediante una instancia nica de la clase.
La encapsulacin tambin permite controlar la forma de utilizar los datos y los procedimientos. Se pueden
utilizar modificadores de acceso, como Private o Protected, para evitar que unos procedimientos externos
ejecuten mtodos de clase o lean y modifiquen datos en propiedades y campos. Debe declarar detalles
internos de una clase como Private para evitar que se utilicen fuera de su clase; esta tcnica se llama
ocultacin de datos y es el modo de proteger informacin del cliente, como un saldo de cuenta por ejemplo.
Una regla bsica de la encapsulacin es que los datos de clase slo se deben modificar o recuperar mediante
mtodos o procedimientos Property. Al ocultar los detalles de implementacin de las clases se evita que
sean utilizados de forma no deseada y hace posible la modificacin posterior de tales elementos sin
problemas de compatibilidad. Por ejemplo, en las versiones posteriores de la clase BankAccount se podra
cambiar el tipo de datos del campo AccountBalance sin peligro de interrumpir otras aplicaciones que se
basan en que ese campo tenga un tipo de datos especfico.
Herencia
Al igual que para las estructuras de Visual Basic, puede utilizar las clases para definir tipos de datos que
encapsulan un grupo de elementos relacionados. No obstante, a diferencia de las estructuras, las clases de
Visual Basic pueden heredar y extender las caractersticas de otras clases. Las clases que sirven de base para
nuevas clases se denominan clases base. Las clases que se derivan de clases base se denominan clases
derivadas. Las clases derivadas heredan todos los campos, propiedades, mtodos y eventos de la clase base.
Esto significa que puede desarrollar y depurar una clase una vez y reutilizarla despus como base de otras
clases.
En el siguiente ejemplo se define una clase base que representa una cuenta bancaria genrica y una clase
especfica que hereda las propiedades de la clase base pero que se personaliza para describir una cuenta
corriente.

Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 28 | P g i n a

End Property
End Class

Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class

Miembros compartidos
De forma predeterminada, los datos de clase se especifican para cada instancia de la clase, pero en
ocasiones puede ser deseable compartir un solo elemento de datos entre todos los objetos creados a partir
de una clase. En casos como ste, utilice el modificador Shared para hacer que una variable comparta el
mismo valor en todas las instancias de una clase (los miembros Shared a veces se llaman "miembros
estticos" en otros lenguajes de programacin). Los mtodos compartidos pueden llamarse directamente
mediante un nombre de clase sin necesidad de crear previamente una instancia de la clase.
Sombrear
Las clases derivadas pueden utilizar la palabra clave Shadows para declarar un miembro con el mismo
nombre que un miembro heredado. El tipo de datos de los miembros sombreados no es necesario que sea
el mismo que el del miembro que se sombrea. Por ejemplo, una propiedad puede sombrear una variable de
tipo Integer.

Fundamentos de la herencia
La instruccin Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una
clase existente conocida como clase base. Las clases derivadas heredan, y pueden extender, las propiedades,
mtodos, eventos, campos y constantes definidos en la clase base. En la siguiente seccin se describen
algunas de las reglas de herencia, as como los modificadores que se pueden utilizar para cambiar la forma
en que las clases heredan o son heredadas:
De forma predeterminada, todas las clases son heredables a menos que se marquen con la palabra
clave NotInheritable. Las clases pueden heredar de otras clases del proyecto o de clases en otros
ensamblados a los que hace referencia el proyecto.
A diferencia de los lenguajes que permiten la herencia mltiple, Visual Basic solamente permite la
herencia simple en las clases; es decir, las clases derivadas solo pueden tener una clase base.
Aunque no se permite la herencia mltiple en las clases, stas pueden implementar mltiples
interfaces, lo que permite lograr de manera eficaz los mismos fines.
Para evitar la exposicin de elementos restringidos en una clase base, el tipo de acceso de una clase
derivada debe ser igual o ms restrictivo que el de su clase base. Por ejemplo, una clase Public no
puede heredar una clase Friend o Private, y una clase Friend no puede heredar una clase Private.
Modificadores de herencia
Visual Basic presenta las siguientes instrucciones y modificadores de nivel de clase para ofrecer
compatibilidad con la herencia:
Instruccin Inherits: especifica la clase base.
Modificador NotInheritable: impide que los programadores utilicen la clase como clase base.
Modificador MustInherit: especifica que la clase slo se debe utilizar como clase base. Las
instancias de las clases MustInherit no se pueden crear directamente; slo se pueden crear como
instancias de clase base de una clase derivada. Otros lenguajes de programacin, como C++ y C#,
utilizan el trmino clase abstracta para describir tal clase.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 29 | P g i n a

Reemplazar propiedades y mtodos en clases derivadas
De forma predeterminada, una clase derivada hereda los mtodos y propiedades de su clase base. Si una
propiedad o mtodo heredados tienen que comportarse de manera diferente en la clase derivada, se
pueden invalidar. Es decir, se puede definir una nueva implementacin del mtodo en la clase derivada. Los
siguientes modificadores se utilizan para controlar cmo se reemplazan propiedades y mtodos:
Overridable: permite reemplazar una propiedad o un mtodo de una clase en una clase derivada.
Overrides: reemplaza una propiedad o un mtodo Overridable definido en la clase base.
NotOverridable: evita que una propiedad o un mtodo se invaliden en una clase que hereda. De
forma predeterminada, los mtodos Public son NotOverridable.
MustOverride: requiere que una clase derivada reemplace una propiedad o un mtodo. Cuando se
utiliza la palabra clave MustOverride, la definicin del mtodo est formada simplemente por la
instruccin Sub, Function o Property. No se permite ninguna otra instruccin y no hay
especficamente ninguna instruccin End Sub o End Function. Los mtodos MustOverride se deben
declarar en las clases MustInherit.
La palabra clave MyBase
Puede utilizar la palabra clave MyBase para llamar a mtodos de una clase base cuando invalide mtodos en
una clase derivada. Por ejemplo, suponga que disea una clase derivada que reemplaza un mtodo
heredado de la clase base. El mtodo reemplazado puede llamar al mtodo de la clase base y modificar el
valor devuelto como se muestra en el fragmento de cdigo siguiente:
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Lllama al mtodo en la clase base y modifica el valor devuelto
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class

En la lista siguiente se describen las restricciones de uso de MyBase:
MyBase hace referencia a la clase base inmediata y a sus miembros heredados. No se puede utilizar
para tener acceso a miembros Private de la clase.
MyBase es una palabra clave, no un objeto real. MyBase no se puede asignar a una variable, pasar a
procedimientos o utilizar en una comparacin Is.
No es necesario definir el mtodo al que certifica MyBase en la clase base inmediata; puede
definirse en una clase base heredada indirectamente. Para compilar correctamente una referencia
certificada mediante MyBase, alguna clase base debe contener un mtodo que se corresponda con
el nombre y los tipos de los parmetros que aparecen en la llamada.
No puede utilizar MyBase para llamar a mtodos de clase base con el modificador MustOverride.
No se puede utilizar MyBase para calificarse a s misma. Por tanto, el siguiente cdigo no es vlido:
MyBase.MyBase.BtnOK_Click()
No se puede utilizar MyBase en mdulos.
No se puede utilizar MyBase para tener acceso a miembros de clase base marcados como Friend si
la clase base est en un ensamblado diferente.
La palabra clave MyClass
La palabra clave MyClass permite llamar a un mtodo Overridable implementado en la clase y asegurarse de
que se llama a la implementacin del mtodo en esta clase y no a la de un mtodo invalidado en una clase
derivada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 30 | P g i n a

MyClass es una palabra clave, no un objeto real. MyClass no se puede asignar a una variable, pasar
a procedimientos o utilizar en una comparacin Is.
MyClass hace referencia a la clase base inmediata y a sus miembros heredados.
MyClass puede utilizarse como calificador de miembros Shared.
MyClass no se puede utilizar en mdulos estndar.
MyClass puede utilizarse para calificar un mtodo que est definido en un clase base y que no tiene
ninguna implementacin del mtodo proporcionado en esa clase. Este tipo de referencia tiene el
mismo significado que MyBase.Mtodo.
Qu son las propiedades, mtodos y eventos?
Todos los objetos en el lenguaje de Visual Basic, incluidos los formularios y controles, tienen sus propias
propiedades, mtodos y eventos. Las propiedades pueden considerarse como los atributos de un objeto, los
mtodos como sus acciones y los eventos como sus respuestas.
Un objeto corriente como un globo de helio tambin tiene propiedades, mtodos y eventos. Las
propiedades de un globo incluyen atributos visibles como su alto, dimetro y color. Otras propiedades
describen su estado (inflado o desinflado) o atributos que no se ven, como su edad. Todos los globos tienen
estas propiedades, aunque sus valores pueden diferir de un globo a otro.
Un globo tambin tiene mtodos o acciones conocidas que puede realizar. Tiene un mtodo para inflarse
(llenarlo con helio), un mtodo para desinflarse (expulsar su contenido) y un mtodo para elevarse
(soltarlo). Asimismo, todos los globos pueden tener estos mtodos.
Los globos tambin tienen respuestas a ciertos eventos externos. Por ejemplo, un globo responde al evento
de ser pinchado desinflndose o al evento de ser soltado elevndose.
Propiedades, mtodos y eventos

Un globo tiene propiedades (Color, Alto y Dimetro), responde a eventos (Puncture) y puede ejecutar
mtodos (Deflate, MakeNoise).
Propiedades
Si pudiera programar un globo, el cdigo de Visual Basic podra parecerse al siguiente "cdigo" que
establece las propiedades de un globo.
Balloon.Color = Red
Balloon.Diameter = 10
Balloon.Inflated = True
Observe el orden del cdigo: el objeto (Globo) seguido por la propiedad (Color) seguida por la asignacin del
valor (= Rojo). Puede cambiar el color del globo sustituyendo un valor diferente.
Mtodos
Los mtodos de un globo se denominan de este modo.
Balloon.Inflate
Balloon.Deflate
Balloon.Rise(5)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 31 | P g i n a

El orden es parecido al de una propiedad: el objeto (un nombre), seguido por el mtodo (un verbo). En el
tercer mtodo, hay un elemento adicional, llamado argumento, que especifica la distancia a que se elevar
el globo. Algunos mtodos tendrn uno o ms argumentos para describir an ms la accin que se va a
realizar.
Eventos
El globo podra responder a un evento de la siguiente manera.
Sub Balloon_Puncture()
Balloon.MakeNoise("Bang")
Balloon.Deflate
Balloon.Inflated = False
End Sub
En este caso, el cdigo describe el comportamiento del globo cuando se produce un evento Puncture: llama
al mtodo MakeNoise con un argumento "Bang", (el tipo de ruido a realizar), luego llama al mtodo Deflate.
Puesto que el globo ya no est inflado, la propiedad Inflated se establece en False.
Si bien, en realidad no puede programar un globo, puede programar un formulario o control de Visual Basic.
Como programador, usted es el responsable de decidir las propiedades que se deben cambiar, los mtodos
que se deben invocar o los eventos que se deben responder para lograr la apariencia y el comportamiento
deseados.

Trabajando con formularios de Windows
La interfaz de usuario es la parte del programa que ven los usuarios cuando ejecutan el programa. Una
interfaz de usuario suele estar formada por una ventana o formulario principal y varios controles, como
botones, campos para la introduccin de texto, etc. Los programas de Visual Basic que se ejecutan en el
equipo se denominan Aplicaciones de Windows Forms y la interfaz de usuario se crea mediante los controles
de formularios Windows Forms.

Para disear la interfaz de usuario debe empezar agregando controles del Cuadro de herramientas al
formulario.
El Cuadro de herramientas se encuentra en el lado izquierdo de Visual Studio y consta de varias fichas, como
Datos, Componentes y Todos los formularios Windows Forms. Dentro de cada ficha hay un conjunto de
entradas, que representan controles o componentes que se pueden agregar a la aplicacin. Por ejemplo, la
ficha Todos los formularios Windows Forms tiene entradas denominadas Textbox, Button y Checkbox que
representan los controles que puede agregar a la aplicacin arrastrndolos al formulario.
Los controles contienen cdigo que define el aspecto que tendrn y las tareas que pueden realizar.
Por ejemplo, considere el control Button: casi todos los programas tienen un botn "Aceptar" o un botn
"Salir". Si bien podra escribir su propio cdigo para dibujar un botn en la pantalla, cambiar su apariencia
cuando se presione y realizar alguna tarea cuando se haga clic en l, hacerlo para cada programa enseguida
se convertir en un asunto tedioso. El control Button ya contiene el cdigo necesario para hacer estas
tareas, lo que le ahorra mucho trabajo innecesario.
Como puede ver, el Cuadro de herramientas contiene numerosos controles y cada uno de ellos tiene un
propsito nico. Los controles Panel se pueden utilizar para contener otros controles, y de esta manera
organizar la interfaz de usuario de una forma funcional y accesible. Los controles Button se utilizan
generalmente para realizar tareas cuando el usuario hace clic en ellos; por ejemplo, cerrar el programa. Los
controles TextBox se utilizan para escribir texto en una pantalla a travs del teclado. Un control
WebBrowser proporciona funciones de exploracin Web integradas similares a Internet Explorer: seguro
que no desea escribir todo el cdigo de esa funcin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 32 | P g i n a

En prximas lecciones aprender a personalizar la apariencia de stos y de otros muchos controles, as como
tambin a escribir el cdigo que define su comportamiento. Adems de utilizar los controles del Cuadro de
herramientas, tambin puede crear sus propios controles, los que se conocen como controles de usuario.

Cmo crear un formulario
Para crear un nuevo formulario en un proyecto de aplicacin de Windows debe usar el cuadro de dilogo
Agregar nuevo elemento. Ya sea seleccionando la opcin Agregar formulario de Windows del men
Proyecto o seleccionando Agregar, Nuevo formulario de Windows del men contextual que se presenta al
seleccionar con el botn derecho del ratn el archivo del proyecto, como ilustra la siguiente imagen.


El cuadro de dilogo Agregar nuevo elemento presenta las plantillas para formularios disponibles en su
equipo. Algunas plantillas bsicas para formularios de Windows incluyen:
- Acerca de
- Cuadro de dilogo
- Formulario de explorador
- Pantalla de inicio (splash)
- Inicio de sesin
- Formulario padre MDI

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 33 | P g i n a


Cmo establecer valores a propiedades de un formulario
Una vez creado un formulario en la vista de diseo puede usar la ventana Propiedades para modificar las
propiedades del formulario.
Dependiendo de la propiedad, la ventana Propiedades presentar editores particulares para el tipo de datos
de la propiedad como el cuadro de dialogo de tipos de letras para la propiedad Font. O una lista de colores
para las propiedades BackColor y ForeColor. Tal como fue descrito anteriormente, la ventana de
propiedades puede organizarse de forma alfabtica o por categoras. Las propiedades cuyo valor ha sido
modificado de su valor por defecto, aparecen en negrita lo que facilita su identificacin con rapidez.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 34 | P g i n a


Tambin puede modificar las propiedades del formulario directamente desde el cdigo a travs de la
palabra clave Me que hace referencia a la clase actual o escribiendo directamente el nombre de la
propiedad.


Las siguientes lneas de cdigo son equivalentes
Me.Text = "Mi primer formulario"
Text = "Mi primer formulario"

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 35 | P g i n a

Cmo llamar a mtodos
De la misma forma que para asignar valores a las propiedades a travs del cdigo, la llamada a mtodos slo
requiere escribir el nombre del mtodo y suministrar los parmetros correspondientes, si alguno es
necesario.
Las siguientes lneas de cdigo son equivalentes
Me.CenterToScreen()
CenterToScreen()

Los controles y mtodos agregados al formulario, tambin son agregados como miembros y estn
disponibles a travs de las listas de IntelliSense.


Cmo manejar eventos de formulario
Un controlador de eventos es un procedimiento del cdigo que determina qu acciones se ejecutan cuando
se produce un evento, como cuando un usuario hace clic en un botn o una cola de mensajes recibe otro
mensaje. Cuando se produce un evento, se ejecuta el controlador o controladores de eventos que reciben
dicho evento. Los eventos pueden asignarse a mltiples controladores, y los mtodos que controlan
determinados eventos pueden modificarse de manera dinmica. Tambin puede utilizar el Diseador de
Windows Forms para crear los controladores de eventos.

En casi todas las aplicaciones, es esencial responder a eventos de usuario o del sistema. Se pueden crear
controladores de eventos mediante la ventana Propiedades, tal como se trata en el procedimiento siguiente.
1. Haga clic en el formulario o control para el que desea crear un controlador de eventos.
2. En la ventana Propiedades, haga clic en el botn Eventos ( ).
3. En la lista de eventos disponibles, haga clic en el evento para el que desea crear un
controlador de eventos.
4. En el cuadro que se encuentra a la derecha del nombre de evento, escriba el nombre del
controlador y presione ENTRAR.
Nota
Asigne al controlador de eventos un nombre relacionado con la funcionalidad del evento; por ejemplo, para
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 36 | P g i n a

el evento Click puede escribir StartProcess como controlador de eventos.
Aparecer el Editor de cdigo con el cdigo del formulario y se generar en el cdigo un mtodo
controlador de eventos similar al siguiente:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
' Agregue el cdigo para el manejador de evento aqu
End Sub
5. Agregue el cdigo apropiado al controlador de eventos.

Formularios modales y no modales
Para presentar un formulario puede el mtodo Show o ShowDialog. El uso de ShowDialog muestra el
formulario como un cuadro de dilogo modal con la ventana activa actualmente establecida como su
propietaria, de manera que el usuario debe cerrar el formulario antes de volver a la pantalla principal
Este es el comportamiento de las ventanas prensentadas con MessageBox.Show y los componentes de
cuadros de dilogo.

Formularios MDI
Las aplicaciones MDI (interfaz de mltiples documentos) permiten mostrar varios documentos al mismo
tiempo, cada uno de ellos en su propia ventana. Las aplicaciones MDI suelen tener un elemento de men
Ventana con submens que permiten cambiar entre ventanas o documentos.

Un ejemplo tpico de este tipo de aplicaciones son las aplicaciones de Microsoft Office, en las que pueden
crearse mltiples ventanas para una misma instancia en ejecucin de la aplicacin.

Crear formularios principales MDI
La base de una Aplicacin con Interfaz de mltiples documentos (MDI) es el formulario primario MDI. Este
formulario es el que contiene las ventanas MDI secundarias, que son las "subventanas" dentro de las cuales
los usuarios interactan con la aplicacin MDI. La creacin de un formulario MDI primario resulta sencilla,
tanto en el Diseador de Windows Forms como mediante programacin.
Para crear un formulario MDI primario en tiempo de diseo
1. Crear un proyecto de aplicacin para Windows.
2. En la ventana Propiedades, establezca la propiedad IsMDIContainer en true.
As se designa el formulario como contenedor MDI para ventanas secundarias.
Nota:
Cuando se establecen las propiedades en la ventana Propiedades, se puede tambin establecer la propiedad
WindowState en Maximized si se desea, ya que es ms fcil manipular las ventanas MDI secundarias cuando
el formulario primario est maximizado. Tenga tambin en cuenta que el borde del formulario MDI primario
seleccionar el color del sistema (que se establece en el Panel de control de Windows), en lugar del color de
fondo establecido en la propiedad Control..::.BackColor.
3. Arrastre un componente MainMenu del Cuadro de herramientas al formulario. Cree un elemento
de men de nivel superior con la propiedad Text establecida en &Archivo, con elementos de
submen denominados &Nuevo y &Cerrar. Cree tambin un elemento de men de nivel superior
denominado &Ventana.
El primer men crear y ocultar los elementos de men en tiempo de ejecucin, mientras que el segundo
se encargar del seguimiento de las ventanas MDI secundarias abiertas. Llegado este punto, ha creado una
ventana MDI primaria.
4. Presione F5 para ejecutar la aplicacin.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 37 | P g i n a

Crear formularios MDI secundarios
Los formularios MDI secundarios son un elemento esencial de Aplicaciones de interfaz de mltiples
documentos (MDI), cuando estos formularios son el centro de interaccin del usuario.
En el procedimiento siguiente, crear formularios MDI secundarios que muestran un control RichTextBox,
similar a la mayora de aplicaciones de procesamiento de textos. Si sustituye el control
System.Windows.Forms por otros controles, tales como el control DataGridView o una mezcla de controles,
podr crear ventanas secundarias MDI (y, por extensin, aplicaciones MDI) con diversas posibilidades.
Nota:
Los cuadros de dilogo y comandos de men que se ven pueden diferir de los descritos en la Ayuda, en
funcin de la configuracin activa o la edicin. Para cambiar la configuracin, elija la opcin Importar y
exportar configuraciones en el men Herramientas.
Para crear formularios MDI secundarios
1. Cree un formulario primario MDI con una estructura de mens que contenga los elementos de
men Archivo y Ventana de nivel superior y los elementos de men Nuevo y Cerrar.
2. En la lista desplegable que se encuentra en la parte superior de la ventana Propiedades, seleccione
el elemento de men correspondiente al elemento Ventana y establezca el valor de la propiedad
MdiList en true.
Esto habilitar al men Ventana para que mantenga una lista de ventanas secundarias MDI abiertas, con una
marca de verificacin junto a la ventana secundaria activa.
3. En el Explorador de soluciones, haga clic con el botn secundario en el proyecto, haga clic en
Agregar y seleccione Agregar nuevo elemento.
Este formulario ser la plantilla de los formularios MDI secundarios.
Nota:
El formulario secundario MDI que crear en este paso es un formulario Windows Forms estndar.
Por tanto, tendr una propiedad Opacity, que permite controlar la transparencia del formulario. Sin
embargo, la propiedad Opacity est diseada para ventanas de alto nivel. No la utilice con
formularios MDI secundarios, porque pueden surgir problemas.
4. En el cuadro de dilogo Agregar nuevo elemento, seleccione Formulario Windows Forms (en Visual
Basic o Visual C#) o Aplicacin de Windows Forms (.NET) (en Visual C++) desde el panel Plantillas.
En el cuadro Nombre, asigne al formulario el nombre Form2. Haga clic en el botn Abrir para
agregar el formulario al proyecto.
Se abrir el Diseador de Windows Forms, que mostrar el formulario Form2.
5. En el Cuadro de herramientas, arrastre un control RichTextBox al formulario.
6. En la ventana Propiedades, establezca la propiedad Anchor en Top, Left y la propiedad Dock en Fill.
Esto hace que el control RichTextBox llene por completo el rea del formulario MDI secundario, aunque se
cambie el tamao del formulario.
7. Cree un controlador de eventos Click para el elemento de men Nuevo.
8. Inserte el cdigo siguiente para crear un nuevo formulario MDI secundario cuando el usuario haga
clic en el elemento de men Nuevo.
Nota:
En el ejemplo siguiente, el controlador de eventos controla el evento Click para MenuItem2. Tenga
presente que, en funcin de las caractersticas especficas de la arquitectura de la aplicacin, podra
ser que el elemento de men Nuevo no fuese MenuItem2.

Protected Sub MDIChildNew_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MenuItem2.Click
Dim NewMDIChild As New Form2()
'Set the Parent Form of the Child window.
NewMDIChild.MdiParent = Me
'Display the new form.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 38 | P g i n a

NewMDIChild.Show()
End Sub

Presione F5 para ejecutar la aplicacin. Observe que al seleccionar Nuevo en el men Archivo, puede
crear nuevos formularios MDI secundarios de los que se har un seguimiento en el men Ventana.
Nota:
Cuando un formulario secundario MDI tiene un componente MainMenu (normalmente con una
estructura de men de elementos de men) y se abre dentro de un formulario primario MDI que
tiene un componente MainMenu (normalmente con una estructura de men de elementos de
men), los elementos de men se combinan automticamente si ha establecido la propiedad
MergeType (y opcionalmente, la propiedad MergeOrder). Establezca la propiedad MergeType de
los componentes MainMenu y todos los elementos de men del formulario secundario en
MergeItems. Adems, establezca el valor de la propiedad MergeOrder de modo que los elementos
de ambos mens aparezcan en el orden deseado. Tenga en cuenta que al cerrar un formulario MDI
primario, cada uno de los formularios MDI secundarios provoca un evento Closing antes de que se
provoque el evento Closing del formulario MDI primario. La cancelacin de un evento Closing del
MDI secundario no evita que se provoque el evento Closing del MDI primario; sin embargo, el
argumento CancelEventArgs para el evento Closing del MDI primario, se establecer en true. Puede
forzar el cierre del formulario MDI primario y todos los formularios secundarios estableciendo el
argumento CancelEventArgs en false.

Determinar el formulario secundario MDI activo
En determinadas ocasiones, desear proporcionar un comando que acte sobre el control que tiene el
enfoque en el formulario secundario actualmente activo. Por ejemplo, suponga que desea copiar texto
seleccionado desde el cuadro de texto del formulario secundario al Portapapeles. Deber crear un
procedimiento que copie el texto seleccionado al Portapapeles mediante el evento Click del elemento de
men Copiar del men estndar Edicin.
Dado que una aplicacin MDI puede tener muchas instancias del mismo formulario secundario, el
procedimiento necesita saber qu formulario debe utilizar. Para especificar el formulario correcto, utilice la
propiedad ActiveMdiChild, que devuelve el formulario secundario que tiene el foco o el que estuvo activo
ms recientemente.
Cuando tenga varios controles en un formulario, deber especificar tambin qu control est activo. Al igual
que la propiedad ActiveMdiChild, la propiedad ActiveControl devuelve el control que tiene el foco en el
formulario secundario activo. El procedimiento siguiente ilustra un procedimiento de copia, al que se puede
llamar desde un men de un formulario secundario, un men del formulario MDI o un botn de la barra de
herramientas.
Para determinar el formulario secundario MDI activo (a fin de copiar el texto que contiene en el
Portapapeles)
Dentro de un mtodo, copie en el Portapapeles el texto del control activo del formulario
secundario activo.
Nota:
En este ejemplo se supone que hay un formulario primario MDI (Form1) que tiene una o varias
ventanas secundarias MDI que, a su vez, contienen un control RichTextBox.

Public Sub mniCopy_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mniCopy.Click

' Determine the active child form.
Dim activeChild As Form = Me.ActiveMDIChild

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 39 | P g i n a

' If there is an active child form, find the active control, which
' in this example should be a RichTextBox.
If (Not activeChild Is Nothing) Then
Try
Dim theBox As RichTextBox = _
Ctype(activeChild.ActiveControl, RichTextBox)
If (Not theBox Is Nothing) Then
' Put selected text on Clipboard.
Clipboard.SetDataObject(theBox.SelectedText)
End If
Catch
MessageBox.Show("You need to select a RichTextBox.")
End Try
End If
End Sub

Organizar formularios MDI secundarios
A menudo, las aplicaciones tienen comandos de men para acciones tales como Mosaico, Cascada y
Organizar, relacionadas con los formularios MDI secundarios abiertos. Puede utilizar el mtodo LayoutMdi
con la enumeracin MdiLayout para reorganizar los formularios secundarios en un formulario primario MDI.
El mtodo LayoutMdi puede utilizar uno de los cuatro valores diferentes de la enumeracin MdiLayout. Los
valores de la enumeracin mostrarn los formularios secundarios en cascada, en mosaico horizontal o
vertical, o en forma de iconos de formularios secundarios dispuestos a lo largo de la parte inferior del
formulario MDI.
A menudo, estos mtodos se utilizan como controladores de eventos, a los que llama el evento Click de un
elemento de men. De este modo, un elemento de men con el texto "Ventanas en cascada" puede tener el
efecto deseado sobre las ventanas MDI secundarias.
Para organizar formularios secundarios
En un mtodo, utilice el mtodo LayoutMdi para establecer la enumeracin MdiLayout para el
formulario primario MDI. En el ejemplo siguiente se utiliza el valor Cascade de la enumeracin
MdiLayout para las ventanas secundarias del formulario primario MDI (Form1). La enumeracin se
utiliza en el cdigo durante el controlador de eventos del evento Click del elemento de men
Ventanas en cascada.

Protected Sub CascadeWindows_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs)
Me.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade)
End Sub

Trabajando con controles
Cmo agregar controles a un formulario
La mayora de los formularios se disean agregando controles a la superficie del formulario para definir una
interfaz de usuario. Un control es un componente de un formulario que se utiliza para mostrar informacin
o aceptar los datos introducidos por el usuario.
Nota:
Los cuadros de dilogo y comandos de men que se ven pueden diferir de los descritos en la Ayuda,
dependiendo de los valores de configuracin o de edicin activos. Para cambiar la configuracin, elija la
opcin Importar y exportar configuraciones en el men Herramientas.
Para dibujar un control en un formulario
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 40 | P g i n a

1. Abra el formulario.
2. En el Cuadro de herramientas, haga clic en el control que desee agregar al formulario.
3. En el formulario, haga clic en el punto en que desee que se encuentre la esquina superior izquierda
del control y arrastre hasta donde desee que se encuentre la esquina inferior derecha del control.
El control se agregar al formulario con la ubicacin y el tamao especificados.
Nota:
Cada control tiene definido un tamao predeterminado. Puede agregar un control al formulario con
su tamao predeterminado arrastrndolo desde el Cuadro de herramientas al formulario.
Para agregar un control a un formulario
1. Abra el formulario.
2. En el Cuadro de herramientas, haga clic en el control que desee y arrstrelo al formulario.
El control se agregar al formulario en la ubicacin especificada, con su tamao predeterminado.
Nota:
Puede hacer doble clic en un control del Cuadro de herramientas para agregarlo al margen superior
izquierdo del formulario con su tamao predeterminado.
Tambin puede agregar controles dinmicamente a un formulario en tiempo de ejecucin. En el ejemplo de
cdigo siguiente, un control TextBox se agregar al formulario cuando se hace clic en un control Button.
Nota:
El procedimiento siguiente requiere la existencia de un formulario con un control Button, Button1,
ya colocado en l.
Para agregar un control a un formulario mediante programacin
En el mtodo que controla el evento Click del botn dentro de la clase del formulario, inserte
cdigo similar al siguiente para agregar una referencia a la variable de control, establecer el valor
de Location para el control y agregar el control:
Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MyText As New TextBox()
MyText.Location = New Point(25, 25)
Me.Controls.Add(MyText)
End Sub

Nota:
Tambin puede agregar cdigo para inicializar otras propiedades del control.

Cmo establecer propiedades de los controles
Puede usar la ventana Propiedades desde la vista de diseo para modificar las propiedades de los controles.
Cada vez que realiza alguna accin sobre un control se actualiza automticamente la ventana de
propiedades y el cdigo subyacente para reflejar los cambios. Por ejemplo: al mover un control, se
actualizan la propiedad Location, o al cambiar su tamao se ajusta la propiedad Size.

Cmo agregar cdigo a los eventos de los controles
Puee usar la ventana Propiedades para crear o asociar controladores de eventos para los eventos de un
control. Para ello debe seccionar el botn Eventos ( ) en las ventana Propiedades en la vista de diseo.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 41 | P g i n a

Tambin puede crear controladores de eventos usando el editor de cdigo. Para ello, seleccione de la lista
de clases el control para el cual desea controlar un evento y de la lista de mtodos seleccione el evento que
desea controlar.
A continuacin se ilustra este procedimiento para el evento Enter de un botn Button1.

Cmo usar la funcin MessageBox
La clase MessageBox muestra un cuadro de mensaje que puede contener texto, botones y smbolos que
informan e instruyen al usuario.
No se puede crear una nueva instancia de la clase MessageBox. Para mostrar un cuadro de mensaje, llame al
mtodo MessageBox.Show. El ttulo, el mensaje, los botones y los iconos que aparecen en el cuadro de
mensaje estn determinados por los parmetros que se pasan a este mtodo.
Ejemplos:
En el siguiente ejemplo de cdigo se muestra cmo se utiliza un objeto MessageBox para informar al
usuario sobre la ausencia de una entrada en un objeto TextBox. Este ejemplo requiere que se llame al
mtodo desde un formulario existente que incluya un objeto Button y un objeto TextBox.

Private Sub button1_Click(sender As Object, e As System.EventArgs)
If textBox1.Text = "" Then
MessageBox.Show("You must enter a name.", "Name Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
' Code to act on the data entered would go here.
End If
End Sub

En el ejemplo de cdigo siguiente se muestra cmo se le formula al usuario una pregunta cuya respuesta es
s o no y cmo se toma una decisin en funcin de la respuesta.

Private Sub ValidateUserEntry()
' Checks the value of the text.
If ServerName.Text.Length = 0 Then
' Initializes variables to pass to the MessageBox.Show method.
Dim Message As String = "You did not enter a server name. Cancel
this operation?"
Dim Caption As String = "Error Detected in Input"
Dim Buttons As MessageBoxButtons = MessageBoxButtons.YesNo
Dim Result As DialogResult
'Displays the MessageBox
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 42 | P g i n a

Result = MessageBox.Show(Message, Caption, Buttons)
' Gets the result of the MessageBox display.
If Result = System.Windows.Forms.DialogResult.Yes Then
' Closes the parent form.
Me.Close()
End If
End If
End Sub

Show
El mtodo Show tiene 21 sobrecargas. A continuacin se presenta un listado de las ms comnmente
utilizadas.

Nombre Descripcin
Show(String) Muestra un cuadro de mensaje con el texto especificado.
Show(String, String) Muestra un cuadro de mensaje con el texto y el ttulo especificados.
Show(String, String, MessageBoxButtons)
Muestra un cuadro de mensaje con el texto, el ttulo y los botones
especificados.
Show(String, String, MessageBoxButtons,
MessageBoxIcon)
Muestra un cuadro de mensaje con el texto, el ttulo, los botones y el
icono especificados.
Show(String, String, MessageBoxButtons,
MessageBoxIcon, MessageBoxDefaultButton)
Muestra un cuadro de mensaje con el texto, el ttulo, los botones, el
icono y el botn predeterminado especificados.
Show(String, String, MessageBoxButtons,
MessageBoxIcon, MessageBoxDefaultButton,
MessageBoxOptions)
Muestra un cuadro de mensaje con el texto, el ttulo, los botones, el
icono, el botn predeterminado y las opciones especificados.
Show(String, String, MessageBoxButtons,
MessageBoxIcon, MessageBoxDefaultButton,
MessageBoxOptions, Boolean)
Muestra un cuadro de mensaje con el texto, el ttulo, los botones, el
icono, el botn predeterminado, las opciones y el botn Ayuda
especificados.
Show(String, String, MessageBoxButtons,
MessageBoxIcon, MessageBoxDefaultButton,
MessageBoxOptions, String)
Muestra un cuadro de mensaje con el texto, el ttulo, los botones, el
icono, el botn predeterminado, las opciones y el botn Ayuda
especificados, que utiliza el archivo de Ayuda indicado.


Dando estilo al cdigo
Convenciones de nombres
Al dar nombre a un elemento de una aplicacin de Visual Basic, el primer carcter del nombre debe ser un
carcter alfabtico o un guin de subrayado. Tenga en cuenta, sin embargo, que los nombres que empiezan
con un guin de subrayado no cumplen las normas de Common Language Specification (CLS).
A la nomenclatura se aplican las siguientes sugerencias.
Empiece cada palabra independiente de un nombre con una letra mayscula, como en
FindLastRecord y RedrawMyForm.
Empiece los nombres de mtodo y de funcin con un verbo, como en InitNameArray o CloseDialog.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 43 | P g i n a

Empiece los nombres de clase, estructura, mdulo y propiedad con un nombre, como en
EmployeeName o CarAccessory.
Empiece los nombres de interfaz con el prefijo "I", seguido de un nombre o una frase nominal,
como IComponent, o con un adjetivo que describa el comportamiento de la interfaz, como
IPersistable. No utilice el subrayado, y utilice lo menos posible las abreviaturas, ya que pueden
causar confusiones.
Empiece los nombres de controlador de eventos con un nombre que describa el tipo de evento
seguido por el sufijo "EventHandler", como en "MouseEventHandler".
En nombres de clases de argumento de evento, incluya el sufijo "EventArgs".
Si un evento tiene un concepto de antes o despus, utilice un sufijo en tiempo presente o
pasado, como en "ControlAdd" o "ControlAdded".
Para trminos largos o utilizados con frecuencia, utilice abreviaturas para mantener las longitudes
de los nombres dentro un lmite razonable, por ejemplo, "HTML" en lugar de "Lenguaje de marcado
de hipertexto". En general, los nombres de variable con ms de 32 caracteres son difciles de leer
en una pantalla configurada para una resolucin baja. Adems, asegrese de que sus abreviaturas
sean coherentes a lo largo de toda la aplicacin. Si utiliza indistinta y aleatoriamente "HTML" y
"Lenguaje de marcado de hipertexto" en un mismo proyecto, puede provocar confusin.
Evite utilizar nombres que en un entorno interno sean iguales que otros nombres de un entorno
externo. Se producirn errores si se obtiene acceso a la variable equivocada. Si se produce un
conflicto entre una variable y la palabra clave del mismo nombre, debe identificar la palabra clave
ponindole delante la biblioteca de tipos adecuada. Por ejemplo, si tiene una variable denominada
Date, slo puede utilizar la funcin intrnseca Date llamando a DateTime.Date.
Cmo dar formato y documentar el cdigo
Una buena prctica de programacin consiste en comenzar todos los procedimientos con un comentario
breve que describe las caractersticas funcionales del procedimiento (lo que hace). Esto ayuda al
programador y a los que puedan examinar el cdigo. Debera separar los detalles de implementacin (cmo
lo hace el procedimiento) de los comentarios que describen las caractersticas funcionales. Al incluir detalles
de implementacin en la descripcin, recuerde actualizarlos en el momento de actualizar la funcin.

Cuando lea ejemplos de cdigo, encontrar el smbolo de comentario ('). Este smbolo solicita al compilador
de Visual Basic que pase por alto el texto que aparece a continuacin, es decir el comentario. Los
comentarios son notas cortas explicativas que se agregan al cdigo para aportar mayor informacin a las
personas que lo lean.
Los comentarios pueden ir a continuacin de una instruccin en la misma lnea, o pueden ocupar una lnea
completa. Ambas opciones quedan reflejadas en el cdigo siguiente.

En Visual Basic, algunos los comentarios insertados en el cdigo se pueden mostrar como mensajes de la
Lista de tareas. Puede hacer clic en un comentario de la Lista de tareas para abrir el editor de Visual Studio
adecuado, con el punto de insercin colocado automticamente en la lnea del comentario.
Los comentarios en el cdigo estn precedidos por la marca de comentario correspondiente al lenguaje de
desarrollo. Si inserta una cadena de smbolo (TODO, UNDONE, HACK o una cadena de smbolo
personalizado) detrs de la marca de comentario, aparecer un acceso directo al comentario en la Lista de
tareas.
Para crear un smbolo de comentario personalizado
1. Seleccione Opciones en el men Herramientas.
2. Seleccione Entorno y, a continuacin, Lista de tareas.
3. En la seccin Smbolo de comentario del cuadro de dilogo Opciones de la lista de tareas, escriba
un Nombre para el smbolo personalizado. Se activar el botn Agregar.
4. Seleccione Normal, Baja o Alta en el men emergente Prioridad.
5. Haga clic en Agregar y, a continuacin, en Aceptar.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 44 | P g i n a


Es tambin una buena prctica organizar el cdigo de manera que facilite su lectura y mantenimiento.
Algunas tcnicas tiles para este fin son:
Uso del carcter de continuacin de lnea (_) para dividir el cdigo en varias lneas en la vista de
cdigo.
Configurar el entorno de desarrollo para que ajuste automticamente el cdigo a la pantalla.
Usar numeracin de lneas en las vistas de cdigo.
Usar etiquetas #Region #End Region para agrupar segmentos de cdigo relacionado.
Dividir el cdigo en varios archivos y usar clases parciales para distribuir en varios archivos fsicos la
funcionalidad de una clase.

Introduccin a VB
Visual Basic 2008 es una evolucin del lenguaje Visual Basic, que se dise para generar aplicaciones con
seguridad de tipos y orientadas a objetos de manera productiva. Visual Basic permite a los desarrolladores
centrar el diseo en Windows, la web y dispositivos mviles. Como ocurre con todos los lenguajes
destinados a Microsoft .NET Framework, los programas escritos en Visual Basic se benefician de la seguridad
y la interoperabilidad de los lenguajes.
Esta generacin de Visual Basic contina la tradicin de ofrecer una manera rpida y fcil de crear
aplicaciones basadas en .NET Framework.

Tipos de datos en .Net
Las estructuras y clases del espacio de nombres System admiten los tipos de datos bsicos de Visual Basic. El
compilador utiliza la palabra clave de cada tipo de datos como alias para la clase o estructura subyacente.
Por ejemplo, declarar una variable con la palabra reservada Byte es igual que declararla con el nombre
completo de estructura System..::.Byte.
Hay clases y estructuras adicionales disponibles en .NET Framework.
Common Language Runtime (CLR) tambin admite estructuras y clases que Visual Basic no proporciona. Por
ejemplo, la estructura System..::.Guid proporciona un identificador nico global (GUID) y la clase
System..::.TimeZone admite una zona horaria. Puede utilizar estos tipos para declarar variables y constantes
y puede tener acceso a los mtodos que .NET Framework implementa en estos tipos. Sin embargo, Visual
Basic no admite operaciones o conversiones de tipo que impliquen a tipos que no proporciona la aplicacin.
Tipos de valores y tipos de referencia
En .NET Framework, una estructura es un tipo de valor y una clase es un tipo de referencia. Por ello, las
estructuras de .NET Framework implementan tipos de valor como Char e Integer, mientras que las clases de
.NET Framework admiten tipos de referencia como Object y String. Observe que una matriz es un tipo de
referencia, incluso cuando sus miembros son tipos de valor, y una estructura es un tipo de valor, incluso
aunque tenga miembros de tipos de referencia.
Como un tipo de referencia representa una clase subyacente de .NET Framework, es preciso usar la palabra
clave New (Visual Basic) al inicializarlo. La instruccin siguiente inicializa una matriz.

Dim totals() As Single = New Single(8) {}

Tambin puede utilizar la palabra clave New para inicializar un tipo de valor. Esto es especialmente til si el
tipo tiene un constructor que toma parmetros. Un ejemplo de esto es el constructor Decimal(Int32, Int32,
Int32, Boolean, Byte) que genera un nuevo valor Decimal de las partes proporcionadas.
Los tipos de datos tienen Miembros
Como los tipos de datos de Visual Basic tienen miembros, los admiten las estructuras y clases de .NET
Framework. Estos miembros incluyen constructores, mtodos, propiedades y campos. Puede obtener
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 45 | P g i n a

acceso a los miembros (excepto los constructores) de una variable del mismo modo que a los mtodos y
propiedades de un objeto.
El ejemplo siguiente utiliza las propiedades Year, Month y Day, y el mtodo DaysInMonth de la estructura
System.DateTime para determinar cuntos das quedan en el mes actual.
Dim current As Date = Now
Dim daysRemaining As Integer
daysRemaining = Date.DaysInMonth(current.Year, current.Month) -
current.Day
Conviene sealar que se debe calificar una referencia a un miembro de tipo de datos, bien con el nombre
del tipo (Date) o bien con el nombre de una variable declarada de dicho tipo (current).
Ejemplos de miembros de tipos de datos
Los siguientes prototipos de cdigo ilustran algunos mtodos, propiedades y campos tiles con los tipos de
datos.
<Char>.IsDigit() ' Returns True if character is a numeric digit.
<Char>.IsLower() ' Returns True if character is a lowercase letter.
<Date>.IsLeapYear() ' Returns True if current year is a leap year.
<Date>.ToUniversalTime() ' Returns local date/time converted to UTC.
<Double>.IsInfinity() ' Returns True if contents represent infinity.
<Double>.IsNaN() ' Returns True if contents are not a number (0/0).
<Long>.MaxValue ' Constant representing largest positive Int64 value.
<Object>.GetType() ' Returns Type object representing type of <Object>.
<Object>.GetType().GetTypeCode() ' Returns type code of <Object>.
<String>.Chars(<index>) ' Character at position <index> of <String>.
<String>.Length ' Number of characters currently in <String>.
Todos los tipos numricos, incluidos Byte y Char, exponen los campos pblicos MaxValue y MinValue que
pueden ser muy tiles al trabajar con estos tipos.
La equivalencia de miembros de tipos de datos no est asegurada
.NET Framework proporciona tambin varios mtodos para los tipos de datos que podran resultar
equivalentes a funciones y palabras clave de Visual Basic. Sin embargo, Visual Basic no siempre utiliza los
mtodos de .NET Framework para realizar la conversin u otras operaciones y los resultados no siempre son
idnticos.
Por ejemplo, el mtodo ToSingle realiza el mismo tipo de accin que hace la palabra clave CSng en una
expresin Decimal. Pero no se garantiza que CSng utilice System.tipoDeDatos.ToSingle y, por consiguiente,
no se garantiza que los resultados sean los mismos en condiciones marginales o lmite.
En general, debe utilizar los elementos de programacin de Visual Basic porque son ms sencillos de usar y
facilitan la lectura del cdigo. En algunos casos, podra ser necesario que un mtodo .NET Framework aporte
funcionalidad adicional.
Tipos de datos en VB
El tipo de datos de un elemento de programacin hace referencia al tipo de datos que puede contener y a
cmo se almacenan dichos datos. Los tipos de datos se aplican a todos los valores que pueden almacenarse
en la memoria del equipo o participar en la evaluacin de una expresin. Cada variable, literal, constante,
enumeracin, propiedad, parmetro de procedimiento, argumento de procedimiento y valor devuelto por
un procedimiento tiene un tipo de datos.
Tipos de datos declarados
A menos que utilice la programacin sin tipos, debe declarar los tipos de datos de todos los elementos de
programacin.
Un elemento de programacin se define con una instruccin de declaracin y su tipo de datos se especifica
con la clusula As. La tabla siguiente muestra las instrucciones utilizadas para declarar diversos elementos.
Elemento de
programacin
Declaracin de tipos de datos
Variable En una Instruccin Dim (Visual Basic)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 46 | P g i n a

Elemento de
programacin
Declaracin de tipos de datos
Dim amount As Double
Static yourName As String
Public billsPaid As Decimal = 0
Literal
Con un carcter de tipo de literal; vea "Caracteres de tipo de literal" en Caracteres de tipo
Dim searchChar As Char = "."C
Constante
En una Instruccin Const (Visual Basic)
Const modulus As Single = 4.17825F
Enumeracin
En una Instruccin Enum (Visual Basic)
Public Enum colors
Propiedad
En una Property (Instruccin)
Property region() As String
Parmetro de
procedimiento
En una Instruccin Sub (Visual Basic), Instruccin Function (Visual Basic) o Operator
(Instruccin)
Sub addSale(ByVal amount As Double)
Argumento de
procedimiento
En el cdigo de llamada; cada argumento es un elemento de programacin que ya se ha
declarado o una expresin que contiene los elementos declarados
subString = Left(inputString, 5)
Valor devuelto por
procedimiento
En una Instruccin Function (Visual Basic) o Operator (Instruccin)
Function convert(ByVal b As Byte) As String

Variables (declaracin, mbito y uso)
Al realizar clculos con Visual Basic, resulta frecuente tener que almacenar valores. Por ejemplo, puede que
necesite calcular varios valores, compararlos y realizar distintas operaciones con ellos, en funcin del
resultado de la comparacin. Si desea comparar los valores, tiene que conservarlos.
Uso
Visual Basic, al igual que la mayora de los lenguajes de programacin, usa variables para almacenar los
valores. Una variable tiene un nombre (la palabra que se usa para referirse al valor que contiene la variable).
Una variable tambin tiene un tipo de datos, que determina el tipo de datos que puede almacenar la
variable. Una variable puede representar una matriz si tiene que almacenar un conjunto indizado de
elementos de datos estrechamente relacionados entre s.
Visual Basic 2008 proporciona inferencia de tipo local, que le permite declarar las variables sin tener que
indicar de forma explcita un tipo de datos. En lugar de ello, el compilador deduce el tipo de la variable a
partir del tipo de la expresin de inicializacin.
Asignar valore
Para efectuar clculos y asignar el resultado a una variable, se utilizan instrucciones de asignacin, como se
muestra en el ejemplo siguiente.
' The following statement assigns the value 10 to the variable.
applesSold = 10
' The following statement increments the variable.
applesSold = applesSold + 1
' The variable now holds the value 11.

Nota: El signo igual (=) de este ejemplo es un operador de asignacin, no un operador de igualdad. El valor
se asigna a la variable applesSold.
Variables y propiedades
Al igual que una variable, una propiedad representa un valor al que se puede obtener acceso. Sin embargo,
es ms complejo que una variable. Una propiedad utiliza bloques de cdigo que controlan cmo establecer y
recuperar su valor.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 47 | P g i n a

Declaracin de variables
Una variable se declara para especificar su nombre y sus caractersticas. La instruccin de declaracin para
variables es Instruccin Dim (Visual Basic). Su ubicacin y contenido determinan las caractersticas de la
variable.
Para las reglas de denominacin de variables y consideraciones, consulte Nombres de elementos
declarados.
Niveles de declaracin
Valor local y variables miembros
Una variable local es aquella que se declara dentro de un procedimiento. Una variable miembro es un
miembro de un tipo de Visual Basic; se declara en el nivel de mdulo, dentro de una clase, estructura o
mdulo, pero no dentro de ningn procedimiento interno de esa clase, estructura o mdulo.
Variables compartidas y de instancias
La categora de una variable miembro, en una clase o estructura, depende de que la variable est o no
compartida. Si una variable se declara con la palabra clave Shared, es una variable compartida, y existe en
una nica copia compartida por todas las instancias de la clase o estructura.
De lo contrario, es una variable de instancia, y se crea una copia independiente de ella para cada instancia
de la clase o estructura. Una copia determinada de una variable de instancia slo est disponible en la
instancia para la cual se cre. Es independiente de una copia en cualquier otra instancia.
Declarar el tipo de datos
La clusula As de la instruccin de declaracin permite definir el tipo de datos o de objetos de la variable
que se est declarando. Se puede especificar cualquiera de los siguientes tipos para una variable:
Un tipo de datos bsico, como Boolean, Long o Decimal.
Un tipo de datos compuesto, como una matriz o una estructura.
Un tipo de objeto o clase, definido en su aplicacin o en otra aplicacin
Clase de .NET Framework, como Label o TextBox
Un tipo de interfaz, como IComparable o IDisposable
Se pueden declarar varias declarar distintas variables en la misma instruccin sin necesidad de repetir el tipo
de datos. En las instrucciones siguientes, las variables i, jy k se declaran como tipo Integer, l y m como Long,
y x e y como Single:
Dim i, j, k As Integer
' All three variables in the preceding statement are declared as Integer.
Dim l, m As Long, x, y As Single
' In the preceding statement, l and m are Long, x and y are Single.

Inferencia de tipo de variable local
Visual Basic 2008 introduce el uso de la inferencia de tipos para determinar los tipos de datos de las
variables locales declarados sin ninguna clusula As. El compilador deduce el tipo de la variable a partir del
tipo de la expresin de inicializacin. Esto permite declarar variables sin especificar un tipo de forma
explcita. En el ejemplo siguiente, num1 y num2 son con establecimiento inflexible de tipos como enteros.
Public Sub inferenceExample()
' Using explicit typing.
Dim num1 As Integer = 3
' Using local type inference.
Dim num2 = 3
End Sub
Si desea utilizar la inferencia de tipo de variable local, Option Infer debe estar establecido en On.

Declarar caractersticas
El perodo de duracin de una variable representa el tiempo durante el cual la variable est disponible para
que pueda ser utilizada. En general, una variable existe mientras el elemento que lo declara (como un
procedimiento o clase) siga existiendo. En algunos casos es posible extender la duracin de una variable
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 48 | P g i n a

El mbito de una variable est formado por todo cdigo que puede hacer referencia a la variable sin tener
que calificar su nombre. El mbito de una variable est determinado por la ubicacin en la que se haya
declarado la variable. El cdigo de una regin determinada puede utilizar las variables definidas en dicha
regin sin necesidad de especificar los nombres de las variables.
El nivel de acceso de una variable es la extensin de cdigo que tiene permiso para tener acceso a ella. El
modificador de acceso (como Public (Visual Basic) o Private (Visual Basic)) que utiliza en la instruccin Dim es
quien determina esto.
mbito en Visual Basic
El mbito de un elemento declarado es el conjunto de todo el cdigo que puede hacer referencia a l sin
calificar su nombre o marcarlo como disponible mediante Instruccin Imports (Tipo y espacio de nombres de
.NET). Un elemento puede tener uno de los niveles de mbito siguientes:
Nivel Descripcin
mbito de bloque
mbito disponible nicamente en el bloque de cdigo en el que se ha
declarado
mbito de procedimiento
Disponible para todo el cdigo dentro del procedimiento en el que se ha
declarado
mbito de mdulo
Disponible para todo el cdigo dentro del mdulo, clase o estructura en el que
se ha declarado
mbito de espacio de
nombres
Disponible para todo el cdigo dentro del espacio de nombres en el que se ha
declarado
Estos niveles de mbito progresan desde el ms restringido (bloque) al ms amplio (espacio de nombres),
donde mbito ms restringido significa el conjunto de cdigo ms pequeo que puede hacer referencia al
elemento sin calificacin.

Especificar mbito y definir variables
El mbito de un elemento se especifica al declararlo y puede depender de los factores siguientes:
La regin (bloque, procedimiento, mdulo, clase o estructura) donde se declara el elemento.
El espacio de nombres que contiene la declaracin del elemento.
El nivel de acceso que se declara para el elemento.
Tenga cuidado cuando defina variables del mismo nombre pero con mbito diferente, puesto que ello
podra causar resultados inesperados.

Niveles de mbito
Un elemento de programacin est disponible en toda la regin en la que se declara. Todo el cdigo de la
misma regin puede hacer referencia al elemento sin calificar su nombre.
mbito de bloque
Un bloque es un conjunto de instrucciones incluido dentro de las instrucciones de declaracin de inicio y fin,
como lo siguiente:
Do y Loop
For [Each] y Next
If y End If
Select y End Select
SyncLock y End SyncLock
Try y End Try
While y End While
With y End With
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 49 | P g i n a

Si declara una variable dentro de un bloque, slo puede utilizarla dentro de ese bloque. En el ejemplo
siguiente, el mbito de la variable de entero cube es el bloque entre If y End If, y las referencias a cube dejan
de ser posibles cuando termina la ejecucin del bloque.
If n < 1291 Then
Dim cube As Integer
cube = n ^ 3
End If
Nota: Incluso si el mbito de una variable est limitado a un bloque, su perodo de duracin sigue siendo el
del procedimiento completo. Si utiliza el bloque varias veces durante el procedimiento, todas las variables
de bloque conservan su valor anterior. Para evitar resultados inesperados en estos casos, es mejor inicializar
las variables de bloque al principio del bloque.

mbito de procedimiento
Un elemento declarado en un procedimiento no est disponible fuera de l. Solamente el procedimiento
que contiene su declaracin puede utilizarlo. Las variables en este nivel tambin se denominan variables
locales. Se declaran con Instruccin Dim (Visual Basic), con o sin la palabra clave Static (Visual Basic).
Los mbitos de procedimiento y de bloque estn estrechamente relacionados. Si se declara una variable
dentro de un procedimiento, pero fuera de un bloque dentro del procedimiento, puede considerarse que la
variable tiene mbito de bloque, donde el bloque es el procedimiento completo.
Nota:
Todos los elementos locales, aunque sean variables Static, son privados para el procedimiento en el que
aparecen. No se puede declarar un elemento mediante la palabra clave Public (Visual Basic) dentro de un
procedimiento.
mbito de mdulo
Por comodidad, el trmino nivel de mdulo se aplica por igual a mdulos, clases y estructuras. Puede
declarar elementos a este nivel si sita la instruccin de declaracin fuera de cualquier procedimiento o
bloque pero dentro del mdulo, clase o estructura.
Cuando se incluye una declaracin en el nivel de mdulo, el nivel de acceso seleccionado determina el
mbito. El espacio de nombres que contiene el mdulo, la clase o la estructura tambin afecta al mbito.
Los elementos para los que se declara el nivel de acceso Private (Visual Basic) estn disponibles para todos
los procedimientos del mdulo, pero no para el cdigo de otros mdulos. La instruccin Dim en el ni vel de
mdulo toma Private como valor predeterminado si no utiliza ninguna palabra nivel de acceso. No obstante,
el mbito y el nivel de acceso sern ms patentes si utiliza la palabra clave Private en la instruccin Dim.
En el ejemplo siguiente, todos los procedimientos definidos en el mdulo pueden hacer referencia a la
variable de cadena strMsg. Cuando se llama al segundo procedimiento, muestra el contenido de la variable
de cadena strMsg en un cuadro de dilogo:
' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub

mbito de espacio de nombres
Si declara un elemento en el nivel de mdulo mediante la palabra claveFriend (Visual Basic) o Public (Visual
Basic), dicho elemento quedar disponible para todos los procedimientos del espacio de nombres en los que
se declare. La siguiente modificacin del ejemplo anterior permite que el cdigo haga referencia a la variable
de cadena strMsg en cualquier parte del espacio de nombres de su declaracin.
' Include this declaration at module level (not inside any procedure).
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 50 | P g i n a

Public strMsg As String
El mbito de espacio de nombres incluye espacios de nombres anidados. Un elemento disponible de un
espacio de nombres tambin est disponible en cualquier espacio de nombres anidado en su interior.
Si un proyecto no contiene Namespace (Instruccin), todo lo que incluya el proyecto estar en el mismo
espacio de nombres. En este caso, el mbito de espacio de nombres se puede considerar como el mbito del
proyecto. Los elementos Public de un mdulo, clase o estructura tambin estn disponibles para cualquier
proyecto que haga referencia a sus proyectos.
Eleccin de mbito
Cuando declara una variable, debe tener presente los puntos siguientes al elegir su mbito.
Ventajas de variables locales
Las variables locales son una buena eleccin para cualquier tipo de clculo temporal, por las razones
siguientes:
Evitar conflictos de nombres. Los nombres de variables locales no son susceptibles de entrar en
conflicto. Por ejemplo, es posible crear varios procedimientos distintos que contengan una variable
denominada intTemp. En tanto que intTemp est declarado como una variable local, cada
procedimiento reconocer nicamente su propia versin de intTemp. Cualquier procedimiento
puede cambiar el valor de su variable intTemp local sin que ello afecte a las variables intTemp del
resto de los procedimientos.
Consumo de memoria. Las variables locales slo utilizan la memoria mientras su procedimiento
est en ejecucin. Su memoria se libera cuando el procedimiento vuelve al cdigo de llamada. Por
el contrario, las variables Shared (Visual Basic) y Static (Visual Basic) consumen recursos de
memoria hasta que su aplicacin deja de ejecutarse, por lo que se deben utilizar slo cuando sea
necesario. Las variables de instancia utilizan la memoria mientras su instancia sigue existiendo, lo
que les resta eficacia frente a las variables locales pero son potencialmente ms eficaces que las
variables Shared o Static.
Minimizar el mbito
En general, cuando se declara una variable o una constante, es un buen hbito de programacin asignar un
mbito lo ms restringido posible (el mbito de un bloque es el ms restringido). Esto permite que no se
pierda memoria y reduce al mnimo la posibilidad de que el cdigo haga referencia por error a una variable
incorrecta. Del mismo modo, slo debera declararse una variable como Static (Visual Basic) si es necesario
que conserve su valor entre una llamada al procedimiento y otra.

Niveles de Acceso en Visual Basic
El nivel de acceso de un elemento declarado es la extensin de la capacidad de acceso a l; es decir, qu
cdigo tiene permiso para leer o escribir en l. Est determinado no solamente por cmo se declara el
propio elemento, sino tambin por la nivel de acceso del contenedor del elemento. El cdigo que no puede
tener acceso a un elemento contenedor no puede tener acceso a ninguno de sus elementos contenedores,
incluso aqullos declarados como Public. Por ejemplo, se puede tener acceso a una variable Public de una
estructura Private desde dentro de la clase que contiene la estructura, pero no desde fuera.
Public
La palabra clave Public (Visual Basic) de la instruccin de declaracin especifica que se puede tener acceso a
los elementos desde el cdigo en cualquier parte del mismo proyecto, desde otros proyectos que hagan
referencia al proyecto y desde un ensamblado generado a partir del proyecto. El cdigo siguiente muestra
un ejemplo de declaracin Public.
Public Class classForEverybody
Puede utilizar Public solamente en el nivel de mdulo, interfaz o espacio de nombres. Es decir, puede
declarar un elemento pblico en el nivel de archivo de cdigo fuente o espacio de nombres o dentro de una
interfaz, mdulo, clase o estructura, pero no dentro de un procedimiento.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 51 | P g i n a

Protected
La palabra clave Protected (Visual Basic) de la instruccin de declaracin especifica que slo se puede tener
acceso a los elementos desde dentro de la misma clase o desde una clase derivada de ella. El cdigo
siguiente muestra un ejemplo de declaracin Protected.
Protected Class classForMyHeirs
Slo puede usar Protected en el nivel de clase y slo al declarar un miembro de una clase.Es decir, puede
declarar un elemento protegido en una clase, pero no en el nivel de archivo de cdigo fuente o espacio de
nombres, o dentro de una interfaz, mdulo, estructura o procedimiento.
Friend
La palabra clave Friend (Visual Basic) en la instruccin de declaracin especifica que se puede tener acceso a
los elementos desde dentro del mismo ensamblado, pero no desde fuera del ensamblado. El cdigo
siguiente muestra un ejemplo de declaracin Friend.
Friend stringForThisProject As String
Puede utilizar Friend solamente en el nivel de mdulo, interfaz o espacio de nombres. Es decir, puede
declarar un elemento Friend en el nivel de archivo de cdigo fuente o espacio de nombres o dentro de una
interfaz, mdulo, clase o estructura, pero no dentro de un procedimiento.
Protected Friend
Las palabras clave Protected y Friend juntas en la instruccin de declaracin especifican que se puede tener
acceso a los elementos desde las clases derivadas, desde dentro del mismo ensamblado o ambos. El cdigo
siguiente muestra un ejemplo de declaracin ProtectedFriend.
Protected Friend stringForProjectAndHeirs As String
Slo puede usar FriendProtected en el nivel de clase y slo al declarar un miembro de una clase.Es decir,
puede declarar un elemento de tipo Protected Friend en una clase, pero no en el nivel de archivo de cdigo
fuente o espacio de nombres, o dentro de una interfaz, mdulo, estructura o procedimiento.
Private
La palabra clave Private (Visual Basic) de la instruccin de declaracin especifica que slo se puede tener
acceso a los elementos desde dentro del mismo mdulo, clase o estructura. El cdigo siguiente muestra un
ejemplo de declaracin Private.
Private numberForMeOnly As Integer
Slo puede utilizar Private en el nivel de mdulo. Es decir, puede declarar un elemento privado dentro de un
mdulo, clase o estructura, pero no en el nivel de archivo de cdigo fuente o espacio de nombres, dentro de
una interfaz o un procedimiento.
En el nivel de mdulo, la instruccin Dim sin ninguna palabra clave de nivel de acceso es equivalente a una
declaracin Private. No obstante, podra convenirle usar la palabra clave Private para facilitar la lectura y la
interpretacin del cdigo.

Modificador de
acceso
Nivel de acceso concedido
Elementos que puede declarar con
este nivel de acceso
Contexto de declaracin dentro de
cual puede utilizar este modificador
Public
Sin restricciones:
Cualquier cdigo que puede
ver un elemento pblico
puede tener acceso a l.
Interfaces
Mdulos
Clases
Estructuras
Miembros de estructura
Procedimientos
Propiedades
Variables miembros
Constantes
Enumeraciones
Eventos
Declaraciones externas
Delegados
Archivo de cdigo fuente
Espacio de nombres
Interfaz
Mdulo
Clase
Estructura
Protected De derivacin: Interfaces Clase
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 52 | P g i n a

Modificador de
acceso
Nivel de acceso concedido
Elementos que puede declarar con
este nivel de acceso
Contexto de declaracin dentro de
cual puede utilizar este modificador
El cdigo de la clase que
declara un elemento
protegido, o una clase
derivada de l, puede tener
acceso al elemento.
Clases
Estructuras
Procedimientos
Propiedades
Variables miembros
Constantes
Enumeraciones
Eventos
Declaraciones externas
Delegados
Friend
Ensamblado:
El cdigo del ensamblado
que declara un elemento de
tipo Friend puede tener
acceso a l.
Interfaces
Mdulos
Clases
Estructuras
Miembros de estructura
Procedimientos
Propiedades
Variables miembros
Constantes
Enumeraciones
Eventos
Declaraciones externas
Delegados
Archivo de cdigo fuente
Espacio de nombres
Interfaz
Mdulo
Clase
Estructura
ProtectedFriend
Unin de Protected y Friend:
El cdigo de la misma clase o
el mismo ensamblado que el
elemento de tipo Protected
Friend o aquel que est
dentro de cualquier clase
derivada de la clase del
elemento, puede tener
acceso a l.
Interfaces
Clases
Estructuras
Procedimientos
Propiedades
Variables miembros
Constantes
Enumeraciones
Eventos
Declaraciones externas
Delegados
Clase
Private
Contexto de declaracin:
El cdigo del tipo que declara
un elemento privado,
incluido el cdigo de los tipos
contenidos, puede tener
acceso al elemento.
Interfaces
Clases
Estructuras
Miembros de estructura
Procedimientos
Propiedades
Variables miembros
Constantes
Enumeraciones
Eventos
Declaraciones externas
Delegados
Mdulo
Clase
Estructura


Caracteres de Tipo y Literales
Adems de especificar un tipo de datos en una instruccin de declaracin, puede forzar el tipo de datos de
algunos elementos de programacin con un carcter de tipo. El carcter de tipo debe ir justo despus del
elemento, sin ningn tipo de carcter intermedio.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 53 | P g i n a

El carcter de tipo no forma parte del nombre del elemento. Se puede hacer referencia a un elemento
definido con un carcter de tipo sin el carcter de tipo.
Caracteres de tipo de identificador
Visual Basic proporciona un conjunto de caracteres de tipo de identificador que se pueden utilizar en una
declaracin para especificar el tipo de datos de una variable o constante. La tabla siguiente muestra los
caracteres de tipo de identificador disponibles, con ejemplos de su utilizacin.
Carcter de tipo de identificador Tipo de datos Ejemplo
% Integer Dim L%
& Long Dim M&
@ Decimal Const W@ = 37.5
! Single Dim Q!
# Double Dim X#
$ String Dim V$ = "Secret"
No existe ningn carcter de tipo de identificador para los tipos de datos Boolean, Byte, Char, Date, Object,
SByte, Short, UInteger, ULong o UShort, ni para los tipos de datos compuestos como matrices o estructuras.
En algunos casos, puede anexar el carcter $ a una funcin de Visual Basic, por ejemplo Left$ en lugar de
Left, para obtener un valor devuelto de tipo String.
En todos los casos, el carcter de tipo de identificador debe ir inmediatamente despus del nombre del
identificador.
Caracteres de tipo de literal
Un literal es una representacin textual de un valor determinado de un tipo de datos.
Tipos de literales predeterminados
El formato de un literal tal como aparece en el cdigo suele determinar su tipo de datos. La siguiente tabla
muestra estos tipos predeterminados.
Formato textual de literal
Tipo de datos
predeterminado
Ejemplo
Numrico, ninguna parte fraccionaria Integer 2147483647
Numrico, ningn parte fraccionaria, demasiado
grande para Integer
Long 2147483648
Numrico, parte fraccionaria Double 1.2
Entre comillas dobles String "A"
Incluido con signos de nmero Date #5/17/1993 9:32 AM#
Tipo de literales forzados
Visual Basic proporciona un conjunto de caracteres de tipo de literal, que puede utilizar para forzar que un
literal adopte un tipo de datos distinto del que indica su formato. Para hacerlo, anexe el carcter al final del
literal. La tabla siguiente muestra los caracteres de tipo de literal disponibles, con ejemplos de su utilizacin.
Caracteres de tipo de literal Tipo de datos Ejemplo
S Short I = 347S
I Integer J = 347I
L Long K = 347L
D Decimal X = 347D
F Single Y = 347F
R Double Z = 347R
US UShort L = 347US
UI UInteger M = 347UI
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 54 | P g i n a

UL ULong N = 347UL
C Char Q = "."C
No existe ningn carcter de tipo de literal para los tipos de datos Boolean, Byte, Date, Object, SByte o
String, ni para los tipos de datos compuestos como matrices o estructuras.
Los literales tambin pueden utilizar los caracteres de tipo de identificador (%, &, @, !, #, $), tal y como lo
hacen las variables, constantes y expresiones. Sin embargo, los caracteres de tipo de literal (S, I, L, D, F, R, C)
slo se pueden utilizar con literales.
En todos los casos, el carcter de tipo de literal debe ir inmediatamente despus del valor de literal.
Literales hexadecimales y octales
El compilador traduce normalmente un literal entero para que est en el sistema numrico decimal (base
10). Puede forzar un literal entero para que sea hexadecimal (base 16) con el prefijo &H y puede forzarle
para que sea octal (base 8) con el prefijo &O. Los dgitos que van a continuacin del prefijo deben ser
adecuados para el sistema numrico. Esto se muestra en la tabla siguiente:
Base numrica Prefijo Valores de dgitos vlidos Ejemplo
Hexadecimal (base 16) &H 0-9 y A-F &HFFFF
Octal (base 8) &O 0-7 &O77
Puede agregar a un literal prefijado un carcter de tipo de literal. Esto se muestra en el siguiente ejemplo.
Dim counter As Short = &H8000S
Dim flags As UShort = &H8000US
En el ejemplo anterior, counter tiene el valor decimal de -32768 y flags, el valor decimal de +32768.

Tipos de valor y tipos de referencia
Un tipo de datos es un tipo de valores si almacena los datos en su propia asignacin de memoria. Un tipo de
referencia contiene un puntero a otra ubicacin de memoria que almacena los datos.
Tipos de valor
Los tipos de valor incluyen lo siguiente:
Todos los tipos de datos numricos
Boolean, Char y Date
Todas las estructuras, incluso si sus miembros son tipos de referencia
Las enumeraciones, ya que su tipo subyacente es siempre SByte, Short, Integer, Long, Byte, UShort,
UInteger o ULong
Tipos de referencia
Los tipos de referencia incluyen lo siguiente:
String
Todas las matrices, incluso si sus elementos son tipos de valores
Los tipos de clase, como Form
Delegados
Elementos que no son tipos
Los elementos de programacin siguientes no se califican como tipos porque no es posible especificar
ninguno de ellos como tipo de datos para un elemento declarado:
Espacios de nombres
Mdulos
Eventos
Propiedades y procedimientos
Variables, constantes y campos
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 55 | P g i n a

Trabajar con el tipo de datos Object
Puede asignar indistintamente un tipo de referencia o un tipo de valores a una variable del tipo de datos
Object. Una variable Object siempre contiene un puntero a los datos, nunca los propios datos. Sin embargo,
si se asigna un tipo de valor a una variable Object, sta se comporta como si contuviera sus propios datos.
Puede averiguar si una variable Object est actuando como un tipo de referencia o un tipo de valor
pasndolo al mtodo IsReference en la clase Information del espacio de nombres Microsoft.VisualBasic.
Information..IsReference devuelve True si el contenido de la variable Object representa un tipo de
referencia.

Resumen de tipos de datos de Visual Basic
Tipo de Visual Basic
Estructura de tipo
Common Language
Runtime
Asignacin de
almacenamiento nominal
Intervalo de valores
Boolean Boolean
En funcin de la plataforma
de implementacin
True o False
Byte Byte 1 byte 0 a 255 (sin signo)
Char (carcter
individual)
Char 2 bytes 0 a 65535 (sin signo)
Date DateTime 8 bytes
0:00:00 (medianoche) del 1 de enero de
0001 a 11:59:59 p.m. del 31 de diciembre
de 9999.
Decimal Decimal 16 bytes
0 a +/-
79.228.162.514.264.337.593.543.950.335
(+/-7,9... E+28) sin separador decimal; 0
a +/-7,9228162514264337593543950335
con 28 posiciones a la derecha del
decimal;
el nmero distinto de cero ms pequeo
es +/-0,0000000000000000000000000001
(+/-1E-28)
Double (punto flotante
de precisin doble)
Double 8 bytes
-1,79769313486231570E+308 a -
4,94065645841246544E-324 para los
valores negativos;
4,94065645841246544E-324 a
1,79769313486231570E+308 para los
valores positivos
Integer Int32 4 bytes
-2.147.483.648 a 2.147.483.647 (con
signo)
Long (entero largo) Int64 8 bytes
-9.223.372.036.854.775.808 a
9.223.372.036.854.775.807 (9,2...E+18 )
(con signo)
Object Object (clase)
4 bytes en plataforma de 32
bits
8 bytes en plataforma de 64
bits
Cualquier tipo puede almacenarse en una
variable de tipo Object
SByte SByte 1 byte -128 a 127 (con signo)
Short (entero corto) Int16 2 bytes -32.768 a 32.767 (con signo)
Single (punto flotante
de precisin simple)
Single 4 bytes
-3,4028235E+38 a -1,401298E-45 para
los valores negativos;
1,401298E-45 a 3,4028235E+38 para los
valores positivos
String (longitud String (clase) En funcin de la plataforma 0 a 2.000 millones de caracteres Unicode
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 56 | P g i n a

Tipo de Visual Basic
Estructura de tipo
Common Language
Runtime
Asignacin de
almacenamiento nominal
Intervalo de valores
variable) de implementacin aprox.
UInteger UInt32 4 bytes 0 a 4.294.967.295 (sin signo)
ULong UInt64 8 bytes
0 a 18.446.744.073.709.551.615
(1,8...E+19 ) (sin signo)
User-Defined
(estructura)
(hereda de ValueType)
En funcin de la plataforma
de implementacin
Cada miembro de la estructura tiene un
intervalo de valores determinado por su
tipo de datos y es independiente de los
intervalos de valores correspondientes a
los dems miembros.
UShort UInt16 2 bytes 0 a 65.535 (sin signo)
En la notacin cientfica, "E" hace referencia a una potencia de 10. Por lo tanto, 3,56E+2 significa 3.56 x
102 o 356, y 3,56E-2 significa 3.56 / 102 o 0,0356.

Constantes
Para declarar y definir una o ms constantes debe usar la palabra clave Const
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Const constantlist.

Partes
attributelist
Opcional. Lista de atributos que se aplican a todas las constantes declaradas en esta instruccin. Vea la Lista
de atributos en corchetes angulares ("<" y ">").
accessmodifier
Opcional. Utilcelo para especificar qu cdigo puede tener acceso a estas constantes. Puede ser Public
(Visual Basic), Protected (Visual Basic), Friend (Visual Basic), Protected Friend o Private (Visual Basic).
Shadows
Opcional. Utilcelo para volver a declarar y ocultar un elemento de programacin de una clase base. Vea
Shadows.
constantlist
Obligatorio. Lista de constantes de miembros que se declaran en esta instruccin.
constant[ , constant ... ]
Cada constant tiene la sintaxis y las partes siguientes:
constantname[ As datatype ] = initializer
Parte Descripcin
constantname Obligatorio. Nombre de la constante.
datatype Obligatorio si Option Strict es On. Tipo de datos de la constante.
initializer
Obligatorio. Expresin que se evala en tiempo de compilacin y se asigna a la
constante.
Comentarios
Si en su aplicacin tiene un valor que nunca cambia, puede definir una constante con nombre y usarla en
lugar de un valor literal. Un nombre es ms fcil de recordar que un valor. Puede definir la constante slo
una vez y utilizarla en muchos lugares de su cdigo. Si en una versin posterior necesita volver a definir el
valor, la instruccin Const es el nico lugar donde es necesario realizar el cambio.
Slo puede utilizar Const en el nivel de mdulo o de procedimiento. Esto significa que el contexto de
declaracin de una propiedad debe ser una clase, estructura, mdulo, procedimiento o bloque, y no un
archivo de cdigo fuente, un espacio de nombres o una interfaz.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 57 | P g i n a

Las constantes locales (contenidas en un procedimiento) tienen un valor predeterminado de acceso pblico
y no puede utilizar ningn modificador de acceso en ellas. Las constantes de clases y miembros de mdulo
(externas a cualquier procedimiento) tienen como valor predeterminado el acceso privado, y las constantes
de miembro de estructura tienen como valor predeterminado el acceso pblico. Puede ajustar sus niveles de
acceso con los modificadores de acceso.
Reglas
Contexto de la declaracin. Una constante declarada en el nivel de mdulo, fuera de cualquier
procedimiento, es una constante de miembros; es un miembro de la clase, estructura o mdulo que
la declara.
Una constante declarada en el nivel de procedimiento es una constante local; es local al procedimiento o
bloque que la declara.
Atributos. Slo puede aplicar los atributos a las constantes de miembro, no a las constantes locales.
Un atributo aporta informacin a los metadatos del ensamblado, que no son significativos para el
almacenamiento temporal como constantes locales.
Modificadores. De manera predeterminada, todas las constantes son Shared, Static y ReadOnly. No
puede utilizar ninguna de estas palabras clave al declarar una constante.
En el nivel de procedimiento, no puede utilizar Shadows ni ningn modificador de acceso para declarar
constantes locales.
Varias constantes. Puede declarar varias constantes en la misma instruccin de declaracin,
especificando la parte constantname para cada una. Las constantes mltiples se separan por
comas.
Reglas de tipos de datos
Tipos de datos. La instruccin Const puede declarar el tipo de datos de una variable. Puede
especificar cualquier tipo de datos o el nombre de una enumeracin.
Tipo predeterminado. Si no especifica datatype, la constante toma el tipo de datos de initializer. Si
especifica datatype e initializer, el tipo de datos de initializer debe ser convertible al datatype. Si ni
datatype ni initializer estn presentes, el tipo de datos utiliza Object de manera predeterminada.
Distintos tipos. Puede especificar distintos tipos de datos para las diferentes constantes utilizando
una clusula As independiente para cada variable que declare. Sin embargo, no puede declarar
varias constantes para que sean del mismo tipo utilizando una clusula As comn.
Inicializacin. Debe inicializar el valor de cada constante en constantlist. Utilice initializer para
proporcionar una expresin que se va a asignar a la constante. La expresin puede ser cualquier
combinacin de literales, otras constantes que ya estn definidas y miembros de enumeracin que
ya se hayan definido. Puede utilizar operadores aritmticos y lgicos para combinar estos
elementos.
No puede utilizar variables ni funciones en initializer. No obstante, pueden utilizarse palabras clave de
conversin como CByte y CShort. Tambin puede utilizar AscW si lo llama con un argumento constante
String o Char, puesto que puede evaluarse en tiempo de compilacin.
Comportamiento
mbito. A las constantes locales slo se puede tener acceso desde dentro de sus procedimientos o
bloques. Se puede tener acceso a las constantes de miembro desde cualquier lugar del interior de
sus clases, estructuras o mdulos.
Calificacin. El cdigo fuera de una clase, estructura o mdulo debe calificar el nombre de una
constante de miembro con el nombre de esa clase, estructura o mdulo. El cdigo situado fuera de
un procedimiento o bloque no puede hacer referencia a ninguna constante local incluida dentro de
ese procedimiento o bloque.
Ejemplo
En el ejemplo siguiente se utiliza la instruccin Const para declarar constantes que se utilicen en lugar de
valores literales.

' The following statements declare constants.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 58 | P g i n a

Const maximum As Long = 459
Public Const helpString As String = "HELP"
Private Const startValue As Integer = 5

Si define una constante con el tipo de datos Object, el compilador de Visual Basic le asigna el tipo de
initializer, en lugar de Object. En el ejemplo siguiente, la naturalLogBase constante tiene el tipo Decimal en
tiempo de ejecucin.
Const naturalLogBase As Object = CDec(2.7182818284)
MsgBox("Run-time type of constant naturalLogBase is " & _
naturalLogBase.GetType.ToString())

El ejemplo anterior utiliza el mtodo ToString del objeto Type devuelto por el GetType (Operador), porque
Type no se puede convertir a String utilizando CStr.

Comentarios
Cuando lea ejemplos de cdigo, encontrar el smbolo de comentario ('). Este smbolo solicita al compilador
de Visual Basic que pase por alto el texto que aparece a continuacin, es decir el comentario. Los
comentarios son notas cortas explicativas que se agregan al cdigo para aportar mayor informacin a las
personas que lo lean.
Una buena prctica de programacin consiste en comenzar todos los procedimientos con un comentario
breve que describe las caractersticas funcionales del procedimiento (lo que hace). Esto ayuda al
programador y a los que puedan examinar el cdigo. Debera separar los detalles de implementacin (cmo
lo hace el procedimiento) de los comentarios que describen las caractersticas funcionales. Al incluir detalles
de implementacin en la descripcin, recuerde actualizarlos en el momento de actualizar la funcin.
Los comentarios pueden ir a continuacin de una instruccin en la misma lnea, o pueden ocupar una lnea
completa. Ambas opciones quedan reflejadas en el cdigo siguiente.
' This is a comment beginning at the left edge of the screen.
text1.Text = "Hi!" ' This is an inline comment.

Si el comentario necesita ms de una lnea, utilice el smbolo de comentario en cada lnea, como se muestra
en el siguiente ejemplo:
' This comment is too long to fit on a single line, so we break
' it into two lines. Some comments might need three or more lines.

Instrucciones sobre los comentarios
La tabla siguiente proporciona directrices generales sobre los tipos de comentarios que pueden preceder
una seccin de cdigo. Se trata nicamente de sugerencias, ya que Visual Basic no tiene reglas obligatorias
para agregar comentarios. Escriba lo que considere ms conveniente, para uso propio o para cualquier otra
persona que lea el cdigo.
Tipo de
comentario
Descripcin del comentario
Finalidad Describe qu hace el procedimiento (no cmo lo hace).
Suposiciones
Enumera cada variable externa, control, archivo abierto u otro elemento al cual el
procedimiento tenga acceso.
Efectos
Enumera cada variable externa, control o archivo que est afectado, y el efecto que
tienen (nicamente si no es evidente).
Entradas Especifica el propsito del argumento.
Valores devueltos Explica los valores que devuelve el procedimiento
Recuerde los siguientes puntos:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 59 | P g i n a

Cada declaracin de variable importante debe incluir un comentario anterior que describa el uso de
la variable que se declara.
Las variables, controles y procedimientos deben tener un nombre lo suficientemente claro para
asegurar que el uso de comentarios slo sea necesario para detalles de implementacin compleja.
Despus de la secuencia de continuacin de lnea no puede escribirse un comentario en la misma
lnea.
Puede agregar o quitar smbolos de comentario de un bloque de cdigo seleccionando una o ms lneas de
cdigo y eligiendo los botones Seleccin con comentarios ( ) y Seleccin sin comentarios ( ) de la
barra de herramientas Edicin.
Nota
Tambin puede agregar comentarios al cdigo poniendo la palabra clave REM antes del texto. Sin embargo,
el smbolo ' y los botones Seleccin con comentarios y Seleccin sin comentarios son ms fciles de utilizar
y requieren menos espacio y memoria.
Intrucciones Option
Option Explicit
Exige la declaracin explcita de todas las variables en un archivo.
Option Explicit { On | Off }

Partes
On Opcional. Habilita la comprobacin Option Explicit. Si no se especifica On u Off, el valor predeterminado
es On.
Off Opcional. Deshabilita la comprobacin Option Explicit.
Comentarios
Si se utiliza, la instruccin Option Explicit tiene que aparecer en un archivo antes que cualquier otra
instruccin de cdigo fuente.
Cuando Option Explicit aparece en un archivo, se deben declarar explcitamente todas las variables
mediante instrucciones Dim o ReDim. Si intenta usar un nombre de variable no declarada, se producir un
error en tiempo de compilacin.
Utilice Option Explicit para evitar escribir incorrectamente el nombre de una variable existente o para evitar
confusiones en el cdigo all donde el mbito de la variable no est claro. Si no utiliza la instruccin Option
Explicit, todas las variables no declaradas son de tipo Object.
Nota:
El valor predeterminado del compilador es Option Explicit On si no especifica Option Explicit en el cdigo.
Tambin puede establecer Option Explicit en el entorno de desarrollo integrado (IDE) de Visual Studio o en
una lnea de comandos.
Nota:
Los cuadros de dilogo y los comandos de men que se ven pueden diferir de los descritos en la Ayuda,
dependiendo de los valores de configuracin o de edicin activos. Para cambiar su configuracin, haga clic
en Importar y exportar configuraciones en el men Herramientas.
Para establecer Option Explicit en el IDE
1. En el men Herramientas, haga clic en Opciones.
2. Abra el nodo Proyectos y soluciones.
3. Elija Valores predeterminados de VB.
4. Modifique el valor de Option Explicit.
Para establecer Option Explicit en la lnea de comandos
Incluya la opcin del compilador /optionexplicit en el comando vbc.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 60 | P g i n a

Ejemplo
En el ejemplo siguiente se utiliza la instruccin Option Explicit para exigir la declaracin explcita de todas las
variables. Si intenta utilizar una variable no declarada, se producir un error en tiempo de compilacin.
' Exige la declaracin explcita de varialbes.
Option Explicit On

Dim thisVar As Integer
thisVar = 10
' La siguiente asignacin produce un ERROR DE COMPILACIN porque
' la variable no ha sido declarada y Option Explicit es On.
thisInt = 10 ' causa un ERROR

Option Strict
Restringe las conversiones de tipos de datos implcitas nicamente a conversiones de ampliacin.
Option Strict { On | Off }
Partes
On Opcional. Habilita la comprobacin Option Strict.
Off Opcional. Deshabilita la comprobacin Option Strict. Si no se especifica On u Off, el valor
predeterminado es Off.
Comentarios
Si se utiliza, la instruccin Option Strict debe aparecer en un archivo antes de cualquier otra instruccin de
cdigo fuente.
Visual Basic permite realizar conversiones de muchos tipos de datos a otros tipos de datos. Sin embargo, se
pueden perder datos cuando el valor de un tipo de datos se convierte en un tipo de datos con menor
precisin o menor capacidad. Se produce un error en tiempo de ejecucin si no se logra la conversin de
restriccin. Option Strict garantiza la notificacin en tiempo de compilacin de estas conversiones de
restriccin para que puedan evitarse.
Nota:
El error de la conversin de restriccin se suprime en las conversiones de los elementos de una coleccin For
EachNext a la variable de control del bucle.
Adems de no permitir las conversiones de restriccin implcitas, Option Strict genera un error para el
enlace en tiempo de ejecucin. Un objeto es de enlace en tiempo de ejecucin cuando se asigna a una
variable que est declarada como del tipo Object.
Puesto que Option Strict On proporciona definicin inflexible de tipos, evita las conversiones de tipos no
deseadas con prdida de datos, deniega el enlace en tiempo de ejecucin y mejora el rendimiento. Es muy
aconsejable usarla.
Nota:
El valor predeterminado del compilador es Option Strict Off si no especifica Option Strict en su cdigo.
Tambin puede establecer Option Strict en el entorno integrado de desarrollo (IDE) de Visual Studio (IDE) o
en una lnea de comandos.
Nota:
Los cuadros de dilogo y los comandos de men que se ven pueden diferir de los descritos en la Ayuda,
dependiendo de los valores de configuracin o de edicin activos. Para cambiar su configuracin, haga clic
en Importar y exportar configuraciones en el men Herramientas.
Para establecer Option Strict en el IDE
1. En el men Herramientas, haga clic en Opciones.
2. Abra el nodo Proyectos y soluciones.
3. Elija Valores predeterminados de VB.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 61 | P g i n a

4. Modifique el ajuste Option Strict.
Para establecer Option Strict en la lnea de comandos
Incluya la opcin del compilador /optionstrict en el comando vbc.
Ejemplo
En el ejemplo siguiente se muestra el modo en que la instruccin Option Strict impide el enlace en tiempo
de ejecucin y las conversiones en las que se perderan datos.
Option Strict On

Dim thisVar As Integer
Dim thisObj As Object = New widget
thisVar = 1000 ' La variable declarada no genera error.
' Intengar convertir Double a Integer genera un ERROR DE COMPILACIN.
thisVar = 1234567890.9876542 ' causa un ERROR
' Llamada de enlace tardo generar un ERROR DE COMPILACIN.
Call thisObj.Method1() ' causa un ERROR

Option Infer
Habilita el uso de la inferencia de tipo de variable local al declarar las variables.
Option Infer { On | Off }
Partes
On Opcional. Habilita la inferencia de tipo de variable local.
Off Opcional. Deshabilita la inferencia de tipo de variable local.
Nota:
Si no se especifica On u Off, el valor predeterminado ser On para los proyectos creados en Visual Basic
2008. El valor predeterminado es Off para los proyectos actualizados de versiones anteriores.
Comentarios
Al establecer Option Infer en On, puede declarar las variables sin especificar explcitamente un tipo de
datos. El compilador deduce el tipo de datos de una variable a partir del tipo de su expresin de
inicializacin. Por ejemplo, si estn desactivadas las instrucciones Option Infer y Option Strict, la variable en
la declaracin Dim someVar = 2 se identifica nicamente como un objeto.
IntelliSense cuando estn desactivadas las instrucciones Option Infer y Option Strict

Al establecer Option Infer en On, el compilador identifica someVar como un valor de tipo Integer.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 62 | P g i n a

IntelliSense cuando est activada la instruccin Option Infer

El compilador puede detectar incoherencias en el uso de la variable en el proyecto que, de lo contrario,
quizs no se reconozcan hasta que se ejecute el proyecto. La identificacin de someVar como un valor de
tipo Integer tambin permite al entorno de desarrollo integrado (IDE) proporcionar compatibilidad total con
IntelliSense.
Nota:
Si no se especifica un valor para Option Infer en el cdigo o el IDE, el valor predeterminado del compilador
es Option Infer On para los proyectos que se acaban de crear. El valor predeterminado es Option Infer Off
para los proyectos actualizados.
Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio que
se tenga y la configuracin que se utilice determinan estos elementos.
Para establecer Option Infer en un archivo
Escriba Option Infer On u Option Infer Off en la parte superior del archivo, antes de cualquier otro
cdigo fuente. Si el valor que se establece para Option Infer en un archivo est en conflicto con el
valor establecido en el IDE o la lnea de comandos, tiene prioridad el valor del archivo.
Para establecer Option Infer en el IDE de un solo proyecto
1. Haga clic en un proyecto en el Explorador de soluciones.
2. Abra el Diseador de proyectos haciendo clic en Pginas de propiedades del men Ver.
3. En el cuadro Option Infer de la ficha Compilacin, haga clic en Activado o Desactivado.
Para establecer el valor predeterminado de Option Infer en el IDE
1. En el men Herramientas, haga clic en Opciones.
2. Expanda el nodo Proyectos y soluciones.
3. Haga clic en Valores predeterminados de VB.
4. En la lista Option Infer, haga clic en Activado o Desactivado.
Nota:
Si establece el valor de Option Infer mediante el men Herramientas, el valor se conservar en los
proyectos subsiguientes a menos que lo cambie.
Para establecer Option Infer en la lnea de comandos
Incluya la opcin del compilador /optioninfer en el comando vbc.
Ejemplo
En los ejemplos siguientes se muestra cmo la instruccin Option Infer habilita la inferencia de tipo de
variable local.

Option Compare
Declara el mtodo de comparacin predeterminado que utilizar al comparar los datos de cadena.
Option Compare { Binary | Text }
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 63 | P g i n a

Partes
Binary Opcional. Se producirn comparaciones de cadenas basadas en un tipo de ordenacin que se deriva
de las representaciones binarias internas de los caracteres.
Text Opcional. Se producirn comparaciones de cadenas basadas en un texto que utiliza un orden que no
distingue entre maysculas y minsculas y que se basa en la configuracin de idioma del sistema.
Comentarios
Si se utiliza, la instruccin Option Compare debe aparecer en un archivo antes de cualquier otra instruccin
de cdigo fuente.
La instruccin Option Compare especifica el mtodo de comparacin de cadenas (Binary o Text) para una
clase, mdulo o estructura. Si no se incluye una instruccin Option Compare, el mtodo predeterminado de
comparacin de texto es Binary.
En Microsoft Windows, el criterio de ordenacin viene determinado por la pgina de cdigos.
En el ejemplo siguiente, los caracteres de la pgina de cdigos (ANSI 1252) de ingls/europeo se ordenan
mediante Option Compare Binary, que genera un criterio de ordenacin binario tpico.
A < B < E < Z < a < b < e < z < < < < < <
Cuando esos mismos caracteres de la misma pgina de cdigos se ordenan con Option Compare Text, se
genera el criterio de ordenacin de texto siguiente.
(A=a) < ( = ) < (B=b) < (E=e) < ( = ) < (Z=z) < ( = )
Tambin puede establecer Option Compare en el entorno integrado de desarrollo (IDE) de Visual Studio
(IDE) o en una lnea de comandos.
Nota:
Los cuadros de dilogo y los comandos de men que se ven pueden diferir de los descritos en la Ayuda,
dependiendo de los valores de configuracin o de edicin activos. Para cambiar su configuracin, haga clic
en Importar y exportar configuraciones en el men Herramientas.
Operadores bsicos
Los operadores de Visual Basic pueden clasificarse segn su funcionalidad segn muestra en la siguiente
tabla:

Operadores Descripcin
Operadores aritmticos
Estos operadores realizan clculos matemticos.
Operador ^: Eleva un nmero a la potencia indicada por otro.
Operador *: Multiplica dos nmeros.
Operador /: Divide dos nmeros y devuelve un resultado de punto flotante.
\ (Operador): Divide dos nmeros y devuelve un resultado de nmero
entero.
Mod (Operador): Divide dos nmeros y devuelve slo el resto.
+ (Operador) (unario y binario): Suma dos nmeros o devuelve el valor
positivo de una expresin numrica. Tambin se puede utilizar para
concatenar dos expresiones de cadena.
- (Operador) (unario y binario): Devuelve la diferencia entre dos
expresiones numricas o el valor negativo de una expresin numrica.
Operadores de asignacin
Estos operadores realizan operaciones de asignacin.
Operador =: Asigna un valor a una variable o propiedad.
Operador ^=: Eleva el valor de una variable o una propiedad a la potencia
de una expresin y asigna el resultado de nuevo a la variable o la
propiedad.
Operador *=: Multiplica el valor de una variable o una propiedad por el
valor de una expresin y asigna el resultado a la variable o la propiedad.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 64 | P g i n a

Operadores Descripcin
Operador /=: Divide el valor de una variable o una propiedad por el valor
de una expresin y asigna el resultado de punto flotante a la variable o la
propiedad.
\= (Operador): Divide el valor de una variable o una propiedad por el valor
de una expresin y asigna el resultado entero a la variable o la propiedad.
Operador +=: Suma el valor de una expresin numrica al valor de una
propiedad o variable numrica y asigna el resultado a la variable o a la
propiedad. Tambin se puede utilizar para concatenar una expresin String
con una propiedad o variable String y asignar el resultado a la variable o a
la propiedad.
Operador -=: Sustrae el valor de una expresin del valor de una variable o
propiedad y asigna el resultado a la variable o propiedad.
Operador <<=: Realiza un desplazamiento aritmtico a la izquierda sobre el
valor de una variable o una propiedad y asigna el nuevo valor a la variable
o la propiedad.
Operador >>=: Realiza un desplazamiento aritmtico a la derecha sobre el
valor de una variable o una propiedad y asigna el nuevo valor a la variable
o la propiedad.
Operador &=: Concatena una expresin String a una variable o propiedad
String y asigna el resultado a la variable o propiedad.
Operadores de comparacin
< (Operador)
<= (Operador)
> (Operador)
>= (Operador)
= (Operador)
<> (Operador)
Is (Operador, Visual Basic): Compara dos variables de referencia de objeto
para ver si hacen referencia al mismo objeto.
IsNot (Operador): Compara dos variables de referencia de objeto, para
determianr si hacen referencia a objeto diferentes. IsNot es el opuesto del
operador Is. La ventaja de IsNot es que puede evitar sintaxis extraa con
Not e Is, que puede ser difcil de leer.
Like (operador, Visual Basic): Compara una cadena respecto a un modelo.
Operadores de concatenacin
Estos operadores combinan cadenas.
Operador &: Genera la concatenacin de cadena de dos expresiones.
Operador +: Se puede utilizar para concatenar dos expresiones de cadena.
Operadores lgicos y operadores bit a
bit
Estos operadores realizan operaciones lgicas.
And (Operador, Visual Basic)
Not (Operador, Visual Basic)
Or (Operador, Visual Basic)
Xor (Operador, Visual Basic): Realiza una exclusin lgica entre dos
expresiones de tipo Boolean o bien una exclusin bit a bit entre dos
expresiones numricas.
AndAlso: Realizan una conjuncin lgica "cortocircuitada" en dos
expresiones.
OrElse: Realiza una disyuncin lgica inclusiva "cortocircuitada" en dos
expresiones.

Se dice que una operacin lgica se encuentra cortocircuitada si el cdigo
compilado puede omitir la evaluacin de una expresin en funcin del resultado de
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 65 | P g i n a

Operadores Descripcin
otra. Si el resultado de la primera expresin evaluada determina el resultado final
de la operacin, no es necesario evaluar la segunda expresin, ya que no cambiar
el resultado final. La evaluacin cortocircuitada puede mejorar el rendimiento si la
expresin omitida es compleja o si implica llamadas de procedimiento.
Operadores varios
Estos operadores realizan operaciones varias.
AddressOf (Operador): Crea una instancia de delegado del procedimiento
que hace referencia al procedimiento especfico.
GetType (Operador): Devuelve un objeto Type para el tipo especificado. El
objeto Type proporciona informacin sobre el tipo como sus propiedades,
mtodos y eventos.
Expresin de funcin: Declara los parmetros y el cdigo que definen una
expresin lambda.
If (operador): Utiliza la evaluacin de cortocircuito para devolver
condicionalmente uno de dos valores. Se puede llamar al operador If con
tres argumentos o con dos argumentos.
TypeOf (Operador, Visual Basic): Compara una variable de referencia a
objeto con un tipo de datos.

Prioridad de Operadores
Cuando aparecen varias operaciones en una expresin, cada parte se evala y se resuelve en un orden
predeterminado conocido como prioridad de operador.
Reglas de prioridad
Cuando las expresiones contienen operadores de ms de una categora, dichos operadores se evalan de
acuerdo con las siguientes reglas:
Los operadores aritmticos y de concatenacin tienen el orden de prioridad que se describe en la
siguiente seccin y tienen prioridad sobre los operadores lgicos, de comparacin y bit a bit.
Todos los operadores de comparacin tienen la misma prioridad; todos ellos tienen mayor
prioridad que los operadores lgicos y los operadores bit a bit, pero menor prioridad que los
operadores de concatenacin y los operadores aritmticos.
Los operadores lgicos y bit a bit tienen el orden de prioridad que se describe en la siguiente
seccin y tienen menor prioridad que los operadores aritmticos, de concatenacin y de
comparacin.
Los operadores con la misma prioridad se evalan de izquierda a derecha en el orden en que
aparecen en la expresin.
Orden de prioridad
Los operadores se evalan en el siguiente orden de prioridad:
Operadores de concatenacin y aritmticos
Exponenciacin (^)
Identidad y negacin unarios (+, )
Multiplicacin y divisin de punto flotante (*, /)
Divisin de nmero entero (\)
Mdulo aritmtico (Mod)
Suma y resta (+, ), concatenacin de cadenas (+)
Concatenacin de cadenas (&)
Desplazamiento de bits aritmtico (<<, >>)
Operadores de comparacin
Todos los operadores de comparacin (=, <>, <, <=, >, >=, Is, IsNot, Like, TypeOf...Is)
Operadores lgicos y bit a bit
Negacin (Not)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 66 | P g i n a

Conjuncin (And, AndAlso)
Disyuncin inclusiva (Or, OrElse)
Disyuncin exclusiva (Xor)
Comentarios
El operador = slo es el operador de comparacin de igualdad, no el operador de asignacin.
El operador de concatenacin de cadenas (&) no es un operador aritmtico, pero en cuanto a prioridad, se
agrupa con los operadores aritmticos.
Los operadores Is e IsNot son los operadores de comparacin de referencia de objeto. No comparan los
valores de dos objetos; slo comprueban y determinan si dos variables de objeto hacen referencia a la
misma instancia del objeto.
Asociatividad
Cuando aparecen operadores de la misma prioridad juntos en una expresin, por ejemplo, multiplicacin y
divisin, el compilador evala cada operacin de izquierda a derecha. Esto se ilustra en el siguiente ejemplo:
Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)
La primera expresin evala la divisin 96 / 8 (que da como resultado 12) y, a continuacin, la divisin 12 / 4
que es igual a tres. Dado que el compilador evala de izquierda a derecha las operaciones para n1, la
evaluacin es igual cuando se indica ese orden explcitamente para n2. Tanto n1 como n2 dan como
resultado tres. En cambio, n3 da como resultado 48, porque los parntesis fuerzan a que el compilador
evale 8 / 4 en primer lugar.
Debido a este comportamiento, se dice que los operadores son asociativos por la izquierda en Visual Basic.
Modificacin de la prioridad y la asociatividad
Puede utilizar parntesis para hacer que determinadas partes de una expresin se evalen antes que otras.
Esto puede reemplazar el orden de prioridad y la asociatividad por la izquierda. Visual Basic siempre lleva a
cabo las operaciones que estn entre parntesis antes que las que estn fuera de los parntesis. Dentro de
los parntesis, sin embargo, mantiene el orden de prioridad y la asociatividad normales, a menos que se
utilicen parntesis dentro del parntesis. Esto se ilustra en el siguiente ejemplo:
Dim a, b, c, d, e, f, g As Double
a = 8.0
b = 3.0
c = 4.0
d = 2.0
e = 1.0
f = a - b + c / d * e
' The preceding line sets f to 7.0. Because of natural operator
' precedence and associativity, it is exactly equivalent to the
' following line.
f = (a - b) + ((c / d) * e)
' The following line overrides the natural operator precedence
' and left associativity.
g = (a - (b + c)) / (d * e)
' The preceding line sets g to 0.5.

Espacios de nombre
Los espacios de nombres organizan los objetos definidos en un ensamblado. Un ensamblado puede
contener varios espacios de nombres; stos, a su vez, pueden contener otros espacios de nombres. Los
espacios de nombres evitan las ambigedades y simplifican las referencias cuando se utilizan grupos grandes
de objetos, como bibliotecas de clases.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 67 | P g i n a

Por ejemplo, .NET Framework define la clase ListBox en el espacio de nombres System.Windows.Forms. El
fragmento de cdigo siguiente muestra cmo se puede declarar una variable utilizando el nombre completo
de esta clase:
Dim LBox As System.Windows.Forms.ListBox


Evitar los conflictos de nombres
Los espacios de nombres de .NET Framework resuelven un problema que a veces se denomina
contaminacin de espacios de nombres y que hace referencia a los obstculos con los que tropieza el
desarrollador de una biblioteca de clases debido al uso de nombres similares en otra biblioteca. Estos
conflictos con componentes existentes a veces se denominan conflictos de nombres.
Por ejemplo, si crea una nueva clase denominada ListBox, podr utilizarla en el propio proyecto sin
necesidad de calificacin. No obstante, si desea usar la clase ListBox de .NET Framework en el mismo
proyecto, deber usar una referencia completa para que sea nica. Si la referencia no es nica, Visual Basic
genera un error que indica que el nombre es ambiguo. En el ejemplo de cdigo siguiente se muestra cmo
declarar objetos de este tipo:
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

Evitar los conflictos de nombres
La siguiente ilustracin muestra dos jerarquas de espacios de nombres; ambas contienen un objeto
denominado ListBox.

De forma predeterminada, todos los archivos ejecutables creados con Visual Basic contienen un espacio de
nombres cuyo nombre es igual que el del proyecto. Por ejemplo, si se define un objeto en un proyecto
denominado ListBoxProject, el archivo ejecutable, ListBoxProject.exe, contendr un espacio de nombres
denominado ListBoxProject.
Varios ensamblados pueden usar el mismo espacio de nombres. Visual Basic los trata como un solo conjunto
de nombres. Por ejemplo, pueden definirse clases para un espacio de nombres denominado
SomeNameSpace en un ensamblado denominado Assemb1, y definirse clases adicionales para el mismo
espacio de nombres desde un ensamblado denominado Assemb2.
Nombres completos
Los nombres completos son referencias de objetos que llevan como prefijo el nombre del espacio de
nombres en el que est definido el objeto. Si se crea una referencia a la clase (por medio del comando
Agregar referencia del men Proyecto) se pueden utilizar objetos definidos en otros proyectos y, despus,
utilizar el nombre completo del objeto en el cdigo. En el fragmento de cdigo siguiente se muestra cmo
utilizar el nombre completo para un objeto del espacio de nombres de otro proyecto:
Dim LBC As New ListBoxProject.Form1.ListBox
Los nombres completos evitan los conflictos de nombres porque permiten al compilador determinar qu
objeto se utiliza. No obstante, los nombres pueden llegar a ser largos y complicados. Para solucionar este
problema, puede utilizar la instruccin Imports para definir un alias, es decir, un nombre abreviado que
sustituya al nombre completo. Por ejemplo, en el cdigo siguiente se crean alias para dos nombres
completos y se utilizan para definir dos objetos.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 68 | P g i n a



Dim LBC As LBControl
Dim MyLB As MyListBox

Si utiliza la instruccin Imports sin un alias, puede utilizar todos los nombres del espacio de nombres sin
calificacin, a condicin de que sean nicos en el proyecto. Si el proyecto contiene instrucciones Imports
para espacios de nombres que contienen elementos con el mismo nombre, deber usar nombres
completos. Supongamos, por ejemplo, que el proyecto contiene estas instrucciones Imports:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Si intenta usar Class1 sin que su nombre sea completo, Visual Basic genera un error para indicar que el
nombre de Class1 es ambiguo.
Instrucciones en el nivel de espacio de nombres

Dentro de un espacio de nombres pueden definirse elementos como los mdulos, interfaces, clases,
delegados, enumeraciones, estructuras y otros espacios de nombres. Los elementos no se pueden definir
como propiedades, procedimientos, variables y eventos en el nivel de espacio de nombres. Estos elementos
se deben declarar dentro de los contenedores como mdulos, estructuras o clases.
Nota: Si ha definido una jerarqua anidada de espacios de nombres, el cdigo de esta jerarqua puede tener
el acceso bloqueado a las clases de otros espacios de nombres con el mismo nombre. Por ejemplo, si define
un espacio de nombres denominado System dentro de un espacio de nombres denominado SpecialSpace,
los miembros del espacio de nombres System de .NET Framework no estarn accesibles a menos que asigne
nombres completos a los miembros utilizando la palabra clave Global.
Espacio de nombre o funcin My
Visual Basic proporciona funciones nuevas para el desarrollo rpido de aplicaciones que mejoran la
productividad y facilidad de uso a la vez que aumentan la funcionalidad. Una de estas funciones,
denominada My, proporciona acceso a la informacin y a las instancias de objeto predeterminadas
relacionadas con la aplicacin y su entorno en tiempo de ejecucin. Esta informacin se organiza en un
formato compatible con IntelliSense y se dispone lgicamente en funcin del uso.
Los miembros de nivel superior de My se exponen como objetos. Cada objeto se comporta de forma similar
a un espacio de nombres o una clase con miembros Shared y expone un conjunto de miembros
relacionados.
En esta tabla se muestran los objetos My de nivel superior y su relacin entre s.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 69 | P g i n a


Realizar tareas con My.Application, My.Computer y My.User
Los tres objetos My centrales que proporcionan acceso a informacin y funcionalidad de uso frecuente son
My.Application (Objeto), My.Computer (Objeto) y My.User (Objeto). Puede utilizar estos objetos para tener
acceso a informacin relacionada con la aplicacin actual, con el equipo donde est instalada la aplicacin o
con el usuario actual de la aplicacin, respectivamente.

' Gets a list of subfolders in a folder
My.Computer.FileSystem.GetDirectories _
(My.Computer.FileSystem.SpecialDirectories.MyDocuments, True, "*Logs*")

Adems de recuperar informacin, los miembros expuestos a travs de estos tres objetos tambin permiten
ejecutar mtodos relacionados con ese objeto. Por ejemplo, puede tener acceso a una variedad de mtodos
para manipular archivos o actualizar el Registro a travs de My.Computer.
La E/S de archivos resulta mucho ms sencilla y rpida con My, que incluye una variedad de mtodos y
propiedades para manipular archivos, directorios y unidades. TextFieldParser (Objeto) permite leer en
archivos estructurados grandes con campos delimitados o de ancho fijo. En este ejemplo se abre
TextFieldParser reader, que se utiliza para leer C:\TestFolder1\test1.txt.

Dim reader As Microsoft.VisualBasic.FileIO.TextFieldParser
reader = My.Computer.FileSystem.OpenTextFieldParser _
("C:\TestFolder1\test1.txt")
reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
reader.Delimiters = New String() {","}
Dim currentRow As String()
While Not reader.EndOfData
Try
currentRow = reader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
MsgBox(currentField)
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 70 | P g i n a

My.Application permite cambiar la referencia cultural de la aplicacin. El ejemplo siguiente muestra cmo
se puede llamar a este mtodo.
' Changes the current culture for the application to Jamaican English.
My.Application.ChangeCulture("en-JM")

Instancias de objeto predeterminadas proporcionadas por My.Forms y My.WebServices
Los objetos My.Forms y My.WebServices proporcionan acceso a formularios, orgenes de datos y servicios
Web XML utilizados por la aplicacin. Para ello, proporcionan colecciones de instancias predeterminadas de
cada uno de estos objetos.

Una instancia predeterminada es una instancia de la clase proporcionada por el tiempo de ejecucin que no
necesita declararse ni crearse como instancia con las instrucciones Dim y New. En el ejemplo siguiente se
muestra cmo se ha podido declarar y crear la instancia de una clase llamada Form Form1, y cmo ahora
puede obtener una instancia predeterminada de esta clase Form mediante My.Forms.

' With My.Forms, you can directly call methods on the default
' instance()
My.Forms.Form1.Show()

El objeto My.Forms devuelve una coleccin de instancias predeterminadas para cada clase Form que existe
en su proyecto. De igual forma, My.WebServices proporciona una instancia predeterminada de la clase de
proxy para cada servicio Web al que ha creado una referencia en su aplicacin.

Desarrollo rpido de aplicaciones con My.Resources y My.Settings
El objeto My.Resources proporciona acceso a los recursos de la aplicacin y permite recuperar
dinmicamente los recursos de su aplicacin.

Recuperar recursos
Diferentes recursos como archivos de sonido, iconos, imgenes y cadenas se pueden recuperar a travs del
objeto My.Resources. Por ejemplo, puede tener acceso a los archivos de recursos especficos de la
referencia cultural de la aplicacin. El siguiente ejemplo establece el icono del formulario en el icono
denominado Form1Icon almacenado en el archivo de recursos de la aplicacin.

Sub SetFormIcon()
Me.Icon = My.Resources.Form1Icon
End Sub

El objeto My.Resources expone slo recursos globales. No proporciona acceso a archivos de recursos
asociados a formularios. Debe tener acceso a los recursos de formulario de los formularios.
De la misma forma, el objeto My.Settings proporciona acceso a la configuracin de la aplicacin y permite
almacenar y recuperar de forma dinmica valores de propiedades y otra informacin relativa a la aplicacin.

Cmo My depende del tipo de proyecto
My slo expone los objetos que requiere un tipo de proyecto determinado. Por ejemplo, el objeto
My.Forms est disponible en una aplicacin de Windows Forms pero no en una aplicacin de consola. En
este tema se describe qu objetos My estn disponibles en diferentes tipos de proyecto.
My en aplicaciones para Windows y sitios Web
My slo expone objetos tiles en el tipo de proyecto actual; suprime los objetos que no son aplicables. Por
ejemplo, la imagen siguiente muestra el modelo de objetos My en un proyecto de formularios Windows
Forms.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 71 | P g i n a


En un proyecto de sitio Web, My expone los objetos que son relevantes para un desarrollador Web (como
los objetos My.Request y My.Response) y suprime los objetos que no lo son (como el objeto My.Forms). La
imagen siguiente muestra el modelo de objetos My en un proyecto de sitio Web:

Detalles del proyecto
La tabla siguiente muestra los objetos My habilitados de forma predeterminada para ocho tipos de
proyecto: aplicacin para Windows, biblioteca de clases, aplicacin de consola, biblioteca de controles de
Windows, biblioteca de controles Web, servicio de Windows, vaco y sitio Web.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 72 | P g i n a

Existen tres versiones del objeto My.Application, dos versiones del objeto My.Computer y dos versiones del
objeto My.User; en las notas al pie incluidas despus de la tabla se incluyen detalles sobre estas versiones.

Existen tres versiones del objeto My.Application, dos versiones del objeto My.Computer y dos versiones del
objeto My.User; en las notas al pie incluidas despus de la tabla se incluyen detalles sobre estas versiones.
Objeto My
Aplicacin
para Windows
Biblioteca
de clases
Aplicacin de
consola
Biblioteca de
controles de
Windows
Biblioteca de
controles Web
Servicio de
Windows
Vaco
Sitio
Web
My.Application S
1
S
2
S
3
S
2
No S
3
No No
My.Computer S
4
S
4
S
4
S
4
S
5
S
4
No S
5

My.Forms S No No S No No No No
My.Log No No No No No No No S
My.Request No No No No No No No S
My.Resources S S S S S S No No
My.Response No No No No No No No S
My.Settings S S S S S S No No
My.User S
6
S
6
S
6
S
6
S
7
S
6
No S
7

My.WebServices S S S S S S No No

1
Versin para formularios Windows Forms de My.Application. Deriva de la versin de consola (vea la nota
3); agrega compatibilidad para interactuar con las ventanas de la aplicacin y proporciona el modelo de
aplicacin de Visual Basic.
2
Versin para bibliotecas de My.Application. Proporciona la funcionalidad bsica que necesita una
aplicacin: proporciona miembros para escribir en el registro de la aplicacin y para tener acceso a
informacin de la aplicacin.
3
Versin para consola de My.Application. Deriva de la versin para bibliotecas (vea la nota 2) y agrega
miembros adicionales para tener acceso a los argumentos de lnea de comandos de la aplicacin y a
informacin de la implementacin ClickOnce.
4
Versin para Windows de My.Computer. Deriva de la versin para servidor (vea la nota 5) y proporciona
acceso u objetos tiles en un equipo cliente, como el teclado, la pantalla y el mouse (ratn).
5
Versin para servidor de My.Computer. Proporciona informacin bsica sobre el equipo, como el nombre,
el acceso al reloj, etc.
6
Versin para Windows de My.User. Este objeto se asocia con la identidad actual del subproceso.
7
Versin para Web de My.User. Este objeto se asocia con la identidad de usuario de la solicitud HTTP actual
de la aplicacin.

Manipulacin de cadenas y nmeros
Clase String
Representa texto como una serie de caracteres Unicode.
Comentarios
Una cadena es una coleccin secuencial de caracteres Unicode que se utiliza para representar texto. Un
objeto String es una coleccin secuencial de objetos System.Char que representan una cadena. El valor del
objeto String es el contenido de la coleccin secuencial y ese valor es inmutable.
Un objeto String se denomina inmutable (de slo lectura) porque no se puede modificar su valor una vez
que se ha creado. Los mtodos que aparentemente modifican un objeto String devuelven en realidad un
nuevo objeto String que contiene la modificacin. Si realmente es necesario modificar el contenido de un
objeto de tipo cadena, hay que utilizar la clase System.Text.StringBuilder.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 73 | P g i n a

Los caracteres Unicode de una cadena se definen mediante un valor escalar Unicode, tambin denominado
punto de cdigo Unicode o valor ordinal (numrico) del carcter Unicode. Los puntos de cdigo se codifican
mediante UTF-16 y los valores numricos de los elementos de la codificacin se representan mediante un
objeto Char.
Normalmente, un nico objeto Char representa un solo punto de cdigo, es decir, el valor numrico de Char
equivale al punto de cdigo. Sin embargo, es posible que un punto de cdigo requiera ms de un elemento
codificado. Por ejemplo, un punto de cdigo adicional de Unicode (un par suplente) se codifica con dos
objetos Char.
ndices
Un ndice es la posicin de un objeto Char en un objeto String, y no un carcter Unicode. Un ndice es un
nmero no negativo de base cero que comienza desde la primera posicin de la cadena, que es la posicin
de ndice cero. Los valores de ndice consecutivos pueden no corresponderse con caracteres Unicode
consecutivos, ya que un carcter Unicode puede estar codificado como ms de un objeto Char. Para trabajar
con cada carcter Unicode en lugar de trabajar con cada objeto Char, se utiliza la clase
System.Globalization.StringInfo.
Operaciones ordinales y operaciones dependientes de la cultura
Los miembros de la clase String realizan una operacin ordinal o lingstica en un objeto String. Una
operacin ordinal acta sobre el valor numrico de cada objeto Char. Una operacin lingstica acta sobre
el valor de String teniendo en cuenta el uso de maysculas y minsculas, ordenacin, formato y reglas de
anlisis especficos de la referencia cultural. Las operaciones lingsticas se ejecutan en el contexto de una
referencia cultural explcitamente declarada o de la referencia cultural implcita actual.
Las reglas de las maysculas y minsculas determinan la forma de cambiar un carcter Unicode de
maysculas a minsculas y viceversa.
Las reglas de formato determinan la forma de convertir un valor en su representacin de cadena, mientras
que las reglas de anlisis determinan la forma de convertir una representacin de cadena en un valor.
Las reglas de ordenacin determinan el orden alfabtico de los caracteres Unicode y la forma de comparar
dos cadenas entre s. Por ejemplo, el mtodo Compare realiza una comparacin lingstica, mientras que el
mtodo CompareOrdinal realiza una comparacin ordinal. Como consecuencia, si la referencia cultural
actual es el ingls de Estados Unidos, el mtodo Compare considera que "a" es menor que "A", mientras que
el mtodo CompareOrdinal considera que "a" es mayor que "A".
.NET Framework admite las reglas de ordenacin de palabras, cadenas y ordinales. Una operacin de
ordenacin de palabras realiza una comparacin de cadenas donde se tiene en cuenta la referencia cultural
y donde ciertos caracteres Unicode no alfanumricos pueden tener asignados pesos especiales. Por ejemplo,
el guin ("-") podra tener asignado un peso muy pequeo, por lo que las cadenas "coop" y "co-op"
apareceran una junto a la otra en una lista ordenada. Una operacin de ordenacin de cadenas es similar a
una operacin de ordenacin de palabras, con la diferencia de que no hay casos especiales y todos los
smbolos no alfanumricos preceden a todos los caracteres Unicode alfanumricos.
Una comparacin dependiente de la cultura es cualquier comparacin que utiliza explcita o implcitamente
un objeto CultureInfo, incluida la referencia cultural de todos los idiomas que especifica la propiedad
CultureInfo.InvariantCulture. La referencia cultural implcita actual viene especificada por la propiedad
Thread.CurrentCulture.
La operacin de ordenacin de ordinales compara las cadenas basndose en el valor numrico de cada
objeto Char de la cadena. La comparacin de ordinales distingue automticamente entre maysculas y
minsculas porque las versiones en minsculas y en maysculas de un carcter tienen distintos puntos de
cdigo. Sin embargo, si en la aplicacin no es importante la distincin entre maysculas y minsculas, se
puede especificar una comparacin de ordinales que omita dicha distincin. Resulta equivalente a pasar la
cadena a maysculas utilizando la referencia cultural de todos los idiomas y realizar despus una
comparacin de ordinales con el resultado.
Una comparacin dependiente de la cultura normalmente es adecuada para ordenar, al contrario de lo que
ocurre con una comparacin de ordinales. Por lo comn, una comparacin de ordinales es adecuada para
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 74 | P g i n a

determinar si dos cadenas son idnticas (esto es, para determinar su igualdad), lo que no sucede con las
comparaciones dependientes de la cultura.
En los Comentarios sobre los mtodos de bsqueda y comparacin se especifica si el mtodo distingue entre
maysculas y minsculas y/o es dependiente de la cultura. Por definicin, en una comparacin todas las
cadenas, incluso la cadena vaca (""), son mayores que una referencia null y dos referencias null son iguales
entre s.
Normalizacin
Algunos caracteres Unicode tienen mltiples representaciones binarias equivalentes que estn formadas por
conjuntos de caracteres Unicode combinables y/o compuestos. El estndar Unicode define un proceso
denominado normalizacin, que devuelve una representacin binaria al proporcionar cualquiera de las
representaciones binarias equivalentes de un carcter. La normalizacin puede realizarse con varios
algoritmos, denominados formas de normalizacin, que cumplen reglas diferentes. .NET Framework admite
actualmente las formas de normalizacin C, D, KC y KD. Un par de cadenas normalizadas se evala
normalmente con una comparacin de ordinales.
Consideraciones de seguridad
Si la aplicacin adopta una decisin de seguridad sobre un identificador simblico, como un nombre de
archivo o una canalizacin con nombre, o sobre los datos conservados, como los basados en texto de un
archivo XML, la operacin debe utilizar una comparacin de ordinales en lugar de una comparacin
dependiente de la cultura. El motivo es que la comparacin dependiente de la cultura puede producir
distintos resultados en funcin de la referencia cultural en vigor, mientras que la comparacin de ordinales
slo depende del valor binario de los caracteres comparados.
Funcionalidad
La clase String proporciona miembros para comparar objetos String, devolver el ndice de un carcter o una
cadena en un objeto String, copiar el valor de un objeto String, dividir una cadena o combinar cadenas,
modificar el valor de una cadena, aplicar formato a los nmeros, las fechas y horas o los valores de
enumeracin en una cadena y normalizar una cadena.
Utilice los mtodos Compare, CompareOrdinal, CompareTo, Equals, EndsWith y StartsWith para
realizar comparaciones.
Utilice los mtodos IndexOf, IndexOfAny, LastIndexOf y LastIndexOfAny para obtener el ndice de
una subcadena o un carcter Unicode en una cadena.
Para copiar una cadena o subcadena a otra cadena o una matriz de Char, utilice los mtodos Copy y
CopyTo.
Para crear una o varias cadenas nuevas a partir de las partes de una cadena original, utilice los
mtodos Substring y Split, y para crear una nueva cadena a partir de una o varias subcadenas,
utilice los mtodos Concat y Join.
Para modificar toda una cadena o parte de ella, se utilizan los mtodos Insert, Replace, Remove,
PadLeft, PadRight, Trim, TrimEnd y TrimStart.
Para cambiar los caracteres Unicode de una cadena de maysculas a minsculas y viceversa, utilice
los mtodos ToLower, ToLowerInvariant, ToUpper y ToUpperInvariant.
Utilice Format para reemplazar uno o varios marcadores de posicin de elementos de formato en
una cadena con la representacin de texto de uno o varios valores numricos, de fecha y hora o de
enumeracin.
Para obtener el nmero de objetos Char de una cadena se utiliza la propiedad Length y para
obtener acceso a los objetos Char reales de una cadena se utiliza la propiedad Chars.
Utilice el mtodo IsNormalized para comprobar si una cadena est normalizada en una forma de
normalizacin determinada. Utilice el mtodo Normalize para crear una cadena normalizada en una
forma de normalizacin determinada.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 75 | P g i n a

Ejemplos de String.Format
La funcin String.Format, toma una cadena de formato y los argumentos, y devuelve una cadena asignando
a cada parmetro el formato correspondiente al tipo de datos, resultado del mtodo estndar ToString o el
formato definido en la cadena de formato. La funcin ToString puede aceptar un parmetro de cadena que
le dice al objeto como darse formato a s mismo.

Ejemplo:
Dim number As Decimal
number = 124.4568
MessageBox.Show(String.Format("{0:##}", number))

En la llamada la cadena de formato se indica despus de la posicin (0). El texto dentro de las llaves es
{ndice_argumento[,alineacin][:cadena_formato]}. Si alineacin es positiva, el texto se
alinea a la derecha rellenando con espacios hasta la longitud indicada, si es negativa se alnea a la izquierda.

Formato de cadneas
No hay mucho formato que pueda ser aplicado a cadenas. Slo el ajuste de espacios y la alineacin. Estas
opciones estn disponibles tambin para cualquier argumento, sin importar el tipo.
Ejmplo Resultado
String.Format("--{0,10}--", "test"); -- test--
String.Format("--{0,-10}--", "test"); --test --

Formato de nmeros
El formato de nmeros es dependiente de la cultura. Por ejemplo, dar formato a una cadena como moneda
para la Nicaragua resultar en C$9.99, en Estados Unidos $9.99 y en Inglaterra 9.99.
Especificador Tipo Formato
Resultado
(double 1.2345)
Resultado
(int-12345)
c Moneda {0:c} 1.23 -12,345.00
d
Decimal
(nmero completo)
{0:d} System.FormatException -12345
e Exponencial/Cientfica {0:e} 1.234500e+000 -1.234500e+004
f Decimales fijos {0:f} 1.23 -12345.00
g General {0:g} 1.2345 -12345
n Nmero {0:n} 1.23 -12,345.00
r Redondeo {0:r} 1.23 System.FormatException
x Hexadecimal {0:x4} System.FormatException ffffcfc7

Formato personalizado de nmeros
Especificador Tipo Formato
Resultado
(double 1234.56)
0 Marcador del cero {0:00.000} 1234.560
# Marcador de dgito {0:#.##} 1234.56
. Marcador de punto decimal {0:0.0} 1234.6
, Separador de miles {0:0,0} 1,235
% Porcentaje {0:0%} 123456%

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 76 | P g i n a

Adems existe el separador de grupos ; que es til para variaciones del formato dependiendo del valor de
los parmetros suministrados. Por ejemplo:
String.Format("{0:#,##0.00;(#,##0.00);Nothing}", numero)

Resultar en "1,240.00" si se pasa 1243.56. Resultar en el mismo formato entre parntesis si el valor es
negativo y devolver la cadena "Nothing" si el nmero es cero.
Formatos de fecha
Los formatos de fecha son muy dependientes de la informacin de cultura suministrada. Los siguientes
ejemplos se presentan con la cultura del Reino Unido (UK).
Especificador Tipo
Resultado
(June 8, 1970 12:30:59)
d Fecha corta 08/06/1970
D Fecha larga 08 June 1970
t Hora corta 12:30
T Hora lcarga 12:30:59
f Fecha y hora completas 08 June 1970 12:30
F Fecha y hora completas (largas) 08 June 1970 12:30:59
g Fecha y hora por defecto 08/06/1970 12:30
G Fecha y hora por defecto (largas) 08/06/1970 12:30:59
M Da Mes 8 June
r Cadena de fecha RFC1123 Mon, 08 Jun 1970 12:30:59 GMT
s Fecha y hora para ordenamiento 1970-06-08T12:30:59
u Hora universal, zona horaria local 1970-06-08 12:30:59Z
Y Mes Ao June 1970

Formato perseonalizado de fechas
Especificador Tipo
Resultado
(Junio 8, 1970 12:30:59)
dd Day 08
ddd Nombre corto del da Lun
dddd Nombre complete del da Lunes
hh Hora de 2 dgitos 12
HH Hora de 2 dgitos (24 horas) 12
mm Minutos de 2 dgitos 30
MM Mes 06
MMM Nombre corto del mes Jun
MMMM Nombre del mes June
ss Segundos 59
tt AM/PM PM
yy Ao a 2 dgitos 70
yyyy Ao a 4 dgitos 1970
: Separador, ej. {0:hh:mm:ss} 12:30:59
/ Separador, ej. {0:dd/MM/yyyy} 08/06/1970

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 77 | P g i n a

Hay otros formatos, incluyendo formatos por zona horaria, pero los anteriores son los formatos ms
comnmente usados.

Informacin de cultura
String.Format tambin brinda un mtodo para aceptar un argumento CultureInfo que implemente la interfaz
IFormatProvider. Esto es importante si trata de escribir cdigo portable y configurable a la localidad, ya que
por ejemplos los nombres de los meses cambiarn de acuerdo a la cultura local de la mquina en la est
ejecutndose. En vez de llamar solamente a String.Format, debera considerar siempre llamar la versin
sobrecargada que acepta la informacin de cultura.

Estructuras de datos
Structure
Una estructura es una generalizacin del tipo definido por el usuario (UDT) admitido por versiones
anteriores de Visual Basic. Adems de campos, las estructuras pueden exponer propiedades, mtodos y
eventos. Una estructura puede implementar una o ms interfaces, y se pueden declarar niveles de acceso
individuales para cada campo.
Para crear una estructura se pueden combinar elementos de datos de distintos tipos. Una estructura asocia
uno o ms elementos entre ellos y con la propia estructura. Al declarar una estructura, sta se convierte en
un tipo de datos compuesto y se pueden declarar variables de este tipo.
Las estructuras son tiles si se desea que una nica variable contenga varios datos relacionados. Por
ejemplo, quizs desee mantener juntos el nombre de un empleado, su extensin telefnica y su salario.
Podra utilizar varias variables para esta informacin, o bien definir una estructura y utilizarla para una nica
variable de empleado. La ventaja de la estructura se hace evidente si tiene muchos empleados y, por
consiguiente, muchas instancias de la variable.

Cmo declarar una estructura
Una declaracin de estructuras empieza con la instruccin Structure (Instruccin) y finaliza con la instruccin
EndStructure. Entre estas dos instrucciones debe declararse por lo menos un elemento. Los elementos
pueden ser de cualquier tipo de datos, pero al menos uno debe ser una variable no compartida o un evento
no compartido y no personalizado.
No puede inicializar ninguno de los elementos de la estructura en la declaracin de la estructura. Al declarar
una variable como un tipo de estructura, le asigna valores a los elementos al obtener acceso a los mismos
mediante la variable.
Para efectos demostrativos, considere una situacin en la que desee mantener el seguimiento del nombre
de un empleado, extensin de telfono y sueldo. Una estructura le permite hacer esto en una variable nica.
Para declarar una estructura
1. Cree las instrucciones de principio y fin para la estructura.
Puede especificar el nivel de acceso de una estructura mediante la palabra clave Public, Protected, Friend o
Private, o puede dejar el valor predeterminado Public.
Private Structure employee
End Structure
2. Agregar elementos al cuerpo de la estructura.
Una estructura debe tener al menos un elemento. Debe declarar cada elemento y especificar un nivel de
acceso para el mismo. Si utiliza la instruccin Instruccin Dim sin palabras clave, la accesibilidad se establece
de forma predeterminada en Public.
Private Structure employee
Public givenName As String
Public familyName As String
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 78 | P g i n a

Public phoneExtension As Long
Private salary As Decimal
Public Sub giveRaise(ByVal raise As Double)
salary *= raise
End Sub
Public Event salaryReviewTime()
End Structure
El campo salary del ejemplo anterior es Private, es decir que es inaccesible fuera de la estructura, incluso
desde la clase contenedora. Sin embargo, el procedimiento giveRaise es Public, as que es posible
llamarlo desde fuera de la estructura. De forma similar, puede provocar el evento salaryReviewTime
desde fuera de la estructura.
Adems de las variables, procedimientos Sub y eventos, tambin puede definir constantes, procedimientos
Function y propiedades en una estructura. Puede designar como mximo una propiedad como propiedad
predeterminada, siempre que admita al menos un argumento. Es posible controlar un evento con un
procedimiento SharedSub.

Variables de estructura
Una vez creada una estructura, se pueden declarar variables de procedimiento y de mdulo como del
mismo tipo. Por ejemplo, puede crear una estructura que registra informacin sobre un sistema del equipo.
En el siguiente ejemplo se muestra cmo.

Public Structure systemInfo
Public cPU As String
Public memory As Long
Public purchaseDate As Date
End Structure
Ahora puede declarar variables de ese tipo: Esto se muestra en la declaracin siguiente:
Dim mySystem, yourSystem As systemInfo

Nota:
En las clases y mdulos, las estructuras declaradas mediante Instruccin Dim se establecen de forma
predeterminada como de acceso pblico. Si desea que una estructura sea privada, asegrese de declararla
utilizando la palabra clave Private .
Acceso a valores de estructura
Para asignar y recuperar valores de los elementos de una variable de estructura, utilice la misma sintaxis que
para establecer y obtener propiedades de un objeto. Coloca al operador de acceso a miembros (.) entre el
nombre de la variable de estructura y el nombre del elemento. El ejemplo siguiente tiene acceso a los
elementos de las variables declaradas previamente como tipo systemInfo.
mySystem.cPU = "486"
Dim tooOld As Boolean
If yourSystem.purchaseDate < #1/1/1992# Then tooOld = True
Asignar variables de estructura

Tambin puede asignar una variable a otra si ambas son del mismo tipo de estructura. Se copian todos los
elementos de una estructura en los elementos correspondientes de la otra. Esto se muestra en la
declaracin siguiente:
yourSystem = mySystem
Si un elemento de una estructura es de tipo referencia, como String, Object o matriz, se copia el puntero a
los datos. Si systemInfo hubiera incluido una variable de objeto, en el ejemplo anterior se habra copiado
el puntero de mySystem a yourSystem y los cambios realizados en los datos del objeto a travs de una
estructura habran surtido efecto al tener acceso a ellos a travs de la otra estructura.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 79 | P g i n a


Estructuras y otros elementos de programacin
Se pueden utilizar estructuras conjuntamente con matrices, objetos y procedimientos, as como unos con
otros. Las interacciones utilizan la misma sintaxis que utilizan estos elementos de forma individual.
Nota:
No puede inicializar ninguno de los elementos de la estructura en la declaracin de la estructura. Slo se
pueden asignar valores a los elementos de una variable que se ha declarado como del tipo estructura.
Estructuras y matrices
Una estructura puede contener una matriz como uno o ms de sus elementos. Esto se ilustra en el siguiente
ejemplo:
Public Structure systemInfo
Public cPU As String
Public memory As Long
Public diskDrives() As String
Public purchaseDate As Date
End Structure

Tiene acceso a los valores de una matriz dentro de una estructura de la misma manera que tiene acceso a
una propiedad en un objeto. Esto se ilustra en el siguiente ejemplo:

Dim mySystem As systemInfo
ReDim mySystem.diskDrives(3)
mySystem.diskDrives(0) = "1.44 MB"

Tambin puede declarar una matriz de estructuras. Esto se ilustra en el siguiente ejemplo:
Dim allSystems(100) As systemInfo

Se siguen las mismas reglas para tener acceso a los componentes de esta arquitectura de datos. Esto se
ilustra en el siguiente ejemplo:
ReDim allSystems(5).diskDrives(3)
allSystems(5).CPU = "386SX"
allSystems(5).diskDrives(2) = "100M SCSI"

Estructuras y objetos
Una estructura puede contener un objeto como uno o ms de sus elementos. Esto se ilustra en el siguiente
ejemplo:
Protected Structure userInput
Public userName As String
Public inputForm As System.Windows.Forms.Form
Public userFileNumber As Integer
End Structure

Se puede utilizar una clase de objeto especfica en este tipo de declaracin, en lugar de Object.

Estructuras y procedimientos
Puede pasar una estructura como un argumento de procedimiento. Esto se ilustra en el siguiente ejemplo:
Public currentCPUName As String = "700MHz Pentium compatible"
Public currentMemorySize As Long = 256
Public Sub fillSystem(ByRef someSystem As systemInfo)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 80 | P g i n a

someSystem.cPU = currentCPUName
someSystem.memory = currentMemorySize
someSystem.purchaseDate = Now
End Sub

El ejemplo anterior pasa la estructura por referencia, lo que permite al procedimiento modificar sus
elementos de tal forma que los cambios se hacen efectivos en el cdigo de llamada. Si desea proteger una
estructura frente a una modificacin de este tipo, psela por valor.
Tambin puede devolver una estructura de un procedimiento Function. Esto se ilustra en el siguiente
ejemplo:
Dim allSystems(100) As systemInfo
Function findByDate(ByVal searchDate As Date) As systemInfo
Dim i As Integer
For i = 1 To 100
If allSystems(i).purchaseDate = searchDate Then Return allSystems(i)
Next i
' Process error: system with desired purchase date not found.
End Function

Estructuras dentro de estructuras
Las estructuras pueden contener otras estructuras. Esto se ilustra en el siguiente ejemplo:
Public Structure driveInfo
Public type As String
Public size As Long
End Structure
Public Structure systemInfo
Public cPU As String
Public memory As Long
Public diskDrives() As driveInfo
Public purchaseDate As Date
End Structure
Dim allSystems(100) As systemInfo
ReDim allSystems(1).diskDrives(3)
allSystems(1).diskDrives(0).type = "Floppy"

Tambin puede utilizar esta tcnica para encapsular una estructura definida en un mdulo dentro de una
estructura definida en un mdulo distinto.
Las estructuras pueden contener otras estructuras hasta cualquier nivel.

Estructuras y clases
Visual Basic unifica la sintaxis para clases y estructuras, y el resultado es que ambas entidades admiten
prcticamente las mismas caractersticas. No obstante, existen tambin importantes diferencias entre clases
y estructuras.
Las clases tienen la ventaja de ser tipos de referencia: pasar una referencia es ms eficiente que pasar una
variable de estructura con todos sus datos. Por otra parte, las estructuras no necesitan asignacin de
memoria en la pila global.
Puesto que no es posible heredar de una estructura, las estructuras slo deben utilizarse para objetos que
no necesiten extenderse. Utilice estructuras cuando el objeto que desee crear tenga un tamao de instancia
pequeo; tenga en cuenta las caractersticas de rendimiento de las clases frente a las estructuras.
Similitudes
Las estructuras y las clases son similares en los siguientes aspectos:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 81 | P g i n a

Ambas son tipos container, lo que significa que contienen otros tipos como miembros.
Ambas tienen miembros, que pueden incluir constructores, mtodos, propiedades, campos,
constantes, enumeraciones, eventos y controladores de eventos. Sin embargo, no confunda estos
miembros con los elementos declarados de una estructura.
Los miembros de ambas pueden tener niveles de acceso individualizados. Por ejemplo, un miembro
puede declararse como Public y otro como Private.
Ambas pueden implementar interfaces.
Ambas pueden tener constructores compartidos, con o sin parmetros.
Ambas pueden exponer una propiedad predeterminada, siempre que esa propiedad acepte al
menos un parmetro.
Ambas pueden iniciar eventos y ambas pueden declarar delegados.
Diferencias
Las estructuras y las clases difieren en los siguientes aspectos:
Las estructuras son tipos de valor, las clases son tipos de referencia. Una variable de un tipo de
estructura contiene los datos de la estructura, en lugar de contener una referencia a los datos,
como sucede con los tipos de clase.
Las estructuras utilizan asignacin de pila y las clases utilizan asignacin del montn.
De forma predeterminada, todos los elementos de estructura son Public; las variables y constantes
de clase son Private, mientras que otros miembros de clase son Public de forma predeterminada.
Este comportamiento de los miembros de las clases proporcionan compatibilidad con el sistema de
valores predeterminados de Visual Basic 6.0.
Una estructura debe tener al menos una variable no compartida o un elemento de evento no
compartido y no personalizado; una clase puede estar completamente vaca.
Los elementos de estructura no se pueden declarar como Protected, mientras que los miembros de
clase s se pueden.
Un procedimiento de estructura slo puede controlar eventos si es un procedimiento Shared Sub y
slo mediante AddHandler (Instruccin); cualquier procedimiento de clase puede controlar
eventos, ya sea utilizando la palabra clave Handles o la instruccin AddHandler.
Las declaraciones de variables de estructura no pueden especificar inicializadores o tamaos
iniciales para matrices; mientras que las declaraciones de variables de clase s pueden.
Las estructuras heredan de forma implcita de la clase System..::.ValueType y no pueden heredar de
ningn otro tipo de clase. Las clases pueden heredar de cualquier clase o clases que no sean del
tipo System..::.ValueType.
Las estructuras no son heredables; las clases, s.
Las estructuras no se terminan nunca, por lo tanto, Common Language Runtime (CLR) nunca llama
al mtodo Finalize en una estructura; las clases las termina el recolector de elementos no utilizados,
que llama al mtodo Finalize en una clase cuando detecta que no quedan referencias activas.
Una estructura no requiere un constructor, una clase s.
Las estructuras slo pueden tener constructores no compartidos si pueden tomar parmetros; sin
embargo las clases pueden tener constructores con o sin parmetros.
Cada estructura tiene un constructor pblico implcito sin parmetros. El constructor inicializa todos los
elementos de datos de estructura con sus valores predeterminados. Este comportamiento no puede
redefinirse.
Instancias y variables
Puesto que las estructuras son tipos de valor, cada variable de estructura est enlazada de forma
permanente a una instancia de estructura individual. Por otro lado, las clases son tipos de referencia y una
variable de objeto puede hacer referencia a varias instancias de clase en distintos momentos. Esta distincin
afecta al uso de estructuras y clases de las siguientes formas:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 82 | P g i n a

Inicializacin. Una variable de estructura incluye implcitamente una inicializacin de los elementos
mediante el constructor sin parmetros de la estructura. Por tanto, Dim s As struct1 equivale a Dim
s As struct1 = New struct1().
Asignar variables. Al asignar una variable de estructura a otra o pasar una instancia de estructura a
un argumento de procedimiento, se copian los valores actuales de todos los elementos de variable
en la nueva estructura. Al asignar una variable de objeto a otra o pasar una variable de objeto a un
procedimiento, slo se copia el puntero de referencia.
No asignar nada. Puede asignar el valor Nothing a una variable de estructura, aunque la instancia
sigue asociada con la variable. Puede seguir llamando a los mtodos y obteniendo acceso a sus
elementos de datos, aunque la asignacin inicializa de nuevo los elementos de variable.
En contraposicin, si establece una variable de objeto en Nothing, elimina su asociacin con cualquier
instancia de clase y no puede tener acceso a ningn miembro a travs de la variable hasta que le asigne otra
instancia.
Varias instancias. Una variable de objeto puede tener asignadas distintas instancias de clase en
momentos distintos y varias variables de objeto pueden hacer referencia a la misma instancia de
clase al mismo tiempo. Los cambios que realice a los valores de los miembros de clase afectan a
dichos miembros cuando se tiene acceso a estos mediante otra variable que apunta a la misma
instancia.
Los elementos de estructura, sin embargo, estn aislados dentro de su propia instancia. Los cambios a sus
valores no se ven reflejados en ninguna otra variable de estructura, incluso en otras instancias de la misma
declaracin Structure.
Igualdad. La comprobacin de igualdad de dos estructuras debe realizarse mediante una prueba
elemento a elemento. Dos variables de objeto se pueden comparar utilizando el mtodo Equals.
Equals indica si las dos variables sealan a la misma instancia.

Estructuras de decisin
Operadores de comparacin y lgicos

Operadores de comparacin
A continuacin se recogen los operadores de comparacin definidos en Visual Basic .NET.
< (Operador)
<= (Operador)
> (Operador)
>= (Operador)
= (Operador)
<> (Operador)

La siguiente tabla contiene una lista con los operadores de comparacin relacionales y las condiciones que
determinan si result es True o False.
Operador True si False si
< (Menor que) expression1 < expression2 expression1 >= expression2
<= (Menor o igual que) expression1 <= expression2 expression1 > expression2
> (Mayor que) expression1 > expression2 expression1 <= expression2
>= (Mayor o igual que) expression1 >= expression2 expression1 < expression2
= (Igual a) expression1 = expression2 expression1 <> expression2
<> (Distinto de) expression1 <> expression2 expression1 = expression2
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 83 | P g i n a

Comparar nmeros
Cuando una expresin de tipo Single se compara con otra de tipo Double, la expresin Single se convierte a
Double. Este comportamiento es contrario al que se daba en Visual Basic 6.
De igual forma, cuando una expresin de tipo Decimal se compara con otra de tipo Single o Double, la
expresin Decimal se convierte a Single o Double. En las expresiones Decimal, cualquier valor fraccionario
menor que 1E-28 podra perderse. Esta prdida de valor fraccionario puede provocar que dos valores se
consideren equivalentes sin serlo. Por esta razn, debern extremarse las precauciones cuando se utilice el
signo de igualdad (=) para comparar dos variables de punto flotante. Es ms seguro comprobar si el valor
absoluto de la diferencia entre dos nmeros es inferior al mnimo aceptable.
Imprecisin de punto flotante
Cuando trabaje con nmeros en punto flotante, tenga presente que no siempre tienen una representacin
precisa en memoria. Esto podra producir que ciertas operaciones arrojaran resultados inesperados, como
una comparacin de valores y el operador Mod (Operador, Visual Basic).
Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalan en funcin del criterio de ordenacin
alfabtica, que depende del valor de Option Compare.
Option Compare Binary efecta comparaciones de cadenas en funcin de un criterio de ordenacin que se
deriva de las representaciones binarias internas de los caracteres. El criterio de ordenacin viene
determinado por la pgina de cdigos. En el ejemplo siguiente se muestra un criterio de ordenacin binario
tpico.
A < B < E < Z < a < b < e < z < < < < < <
Option Compare Text efecta comparaciones de cadenas en funcin de un criterio de ordenacin textual
que no distingue entre maysculas y minsculas y que viene determinado por la configuracin regional del
sistema. Al establecer Option Compare Text y ordenar los caracteres en el ejemplo anterior, se aplica el
criterio de ordenacin de texto siguiente:
(A=a) < (= ) < (B=b) < (E=e) < (= ) < ( = ) < (Z=z)
Dependencia de la configuracin regional
Cuando establece Option Compare Text, el resultado de una comparacin de cadenas puede depender de la
configuracin regional en la que se ejecuta la aplicacin. Dos caracteres podran compararse como iguales
en una configuracin local, pero no en otra. Si est utilizando una comparacin de cadenas para tomar
decisiones importantes, por ejemplo aceptar un intento de inicio de sesin, debera estar atento a la
sensibilidad de la configuracin regional. Considere la posibilidad de definir Option Compare Binary o llamar
a StrComp (Funcin, Visual Basic), que tiene en cuenta la configuracin regional.
Programacin sin tipos con operadores de comparacin relacionales
No se permite utilizar operadores de comparacin relacionales con expresiones Object bajo Option Strict
On. Cuando Option Strict es Off, y expression1 o expression2 es una expresin Object, los tipos en tiempo de
ejecucin determinan cmo se comparan. En la siguiente tabla se muestra cmo se comparan las
expresiones y el resultado que devuelve tal comparacin en funcin del tiempo de ejecucin de los
operandos:

Si los operandos son... La comparacin es...
Ambos String
Ordenar la comparacin segn las caractersticas de ordenacin de las
cadenas.
Ambos numricos Objetos convertidos a Double, comparacin numrica.
Uno numrico y el otro String
String se convertir en Double y se realizar una comparacin numrica. Si
String no puede convertirse a Double, se producir una excepcin
InvalidCastException.
Uno o ambos pertenecen a
tipos de referencia distintos de
String
Se produce una excepcin InvalidCastException.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 84 | P g i n a

Las comparaciones numricas tratan Nothing como 0. Las comparaciones de cadena tratan Nothing como ""
(una cadena vaca).
Sobrecarga
Los operadores de comparacin relacionales (<. <=, >, >=, =, <>) se pueden sobrecargar, lo que significa que
una clase o estructura puede definir de nuevo su comportamiento cuando un operando pertenece al tipo de
esa clase o estructura. Si el cdigo utiliza alguno de estos operadores en una clase o estructura de este tipo,
asegrese de conocer su comportamiento redefinido.
Observe que = (Operador, Visual Basic) slo se puede sobrecargar como operador de comparacin
relacional, y no como operador de asignacin.

Ejemplo
En este ejemplo se muestran varios usos distintos de los operadores de comparacin, que se utilizan para
comparar expresiones. Los operadores de comparacin relacionales devuelven un resultado de tipo Boolean
para indicar si la expresin se evala o no como True. Cuando los operadores > y < se apliquen a cadenas, la
comparacin se llevar a cabo utilizando el orden alfabtico normal de las cadenas. Este orden puede
depender de la configuracin regional. Que el orden discrimine o no entre maysculas y minsculas
depender de la configuracin de Option Compare .

Dim testResult As Boolean
testResult = 45 < 35
testResult = 45 = 45
testResult = 4 <> 3
testResult = "5" > "4444"


En el ejemplo anterior, la primera comparacin devuelve False y las comparaciones restantes devuelven
True.

Is (Operador, Visual Basic)
El operador Is determina si dos referencias de objeto hacen referencia al mismo objeto. Sin embargo, no
establece comparaciones entre valores. Si object1 y object2 hacen referencia la misma instancia de objeto
exacta, result da como resultado True; si no es as, result da como resultado False.
Is tambin se puede utilizar con la palabra clave TypeOf para crear una expresin TypeOf...Is, que
comprueba si una variable de objeto es compatible con un tipo de datos.
Ejemplo
El ejemplo siguiente utiliza el operador Is para comparar pares de referencias a objeto. El resultado se asigna
a un valor de tipo Boolean que indica si ambos objetos son idnticos.
Dim myObject As New Object
Dim otherObject As New Object
Dim yourObject, thisObject, thatObject As Object
Dim myCheck As Boolean
yourObject = myObject
thisObject = myObject
thatObject = otherObject
' The following statement sets myCheck to True.
myCheck = yourObject Is thisObject
' The following statement sets myCheck to False.
myCheck = thatObject Is thisObject
' The following statement sets myCheck to False.
myCheck = myObject Is thatObject
thatObject = myObject
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 85 | P g i n a

' The following statement sets myCheck to True.
myCheck = thisObject Is thatObject

Como muestra el ejemplo anterior, puede utilizar el operador Is para comprobar objetos enlazados en
tiempo de compilacin y en tiempo de ejecucin.

IsNot (Operador)
El operador IsNot determina si dos referencias a objeto hacen referencia a objetos diferentes. Sin embargo,
no establece comparaciones entre valores. Si object1 y object2 hacen referencia la misma instancia de
objeto exacta, result da como resultado False; si no es as, result da como resultado True.
IsNot es el opuesto del operador Is. La ventaja de IsNot es que puede evitar sintaxis extraa con Not e Is,
que puede ser difcil de leer.
Puede utilizar los operadores Is e IsNot para probar objetos enlazados en tiempo de compilacin y en
tiempo de ejecucin.

Ejemplo
El ejemplo de cdigo siguiente utiliza los operadores Is e IsNot para lograr la misma comparacin.

Dim o1, o2 As New Object
If Not o1 Is o2 Then MsgBox("o1 and o2 do not refer to the same
instance.")
If o1 IsNot o2 Then MsgBox("o1 and o2 do not refer to the same
instance.")

Like (operador, Visual Basic)
Compara una cadena respecto a un modelo. Si el valor de string coincide con el modelo contenido en
pattern, result es True. Si la cadena no coincide con el modelo, result es False. Si tanto string como pattern
son cadenas vacas, el resultado es True.
Mtodo de comparacin
El comportamiento del operador Like depende de Option Compare (Instruccin). El mtodo de comparacin
de cadenas predeterminado para cada archivo de cdigo fuente es Option Compare Binary.
Opciones de modelo
El modelo de coincidencias integrado es una flexible herramienta para establecer comparaciones entre
cadenas. Las caractersticas de coincidencia de modelos permiten comparar cada carcter de string con un
carcter concreto, un carcter comodn, una lista de caracteres o un intervalo de caracteres. En la siguiente
tabla se muestran los caracteres permitidos en pattern y aquellos caracteres con los que coinciden.
Caracteres de pattern Coincidencias en string
? Cualquier carcter individual
* Cero o ms caracteres
# Cualquier dgito individual (0-9)
[charlist] Cualquier carcter individual de charlist
[!charlist] Cualquier carcter individual que no est incluido en charlist
Listas de caracteres
Se puede utilizar un grupo de uno o varios caracteres (charlist) entre corchetes ([ ]) para hacer coincidir
cualquier carcter individual de string; este grupo podr incluir prcticamente cualquier cdigo de
caracteres, dgitos incluidos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 86 | P g i n a

Un signo de exclamacin de cierre (!) situado al principio de charlist significa que se encontrar una
coincidencia si string contiene cualquier carcter no incluido en charlist. Cuando se use sin corchetes, el
signo de cerrar exclamacin coincidir consigo mismo.
Caracteres especiales
Si desea buscar caracteres especiales: corchete de apertura ([), interrogacin de cierre (?) signo de nmero
(#) y asterisco (*), escrbalos entre corchetes. No se puede usar el corchete de cierre (]) dentro de un grupo
para identificar una autocoincidencia, pero s fuera de un grupo, como carcter individual.
La secuencia [] se considera una cadena de longitud cero (""). Sin embargo, no puede formar parte de una
lista de caracteres encerrada entre corchetes. Si desea comprobar si una posicin en string contiene un
carcter de un grupo de caracteres o no contiene ninguno, puede utilizar Like dos veces.
Intervalos de caracteres
Si utiliza un guin () para separar los lmites superior e inferior del intervalo, charlist puede especificar un
intervalo de caracteres. Por ejemplo, [AZ] arroja una coincidencia si la posicin de caracteres
correspondiente en string contiene cualquier carcter comprendido en el intervalo AZ, y [!HL] arroja una
coincidencia si la posicin de caracteres correspondiente contiene cualquier carcter que no est
comprendido en el intervalo HL.
Cuando se especifique un intervalo de caracteres, stos debern aparecer en orden ascendente, es decir, de
menor a mayor. Eso significa que [AZ] es un modelo vlido, pero [ZA] no.
Varios intervalos de caracteres
Para especificar varios intervalos en la misma posicin de caracteres, sitelos entre los mismos corchetes sin
delimitadores. Por ejemplo, [ACXZ] arroja una coincidencia si la posicin de caracteres correspondiente en
string contiene cualquier carcter comprendido en el intervalo AC o en el intervalo XZ.
Uso del guin
Un guin () puede aparecer tanto al principio (despus de un signo de exclamacin, si lo hay) como al final
de charlist para identificar una autocoincidencia. En cualquier otra posicin, el guin identifica un intervalo
de caracteres delimitado por los caracteres a ambos lados de l.
Secuencia de ordenacin
El significado de un intervalo especfico depender del orden de los caracteres en tiempo de ejecucin
(segn venga determinado por OptionCompare y la configuracin regional del sistema en que se est
ejecutando el cdigo). Con OptionCompareBinary, el intervalo [AE] coincide con A, B, C, D y E. Con
OptionCompareText, [AE] coincide con A, a, , , B, b, C, c, D, d, E y e. El intervalo no coincide con o
porque los caracteres acentuados se intercalan despus de los caracteres sin acento en el criterio de
ordenacin.
Caracteres dgrafos
En algunos idiomas, existen caracteres alfabticos que representan dos fonemas distintos. Por ejemplo,
existen algunos idiomas que utilizan el carcter para representar los sonidos a y e cuando aparecen
juntos. El operador Like reconoce que el carcter dgrafo unitario y los dos caracteres individuales son
equivalentes.
Cuando en la configuracin regional del sistema se especifica un idioma que utiliza un carcter dgrafo, la
aparicin de un carcter dgrafo unitario, ya sea en pattern o en string, coincidir con la secuencia de dos
caracteres de la otra cadena. Del mismo modo, un carcter dgrafo que aparezca en pattern entre corchetes
(aislado, en una lista o en un intervalo) coincidir con la secuencia de dos caracteres equivalente en string.

Ejemplo
En este ejemplo se utiliza el operador Like para comparar cadenas en varios modelos. Los resultados se
introducen en una variable de tipo Boolean que indica si cada cadena satisface el modelo.
Dim testCheck As Boolean
' The following statement returns True (does "F" satisfy "F"?)
testCheck = "F" Like "F"
' The following statement returns False for Option Compare Binary
' and True for Option Compare Text (does "F" satisfy "f"?)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 87 | P g i n a

testCheck = "F" Like "f"
' The following statement returns False (does "F" satisfy "FFF"?)
testCheck = "F" Like "FFF"
' The following statement returns True (does "aBBBa" have an "a" at the
' beginning, an "a" at the end, and any number of characters in
' between?)
testCheck = "aBBBa" Like "a*a"
' The following statement returns True (does "F" occur in the set of
' characters from "A" through "Z"?)
testCheck = "F" Like "[A-Z]"
' The following statement returns False (does "F" NOT occur in the
' set of characters from "A" through "Z"?)
testCheck = "F" Like "[!A-Z]"
' The following statement returns True (does "a2a" begin and end with
' an "a" and have any single-digit number in between?)
testCheck = "a2a" Like "a#a"
' The following statement returns True (does "aM5b" begin with an "a",
' followed by any character from the set "L" through "P", followed
' by any single-digit number, and end with any character NOT in
' the character set "c" through "e"?)
testCheck = "aM5b" Like "a[L-P]#[!c-e]"
' The following statement returns True (does "BAT123khg" begin with a
' "B", followed by any single character, followed by a "T", and end
' with zero or more characters of any type?)
testCheck = "BAT123khg" Like "B?T*"
' The following statement returns False (does "CAT123khg"?) begin with
' a "B", followed by any single character, followed by a "T", and
' end with zero or more characters of any type?)
testCheck = "CAT123khg" Like "B?T*"

Operadores lgicos
A continuacin se recogen los operadores lgicos definidos en Visual Basic.
And (Operador, Visual Basic)
Para la comparacin booleana, result es True si y slo si expression1 y expression2 se evalan como True. La
tabla siguiente ilustra cmo se determina el argumento result.
Si expression1 es: Y expression2 es El valor de result es
True True True
True False False
False True False
False False False

Not (Operador, Visual Basic)
En la siguiente tabla se muestra cmo se determina result cuando las expresiones son de tipo Boolean:
Si expression es: El valor de result es:
True False
False True

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 88 | P g i n a

Or (Operador, Visual Basic)
Para la comparacin Boolean, result es False si y slo si expression1 y expression2 se evalan como False. La
tabla siguiente ilustra cmo se determina el argumento result.
Si expression1 es: Y expression2 es El valor de result es
True True True
True False True
False True True
False False False

Xor (Operador, Visual Basic)
En la comparacin booleana, result es True si y slo si uno de los argumentos expression1 y expression2 se
evala exactamente en True. Es decir, si y slo si expression1 y expression2 se evalan en valores Boolean
opuestos. La tabla siguiente ilustra cmo se determina el argumento result.
Si expression1 es: Y expression2 es El valor de result es
True True False
True False True
False True True
False False False

AndAlso (Operador)
Realiza una conjuncin lgica "cortocircuitada" en dos expresiones. Se dice que una operacin lgica se
encuentra cortocircuitada si el cdigo compilado puede omitir la evaluacin de una expresin en funcin del
resultado de otra. Si el resultado de la primera expresin evaluada determina el resultado final de la
operacin, no es necesario evaluar la segunda expresin, ya que no cambiar el resultado final. La
evaluacin cortocircuitada puede mejorar el rendimiento si la expresin omitida es compleja o si implica
llamadas de procedimiento.
Si ambas expresiones se evalan como True, result es True. En la tabla siguiente se ilustra cmo se
determina el argumento result.
Si expression1 es: Y expression2 es El valor de result es:
True True True
True False False
False (no se evala) False
Una utilidad del operador AndAlso es probar la existencia de una instancia de objeto antes de intentar tener
acceso a uno de sus miembros. En la siguiente lnea se muestra cmo hacerlo:
If newObject AndAlso newObject.initFinished Then
El acceso a la propiedad initFinished en la lnea de cdigo anterior podra producir una excepcin
NullReferenceException si la variable newObject no tiene una instancia de objeto asignada. Sin embargo, el
operador AndAlso hace que el compilador omita el acceso a initFinished si newObject es Nothing, porque
Nothing se evala como False.
Tipos de datos
El operador AndAlso slo se define para Boolean (Tipo de datos, Visual Basic). Visual Basic convierte cada
operando segn sea necesario a Boolean y lleva a cabo toda la operacin en Boolean. Si asigna el resultado a
un tipo numrico, Visual Basic lo convierte de Boolean a ese tipo. Esto podra generar un comportamiento
inesperado. Por ejemplo, 5 AndAlso 12 da como resultado 1 cuando se convierte a Integer.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 89 | P g i n a

Ejemplo
En el ejemplo siguiente se utiliza el operador AndAlso para realizar la conjuncin lgica de dos expresiones.
El resultado ser un valor de tipo Boolean que indicar si la expresin conjunta es en su totalidad verdadera
(True). Si la primera expresin es False, no se evaluar la segunda.
Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b AndAlso b > c
secondCheck = b > a AndAlso b > c
thirdCheck = a > b AndAlso c > b

En el ejemplo anterior se generan los resultados de True, False y False, respectivamente. En el clculo de
secondCheck, no se evala la segunda expresin porque la primera ya es False. Sin embargo, la segunda
expresin se evala en el clculo de thirdCheck.

En el ejemplo siguiente se muestra un procedimiento Function que busca un valor determinado entre los
elementos de una matriz. Si la matriz est vaca o si se sobrepasa su longitud, la instruccin While no
comprueba el elemento de la matriz con el valor de bsqueda.
Public Function findValue(ByVal arr() As Double, _
ByVal searchValue As Double) As Double
Dim i As Integer = 0
While i <= UBound(arr) AndAlso arr(i) <> searchValue
' If i is greater than UBound(arr), searchValue is not checked.
i += 1
End While
If i > UBound(arr) Then i = -1
Return i
End Function

OrElse (Operador)
Realiza una disyuncin lgica inclusiva "cortocircuitada" en dos expresiones. Se dice que una operacin
lgica se encuentra cortocircuitada si el cdigo compilado puede omitir la evaluacin de una expresin en
funcin del resultado de otra. Si el resultado de la primera expresin evaluada determina el resultado final
de la operacin, no es necesario evaluar la segunda expresin, ya que no cambiar el resultado final. La
evaluacin cortocircuitada puede mejorar el rendimiento si la expresin omitida es compleja o si implica
llamadas de procedimiento.
Si una o ambas expresiones se evalan como True, result es True. La tabla siguiente ilustra cmo se
determina el argumento result.
Si expression1 es: Y expression2 es El valor de result es
True (no se evala) True
False True True
False False False
Tipos de datos
El operador OrElse slo se define para Boolean (Tipo de datos, Visual Basic). Visual Basic convierte cada
operando tal como sea necesario en Boolean y realiza toda la operacin en Boolean. Si asigna el resultado a
un tipo numrico, Visual Basic lo convierte de Boolean a ese tipo. Esto podra generar un comportamiento
inesperado. Por ejemplo, 5 OrElse 12 tiene como resultado 1 cuando se convierte en Integer.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 90 | P g i n a

Ejemplo
En el ejemplo siguiente se usa el operador OrElse para realizar una disyuncin lgica entre dos expresiones.
El resultado ser un valor de tipo Boolean que indicar si alguna de las dos expresiones es verdadera (True).
Si la primera expresin es True, la segunda no ser evaluada.
Dim a As Integer = 10
Dim b As Integer = 8
Dim c As Integer = 6
Dim firstCheck, secondCheck, thirdCheck As Boolean
firstCheck = a > b OrElse b > c
secondCheck = b > a OrElse b > c
thirdCheck = b > a OrElse c > b


El ejemplo anterior genera unos resultados de True, True y False, respectivamente. En el clculo de
firstCheck, no se evala la segunda expresin porque la primera ya es True. Sin embargo, la segunda
expresin se evala en el clculo de secondCheck.
En el ejemplo siguiente se muestra la instruccin If...Then que contiene dos llamadas a procedimientos. Si la
primera llamada devuelve True, no se llama al segundo procedimiento. Esto puede generar resultados
inesperados si el segundo procedimiento realiza tareas importantes que se deben realizar siempre que se
ejecute esta seccin del cdigo.
If testFunction(5) = True OrElse otherFunction(4) = True Then
' If testFunction(5) is True, otherFunction(4) is not called.
' Insert code to be executed.
End If

Estructuras de decisin
Visual Basic permite probar condiciones y realizar diferentes operaciones en funcin de los resultados de la
prueba. Puede comprobar si una condicin es verdadera o falsa, los distintos valores de una expresin o las
diferentes excepciones que se generan al ejecutar una serie de instrucciones.
En el siguiente ejemplo se muestra una estructura de decisin que prueba si el valor de una condicin es
true y emprende distintas acciones en funcin del resultado.
Emprender acciones diferentes cuando el valor de una condicin es true y cuando es false

Construccin If...Then...Else
Las construcciones If...Then...Else permiten probar una o ms condiciones y ejecutar una o ms
instrucciones en funcin de cada condicin. Puede probar las condiciones y tomar medidas de las maneras
siguientes:
Ejecutar una o ms instrucciones si una condicin es True.
Ejecutar una o ms instrucciones si una condicin es False.
Ejecutar algunas instrucciones si una condicin es True y otras si es False.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 91 | P g i n a

Probar una condicin adicional si una condicin anterior es False.
La estructura de control que proporciona todas estas posibilidades es Instruccin If...Then...Else (Visual
Basic). Puede utilizar una versin de una lnea si tiene simplemente una comprobacin y una instruccin
para ejecutar. Si tiene un conjunto ms complejo de condiciones y acciones, puede utilizar la versin de
varias lneas.
Construccin Select...Case
La construccin Select...Case permite evaluar una expresin una vez y ejecutar distintos conjuntos de
instrucciones basados en diferentes valores posibles.

Construccin Try...Catch...Finally
Las construcciones Try...Catch...Finally permiten ejecutar un conjunto de instrucciones en un entorno que
conserva el control si una de las instrucciones provoca una excepcin. Puede tomar distintas medidas para
excepciones diferentes. Opcionalmente, puede especificar un bloque de cdigo que se ejecuta antes de salir
de la construccin Try...Catch...Finally completa, sin tener en cuenta el resultado.

Cmo: Ejecutar instrucciones en funcin de una o varias condiciones
Puede utilizar Instruccin If...Then...Else para ejecutar una instruccin especfica o un bloque de
instrucciones dependiendo del valor Boolean (Tipo de datos, Visual Basic) de una condicin. Generalmente,
la condicin es el resultado de comparar dos valores, pero tambin puede ser cualquier expresin que da
como resultado un valor Boolean (True o False). Esto incluye los valores de otros tipos de datos, como los
numricos, que han sido convertidos a valores de tipo Boolean.
Para ejecutar una o ms instrucciones si una condicin es verdadera
Si tiene slo una instruccin para ejecutar, utilice la sintaxis de lnea nica de la construccin
If...Then...Else. No necesita las instrucciones Else o End If Esto se ilustra en el siguiente ejemplo:
Sub fixDate()
Dim myDate As Date = #2/13/1973#
If myDate < Now Then myDate = Now
End Sub
o bien
Para ejecutar ms de una lnea de cdigo cuando la condicin es True, se utiliza la sintaxis
de varias lneas, que incluye la instruccin End If. Si no tiene ningn cdigo para ejecutar
cuando la condicin es False, omita la instruccin Else. Esto se ilustra en el siguiente
ejemplo:
Dim alertLabel As New System.Windows.Forms.Label
Sub alertUser(ByVal value As Long)
If value = 0 Then
alertLabel.ForeColor = System.Drawing.Color.Red
alertLabel.Font = New Font(alertLabel.Font, _
FontStyle.Bold Or FontStyle.Italic)
End If
End Sub


Para ejecutar algunas instrucciones si una condicin es verdadera y otras si es falsa
Utilice la construccin If...Then...Else con la instruccin Else para definir dos bloques de
instrucciones. Visual Basic ejecuta un bloque si la condicin es True y el otro si es False. Esto se
ilustra en el siguiente ejemplo:

Dim alertLabel As New System.Windows.Forms.Label
Sub alertUser(ByVal value As Long)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 92 | P g i n a

If value = 0 Then
alertLabel.ForeColor = System.Drawing.Color.Red
alertLabel.Font = New Font(alertLabel.Font, _
FontStyle.Bold Or FontStyle.Italic)
Else
alertLabel.Forecolor = System.Drawing.Color.Black
alertLabel.Font = New Font(alertLabel.Font, _
FontStyle.Regular)
End If
End Sub
Para probar las condiciones adicionales si la primera condicin es falsa
Utilice la construccin If...Then...Else con una o ms instrucciones ElseIf para probar las condiciones
adicionales si la primera condicin es False. En el siguiente ejemplo, el procedimiento Function
calcula una bonificacin en la nmina basndose en el nivel de rendimiento. El bloque de
instrucciones que sigue a la instruccin Else slo se ejecuta si las condiciones de las instrucciones If
y ElseIf son todas False.
Function bonus(ByVal performance As Integer, ByVal salary As
Decimal) _
As Decimal
If performance = 1 Then
Return salary * 0.1
ElseIf performance = 2 Then
Return salary * 0.09
ElseIf performance = 3 Then
Return salary * 0.07
Else
Return 0
End If
End Function

Visual Basic prueba las condiciones en el orden en que aparecen en las instrucciones If...Then...Else. Si
encuentra una condicin True o una instruccin Else, ejecuta el bloque de instrucciones correspondiente.
Despus, el control pasa a la instruccin que sigue a la instruccin End If.
Puede existir un nmero arbitrario de instrucciones ElseIf o ninguna. Puede incluir u omitir una instruccin
Else independientemente de que existan otras instrucciones ElseIf.

If
La Instruccin If...Then...Else ejecuta de forma condicional un grupo de instrucciones, dependiendo del valor
de una expresin.

If condition [ Then ]
[ statements ]
[ ElseIf elseifcondition [ Then ]
[ elseifstatements ] ]
[ Else
[ elsestatements ] ]
End If
-or-
If condition Then [ statements ] [ Else [ elsestatements ] ]

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 93 | P g i n a

Partes
condition
Obligatorio. Expresin. Se debe evaluar como True o False, o como un tipo de datos que es implcitamente
convertible a Boolean.
Then Obligatorio en la forma de una lnea, opcional en la forma de varias lneas.
statements Opcional. Se ejecutan una o ms instrucciones que siguen a If...Then que se ejecutan si condition
se evala como True.
elseifcondition Obligatorio si ElseIf est presente. Expresin. Se debe evaluar como True o False, o como un
tipo de datos que es implcitamente convertible a Boolean.
elseifstatements Opcional. Se ejecutan una o ms instrucciones que siguen a ElseIf...Then que se ejecutan si
elseifcondition se evala como True.
elsestatements Opcional. Una o ms instrucciones que se ejecutan si ninguna expresin condition o
elseifcondition anterior se evala como True.
End If Termina el bloque If...Then...Else.

Puede utilizar la forma de una sola lnea para pruebas cortas y sencillas. Sin embargo, el formato de
mltiples lneas proporciona ms estructura y flexibilidad que el formato de una sola lnea y, generalmente,
es ms fcil de leer, mantener y depurar.
Cuando se encuentra una estructura If...Then...Else, se comprueba la condition. Si condition es True, se
ejecutan las instrucciones que estn a continuacin de Then. Si condition es False, se evalan por orden
cada una de las instrucciones ElseIf. Cuando se encuentra una elseifcondition que sea True, se ejecutan las
instrucciones que siguen inmediatamente a la instruccin Then asociada. Si elseifcondition se evala como
True, o si no hay ninguna instruccin ElseIf, se ejecutan las instrucciones situadas despus de Else. Despus
de la ejecucin de las instrucciones que siguen a Then, ElseIf o Else, la ejecucin contina con la instruccin
que sigue a End If.

Con el formato de una sola lnea, es posible ejecutar varias instrucciones como resultado de una decisin
If...Then. Todas las instrucciones deben estar en la misma lnea y separarse con dos puntos. En el siguiente
ejemplo se muestra cmo.
If A > 10 Then A = A + 1 : B = B + A : C = C + B

Con la forma de varias lneas, la instruccin If debe ser la nica instruccin incluida en la primera lnea. Las
instrucciones ElseIf, Else y End If pueden ir precedidas solamente por una etiqueta de lnea. El bloque
If...Then...Else de varias lneas debe finalizar con una instruccin End If.
Para determinar si una instruccin If introduce o no un formato de varias lneas, examine lo que sigue a la
palabra clave Then. Si aparece cualquier otra cosa que no sea un comentario despus de Then en la misma
instruccin, sta se trata como una instruccin If de una sola lnea. Si no est presente Then, debe ser el
comienzo de una instruccin If...Then...Else de varias lneas.
Las clusulas ElseIf y Else son opcionales. Puede tener tantas clusulas ElseIf como desee en una instruccin
If...Then...Else de varias lneas, pero no puede aparecer ninguna de ellas despus de una clusula Else. Los
formatos de mltiples lneas pueden anidarse unos dentro de otros.
Ejemplo
En el ejemplo siguiente se muestran los formatos de varias lneas y de una sola lnea de la instruccin
If...Then...Else.
Dim number, digits As Integer
Dim myString As String
number = 53
If number < 10 Then
digits = 1
ElseIf number < 100 Then
digits = 2
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 94 | P g i n a

Else
digits = 3
End If
If digits = 1 Then myString = "One" Else myString = "More than one"

En el ejemplo anterior, la condicin ElseIf se evala como True y se asigna a digits un valor de 2. A
continuacin, la ltima instruccin le asigna un valor de "Ms de una" a myString.
Select Case
La instruccin Select...Case ejecuta uno de varios grupos de instrucciones, segn el valor de una expresin.
Select [ Case ] testexpression
[ Case expressionlist
[ statements ] ]
[ Case Else
[ elsestatements ] ]
End Select

Partes
testexpression Obligatorio. Expresin. Debe evaluarse en uno de los tipos de datos elementales (Boolean,
Byte, Char, Date, Double, Decimal, Integer, Long, Object, SByte, Short, Single, String, UInteger, ULong y
UShort).
expressionlist Requerido en una instruccin Case. Lista de clusulas de expresiones que representan valores
que coinciden para testexpression. Las clusulas de varias expresiones se separan mediante comas. Cada
clusula puede tomar una de las siguientes formas:
expression1 To expression2
[ Is ] comparisonoperator expression
expression
Utilice la palabra clave To para especificar los lmites de un intervalo de valores que coinciden para
testexpression. El valor de expression1 debe ser menor o igual que el valor de expression2.
Utilice la palabra clave Is con un operador de comparacin (=, <>, <, <=, > o >=) para especificar una
restriccin de los valores coincidentes para testexpression. Si no se escribe la palabra clave Is, se
insertar automticamente antes de comparisonoperator.
La forma que especifica nicamente expression se considera un caso especial de la forma Is, donde
comparisonoperator es el signo igual (=). Esta forma se evala como testexpression = expression.
Las expresiones contenidas en expressionlist pueden ser de cualquier tipo de datos, siempre que sean
implcitamente convertibles al tipo de testexpression y el correspondiente comparisonoperator sea
vlido para los dos tipos con los que se utilice.
statements Opcional. Una o ms instrucciones posteriores a Case que se ejecutan si testexpression coincide
con cualquier clusula de expressionlist.
elsestatements Opcional. Una o ms instrucciones posteriores a Case Else que se ejecutan si testexpression
no coincide con ninguna clusula de expressionlist de cualquiera de las instrucciones Case.
End Select Termina la definicin la construccin Select...Case.

Si testexpression coincide con cualquier clusula de Case expressionlist, se ejecutan las instrucciones
situadas a continuacin de Case hasta la siguiente instruccin Case, Case Else o End Select. El control pasa
despus a la instruccin que sigue a End Select. Si testexpression coincide con una clusula expressionlist en
ms de una clusula Case, slo se ejecutan las instrucciones situadas despus de la primera coincidencia.
La instruccin Case Else se utiliza para introducir las elsestatements que se deben ejecutar si no se
encuentra ninguna coincidencia entre las clusulas testexpression y expressionlist de cualquiera de las
dems instrucciones Case. Aunque no es necesario, es aconsejable tener una instruccin Case Else en su
construccin Select Case para controlar los valores testexpression imprevistos. Si no coincide ninguna
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 95 | P g i n a

clusula Case expressionlist con testexpression y no hay ninguna instruccin Case Else, el control pasa a la
instruccin End Select siguiente.
Se pueden utilizar varias expresiones o intervalos en cada clusula Case. Por ejemplo, la lnea siguiente es
vlida.
Case 1 To 4, 7 To 9, 11, 13, Is > maxNumber

Nota:
La palabra clave Is utilizada en las instrucciones Case y Case Else no es igual que Is (Operador, Visual Basic),
que se utiliza para la comparacin de referencias a objetos.
Puede especificar intervalos y varias expresiones para cadenas de caracteres. En el ejemplo siguiente, Case
coincide con cualquier cadena que sea exactamente igual a "apples", tenga un valor comprendido entre
"nuts" y "soup" en orden alfabtico, o contenga el mismo valor exacto que el valor actual de testItem.
Case "apples", "nuts" To "soup", testItem
El valor de Option Compare puede afectar a las comparaciones de cadenas. Bajo Option Compare Text, las
cadenas "Apples" y "apples" se comparan como iguales, pero no bajo Option Compare Binary.
Nota:
Una instruccin Case con varias clusulas puede exhibir el comportamiento conocido como cortocircuitar.
Visual Basic evala las clusulas de izquierda a derecha y, si una de ellas coincide con testexpression, no se
evalan las clusulas restantes. El procedimiento de cortocircuitar puede mejorar el rendimiento, pero
puede generar resultados inesperados si est esperando que se evalen todas las expresiones de
expressionlist.
Si el cdigo contenido en un bloque de instrucciones Case o Case Else no necesita ejecutar ms instrucciones
contenidas en el bloque, puede salir del bloque utilizando la instruccin Exit Select. Esto transfiere
inmediatamente el control a la instruccin que sigue a End Select.
Las construcciones Select Case se pueden anidar. Cada construccin Select Case anidada debe tener una
instruccin End Select coincidente y estar completamente contenida dentro de un nico bloque de
instruccin Case o Case Else de la construccin Select Case ms exterior dentro de la cual est anidada.
Ejemplo
En el ejemplo siguiente se utiliza una construccin Select Case para escribir una lnea correspondiente al
valor de la variable number. La segunda instruccin Case contiene el valor que coincide con el valor actual
de number, por lo que se ejecuta la instruccin que escribe "Between 6 and 8, inclusive".
Dim number As Integer = 8
Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
' The following is the only Case clause that evaluates to True.
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case 9 To 10
Debug.WriteLine("Equal to 9 or 10")
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

Funciones Iif & If

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 96 | P g i n a

Ciclos
Las estructuras de bucles de Visual Basic permiten ejecutar una o ms lneas de cdigo de forma repetitiva.
Puede repetir las instrucciones de una estructura de bucles hasta que una condicin sea True, una condicin
sea False, un nmero de veces especificado o una vez para cada objeto de una coleccin.
En el siguiente ejemplo se muestra una estructura de bucle que ejecuta un conjunto de instrucciones hasta
que una condicin se convierta en verdadera.
Ejecutar un conjunto de instrucciones hasta que una condicin se convierta en verdadera

Bucles While
La construccin While...End While ejecuta un conjunto de instrucciones mientras la condicin especificada
en la instruccin While sea True.
Bucles Do
La construccin Do...Loop le permite probar una condicin al comienzo o al final de una estructura de bucle.
Tambin puede especificar si repite el bucle mientras la condicin sigue siendo True o hasta que se
convierta en True.
Bucles For
La construccin For...Next ejecuta el bucle un nmero fijo de veces. Utiliza una variable de control de bucle,
tambin denominada contador para realizar el seguimiento de las repeticiones. Especifica los valores de
inicio y fin de este contador, y puede especificar opcionalmente la cantidad en la que se incrementa de una
repeticin a la siguiente.
Bucles For Each
La construccin For Each...Next ejecuta un conjunto de instrucciones una vez para cada elemento de una
coleccin. Especifica la variable de control de bucle pero no tiene que determinar los valores de inicio y fin
para ella.

Instruccin For...Next
Repite un grupo de instrucciones un nmero de veces especificado.
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]

Utilice una estructura For...Next cuando desee repetir un conjunto de instrucciones un nmero fijo de veces.
Una Instruccin While...End While (Visual Basic) o una Instruccin Do...Loop (Visual Basic) funciona bien
cuando no se sabe de antemano cuntas veces se necesita ejecutar las instrucciones del bucle. Sin embargo,
cuando espere ejecutar el bucle un nmero concreto de veces, For...Next es una mejor eleccin. Determina
el nmero de iteraciones cuando se entra en el bucle por primera vez.
El valor de step puede ser positivo o negativo. Determina el procesamiento del bucle como sigue:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 97 | P g i n a

Valor de step El bucle se ejecuta si
Positivo o cero counter <= end
Negativo counter >= end
Si no se especifica, el valor predeterminado de step es 1.
Reglas
Tipos de datos. El tipo de datos de counter suele ser Integer, pero puede ser cualquier tipo que
admita los operadores mayor o igual que (>=), menor o igual que (<=), suma (+) y resta (-). Incluso
puede ser un tipo definido por el usuario siempre que admita todos estos operadores.
Las expresiones start, end y step suelen evaluarse como tipo Integer, pero pueden evaluarse como cualquier
tipo de datos que se ample al tipo de counter. Si se utiliza un tipo definido por el usuario para counter,
significa que hay que definir el operador de conversin CType para convertir los tipos de start, end o step al
tipo de counter.
Declaracin. Si counter no se ha declarado fuera de este bucle, se debe declarar en la instruccin
For. En tal caso, el mbito de counter es el cuerpo del bucle. Sin embargo, no se puede declarar
counter fuera y dentro del bucle.
Nmero de iteraciones. Visual Basic evala los valores de iteracin start, end y step slo una vez,
antes de que comience el bucle. Si el bloque de instrucciones cambia end o step, estos cambios no
afectan a la iteracin del bucle.
Bucles anidados. Se pueden anidar bucles For colocando un bucle dentro de otro. Sin embargo,
cada bucle debe tener una variable counter nica. La siguiente construccin es vlida.
For i As Integer = 1 To 10
For j As Integer = 1 To 10
For k As Integer = 1 To 10
' Insert statements to operate with current values of i, j, and k.
Next k
Next j
Next i
Identificar la variable de control. Opcionalmente, puede especificarse counter en la instruccin
Next. Esto mejora la legibilidad del programa, sobre todo si se han anidado bucles For. La variable
que se especifique debe ser igual a la que aparece en la instruccin For correspondiente.
Transferir fuera del bucle. La Instruccin Exit (Visual Basic) transfiere el control inmediatamente a la
instruccin que sigue a Next. Por ejemplo, puede ser conveniente salir de un bucle si se detecta una
condicin que hace que sea innecesario o imposible continuar la iteracin, como puede ser un valor
errneo o una solicitud de finalizacin. Asimismo, si se detecta una excepcin en una instruccin
Try...Catch...Finally, se puede utilizar Exit For al final del bloque Finally.
Se puede colocar cualquier nmero de instrucciones Exit For en un bucle For. Exit For se suele utilizar
despus de evaluar alguna condicin, por ejemplo en una estructura If...Then...Else.
Bucles sin fin. Un uso de Exit For es comprobar una condicin que pudiera ocasionar un bucle sin
fin; es decir, un bucle que pudiera ejecutarse un nmero extremadamente elevado de veces e
incluso infinitamente. Si se detecta este tipo de condicin, se puede utilizar Exit For para escapar
del bucle.
Comportamiento
Entrada en el bucle. Cuando comienza la ejecucin del bucle For...Next, Visual Basic evala start,
end y step por primera y nica vez. Despus asigna start a counter. Antes de ejecutar el bloque de
instrucciones, compara counter con end. Si counter ya ha superado el valor final, el bucle For
finaliza y el control pasa a la instruccin que sigue a Next. De lo contrario se ejecuta el bloque de
instrucciones.
Iteraciones del bucle. Cada vez que Visual Basic encuentra la instruccin Next, incrementa counter
en el valor indicado en step y vuelve a la instruccin For. Compara de nuevo counter con end y, otra
vez, ejecuta el bloque o termina el bucle segn el resultado. Este proceso contina hasta que
counter sobrepasa end o se encuentra una instruccin Exit For.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 98 | P g i n a

Terminacin del bucle. El bucle no finaliza hasta que counter haya sobrepasado end. Si counter es
igual a end, el bucle contina. La comparacin que determina si se ejecuta el bloque es
counter <= end si step es positivo y counter >= end si step es negativo.
Cambiar los valores de iteracin. Cambiar el valor de counter mientras se est dentro de un bucle
puede dificultar la lectura y la depuracin del cdigo. Cambiar el valor de start, end o step no afecta
a los valores de iteracin especificados cuando se entr en el bucle por primera vez.

Instruccin For Each...Next
Repite un grupo de instrucciones para cada elemento de una coleccin.
For Each element [ As datatype ] In group
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]
Utilice un bucle For Each...Next cuando desee repetir un conjunto de instrucciones para cada elemento de
una coleccin o matriz.
Una Instruccin For...Next (Visual Basic) funciona bien cuando se puede asociar cada iteracin de un bucle
con una variable de control y determinar los valores iniciales y finales de esa variable. Sin embargo, cuando
se trata de colecciones, el concepto de valores iniciales y finales no es significativo, y no siempre se sabe
cuntos elementos tiene la coleccin. En este caso, el bucle For Each...Next es la mejor opcin.
Reglas
Tipos de datos. El tipo de datos de element debe ser tal que el tipo de datos de los elementos de
group se pueda convertir en l.
El tipo de datos de group debe ser un tipo de referencia que hace referencia a una coleccin o una matriz.
Esto significa que group tiene que hacer referencia a un objeto que implementa la interfaz IEnumerable del
espacio de nombres System.Collections o la interfaz IEnumerable<(Of <(T>)>) del espacio de nombres
System.Collections.Generic. IEnumerable define el mtodo GetEnumerator, que devuelve un objeto
enumerador para la coleccin. El objeto enumerador implementa la interfaz IEnumerator del espacio de
nombres System.Collections y expone la propiedad Current y los mtodos Reset y MoveNext. Visual Basic los
utiliza para recorrer la coleccin.
Los elementos de group normalmente son del tipo Object pero pueden tener cualquier tipo de datos en
tiempo de ejecucin.
Conversiones de restriccin. Cuando Option Strict est establecido en On, las conversin de
restriccin suelen producir errores del compilador. En el ejemplo siguiente, la asignacin de m
como valor inicial de n no se compila con Option Strict porque la conversin de Long a Integer es
una conversin de restriccin.
Dim m As Long = 987
' Does not compile.
'Dim n As Integer = m
Sin embargo, las conversiones de los elementos de group a element se evalan y se realizan en tiempo de
ejecucin, por lo que se suprime el error de la conversin de restriccin. En el ejemplo siguiente, no se
notifica ningn error del compilador en el bucle For Each, aunque requiere la misma conversin de Long a
Integer que produjo un error en el ejemplo anterior.
Option Strict On
Module Module1
Sub Main()

' The assignment of m to n causes a compiler error when
' Option Strict is on.
Dim m As Long = 987
'Dim n As Integer = m
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 99 | P g i n a


' The For Each loop requires the same conversion, but
' causes no errors. The output is 45 3 987.
For Each p As Integer In New Long() {45, 3, 987}
Console.Write(p & " ")
Next
Console.WriteLine()
End Sub
End Module

El hecho de que no se produzca un error del compilador no elimina el riesgo de un error en tiempo de
ejecucin. En el ejemplo siguiente, no se notifica ningn error del compilador, pero se produce un error en
tiempo de ejecucin cuando se aplica ToInteger a 9876543210. El error en tiempo de ejecucin se produce
tanto si Option Strict est activado como desactivado.
Option Strict On

Module Module1
Sub Main()

' The assignment of m to n causes a compiler error when
' Option Strict is on.
Dim m As Long = 9876543210
'Dim n As Integer = m

Try
' The For Each loop requires the same conversion, but
' is not flagged by the compiler. A run-time error is
' raised because 9876543210 is too large for type Integer.
For Each p As Integer In New Long() {45, 3, 9876543210}
Console.Write(p & " ")
Next
Console.WriteLine()
Catch e As System.OverflowException
Console.WriteLine()
Console.WriteLine(e.Message)
End Try
End Sub
End Module
Declaracin. Si element no se ha declarado fuera de este bucle, se debe declarar en la instruccin
For Each. Puede declarar el tipo de element explcitamente mediante una instruccin As o bien
puede basarse en la inferencia de tipos para asignar el tipo. En ambos casos, el mbito de element
es el cuerpo del bucle. Sin embargo, no se puede declarar element fuera y dentro del bucle.
Nmero de iteraciones. Visual Basic slo evala una vez la coleccin, antes de que comience el
bucle. Si el bloque de instrucciones cambia element o group, estos cambios no afectan a la
iteracin del bucle.
Bucles anidados. Se pueden anidar bucles For Each colocando un bucle dentro de otro. Sin
embargo, cada bucle debe tener una variable element nica.
Tambin se pueden anidar entre s tipos diferentes de estructuras de control.
Nota:
Si una instruccin Next de un nivel de anidamiento externo se encuentra antes de la instruccin Next de un
nivel interno, el compilador genera un error. Sin embargo, el compilador slo puede detectar este error
superpuesto si se especifica element en cada instruccin Next.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 100 | P g i n a

Identificar la variable de control. Opcionalmente, puede especificarse element en la instruccin
Next. Esto mejora la legibilidad del programa, sobre todo si se han anidado bucles For Each. La
variable que se especifique debe ser igual a la que aparece en la instruccin For Each
correspondiente.
Transferir fuera del bucle. La Instruccin Exit (Visual Basic) transfiere el control inmediatamente a la
instruccin que sigue a Next. Por ejemplo, puede ser conveniente salir de un bucle si se detecta una
condicin que hace que sea innecesario o imposible continuar la iteracin, como puede ser un valor
errneo o una solicitud de finalizacin. Asimismo, si se detecta una excepcin en una instruccin
Try...Catch...Finally, se puede utilizar Exit For al final del bloque Finally.
Se puede colocar cualquier nmero de instrucciones Exit For en un bucle For Each. Exit For se suele utilizar
despus de evaluar alguna condicin, por ejemplo en una estructura If...Then...Else.
Bucles sin fin. Un uso de Exit For es comprobar una condicin que pudiera ocasionar un bucle sin
fin; es decir, un bucle que pudiera ejecutarse un nmero extremadamente elevado de veces e
incluso infinitamente. Si se detecta este tipo de condicin, se puede utilizar Exit For para escapar
del bucle.
Comportamiento
Entrada en el bucle. Cuando comienza la ejecucin del bucle For Each...Next, Visual Basic
comprueba que group hace referencia a un objeto de coleccin vlido. Si no, produce una
excepcin. De lo contrario, llama al mtodo MoveNext y a la propiedad Current del objeto
enumerador para devolver el primer elemento. Si MoveNext indica que no hay un elemento
siguiente, es decir, si la coleccin est vaca, el bucle For Each termina y el control pasa a la
instruccin que sigue a Next. De lo contrario, Visual Basic establece element en el primer elemento
y ejecuta el bloque de instrucciones.
Iteraciones del bucle. Cada vez que Visual Basic encuentra la instruccin Next, vuelve a la
instruccin For Each. Llama de nuevo a MoveNext y Current para devolver el elemento siguiente, y
una vez ms ejecuta el bloque o termina el bucle segn el resultado. Este proceso contina hasta
que MoveNext indica que no hay ningn elemento siguiente o se encuentra una instruccin Exit
For.
Terminacin del bucle. Cuando todos los elementos de la coleccin se han asignado correctamente
a element, el bucle For Each termina y el control pasa a la instruccin que sigue a Next.
Cambiar los valores de iteracin. Cambiar el valor de element mientras se est dentro de un bucle
puede dificultar la lectura y la depuracin del cdigo. Cambiar el valor de group no afecta a la
coleccin o sus elementos, que se determinaron en el momento de entrar en el bucle.
Orden de recorrido. Cuando se ejecuta un bucle For Each...Next, el recorrido de la coleccin est
bajo el control del objeto enumerador devuelto por el mtodo GetEnumerator. El orden de
recorrido no lo determina Visual Basic, sino el mtodo MoveNext del objeto enumerador. Esto
significa que tal vez no se pueda predecir qu elemento de la coleccin es el primero que se
devuelve en element o qu elemento es el siguiente en ser devuelto tras un elemento dado.
Si el cdigo utilizado depende del recorrido de una coleccin en un orden concreto, un bucle For Each...Next
no es la mejor opcin a menos que conozca las caractersticas del objeto enumerador que expone la
coleccin. Es posible obtener resultados ms fiables si se utiliza una estructura de bucle diferente, tal como
For...Next o Do...Loop.
Modificar la coleccin. El objeto enumerador devuelto por GetEnumerator normalmente no
permite que se agreguen, eliminen, reemplacen o reordenen elementos de la coleccin. Si se
modifica la coleccin despus de haber iniciado un bucle For Each...Next, el objeto enumerador
deja de ser vlido y el siguiente intento de acceso a un elemento produce una excepcin
InvalidOperationException.
Sin embargo, este bloqueo de la modificacin no viene determinado por Visual Basic sino por la
implementacin de la interfaz IEnumerable. Es posible implementar IEnumerable de modo que se permita la
modificacin durante la iteracin. Si piensa realizar este tipo de modificacin dinmica, asegrese de
conocer las caractersticas de la implementacin de IEnumerable en la coleccin que est utilizando.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 101 | P g i n a

Modificar los elementos de coleccin. La propiedad Current del objeto enumerador es ReadOnly
(Visual Basic) y devuelve una copia local de cada elemento de la coleccin. Esto significa que no es
posible modificar los propios elementos en un bucle For Each...Next. Cualquier modificacin que se
realice afectar slo a la copia local de Current y no se ver reflejada de nuevo en la coleccin
subyacente. Sin embargo, si un elemento es un tipo de referencia, es posible modificar los
miembros de la instancia a los que apunta. Esto se ilustra en el siguiente ejemplo:
Sub lightBlueBackground(ByVal thisForm As System.Windows.Forms.Form)
For Each thisControl As System.Windows.Forms.Control In
thisForm.Controls
thisControl.BackColor = System.Drawing.Color.LightBlue
Next thisControl
End Sub

En el ejemplo anterior se puede modificar el miembro BackColor de cada elemento thisControl, aunque no
se puede modificar el propio elemento thisControl.
Recorrer matrices. Dado que la clase Array implementa la interfaz IEnumerable, todas las matrices
exponen el mtodo GetEnumerator. Esto significa que es posible recorrer una matriz con un bucle
For Each...Next. Sin embargo, slo podr leer los elementos de la matriz, no modificarlos.

Ejemplo
En el ejemplo siguiente se utiliza la instruccin For Each...Next para buscar todos los elementos en una
coleccin de la cadena "Hello". El ejemplo supone que ya se ha creado la coleccin thisCollection y que sus
elementos son de tipo String.
Dim found As Boolean = False
Dim thisCollection As New Collection
For Each thisObject As String In thisCollection
If thisObject = "Hello" Then
found = True
Exit For
End If
Next thisObject

Instruccin Do Loop
Repite un bloque de instrucciones mientras una condicin Boolean sea True o hasta que la condicin se
convierta en True.
Do { While | Until } condition
[ statements ]
[ Exit Do ]
[ statements ]
Loop
-or-
Do
[ statements ]
[ Exit Do ]
[ statements ]
Loop { While | Until } condition

Utilice una estructura Do...Loop cuando desee repetir un conjunto de instrucciones un nmero indefinido de
veces, hasta que se satisfaga una condicin. Si desea repetir las instrucciones un nmero fijo de veces, la
Instruccin For...Next es normalmente una opcin mejor.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 102 | P g i n a

La estructura Do...Loop proporciona mayor flexibilidad que laInstruccin While...End While (Visual Basic)
porque permite elegir si se debe finalizar el bucle cuando condition deja de ser True o cuando es True por
primera vez. Tambin le permite probar condition al principio o al final del bucle.
Reglas
Naturaleza de la condicin. Generalmente, la condicin es el resultado de comparar dos valores,
pero tambin puede ser cualquier expresin que da como resultado un valor de Boolean (Tipo de
datos, Visual Basic) (True o False). Esto incluye los valores de otros tipos de datos, como los
numricos, que han sido convertidos a valores de tipo Boolean.
Probar la condicin. Slo puede probar condition una vez, al principio o al final del bucle. Puede
usar While o Until para especificar condition, pero no ambas.
Nmero de iteraciones. Si prueba condition al principio del bucle (en la instruccin Do), puede que
el bucle no se ejecute ni siquiera una vez. Si prueba al final del bucle (en la instruccin Loop), el
bucle siempre se ejecuta al menos una vez.
Anidar bucles. Los bucles Do se pueden anidar colocando un bucle dentro de otro. Tambin puede
anidar distintos tipos de estructuras de control dentro de otras.
Transferir el control fuera del bucle. La Instruccin Exit (Visual Basic) transfiere el control
inmediatamente a la instruccin que sigue a la instruccin Loop. Puede desear salir de un bucle si
detecta una condicin que hace que sea innecesario o no se pueda continuar la iteracin, como
puede ser un valor errneo o una solicitud de finalizacin. Puede colocar cualquier cantidad de
instrucciones Exit Do en cualquier punto del bucle Do. Exit Do suele utilizarse despus de evaluar
alguna condicin, por ejemplo en una estructura If...Then...Else.
Bucles sin fin
Un uso de Exit Do consiste en comprobar una condicin que podra ocasionar un bucle sin fin; es decir, un
bucle que pudiera ejecutarse un nmero extremadamente elevado, o incluso infinito, de veces. Si detecta
este tipo de situacin, puede utilizar Exit Do para interrumpir el bucle. De lo contrario, el bucle sigue
ejecutndose.
En el siguiente ejemplo se asigna a number un valor que podra hacer que el bucle se ejecutara ms de 2 ^
31 veces. La instruccin If comprueba si se produce esta situacin y, si es as, sale de ella, impidiendo la
entrada en un bucle sin fin.
Sub exitDoExample()
Dim counter As Integer = 0
Dim number As Integer = 8
Do Until number = 10
If number <= 0 Then Exit Do
number -= 1
counter += 1
Loop
MsgBox("The loop ran " & counter & " times.")
End Sub

Ejemplo
El ejemplo siguiente ilustra las estructuras Do...Loop anidadas, as como el uso de While y Until, y la
comprobacin al principio (instruccin Do) y al final (instruccin Loop) del bucle.
Sub DoExample()
Dim check As Boolean = True
Dim counter As Integer = 0
Do
Do While counter < 20
counter += 1
If counter = 10 Then
check = False
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 103 | P g i n a

Exit Do
End If
Loop
Loop Until check = False
End Sub


En el ejemplo anterior, la estructura Do...Loop interior se ejecuta 10 veces, establece el valor del indicador
en False y sale de forma prematura utilizando la instruccin Exit Do. El bucle externo sale inmediatamente al
comprobar el valor del indicador.

While End While
Ejecuta una serie de instrucciones siempre que una condicin dada sea True.
While condition
[ statements ]
[ Exit While ]
[ statements ]
End While


Utilice una estructura While...End While si desea repetir un conjunto de instrucciones un nmero indefinido
de veces, siempre que una condicin sea True. Si desea ms flexibilidad con respecto a la ubicacin donde
prueba la condicin o al resultado para el que la prueba, quiz prefiera Instruccin Do...Loop (Visual Basic).
Si desea repetir las instrucciones un nmero fijo de veces, Instruccin For...Next (Visual Basic) suele ser
mejor opcin.
Si condition es True, se ejecutan todas las statements hasta que se encuentra la instruccin End While
Despus, el control vuelve a la instruccin While y se comprueba de nuevo condition. Si condition an es
True, se repite el proceso. Si es False, el control pasa a la instruccin que sigue a la instruccin End While.
Reglas
Naturaleza de la condicin. Generalmente, la condicin es el resultado de comparar dos valores,
pero tambin puede ser cualquier expresin que da como resultado un valor Boolean (Tipo de
datos, Visual Basic) (True o False). Esto incluye los valores de otros tipos de datos, como los
numricos, que han sido convertidos a valores de tipo Boolean.
Probar la condicin. La instruccin While comprueba siempre la condicin antes de iniciar el bucle.
La ejecucin en bucle contina mientras el resultado de la condicin sea True.
Nmero de iteraciones. Si condition es False cuando entra en el bucle por primera vez, no se
ejecuta ni una vez.
Anidar bucles. Los bucles While se pueden anidar, colocando un bucle dentro de otro. Tambin
puede anidar tipos diferentes de estructuras de control entre s.
Transferir fuera del bucle.Instruccin Exit (Visual Basic) transfiere el control inmediatamente a la
instruccin que sigue a la instruccin End While. Puede desear salir de un bucle si detecta una
condicin que hace que sea innecesario o que no se pueda continuar la iteracin, como un valor
incorrecto o una solicitud de finalizacin. Puede incluir el nmero que desee de instrucciones Exit
While en cualquier parte del bucle While. Exit While se utiliza a menudo tras evaluar alguna
condicin, por ejemplo en una estructura If...Then...Else.
Bucles sin fin. Un uso de Exit While consiste en comprobar una condicin que puede ocasionar un
bucle sin fin; es decir, un bucle que se puede ejecutar un nmero extremadamente elevado o
infinito de veces. Si detecta este tipo de condicin, puede utilizar Exit While para salir del bucle.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 104 | P g i n a

Ejemplo
Este ejemplo utiliza la estructura While...End While para incrementar una variable de contador. Las
instrucciones del bucle se ejecutan en tanto la condicin d como resultado True.
Dim counter As Integer = 0
While counter < 20
counter += 1
' Insert code to use current value of counter.
End While
MsgBox("While loop ran " & CStr(counter) & " times")

Exit
Puede utilizar Instruccin Exit para salir directamente de una estructura de control. Exit transfiere
inmediatamente la ejecucin a la instruccin que sigue a la ltima instruccin de la estructura de control. La
sintaxis de la instruccin Exit especifica el tipo de estructura de control desde la que se transfiere la
ejecucin. Son posibles las siguientes versiones de la instruccin Exit:
Exit Select
Exit Try
Exit While
Exit Do
Exit For
Las instrucciones Exit pueden aparecer tantas veces como sea necesario dentro de una estructura de control
que las admite. Exit es til cuando una estructura de control ha hecho todo que necesita hacer y no necesita
ejecutar ninguna instruccin ms.
Estructuras de control que no admiten la salida. No puede utilizar la instruccin Exit para transferir fuera de
un bloque If, Using o With. Para lograr el mismo resultado, puede colocar una etiqueta de instruccin en la
instruccin End del bloque y transferir hacia l mediante una instruccin GoTo.

Ejemplo
Si se encuentra una instruccin Exit dentro de estructuras de control anidadas, el control pasa a la
instruccin que sigue al final de la estructura ms interna del tipo especificado en la instruccin Exit. Esto se
ilustra en el siguiente ejemplo:

Public Sub invertElements(ByRef a(,) As Double)
For i As Integer = 0 To UBound(a, 1)
For j As Integer = 0 To UBound(a, 2)
If a(i, j) = 0 Then
' Cannot complete this row; resume outer loop.
Exit For
Else
a(i, j) = 1.0 / a(i, j)
End If
Next j
' Control comes here directly from the Exit For statement.
Next i
End Sub

En el ejemplo anterior, la instruccin Exit For se encuentra en el bucle For interno, de modo que pasa el
control a la instruccin que sigue al bucle y contina con el bucle For externo.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 105 | P g i n a

Procedimientos y funciones
Un procedimiento es un bloque de instrucciones de Visual Basic incluido entre una instruccin de
declaracin (Function, Sub, Operator, Get, Set) y una declaracin End correspondiente. En Visual Basic,
todas las instrucciones ejecutables deben incluirse en algn procedimiento.
Llamar a un procedimiento
Los procedimientos se invocan desde otras partes del cdigo. Esto se conoce como una llamada a
procedimiento. Cuando finaliza la ejecucin de un procedimiento, ste devuelve el control al cdigo que lo
invoc, que recibe el nombre de cdigo de llamada. El cdigo de llamada es una instruccin o una expresin
contenida en una instruccin, que hace referencia al procedimiento por su nombre y le transfiere el control.
Volver de un procedimiento
Los procedimientos devuelven el control al cdigo de llamada cuando finalizan su ejecucin. Para ello,
puede utilizar Instruccin Return (Visual Basic), la instruccin Instruccin Exit (Visual Basic) apropiada para el
procedimiento o la instruccin End (Visual Basic) del procedimiento. El control se devuelve al cdigo de
llamada, a continuacin del punto de la llamada al procedimiento.
Con una instruccin Return, el control vuelve inmediatamente al cdigo de llamada. No se ejecutan
las instrucciones siguientes a la instruccin Return. Puede tener ms de una instruccin Return en
el mismo procedimiento.
Con una instruccin Exit Sub o Exit Function, el control vuelve inmediatamente al cdigo de
llamada. No se ejecutan las instrucciones siguientes a la instruccin Exit. Puede tener ms de una
instruccin Exit en el mismo procedimiento, y puede mezclar las instrucciones Return y Exit en el
mismo procedimiento.
Si un procedimiento no incluye instrucciones Return o Exit, concluye con una instruccin End Sub o
End Function, End Get o End Set a continuacin de la ltima instruccin del cuerpo del
procedimiento. La instruccin End devuelve el control inmediatamente al cdigo de llamada. Puede
tener slo una instruccin End en un procedimiento.
Parmetros y argumentos
En la mayora de los casos, un procedimiento necesita funcionar en datos diferentes cada vez que lo llama.
Puede pasar esta informacin al procedimiento como parte de la llamada al procedimiento. El
procedimiento define cero o ms parmetros, cada uno de los cuales representa un valor que el
procedimiento espera que le pase. Cada parmetro de la definicin del procedimiento cuenta con un
argumento correspondiente en la llamada al procedimiento. Un argumento representa el valor que pasa al
parmetro correspondiente en una llamada a procedimiento determinada.
Tipos de procedimientos
Visual Basic utiliza varios tipos de procedimientos:
Procedimientos Sub: ejecutan acciones pero no devuelven un valor al cdigo de llamada.
Los procedimientos de control de eventos son procedimientos Sub que se ejecutan en respuesta a
un evento provocado por una accin del usuario o por un suceso en un programa.
Procedimientos Function: devuelven un valor al cdigo de llamada. Pueden realizar otras acciones
antes de volver.
Procedimientos de propiedad: devuelven y asignan valores de propiedades en objetos o mdulos.
Procedimientos de operador: definen el comportamiento de un operador estndar cuando uno o
los dos operandos son una clase definida recientemente o una estructura.
Procedimientos genricos en Visual Basic: definen uno o varios parmetros de tipo adems de sus
parmetros normales, de forma que el cdigo de llamada puede pasar tipos de datos especficos
cada vez que realiza una llamada.
Procedimientos y cdigo estructurado
Todas las lneas de cdigo ejecutable de una aplicacin deben encontrarse dentro de un procedimiento, por
ejemplo, Main, calculate o Button1_Click. La aplicacin se leer con mayor facilidad si subdivide los
procedimientos grandes en procedimientos ms pequeos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 106 | P g i n a

Los procedimientos son tiles para realizar tareas repetitivas o compartidas, como clculos de uso
frecuente, manipulacin de texto y controles, y operaciones con bases de datos. Se puede llamar a un
procedimiento desde distintos lugares del cdigo; de modo que los procedimientos se prestan a servir de
unidades de creacin de la aplicacin.
La estructuracin del cdigo en procedimientos aporta las siguientes ventajas:
Los procedimientos permiten desglosar los programas en unidades lgicas independientes. Es ms
fcil depurar unidades individuales que todo un programa sin procedimientos.
Despus de desarrollar los procedimientos para el uso en un programa, puede utilizarlos en otros
programas, a menudo con pocas o ninguna modificacin. Esto ayuda a evitar la duplicacin del
cdigo.
Sub (Declaracin, definicin y uso)
Un procedimiento Sub consiste en una serie de instrucciones de Visual Basic delimitadas por las
instrucciones Sub y End Sub. El procedimiento Sub ejecuta una tarea y devuelve el control al cdigo de
llamada, pero no le devuelve un valor.
Cada vez que se llama a un procedimiento, se ejecutan las instrucciones de ste, desde la primera
instruccin ejecutable tras la instruccin Sub hasta la primera instruccin End Sub, Exit Sub o Return que se
encuentre.
Se puede definir un procedimiento Sub en mdulos, clases y estructuras. Es Public de forma
predeterminada, lo que significa que puede llamarlo desde cualquier lugar de la aplicacin que tenga acceso
al mdulo, clase o estructura en el que se ha definido. El trmino mtodo describe un procedimiento Sub o
Function al que se tiene acceso desde fuera de su mdulo, clase o estructura en el que se ha definido.
Un procedimiento Sub puede aceptar argumentos, como constantes, variables o expresiones, que le pasa el
cdigo de llamada.

Sintaxis de la declaracin
La sintaxis para declarar un procedimiento Sub es la siguiente:
[ modifiers ] Sub subname [( parameterlist )]
' Statements of the Sub procedure.
End Sub
Los modifiers pueden especificar un nivel de acceso e informacin relativo a la sobrecarga, al reemplazo, uso
compartido y sombreado.
Declaracin de parmetros
Puede declarar un parmetro del procedimiento de igual forma que lo hara con una variable, especificando
el nombre de parmetro y el tipo de datos. Tambin puede especificar el mecanismo para pasar argumentos
y si el parmetro es opcional o una matriz de parmetros.
La sintaxis de los parmetros de una lista de parmetros es la siguiente:
[Optional] [ByVal | ByRef] [ParamArray] parametername As datatype
Si el parmetro es opcional, debe proporcionar tambin un valor predeterminado como parte de su
declaracin. La sintaxis para especificar un valor predeterminado es la siguiente:
Optional [ByVal | ByRef] parametername As datatype = defaultvalue
Parmetros como variables locales
Cuando el control pasa al procedimiento, cada parmetro se trata como una variable local. Esto significa que
su perodo de duracin es igual al del procedimiento y su mbito es el procedimiento completo.
Sintaxis de llamada
Los procedimientos Sub se invocan de forma explcita, con una instruccin de llamada independiente. No se
les puede llamar utilizando su nombre en una expresin. Debe suministrar valores para todos los
argumentos que no sean opcionales e incluir la lista de argumentos entre parntesis. Si no se proporcionan
argumentos, se puede omitir el parntesis. El uso de la palabra clave Call es opcional aunque no
recomendado.
La sintaxis para llamar a un procedimiento Sub es la siguiente:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 107 | P g i n a

[Call] subname [( argumentlist )]
Puede llamar a un mtodo Sub desde fuera de la clase que lo define. Primero, tiene que utilizar la palabra
clave New para crear una instancia de la clase o llamar a un mtodo que devuelve una instancia de la clase.
A continuacin, puede utilizar la sintaxis siguiente para llamar al mtodo Sub en el objeto de instancia:
Object.methodname[(argumentlist)]

Ejemplo de declaracin y llamada
El procedimiento Sub que aparece a continuacin notifica al usuario del equipo la tarea que est a punto de
realizar la aplicacin, y tambin muestra una marca de tiempo. En lugar de duplicar este cdigo al principio
de cada tarea, la aplicacin simplemente llama a tellOperator desde varios lugares. Cada llamada pasa una
cadena al argumento task que identifica la tarea que se va a iniciar.
Sub tellOperator(ByVal task As String)
Dim stamp As Date
stamp = TimeOfDay()
MsgBox("Starting " & task & " at " & CStr(stamp))
End Sub

El ejemplo siguiente muestra una llamada tpica a tellOperator.
Call tellOperator("file update")

Cmo: Llamar a un procedimiento que no devuelve un valor
Un procedimiento Sub no devuelve un valor al cdigo de llamada. Se llama a este procedimiento de forma
explcita, con una instruccin de llamada independiente. No se le puede llamar utilizando simplemente su
nombre en una expresin.
La instruccin de llamada puede utilizar opcionalmente la palabra clave Call. Esto se recomienda porque
mejora la legibilidad de su cdigo.
Para llamar a un procedimiento Sub
1. Utilice una instruccin Call y agregue detrs de la palabra clave Call el nombre del procedimiento
Sub.
2. Agregue parntesis detrs del nombre de procedimiento para incluir la lista de argumentos. Si no
hay ningn argumento, puede omitir opcionalmente los parntesis. No obstante, el uso de
parntesis facilita la lectura del cdigo.
3. Coloque los argumentos en la lista de argumentos entre parntesis y separados por comas.
Asegrese de proporcionar los argumentos en el mismo orden en que el procedimiento Sub define
los parmetros correspondientes.
El ejemplo siguiente llama a la funcin AppActivate de Visual Basic para activar una ventana de la aplicacin.
AppActivate acepta el ttulo de la ventana como nico argumento. No devuelve ningn valor al cdigo de
llamada. Si no se est ejecutando un proceso del Bloc de notas, el ejemplo produce una excepcin
ArgumentException. En el procedimiento Shell se presupone que las aplicaciones se encuentran en las rutas
de acceso especificadas.
Dim notepadID As Integer
' Activate a running Notepad process.
AppActivate("Untitled - Notepad")
' AppActivate can also use the return value of the Shell function.
' Shell runs a new instance of Notepad.
notepadID = Shell("C:\WINNT\NOTEPAD.EXE", AppWinStyle.NormalFocus)
' Activate the new instance of Notepad.
AppActivate(notepadID)


ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 108 | P g i n a

Function (Declaracin, definicin y uso)
Un procedimiento Function consiste en una serie de instrucciones de Visual Basic delimitadas por las
instrucciones Function y End Function. El procedimiento Function realiza una tarea y, a continuacin,
devuelve el control al cdigo de llamada. Cuando devuelve el control, tambin devuelve un valor al cdigo
de llamada.
Cada vez que se llama a un procedimiento, se ejecutan las instrucciones de ste, desde la primera
instruccin ejecutable tras la instruccin Function hasta la primera instruccin End Function, Exit Function o
Return que se encuentre.
Puede definir un procedimiento Function en un mdulo, clase o estructura. Es Public de forma
predeterminada, lo que significa que puede llamarlo desde cualquier lugar de la aplicacin que tenga acceso
al mdulo, clase o estructura en el que se ha definido.
Un procedimiento Function puede aceptar argumentos, como constantes, variables o expresiones, que le
pasa el cdigo de llamada.

Sintaxis de la declaracin
La sintaxis para declarar un procedimiento Function es la siguiente:
[ modifiers ] Function functionname [( parameterlist )] As returntype
' Statements of the Function procedure.
End Function
Los modifiers pueden especificar un nivel de acceso e informacin relativo a la sobrecarga, al reemplazo, uso
compartido y sombreado.
Declara cada parmetro de la misma manera que para procedimientos Sub.
Tipo de datos
Todos los procedimientos Function tienen un tipo de datos, al igual que las variables. La clusula As
especifica este tipo de datos en la instruccin Function y determina el tipo de datos del valor que la funcin
devuelve al cdigo de llamada. En las siguientes declaraciones de ejemplo se ilustra esto ltimo.

Function yesterday() As Date
' Instrucciones
End Function

Function findSqrt(ByVal radicand As Single) As Single
' Instrucciones
End Function
Valores devueltos
El valor que un procedimiento Function devuelve al cdigo de llamada se denomina valor devuelto. El
procedimiento devuelve dicho valor de dos maneras:
La funcin asigna un valor a su propio nombre de funcin en una o ms instrucciones del
procedimiento. El control no vuelve al programa de llamada hasta que se ejecuta una instruccin
Exit Function o End Function. Esto se ilustra en el siguiente ejemplo:
Function functionname [( parameterlist )] As returntype
' The following statement does not transfer control back to the calling code.
functionname = expression
' When control returns to the calling code, expression is the return value.
End Function
Utiliza la instruccin Return para especificar el valor devuelto y devuelve el control inmediatamente
al programa de llamada. Esto se ilustra en el siguiente ejemplo:
Function functionname [( parameterlist )] As returntype
' The following statement immediately transfers control back to the calling code and
returns the value of expression .
Return expression
End Function
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 109 | P g i n a

La ventaja de asignar el valor devuelto al nombre de la funcin es que el control permanece en el
procedimiento hasta que encuentra una instruccin Exit Function o End Function, lo que permite asignar un
valor previo y, si es necesario, se puede ajustar despus.

Matrices devueltas
Si el procedimiento Function devuelve datos de tipo matricial, el acceso a los elementos individuales de la
matriz no es posible dentro de la funcin. Si se intentara hacerlo, el compilador lo interpretar como una
llamada recursiva al procedimiento. Esto se ilustra en el siguiente ejemplo:
Function allOnes(ByVal n As Integer) As Integer()
For i As Integer = 1 To n - 1
' The following statement generates a COMPILER ERROR .
allOnes(i) = 1
Next i
' The following statement generates a COMPILER ERROR .
Return allOnes()
End Function
En el ejemplo anterior, el compilador interpreta la asignacin intentada allOnes(i) = 1 como una
llamada a allOnes en el lado izquierdo de una instruccin de asignacin. Interpreta la instruccin
intentada Return allOnes() como una llamada sin argumento. Ambas instrucciones generan errores
de compilador.
Sintaxis de llamada
Para invocar a un procedimiento Function hay que incluir el nombre y los argumentos de ste en la parte
derecha de una instruccin de asignacin o en una expresin. Debe suministrar valores para todos los
argumentos que no sean opcionales e incluir la lista de argumentos entre parntesis. Si no se proporcionan
argumentos, se puede omitir el parntesis.
La sintaxis para llamar a un procedimiento Function es la siguiente:
lvalue = functionname [( argumentlist )]
If (( functionname [( argumentlist )] / 3) <= expression ) Then
Cuando se llama a un procedimiento Function, no es necesario utilizar su valor devuelto, en cuyo caso se
ejecutan todas las acciones de la funcin, pero se omite el valor devuelto. A menudo, se llama as a MsgBox.

Crear un procedimiento que devuelve un valor
Para crear un procedimiento que devuelva un valor
1. Fuera de cualquier otro procedimiento, utilice una instruccin Function, seguida de una instruccin
End Function.
2. En la instruccin Function, siga la palabra clave Function con el nombre del procedimiento y a
continuacin la lista de parmetros entre parntesis.
3. A continuacin de parntesis incluya una clusula As para especificar el tipo de datos del valor
devuelto.
4. Coloque las instrucciones de cdigo del procedimiento entre las instrucciones Function y End
Function.
5. Utilice una instruccin Return para devolver el valor al cdigo de llamada.
El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo a partir de los valores
de los catetos.
Function hypotenuse(ByVal side1 As Single, ByVal side2 As Single) As
Single
Return Math.Sqrt((side1 ^ 2) + (side2 ^ 2))
End Function

El ejemplo siguiente muestra una llamada tpica a hypotenuse.
Dim testLength, testHypotenuse As Single
testHypotenuse = hypotenuse(testLength, 10.7)

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 110 | P g i n a

Para devolver un valor mediante la instruccin Return
1. Coloque una instruccin Return en el punto en el que finaliza la tarea del procedimiento.
2. Agregue detrs de la palabra clave Return una expresin que genere el valor que desea que se
devuelva al cdigo de llamada.
3. Puede tener ms de una instruccin Return en el mismo procedimiento.
El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo y la devuelve al cdigo
de llamada.

Para devolver un valor mediante Exit Function o End Function
1. En al menos un lugar del procedimiento Function, asigne un valor al nombre del procedimiento.
2. Al ejecutar una instruccin Exit Function o End Function, Visual Basic devuelve el valor asignado
ms recientemente al nombre del procedimiento.
3. Puede tener ms de una instruccin Exit Function en el mismo procedimiento, y puede mezclar las
instrucciones Return y Exit Function en el mismo procedimiento.
4. Puede tener slo una instruccin End Function en un procedimiento Function.









ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 111 | P g i n a

Manejador de excepciones
Visual Basic admite el control estructurado de excepciones (errores), que permite al programa detectar y
recuperarse posiblemente de los errores durante la ejecucin. Visual Basic utiliza una versin mejorada de la
sintaxis Try...Catch...Finally que ya est admitida por otros lenguajes como C++. El control estructurado de
excepciones combina una estructura de control moderna (similar a Select Case o While) con excepciones,
bloques de cdigo protegidos y filtros.
El control estructurado de excepciones, que es el mtodo recomendado de control de errores en Visual
Basic, facilita la tarea de crear y mantener programas mediante controladores de errores consistentes y
exhaustivos. El mtodo de control de excepciones no estructurado por medio de On Error puede degradar el
rendimiento de la aplicacin y puede dificultar la depuracin y el mantenimiento del cdigo.

Visual Basic admite el control (de errores) de excepciones tanto estructurado como no estructurado. La
introduccin de cdigos de control de excepciones en la aplicacin permite controlar la mayora de los
errores con los que pueden encontrarse los usuarios y permite que la aplicacin siga ejecutndose. Puede
utilizar control de errores estructurado y no estructurado para prever los posibles errores, y evitar as que
interfieran con la aplicacin.
Reflexione sobre el uso de mtodos de control de excepciones que utilicen operadores que puedan generar
una excepcin o que llamen o tengan acceso a otros procedimientos que puedan generar una excepcin.
Si se produce una excepcin en un mtodo que no est preparado para controlarla, la excepcin se
propagar de vuelta al mtodo de llamada o al mtodo anterior. Si el mtodo anterior tampoco tiene
controlador de excepciones, la excepcin se propagar de vuelta al llamador del mtodo, y as
sucesivamente. La bsqueda de un controlador continuar hasta la pila de llamadas, que es la serie de
procedimientos a los que se llama dentro de la aplicacin. Si sta tampoco encuentra un controlador para la
excepcin, se mostrar un mensaje de error y la aplicacin finalizar.

Nota: Un mtodo puede contener un mtodo de control de excepciones estructurado o uno no
estructurado, pero no ambos.

Control estructurado de excepciones
En el control estructurado de excepciones, los bloques de cdigo se encapsulan y cada uno de ellos tiene
uno o varios controladores asociados. Cada controlador especifica una forma de condicin de filtro para el
tipo de excepcin que controla. Cuando el cdigo de un bloque protegido genera una excepcin, se busca
por orden en el conjunto de controladores correspondientes y se ejecuta el primero que contenga una
condicin de filtro coincidente. Un mtodo puede tener varios bloques de control estructurado de
excepciones y dichos bloques pueden adems estar anidados.
La instruccin Try...Catch...Finally se utiliza especficamente para el control estructurado de excepciones.
Control no estructurado de excepciones
La instruccin On Error se utiliza especficamente para el control no estructurado de excepciones. En este
tipo de control, On Error se coloca al principio de un bloque de cdigo, y, entonces, tiene "mbito" sobre el
bloque; controla cualquier error que se produzca dentro del bloque. Si el programa encuentra otra
instruccin On Error, sta pasa a ser vlida e invalida a la primera.

Cmo elegir cundo usar control estructurado o no estructurado
El control estructurado de excepciones es simplemente eso: utilizar una estructura de control que contiene
excepciones, bloques aislados de cdigo y filtros para crear un mecanismo de control de excepciones. Esto
permite al cdigo diferenciar entre diversos tipos de errores y reaccionar de acuerdo con las circunstancias.
En el control estructurado de excepciones, una instruccin On Error al principio del cdigo controla todas las
excepciones.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 112 | P g i n a

El control estructurado de excepciones es significativamente ms verstil, robusto y flexible que el no
estructurado. Si es posible, utilice el control estructurado de excepciones. No obstante, quiz desee usar el
control no estructurado de excepciones bajo las siguientes circunstancias:
Cuando se actualiza una aplicacin escrita en una versin anterior de Visual Basic.
Cuando se desarrolla una versin preliminar o de borrador de una aplicacin y no importa si el
programa no se cierra correctamente.
Cuando se sabe de antemano, exactamente, qu provocar la excepcin.
Hay una fecha lmite, necesita trabajar con rapidez y prefiere sacrificar la flexibilidad a la velocidad.
Cuando el cdigo es trivial o tan corto que slo es necesario probar la bifurcacin del cdigo que
genera la excepcin.
Cuando es necesario utilizar la instruccin Resume Next, que no se admite en el control
estructurado de excepciones.
No es posible combinar el control estructurado de excepciones y el no estructurado en la misma funcin.
Si utiliza una instruccin On Error, no puede utilizar una instruccin Try...Catch en la misma funcin.
Independientemente de lo que elija para controlar las excepciones del cdigo, deber retroceder un paso y
examinar qu suposiciones hace el cdigo. Por ejemplo, cuando la aplicacin pide al usuario que escriba un
nmero de telfono, estn presentes las siguientes suposiciones:
El usuario escribir un nmero en lugar de caracteres.
El nmero tendr algo de formato.
El usuario no escribir ninguna cadena de tipo null.
El usuario tiene un nmero de telfono nico.
La entrada del usuario puede infringir cualquiera o todas estas suposiciones. Un cdigo robusto requiere un
control de excepciones adecuado, que permita que la aplicacin se recupere correctamente de la infraccin.
A menos que pueda garantizar que un mtodo nunca producir una excepcin, bajo ninguna circunstancia,
incluya un control de excepciones que ofrezca informacin. El control de excepciones debe ser
comprensible. Adems de afirmar que algo fue mal, los mensajes resultantes del control de excepciones
deben indicar porqu y dnde fue mal. Un mensaje poco informativo, del tipo de "Ocurri un error", slo
sirve para frustrar al usuario.

Tipos de errores
En Visual Basic, los errores (tambin denominados excepciones) se dividen en tres categoras: errores de
sintaxis, errores en tiempo de ejecucin y errores lgicos.

Errores sintcticos
Los errores de sintaxis son aqullos que aparecen mientras escribe el cdigo. Visual Basic comprueba su
cdigo cuando lo escribe en la ventana del Editor de cdigo y le avisa si comete algn error, como escribir
mal una palabra o utilizar un elemento del lenguaje incorrectamente. Los errores sintcticos son los errores
ms frecuentes. Se pueden corregir fcilmente en el entorno de codificacin en cuanto se producen.
Nota:
La instruccin Option Explicit es una medida para evitar los errores de sintaxis. Le obliga a declarar, por
anticipado, todas las variables que se vayan a utilizar en la aplicacin. De este modo, cuando se utilicen las
variables en el cdigo, cualquier error tipogrfico que se produzca se capturar de forma inmediata, y podr
corregirse.
Errores en tiempo de ejecucin
Los errores en tiempo de ejecucin son aquellos que aparecen solamente despus de la compilacin y la
ejecucin del cdigo. Pueden darse errores de este tipo, por ejemplo, en fragmentos de cdigo
aparentemente correctos, por no presentar errores sintcticos, pero que no se ejecutan correctamente. Por
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 113 | P g i n a

ejemplo, podra escribir correctamente una lnea de cdigo que abre un archivo. Pero, si el archivo est
daado, la aplicacin no podr ejecutar la funcin Open y se detendr su ejecucin. La mayora de los
errores de este tipo pueden corregirse modificando el cdigo que presenta errores, para despus compilarlo
y volver a ejecutarlo.
Errores lgicos
Los errores lgicos son aquellos que aparecen cuando la aplicacin est en funcionamiento. Son a menudo
resultados no deseados o inesperados en respuesta a acciones del usuario. Por ejemplo, una clave mal
escrita u otra influencia externa podra hacer que la aplicacin dejase de funcionar an siendo correctos los
parmetros, o que simplemente no funcionase. Por lo general, los errores lgicos son los ms difciles de
corregir, puesto que no siempre est claro dnde se originan.

Depuracin de cdigo fuente
Esta seccin trata sobre las caractersticas de depuracin integradas en Visual Studio.
Puede utilizar la ms importante de estas caractersticas, el depurador, para observar el comportamiento en
tiempo de ejecucin del programa y determinar la ubicacin de errores semnticos.
Con el depurador puede examinar el contenido de las variables del programa sin insertar llamadas
adicionales a funciones que lo muestren. De la misma forma, puede insertar un punto de interrupcin en el
cdigo para detener la ejecucin en el punto deseado.

Interrumpir la ejecucin
Cuando se depura una aplicacin con el depurador de Visual Studio, la aplicacin se est ejecutando o est
en modo de interrupcin. La mayora de las funciones del depurador, como la evaluacin de expresiones en
la ventana Inspeccin, slo estn disponibles en el modo de interrupcin.
El depurador interrumpe la ejecucin del programa cuando llega a un punto de interrupcin o cuando se
produce una excepcin. Puede interrumpir manualmente la ejecucin en cualquier momento. Si interrumpe
cuando se est ejecutando cdigo sin la fuente correspondiente, podr depurar en la ventana
Desensamblador.
Para interrumpir manualmente la ejecucin del programa
En el men Depurar, haga clic en Interrumpir todo.
El depurador detendr la ejecucin de todos los programas que se ejecutan bajo su control. Los programas
no terminan, y es posible reanudar su ejecucin en cualquier momento. El depurador y la aplicacin se
encuentran ahora en modo de interrupcin.
Si depura varios programas, un punto de interrupcin o el comando Interrumpir todos afecta de forma
predeterminada a todos los programas que se estn depurando. Puede cambiar esta configuracin
predeterminada si slo desea interrumpir el programa actual.
Para cambiar el comportamiento de la interrupcin cuando se depuran varios programas
1. En el men Herramientas, haga clic en Opciones.
2. En el cuadro de dilogo Opciones, seleccione la carpeta Depuracin y haga clic en la categora
General.
3. Active o desactive Cuando se interrumpe un proceso, se interrumpen todos los procesos.
4. Haga clic en Aceptar.

Iniciar la ejecucin
Para iniciar la depuracin
1. En el men Depurar, elija Inicio, Paso a paso por instrucciones o Paso a paso por procedimientos.
O bien
2. En una ventana de cdigo fuente, haga clic con el botn secundario del mouse (ratn) en una lnea
de cdigo ejecutable y elija Ejecutar hasta el cursor en el men contextual.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 114 | P g i n a

Si selecciona Iniciar, la aplicacin se iniciar y se ejecutar hasta que encuentre un punto de interrupcin.
Puede interrumpir la ejecucin en cualquier momento para examinar valores, modificar variables o
examinar el estado del programa.
Si selecciona Ir a instrucciones o Paso a paso por procedimientos, la aplicacin se iniciar y se interrumpir
en la primera lnea.
Si selecciona Ejecutar hasta el cursor, la aplicacin se iniciar y se ejecutar hasta que encuentre un punto
de interrupcin o la posicin del cursor, lo que encuentre primero. Puede establecer la posicin del cursor
en una ventana de cdigo fuente. En algunos casos, no se produce una interrupcin. Esto significa que la
ejecucin nunca lleg al cdigo en el que se encuentra el cursor.
Una solucin puede incluir varios proyectos. En ese caso, puede seleccionar el proyecto que se iniciar
mediante los comandos de ejecucin del men Depurar. Asimismo, puede iniciar un proyecto seleccionado
desde el Explorador de soluciones.
Puede utilizar el comando Iniciar sin depurar (en el men Depurar) para iniciar la ejecucin de un proyecto
sin el depurador.

Elegir un proyecto de inicio
El proyecto de inicio es el proyecto incluido en una solucin de Visual Studio que se inicia al seleccionar un
comando de ejecucin como Iniciar en el men Depurar.
Para elegir un proyecto de inicio
1. En el Explorador de soluciones, haga clic con el botn secundario del mouse (ratn) en un nombre
de proyecto y, en el men contextual, elija Establecer como proyecto de inicio.
2. Si desea depurar ms de un proyecto, puede elegir varios proyectos de inicio.
Para elegir varios proyectos de inicio
1. En el Explorador de soluciones, haga clic con el botn secundario del mouse en el nombre de la
solucin y, en el men contextual, haga clic en Propiedades.
Aparecer el cuadro de dilogo Pginas de propiedades de la solucin.
2. En el cuadro de dilogo Pginas de propiedades de la solucin, seleccione la opcin Proyectos de
inicio mltiples.
3. Bajo Proyectos de inicio mltiples se encuentra una cuadrcula con dos columnas, Proyecto y
Accin. En la columna accin:
1. Para cada proyecto que desee depurar, haga clic en la columna Accin y seleccione Iniciar.
2. Para ejecutar un proyecto sin depurarlo, haga clic en la columna Accin y seleccione Iniciar
sin depurar.
3. Si no desea ejecutar un proyecto, haga clic en la columna Accin y seleccione Ninguna.
4. Haga clic en Aceptar.

Puntos de interrupcin
Los puntos de interrupcin indican el depurador que una aplicacin debera interrumpirse, o hacer una
pausa durante la ejecucin, en cierto punto. Cuando se produce una interrupcin, se dice que el programa y
el depurador estn en modo de interrupcin.
Los puntos de seguimiento son una nueva caracterstica del depurador de Visual Studio. Un punto de
seguimiento es un punto de interrupcin con una accin personalizada asociada. Cuando se alcanza un
punto de seguimiento, el depurador realiza la accin asociada al punto de seguimiento en lugar de, o
adems de, interrumpir la ejecucin del programa.
Los puntos de seguimiento suelen usarse para imprimir un mensaje cuando el programa alcanza un punto
determinado. Los puntos de seguimiento pueden usarse para muchas de las finalidades de Trace, pero sin
que sea necesario modificar el cdigo. Otra diferencia reside en que los puntos de seguimiento slo
funcionan cuando est ejecutndose el depurador.



ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 115 | P g i n a

Glifos de puntos de interrupcin
Las ventanas de cdigo fuente y Desensamblador muestran la ubicacin de los puntos de interrupcin
mediante smbolos en el margen izquierdo que se denominan glifos. En la tabla siguiente se describen estos
glifos.
Si detiene el mouse sobre un glifo de punto de interrupcin, aparece una sugerencia que le ofrece ms
informacin. Esta informacin resulta de gran utilidad para saber ms acerca de los errores y advertencias
de los puntos de interrupcin.

Glifo Descripcin

Punto de interrupcin normal. El glifo relleno indica que el punto de interrupcin est
habilitado. El glifo vaco indica que est desactivado.

Punto de interrupcin avanzado. Habilitado/deshabilitado. El signo + indica que el punto de
interrupcin tiene por lo menos una caracterstica avanzada asociada a l, como por ejemplo
una condicin, recuento de visitas o filtro.

Punto de interrupcin asignado. Habilitado/deshabilitado. El punto de interrupcin se
establece en cdigo de ASP/ASP.NET y se asigna a un punto de interrupcin en la pgina
HTML correspondiente.

Punto de seguimiento. Habilitado/deshabilitado. Cuando se llega a este punto, se realiza una
accin especfica pero no se interrumpe la ejecucin del programa.

Punto de seguimiento avanzado. Habilitado/deshabilitado. El signo + indica que el punto de
seguimiento tiene por lo menos una caracterstica avanzada asociada a l, como una
condicin, recuento de visitas o filtro.

Punto de seguimiento asignado. Habilitado/deshabilitado. El punto de seguimiento se
establece en cdigo de ASP/ASP.NET y se asigna a un punto de seguimiento en la pgina
HTML correspondiente.

Error de punto de interrupcin o punto de seguimiento. La X indica que no se pudo establecer
el punto de interrupcin o punto de seguimiento debido a una condicin de error.

Advertencia de punto de interrupcin o de punto de seguimiento. El signo de admiracin
indica que no se pudo establecer un punto de interrupcin o punto de seguimiento debido a
una condicin temporal. Normalmente, esto significa que no se ha cargado el cdigo en la
ubicacin del punto de interrupcin o punto de seguimiento. Cuando se cargue el cdigo, se
habilitar el punto de interrupcin y el glifo cambiar.

Para establecer un punto de interrupcin simple (desde el men de acceso directo)
1. Dentro de una ventana de cdigo fuente, haga clic en una lnea de cdigo ejecutable donde desee
establecer un punto de interrupcin.
2. En el men de acceso directo, vaya a Punto de interrupcin y elija Insertar punto de interrupcin.
Para establecer un punto de interrupcin simple (desde el men Depurar)
1. Dentro de una ventana de cdigo fuente, haga clic en una lnea de cdigo ejecutable donde desee
establecer un punto de interrupcin.
2. En el men Depurar, elija Alternar puntos de interrupcin.

Manejo de excepciones
Una excepcin es una situacin anmala que se produce mientras se ejecuta un programa. Las excepciones
son, a menudo, indicaciones de problemas que deben depurarse. Cuando se produce una excepcin, el
depurador escribe un mensaje de excepcin en la ventana Resultados, salvo que est deshabilitada en el
cuadro de dilogo General, Depuracin, Opciones (Cuadro de dilogo).
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 116 | P g i n a

El depurador puede interrumpir la ejecucin cuando se produce una excepcin.
Si se produce una excepcin que no es ASP.NET y no se controla, el depurador siempre interrumpe
la ejecucin.
Puede indicar al depurador que interrumpa inmediatamente la ejecucin cuando se produce una
excepcin, antes de que se invoque un controlador.
Si est depurando con Cmo: Avanzar en Slo mi cdigo, tiene una tercera opcin. Puede indicar al
depurador que interrumpa en cualquier excepcin que no sea controlada por un controlador en
cdigo de usuario ("Mi cdigo").
ASP.NET tiene un controlador de excepciones de nivel superior que controla las excepciones para
mostrar las pginas de error a los usuarios del explorador. Ese controlador de excepciones de nivel
superior detendr una excepcin no controlada para que no interrumpa el depurador a menos que
se active Slo mi cdigo. Asegrese de habilitar Slo mi cdigo en la depuracin de ASP.NET.
Recuerde que si se produce una excepcin y no se controla, el depurador siempre se interrumpe. La
configuracin no controlada por el usuario no cambia esta situacin.
El depurador de Visual Studio reconoce las siguientes categoras de excepciones:
Excepciones de C++
Excepciones de Common Language Runtime
Ayudante para la depuracin administrada
Comprobaciones nativas en tiempo de ejecucin
Excepciones Win32
La mayora de las excepciones tienen controladores que estn diseados para responder a una excepcin
cuando se produce. Esto da al programa la ocasin de recuperarse de la situacin anmala. Las
comprobaciones nativas en tiempo de ejecucin no tienen controladores.
En una aplicacin de Visual Basic, el depurador representa todos los errores como excepciones, incluso si
utiliza controladores de error de tipo On Error.
Para Visual Basic y C#, el depurador presenta ahora una nueva caracterstica Ayudante de excepciones que
proporciona ms informacin cuando se produce una excepcin.

Control estructurado de excepciones
Visual Basic admite el control estructurado de excepciones, que puede utilizar para crear y mantener
programas mediante controladores de errores consistentes y exhaustivos. El control estructurado de
excepciones es un cdigo diseado para detectar y dar respuesta a los errores que se producen durante la
ejecucin, mediante la combinacin de una estructura de control (similar a Select Case o While) con
excepciones, bloques de cdigo protegidos y filtros.
Con la instruccin Try...Catch...Finally, puede proteger bloques de cdigo que tienen posibilidades de
producir errores. Los controladores de excepciones pueden anidarse, y las variables que se declaren en cada
bloque tendrn un mbito local.

Instruccin Try...Catch...Finally
El cdigo siguiente muestra la estructura de la instruccin Try...Catch...Finally.

Try
' Starts a structured exception handler.
' Place executable statements that may generate
' an exception in this block.
Catch '[optional filters]
' This code runs if the statements listed in
' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 117 | P g i n a

' This code always runs immediately before
' the Try statement exits.
End Try
' Ends a structured exception handler.

El bloque Try de un controlador de excepciones Try...Catch...Finally contiene la seccin de cdigo que se va a
controlar para las excepciones. Si aparece un error durante la ejecucin de esta seccin, Visual Basic
examina cada instruccin Catch dentro de Try...Catch...Finally hasta que encuentra una con una condicin
que coincida con el error. Si la encuentra, el control se transferir a la primera lnea de cdigo del bloque
Catch. Si no se encuentra una instruccin Catch coincidente, la bsqueda continuar en las instrucciones
Catch del bloque Try...Catch...Finally exterior que contiene el bloque en el que ocurri la excepcin. Este
proceso se prolongar a lo largo de toda la pila hasta que se encuentre un bloque Catch coincidente en el
procedimiento actual. De no encontrarse, se producira un error.
El cdigo de la seccin Finally siempre se ejecuta en ltimo lugar, inmediatamente antes de que el bloque de
control de errores pierda su mbito, con independencia de que se ejecute el cdigo de los bloques Catch.
Site el cdigo de limpieza (el cdigo que cierra los archivos y libera los objetos, por ejemplo) en la seccin
Finally. Si no necesita detectar las excepciones, pero debe limpiar los recursos, considere el uso de la
instruccin Using en lugar de una seccin Finally.

Filtrar errores en el bloque Catch
Los bloques Catch ofrecen tres opciones para filtrar errores especficos. En una de ellas, los errores se filtran
basndose en la clase de la excepcin (en este caso ClassLoadException), como se muestra en el siguiente
cdigo.
Try
' "Try" block.
Catch e as ClassLoadException
' "Catch" block.
Finally
' "Finally" block.
End Try

Si se produce un error ClassLoadException, se ejecuta el cdigo del bloque Catch especificado.
En la segunda opcin para filtrar errores, la seccin Catch puede filtrar cualquier expresin condicional. Un
uso comn de este tipo de filtro Catch consiste en comprobar nmeros de error especficos, como se
muestra en el cdigo siguiente.
Try
' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
' "Catch" block.
Finally
' "Finally" block.
End Try

Cuando Visual Basic encuentra el controlador de errores coincidente, ejecuta el cdigo de este controlador y
pasa el control al bloque Finally.

Nota: Al buscar un bloque Catch que controle una excepcin, se evala el controlador de cada bloque hasta
encontrar uno que coincida. Puesto que estos controladores pueden ser llamadas a funciones, es posible
que se produzcan efectos secundarios no esperados; por ejemplo, una llamada de este tipo puede cambiar
una variable pblica y provocar que sta se utilice en el cdigo de un bloque Catch distinto que termina
controlando la excepcin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 118 | P g i n a


La tercera alternativa consiste en combinar las dos primeras opciones y utilizar ambas para el control de
excepciones. Las instrucciones Catch deben ir de lo ms especfico a lo menos especfico. Un bloque Catch
por s mismo detectar todas las excepciones derivadas de Exceptiony, por consiguiente, siempre debe ser el
ltimo bloque antes de Finally.

Bifurcacin fuera de bloques TryCatch
Es posible bifurcar a partir de un bloque Catch de nuevo en la instruccin Try inicial o la instruccin End Try,
pero no es posible bifurcar en un bloque TryCatch de inclusin. Esto se muestra aqu:

Ejemplo de controlador estructurado de excepciones
En el siguiente ejemplo se muestra otro controlador de errores sencillo que utiliza la instruccin
Try...Catch...Finally.

Option Strict On
Imports System.IO

Module Module1
Private Const FileName As String = "TestFile.data"

Public Sub Main()

' First, create a new data file and write some data to the file.
' 1. Create the new, empty data file.
If File.Exists(FileName) Then
File.Delete(FileName)
End If
Dim fs As New FileStream(FileName, FileMode.CreateNew)

' 2. Create a BinaryWriter object for the data.
Dim writer As New BinaryWriter(fs)

' 3. Write some sample data to the file.
For i = 0 To 10
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 119 | P g i n a

writer.Write(i)
Next i
writer.Close()
fs.Close()

' Now read from the file you just made.
' 1. Create a BinaryReader object for the data stream.
fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
Dim reader As New BinaryReader(fs)

' 2. Read data from TestFile.data. The loop terminates with an
' EndOfStreamException when an attempt is made to read past
' the end of the stream.
Try
' This loop terminates with an EndOfStreamException when it
' reaches the end of the stream.
While True
Console.WriteLine(reader.ReadInt32())
End While
Console.WriteLine("The data was read with no error.")
' 3. Report the first error that is caught, if there is one.
Catch eosExcep As EndOfStreamException
' This Catch block is executed when the reader attempts
' to read past the end of the stream.
Console.WriteLine("End-of-stream exception occurred.")
Catch IOExcep As System.IO.IOException
' For this Catch block, some other error occurred before
' the end of stream was reached. Print the standard
' exception message.
Console.WriteLine(IOExcep.Message)
Finally
' The Finally block is always executed.
Console.WriteLine("Executing the Finally block.")
reader.Close()
fs.Close()
End Try
End Sub

End Module

El bloque Finally siempre se ejecuta, con independencia de cualquier otra accin que tenga lugar en los
bloques Catch anteriores. No puede utilizar Resume o Resume Next en el control estructurado de
excepciones.

Nota: En el ejemplo anterior, cualquier excepcin distinta de la clase IOException o la clase
EndOfStreamException se propaga de nuevo al llamador no controlado.

Clase de excepcin de Visual Basic
Para facilitar el uso del control estructurado de excepciones, Visual Basic ofrece la posibilidad de separar el
cdigo estndar del cdigo de control de excepciones. El cdigo de control de excepciones obtiene acceso a
una instancia de la clase Exception, que permite recuperar informacin de cualquier excepcin que se
detecte.
Cada vez que se produce una excepcin, se establece el objeto Err global y se crea una nueva instancia de la
clase Exception.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 120 | P g i n a

Las propiedades de la clase Exception ayudan a identificar la ubicacin en el cdigo, el tipo y la causa de las
excepciones. Por ejemplo, la propiedad StackTrace muestra una lista de los mtodos que fueron invocados
antes de que se produjese la excepcin, lo que ayuda a detectar el lugar del cdigo en el que ocurri el
error. La propiedad Message devuelve un mensaje de texto que describe el error; puede modificar este
mensaje para que sea ms fcil de entender. Si no proporciona una cadena de texto del mensaje de error, se
utiliza el valor predeterminado. HelpLink obtiene o establece un vnculo en un archivo de ayuda asociado.
Source obtiene o establece una cadena que contiene el nombre del objeto que produce el error o el nombre
del ensamblado donde se origin la excepcin.

Nota: Procure no escribir cdigo para comprobar mensajes de error especficos, ya que los mensajes pueden
cambiar entre las distintas versiones de la clase que los gener en un principio. En vez de esto, pruebe el
tipo de excepcin o utilice el nmero de excepcin del objeto Err global.

Propiedades de la clase Excepcin
La tabla siguiente muestra y describe propiedades de la clase Exception.
Propiedad Descripcin
HelpLink Obtiene o establece un vnculo en el archivo de ayuda asociado a esta excepcin.
HResult
Obtiene o establece HRESULT, un valor numrico codificado asignado a una excepcin
especfica.
InnerException Obtiene la instancia Exception que produjo la excepcin actual.
Message Obtiene un mensaje que describe la excepcin actual.
Source Obtiene o establece el nombre de la aplicacin u objeto que produjo el error.
StackTrace
Obtiene una representacin de la cadena de los marcos en la pila de llamadas en el
momento en el que se produjo la excepcin actual.
TargetSite Obtiene el mtodo que produjo la excepcin actual.

Controles WinForm
Label
Nota importante: El control ToolStripLabel reemplaza y agrega funcionalidad al control Label. Puede utilizar
ToolStripLabel con otros nuevos controles como ToolStripDropDown. Sin embargo, el control Label se
conserva a efectos de compatibilidad con versiones anteriores y de uso futuro, segn sea el caso.

Los controles Label se utilizan normalmente para proporcionar texto descriptivo de un control. Por ejemplo,
se puede utilizar un objeto Label para agregar texto descriptivo para un control TextBox e informar al
usuario del tipo de datos que se espera tener en el control. Los controles Label se pueden utilizar tambin
para agregar texto descriptivo a un Form para proporcionar al usuario informacin til. Por ejemplo, se
puede agregar Label en la parte superior de Form que proporciona al usuario instrucciones sobre cmo
especificar datos en los controles del formulario. Los controles Label se pueden utilizar tambin para
mostrar informacin en tiempo de ejecucin sobre el estado de una aplicacin. Por ejemplo, se puede
agregar un control Label a un formulario para mostrar el estado de cada archivo cuando se procesa una lista
de archivos.

Label participa en el orden de tabulacin de un formulario, pero no recibe el foco (el siguiente control del
orden de tabulacin recibe el enfoque). Por ejemplo, si la propiedad UseMnemonic est establecida en true
y se especifica un carcter mnemotcnico (el primer carcter despus del smbolo &) en la propiedad Text
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 121 | P g i n a

del control, cuando el usuario presiona ALT + la tecla mnemotcnica, el foco se mueve hacia el siguiente
control del orden de tabulacin. Esta caracterstica permite navegar por un formulario mediante el teclado.
Adems de mostrar texto, el control Label puede mostrar asimismo una imagen mediante la propiedad
Image, o una combinacin de las propiedades ImageIndex y ImageList.

Nota: Para que Label sea transparente, hay que establecer la propiedad BackColor en Color.Transparent. Al
utilizar una etiqueta transparente, hay que utilizar slo el sistema de coordenadas del dispositivo actual para
dibujar en el contenedor; en caso contrario, es posible que se pinte incorrectamente el fondo de Label.

Ejemplos
En el siguiente ejemplo de cdigo se muestra cmo crear un control Label que tenga un borde
tridimensional y una imagen. La imagen se muestra mediante las propiedades ImageList y ImageIndex. El
control tambin dispone de un ttulo con un carcter de tecla de acceso especificado. El cdigo de ejemplo
utiliza las propiedades PreferredHeight y PreferredWidth para ajustar correctamente el tamao del control
Label. En este ejemplo se requiere que se haya creado una propiedad ImageList denominada imageList1 y
que sta haya cargado dos imgenes. En el ejemplo se requiere tambin que el cdigo pertenezca a un
formulario que tenga el espacio de nombres System.Drawing agregado a su cdigo.

Public Sub CreateMyLabel()
' Create an instance of a Label.
Dim label1 As New Label()

' Set the border to a three-dimensional border.
label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
' Set the ImageList to use for displaying an image.
label1.ImageList = imageList1
' Use the second image in imageList1.
label1.ImageIndex = 1
' Align the image to the top left corner.
label1.ImageAlign = ContentAlignment.TopLeft

' Specify that the text can display mnemonic characters.
label1.UseMnemonic = True
' Set the text of the control and specify a mnemonic character.
label1.Text = "First &Name:"

' Set the size of the control based on the PreferredHeight and
PreferredWidth values.
label1.Size = New Size(label1.PreferredWidth, label1.PreferredHeight)

'...Code to add the control to the form...
End Sub

TextBox
Con el control TextBox, el usuario puede escribir texto en una aplicacin. Este control tiene funcionalidad
adicional que no se encuentra en el control de cuadro de texto de Windows estndar, como el
enmascaramiento de caracteres de contrasea y la edicin de mltiples lneas.
Habitualmente, se utiliza un control TextBox para mostrar, o aceptar como entrada, una sola lnea de texto.
Es posible utilizar las propiedades Multiline y ScrollBars para permitir que se muestren o escriban varias
lneas de texto. Establezca las propiedades AcceptsTab y AcceptsReturn en true con el fin de permitir una
mayor manipulacin de texto en un control TextBox multilnea.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 122 | P g i n a


Nota: Debe establecer la propiedad Multiline en true para ajustar el alto del control TextBox. Puede ajustar
el alto estableciendo la propiedad Size.

Para limitar la cantidad de texto escrito en un control TextBox, establezca la propiedad MaxLength en un
nmero de caracteres especfico. Los controles TextBox se pueden utilizar tambin para aceptar contraseas
y otra informacin delicada. Es posible utilizar la propiedad PasswordChar para enmascarar caracteres
escritos en una versin de una sola lnea del control. Utilice la propiedad CharacterCasing para permitir al
usuario escribir slo maysculas, slo minsculas o una combinacin de caracteres en maysculas y
minsculas en el control TextBox.
Para desplazar el contenido de TextBox hasta que el cursor (smbolo de intercalacin) est en la regin
visible del control, puede usar el mtodo ScrollToCaret. Para seleccionar un intervalo de texto en el cuadro
de texto, puede utilizar el mtodo Select.
Para restringir que se escriba texto en un control TextBox, se puede crear un controlador de eventos para el
evento KeyDown con el fin de validar cada carcter escrito en el control. Tambin se puede restringir toda
entrada de datos en un control TextBox; para ello, establezca la propiedad ReadOnly en true.

Ejemplos
En el siguiente ejemplo de cdigo se crea un control TextBox multilnea con barras de desplazamiento
verticales. En este ejemplo se utilizan las propiedades AcceptsTab, AcceptsReturn y Dock para hacer que el
control de cuadro de texto multilnea sea til para crear documentos de texto.
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms

Public Class Form1
Inherits Form

Dim textBox1 As TextBox

Public Sub New()
InitializeComponent()
End Sub

Private Sub InitializeComponent()

Me.textBox1 = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
' textBox1
'
Me.textBox1.AcceptsReturn = True
Me.textBox1.AcceptsTab = True
Me.textBox1.Dock = System.Windows.Forms.DockStyle.Fill
Me.textBox1.Multiline = True
Me.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
'
' Form1
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 123 | P g i n a

'
Me.ClientSize = New System.Drawing.Size(284, 264)
Me.Controls.Add(Me.textBox1)
Me.Text = "TextBox Example"
Me.ResumeLayout(False)
Me.PerformLayout()

End Sub

End Class

ComboBox
ComboBox permite al usuario seleccionar un elemento en una lista desplegable o tambin escribir texto
nuevo en el cuadro de texto del control.
Las propiedades IsEditable e IsReadOnly especifican cmo se comporta ComboBox cuando el usuario realiza
una de las acciones siguientes:
Escribe una cadena para seleccionar un elemento de ComboBox.
Escribe una cadena que no se corresponde con ningn elemento de ComboBox.
Selecciona parte de la cadena que aparece en el cuadro de texto.
Copia o pega un valor en el cuadro de texto.
En la tabla siguiente se describen las acciones que el usuario puede o no llevar a cabo en funcin de los
valores de las propiedades IsEditable e IsReadOnly.


IsReadOnly es true IsReadOnly es false
IsEditable
es true
No puede seleccionar un elemento de
ComboBox escribiendo una cadena.
No puede escribir una cadena que no se
corresponda con un elemento de
ComboBox.
Puede seleccionar parte de la cadena en
el cuadro de texto de ComboBox.
Puede copiar la cadena del cuadro de
texto de ComboBox, pero no puede
pegar una cadena en el cuadro de texto
de ComboBox.
Puede seleccionar un
elemento de ComboBox
escribiendo una cadena.
Puede escribir una cadena
que no se corresponda con
ningn elemento de
ComboBox.
Puede seleccionar parte de la
cadena en el cuadro de texto
de ComboBox.
Puede copiar o pegar la
cadena en el cuadro de texto
de ComboBox.
IsEditable
es false
Puede seleccionar un elemento de
ComboBox escribiendo una cadena.
No puede escribir una cadena que no se
corresponda con un elemento de
ComboBox.
No puede seleccionar parte de la cadena
de ComboBox.
No puede copiar ni pegar la cadena en
ComboBox.
Puede seleccionar un
elemento de ComboBox
escribiendo una cadena.
No puede escribir una cadena
que no se corresponda con un
elemento de ComboBox.
No puede seleccionar parte
de la cadena de ComboBox.
No puede copiar ni pegar la
cadena en ComboBox.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 124 | P g i n a

La propiedad IsReadOnly solo tiene efecto si IsEditable es true.
ComboBox es un objeto de tipo ItemsControl, por lo que puede mostrar otro contenido distinto de cadenas
simples. Por ejemplo, puede crear un objeto ComboBox que contenga una lista de imgenes. Cuando el
objeto ComboBox contiene elementos que no son cadenas, puede aparecer una cadena sin sentido en
ComboBox cuando la lista desplegable est oculta. Para mostrar una cadena en el objeto ComboBox cuando
contiene elementos que no son cadenas, utilice la propiedad adjunta TextSearchText o TextSearchTextPath.
Modelo de contenido: ComboBox es ItemsControl. Sus propiedades de contenido son Items e ItemsSource.
ListBox
ListBox es un ItemsControl. Sus propiedades de contenido son Items e ItemsSource.
ListBox es un control que contiene una coleccin de elementos. Hay ms de un elemento visible en ListBox,
a diferencia de ComboBox, que slo tiene el elemento seleccionado visible a menos que la propiedad
IsDropDownOpen sea true. La propiedad SelectionMode determina si hay ms de un elemento en ListBox
seleccionable a la vez.
La propiedad SelectionMode determina cuntos elementos de la lista puede seleccionar el usuario de una
vez. Puede establecer la propiedad en Single (valor predeterminado), Multiple o Extended. En la tabla
siguiente se describe el comportamiento de estos valores de enumeracin.

Valor Descripcin
Single El usuario slo puede seleccionar a la vez un elemento.
Multiple El usuario puede seleccionar varios elementos sin mantener presionada una tecla
modificadora.
Extended El usuario puede seleccionar varios elementos consecutivos manteniendo presionada la tecla
MAYS o elementos no consecutivos manteniendo presionada la tecla CTRL y haciendo clic en
los elementos.
Los controles ListBox se utilizan a menudo con enlace de datos.
Mostrar un gran nmero de elementos puede producir problemas de rendimiento.
Ejemplos
En el ejemplo siguiente se crea un objeto ListBox y se suscribe al evento SelectionChanged.
Private Sub PrintText(ByVal sender As Object, ByVal e As
SelectionChangedEventArgs)

Dim lbsender As ListBox
Dim li As ListBoxItem

lbsender = CType(sender, ListBox)
li = CType(lbsender.SelectedItem, ListBoxItem)
tb.Text = " You selected " & li.Content.ToString & "."
End Sub

Button
Button es ContentControl. Su propiedad de contenido es Content.

Administre el evento Click para responder cuando el usuario hace clic en Button.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 125 | P g i n a

El mtodo OnMouseLeftButtonDown marca el evento MouseLeftButtonDown como administrado. Para
responder al evento MouseLeftButtonDown, asocie un controlador de eventos al evento
PreviewMouseLeftButtonDown o llame a AddHandler(RoutedEvent, Delegate, Boolean) con
handledEventsToo establecido en true.
Ejemplos
El ejemplo siguiente muestra tres botones que responden a los clics de tres maneras diferentes.
Desplazar: el primer botn cambia de color cuando el usuario se desplaza con el mouse sobre el
botn.
Presionar: el segundo botn requiere que se presione el mouse mientras el puntero del mouse est
encima del botn.
Soltar: el tercero no restablece el color de fondo de los botones hasta que se presione el mouse y
se suelte el botn.


Private Sub OnClick1(ByVal sender As Object, ByVal e As RoutedEventArgs)
btn1.Background = Brushes.LightBlue
End Sub

Private Sub OnClick2(ByVal sender As Object, ByVal e As RoutedEventArgs)
btn2.Background = Brushes.Pink
End Sub

Private Sub OnClick3(ByVal sender As Object, ByVal e As RoutedEventArgs)
btn1.Background = Brushes.Pink
btn2.Background = Brushes.LightBlue
End Sub

DateTimePicker
El control DateTimePicker de formularios Windows Forms permite al usuario seleccionar un solo
elemento de una lista de fechas y horas. Cuando se utiliza para representar una fecha, aparece en dos
partes: una lista desplegable con una fecha representada como texto y una cuadrcula, que aparece al
hacer clic en la flecha hacia abajo que se encuentra junto a la lista.

Propiedades principales
Si desea que DateTimePicker aparezca como un control para seleccionar y editar las horas en lugar de las
fechas, establezca la propiedad ShowUpDown en true la propiedad Format en Time.
Cuando la propiedad ShowCheckBox se establece en true, se muestra una casilla junto a la fecha
seleccionada en el control. Cuando se comprueba la casilla, se puede actualizar el valor de fecha y hora
seleccionado. Cuando la casilla est vaca, el valor se muestra no disponible.
El control MaxDate y las propiedades MinDate determinan el intervalo de fechas y horas. La propiedad
Value contiene la fecha y la hora actuales en las que se establece el control. Los valores se pueden mostrar
en cuatro formatos establecidos por la propiedad Format: Long, Short, Time o Custom. Si est seleccionado
un formato personalizado, debe establecer la propiedad CustomFormat en una cadena adecuada.

Mostrar una fecha con un formato personalizado
El control DateTimePicker de formularios Windows Forms proporciona flexibilidad para dar formato a la
presentacin de fechas y horas en el control. La propiedad Format le permite seleccionar entre formatos
predefinidos, que se enumeran en DateTimePickerFormat. Si ninguno de ellos es adecuado para lograr el
objetivo deseado, puede crear estilos de formato propios utilizando los caracteres de formato que se
enumeran en CustomFormat.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 126 | P g i n a

Para mostrar un formato personalizado
1. Establezca la propiedad Format en DateTimePickerFormat.Custom.
2. Establezca la propiedad CustomFormat como una cadena de formato.
DateTimePicker1.Format = DateTimePickerFormat.Custom
' Display the date as "Mon 26 Feb 2001".
DateTimePicker1.CustomFormat = "ddd dd MMM yyyy"

Para agregar texto al valor con formato
Utilice las comillas sencillas para agregar cualquier carcter que no sea un carcter de formato,
como "M" o un delimitador como ":". Por ejemplo, la siguiente cadena de formato muestra la
fecha actual con el formato "Today is: 05:30:31 Friday March 03, 2001" en la referencia cultural
Ingls (Estados Unidos).
DateTimePicker1.CustomFormat = "'Today is:' hh:mm:ss dddd MMMM dd, yyyy"

Dependiendo del valor de la referencia cultural, se pueden cambiar los caracteres que no estn rodeados
de comillas simples. Por ejemplo, la cadena de formato anterior muestra la fecha actual con el formato
"Today is: 05:30:31 Friday March 03, 2001" en la referencia cultural Ingls (Estados Unidos). Observe que
los primeros dos puntos estn encerrados entre comillas simples, dado que no pretenden ser un carcter
delimitador como en "hh:mm:ss". En otra referencia cultural, el formato puede aparecer como "Today is:
05.30.31 Friday March 03, 2001".

Establecer y devolver fechas
La fecha u hora seleccionada actualmente en el control DateTimePicker de formularios Windows Forms
est determinada por la propiedad Value. Puede establecer la propiedad Value antes de que se muestre
el control (por ejemplo, en tiempo de diseo o en el evento Load del formulario) para determinar cul
ser la fecha seleccionada inicialmente en el control. De forma predeterminada, la propiedad Value del
control se establece en la fecha actual. Si cambia la propiedad Value del control mediante cdigo, el
control se actualizar automticamente en el formulario para reflejar la nueva configuracin.
La propiedad Value devuelve como valor una estructura DateTime. Hay varias propiedades de la
estructura DateTime que devuelven informacin especfica acerca de la fecha que se muestra. Estas
propiedades slo pueden utilizarse para devolver un valor; no las utilice para establecer valores.
Para los valores de fecha, las propiedades Month, Day y Year devuelven valores enteros para las
correspondientes unidades de tiempo de la fecha seleccionada. La propiedad DayOfWeek
devuelve un valor que indica el da de la semana seleccionado (los posibles valores aparecen en
la lista de la enumeracin DayOfWeek).
Para los valores de tiempo, las propiedades Hour, Minute, Second y Millisecond devuelven
valores enteros para esas unidades de tiempo.
Para establecer el valor de fecha y hora del control
Establezca la propiedad Value en un valor de fecha u hora.
DateTimePicker1.Value = New DateTime(2001, 10, 20)

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 127 | P g i n a

Para devolver el valor de fecha y hora
Llame a la propiedad Text para devolver el valor completo con el formato que tiene en el control
o llame al mtodo correspondiente de la propiedad Value para devolver una parte del valor.
Utilice ToString para convertir la informacin en una cadena que puede mostrarse al usuario.
MessageBox.Show("The selected value is ", DateTimePicker1.Text)
MessageBox.Show("The day of the week is ",
DateTimePicker1.Value.DayOfWeek.ToString)
MessageBox.Show("Millisecond is: ",
DateTimePicker1.Value.Millisecond.ToString)

GroupBox
GroupBox muestra un marco alrededor de un grupo de controles con o sin ttulo. Utilice GroupBox para
agrupar de forma lgica una coleccin de controles en un formulario. El cuadro de grupo es un control
contenedor que puede utilizarse para definir grupos de controles.
El uso habitual de un cuadro de grupo es contener un grupo lgico de controles RadioButton. Si dispone
de dos cuadros de grupo, cada uno de los cuales contiene diversos botones de opciones (tambin
conocidos como botones radio), ambos grupos de botones se excluirn mutuamente y establecern un
valor de opcin por grupo.
Se pueden agregar controles a GroupBoxmediante el mtodo Add de la propiedad Controls.
Nota: Slo se pueden seleccionar o slo pueden recibir el foco los controles que estn contenidos el control
GroupBox. No se puede seleccionar ni puede recibir el foco todo el control GroupBox.

El control GroupBox no puede mostrar una barra de desplazamiento. Si necesita un control similar a
GroupBox que puede contener una barra de desplazamiento, vea el control Panel.

Ejemplo
En el ejemplo de cdigo siguiente se crea una instancia de GroupBox y de dos controles RadioButton. Los
botones de radio se agregan al cuadro de grupo y ste se agrega a Form.

Private Sub InitializeMyGroupBox()
' Create and initialize a GroupBox and a Button control.
Dim groupBox1 As New GroupBox()
Dim button1 As New Button()
button1.Location = New Point(20, 10)

' Set the FlatStyle of the GroupBox.
groupBox1.FlatStyle = FlatStyle.Flat

' Add the Button to the GroupBox.
groupBox1.Controls.Add(button1)

' Add the GroupBox to the Form.
Controls.Add(groupBox1)

' Create and initialize a GroupBox and a Button control.
Dim groupBox2 As New GroupBox()
Dim button2 As New Button()
button2.Location = New Point(20, 10)
groupBox2.Location = New Point(0, 120)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 128 | P g i n a


' Set the FlatStyle of the GroupBox.
groupBox2.FlatStyle = FlatStyle.Standard

' Add the Button to the GroupBox.
groupBox2.Controls.Add(button2)

' Add the GroupBox to the Form.
Controls.Add(groupBox2)
End Sub
Panel
Panel es un control que contiene otros controles. Se puede utilizar Panel para agrupar colecciones de
controles, como un grupo de controles RadioButton. Al igual que sucede con otros controles
contenedores, como el control GroupBox, si la propiedad Enabled del control Panel est establecida en
false, los controles contenidos dentro de Panel tambin se deshabilitarn.
El control Panel se muestra de forma predeterminada sin bordes. Para proporcionar un borde estndar o
tridimensional, se utiliza la propiedad BorderStyle para distinguir el rea del panel de otras reas del
formulario. Debido a que el control Panel deriva de la clase ScrollableControl, se puede utilizar la
propiedad AutoScroll para habilitar barras de desplazamiento en el control Panel. Cuando la propiedad
AutoScroll est establecida en true, es posible desplazarse a cualquier control situado dentro de Panel,
aunque fuera de su regin visible, con las barras de desplazamiento proporcionadas.
El control Panel no muestra ningn ttulo. Si necesita un control similar a Panel que puede mostrar un
ttulo, vea el control GroupBox.
Ejemplos
En el ejemplo de cdigo siguiente se crea un control Panel, y se agrega Label y TextBox a Panel. El control
Panel se muestra con un borde tridimensional para distinguir dnde est situado el control Panel en
relacin con otros objetos del formulario. En este ejemplo se requiere que se llame al mtodo definido en
este ejemplo desde dentro de un formulario existente y que se haya agregado el espacio de nombres
System.Drawing al cdigo fuente para el formulario.

Public Sub CreateMyPanel()
Dim panel1 As New Panel()
Dim textBox1 As New TextBox()
Dim label1 As New Label()

' Initialize the Panel control.
panel1.Location = New Point(56, 72)
panel1.Size = New Size(264, 152)
' Set the Borderstyle for the Panel to three-dimensional.
panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D

' Initialize the Label and TextBox controls.
label1.Location = New Point(16, 16)
label1.Text = "label1"
label1.Size = New Size(104, 16)
textBox1.Location = New Point(16, 32)
textBox1.Text = ""
textBox1.Size = New Size(152, 20)

' Add the Panel control to the form.
Me.Controls.Add(panel1)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 129 | P g i n a

' Add the Label and TextBox controls to the Panel.
panel1.Controls.Add(label1)
panel1.Controls.Add(textBox1)
End Sub

Checkbox
Utilice un control CheckBox para dar al usuario una opcin del tipo verdadero/falso o s/no. El control
CheckBox de casilla de verificacin puede mostrar una imagen o texto, o ambos.
Los controles CheckBox y RadioButton tienen una funcin similar: ambos permiten al usuario elegir de
una lista de opciones. Los controles CheckBox permiten al usuario elegir una combinacin de opciones.
Por otra parte, los controles RadioButton permiten al usuario elegir a partir de opciones que se excluyen
mutuamente.
La propiedad Appearance determina si la casilla de verificacin CheckBox como un control CheckBox
tpico o como un botn.
La propiedad ThreeState determina si el control admite dos o tres estados. Utilice la propiedad Checked
para obtener o establecer el valor de un control CheckBox de casilla de verificacin de dos estados y use
la propiedad CheckState para obtener o establecer el valor de un control CheckBox de casilla de
verificacin de tres estados.
Nota: Si se establece la propiedad ThreeState en true, la propiedad Checked devuelve true para los estados
activado o indeterminado.

La propiedad FlatStyle determina el estilo y el aspecto del control. Si la propiedad FlatStyle se establece en
FlatStyleSystem, el sistema operativo del usuario determina la apariencia del control.

Nota: Cuando se establece la propiedad FlatStyle en FlatStyle.System, se omite la propiedad CheckAlign y se
muestra el control con la alineacin ContentAlignment. MiddleLeft o ContentAlignment.MiddleRight. Si se
establece la propiedad CheckAlign en una de las alineaciones a la derecha, se muestra el control con la
alineacin ContentAlignment.MiddleRight; de lo contrario, se muestra con la alineacin
ContentAlignment.MiddleLeft.

A continuacin se describe en qu consiste un estado indeterminado. Dispone de un control CheckBox que
determina si el texto seleccionado en un control RichTextBox est en negrita. Cuando seleccione texto,
puede hacer clic en la casilla de verificacin CheckBox para poner en negrita la seleccin. De forma parecida,
al seleccionar parte del texto, la casilla CheckBox muestra si el texto seleccionado est en negrita. Si el texto
seleccionado contiene texto con formato normal y con formato de negrita, la casilla de verificacin
CheckBox tendr un estado indeterminado.

Ejemplos
En el siguiente ejemplo de cdigo se crea y se inicializa un control CheckBox, se le da la apariencia de un
botn de alternar, se establece AutoCheck en false y se agrega a un formulario Form.

Public Sub InstantiateMyCheckBox()
' Create and initialize a CheckBox.
Dim checkBox1 As New CheckBox()

' Make the check box control appear as a toggle button.
checkBox1.Appearance = Appearance.Button

' Turn off the update of the display on the click of the control.
checkBox1.AutoCheck = False
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 130 | P g i n a


' Add the check box control to the form.
Controls.Add(checkBox1)
End Sub 'InstantiateMyCheckBox

RadioButton
El control RadioButton puede mostrar texto, Image o ambos.
Cuando el usuario selecciona un botn de opcin dentro de un grupo, los otros se borran automticamente.
Todos los controles RadioButton de un contenedor determinado, como Form, constituyen un grupo. Para
crear varios grupos en un formulario, coloque cada grupo en su propio contenedor, como un control
GroupBox o Panel.
Los controles RadioButton y CheckBox tienen una funcin similar; es decir, ofrecen opciones que el usuario
puede activar o desactivar. La diferencia consiste en que se pueden seleccionar mltiples controles
CheckBox al mismo tiempo, mientras que los botones de opcin se excluyen mutuamente.
Utilice la propiedad Checked para obtener o establecer el estado de un RadioButton. El aspecto de un botn
de opcin se puede modificar para que aparezca como botn de alternar o como botn de opcin estndar
al establecer la propiedad Appearance.
Ejemplos
En el ejemplo de cdigo siguiente se crean e inicializan dos controles RadioButton en una clase GroupBox.
Para ejecutar este ejemplo, pegue el cdigo en un formulario Windows Forms. Llame a
InitializeRadioButtons desde el constructor del formulario o el mtodo de control de eventos Load.
Private groupBox1 As GroupBox
Private radioButton2 As RadioButton
Private radioButton1 As RadioButton


Public Sub InitializeRadioButtons()
Me.groupBox1 = New System.Windows.Forms.GroupBox()
Me.radioButton2 = New System.Windows.Forms.RadioButton()
Me.radioButton1 = New System.Windows.Forms.RadioButton()

Me.groupBox1.Controls.Add(Me.radioButton2)
Me.groupBox1.Controls.Add(Me.radioButton1)
Me.groupBox1.Location = New System.Drawing.Point(80, 75)
Me.groupBox1.Size = New System.Drawing.Size(200, 100)
Me.groupBox1.Text = "Radio Buttons"

Me.radioButton2.Location = New System.Drawing.Point(31, 53)
Me.radioButton2.Size = New System.Drawing.Size(67, 17)
Me.radioButton2.Text = "Choice 2"

Me.radioButton1.Location = New System.Drawing.Point(31, 20)
Me.radioButton1.Name = "radioButton1"
Me.radioButton1.Size = New System.Drawing.Size(67, 17)
Me.radioButton1.Text = "Choice 1"

Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.groupBox1)

End Sub
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 131 | P g i n a

CheckedListBox
Este control presenta una lista de elementos por los que el usuario puede navegar mediante el teclado o la
barra de desplazamiento situada a la derecha del control. El usuario puede colocar una marca de verificacin
junto a uno o ms elementos, y puede navegar por los elementos activados con
CheckedListBoxCheckedItemCollection y CheckedListBoxCheckedIndexCollection.
Para agregar objetos a la lista en tiempo de ejecucin, asigne una matriz de referencias a objetos con el
mtodo AddRange. De este modo la lista muestra el valor de cadena predeterminado para cada objeto. Es
posible agregar elementos individuales a la lista con el mtodo Add.
El objeto CheckedListBox admite tres estados a travs de la enumeracin CheckState: Checked,
Indeterminate y Unchecked. Hay que establecer el estado de Indeterminate en el cdigo, ya que la interfaz
de usuario de CheckedListBox no proporciona ningn mecanismo para ello.
Si UseTabStops es true, CheckedListBox reconocer y extender los caracteres de tabulacin en el texto de
un elemento, creando columnas. Estas posiciones de tabulacin estn preestablecidas y no pueden
modificarse. Para utilizar las posiciones de tabulacin personalizadas, establezca UseTabStops en false,
establezca UseCustomTabOffsets en true y agregue los valores personalizados a la coleccin de
CustomTabOffsets.

Nota: Si la propiedad UseCompatibleTextRendering es false, la propiedad CustomTabOffsets se omitir y
ser reemplazada por desplazamientos de tabulaciones estndar.

La clase CheckedListBox admite las siguientes tres colecciones indizadas:
Coleccin Clase encapsuladora
Todos los elementos incluidos en el control CheckedListBox. CheckedListBoxObjectCollection
Elementos activados (incluidos los elementos con estado
indeterminado), que es un subconjunto de los elementos que
contiene el control CheckedListBox.
CheckedListBoxCheckedItemCollection
ndices activados, que constituyen un subconjunto de los ndices
de la coleccin de elementos. Estos ndices especifican
elementos que estn activados o en un estado indeterminado.
CheckedListBoxCheckedIndexCollection
Las tres tablas siguientes son ejemplos de las tres colecciones indizadas que admite la clase CheckedListBox.

La primera tabla proporciona un ejemplo de la coleccin indizada de elementos del control (todos los
elementos que contiene el control).
ndice Item Estado de activacin
0 Objeto 1 Unchecked
1 Objeto 2 Checked
2 Objeto 3 Unchecked
3 Objeto 4 Indeterminate
4 Objeto 5 Checked
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 132 | P g i n a

La segunda tabla proporciona un ejemplo de la coleccin indizada de elementos activados.
ndice Item
0 Objeto 2
1 Objeto 4
2 Objeto 5
La tercera tabla proporciona un ejemplo de la coleccin indizada de ndices de elementos activados.
ndice ndice de elemento
0 1
1 3
2 4
Nota: No es posible enlazar datos a CheckedListBox. Utilice ComboBox o ListBox en su lugar para esto.
Ejemplos
En el ejemplo siguiente se muestra cmo utilizar los mtodos, las propiedades y las colecciones de
CheckedListBox. Se trata de un ejemplo completo que est listo para ejecutarse despus de copiarlo en el
proyecto. Se pueden activar y desactivar elementos, utilizar el cuadro de texto para agregar elementos y,
una vez que se haya hecho clic en el botn para guardar, desactivar los elementos activados.
Option Explicit
Option Strict

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.IO

Namespace WindowsApplication1
Public Class Form1
Inherits System.Windows.Forms.Form
Private WithEvents checkedListBox1 As
System.Windows.Forms.CheckedListBox
Private WithEvents textBox1 As System.Windows.Forms.TextBox
Private WithEvents button1 As System.Windows.Forms.Button
Private WithEvents button2 As System.Windows.Forms.Button
Private WithEvents listBox1 As System.Windows.Forms.ListBox
Private WithEvents button3 As System.Windows.Forms.Button
Private components As System.ComponentModel.Container


Public Sub New()
InitializeComponent()

' Sets up the initial objects in the CheckedListBox.
Dim myFruit As String() = {"Apples", "Oranges", "Tomato"}
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 133 | P g i n a

checkedListBox1.Items.AddRange(myFruit)

' Changes the selection mode from double-click to single
click.
checkedListBox1.CheckOnClick = True
End Sub 'New


Protected Overloads Overrides Sub Dispose(ByVal disposing As
Boolean)
If disposing Then
If (components IsNot Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.textBox1 = New System.Windows.Forms.TextBox()
Me.checkedListBox1 = New
System.Windows.Forms.CheckedListBox()
Me.listBox1 = New System.Windows.Forms.ListBox()
Me.button1 = New System.Windows.Forms.Button()
Me.button2 = New System.Windows.Forms.Button()
Me.button3 = New System.Windows.Forms.Button()
Me.textBox1.Location = New System.Drawing.Point(144, 64)
Me.textBox1.Size = New System.Drawing.Size(128, 20)
Me.textBox1.TabIndex = 1
Me.checkedListBox1.Location = New System.Drawing.Point(16,
64)
Me.checkedListBox1.Size = New System.Drawing.Size(120, 184)
Me.checkedListBox1.TabIndex = 0
Me.listBox1.Location = New System.Drawing.Point(408, 64)
Me.listBox1.Size = New System.Drawing.Size(128, 186)
Me.listBox1.TabIndex = 3
Me.button1.Enabled = False
Me.button1.Location = New System.Drawing.Point(144, 104)
Me.button1.Size = New System.Drawing.Size(104, 32)
Me.button1.TabIndex = 2
Me.button1.Text = "Add Fruit"
Me.button2.Enabled = False
Me.button2.Location = New System.Drawing.Point(288, 64)
Me.button2.Size = New System.Drawing.Size(104, 32)
Me.button2.TabIndex = 2
Me.button2.Text = "Show Order"
Me.button3.Enabled = False
Me.button3.Location = New System.Drawing.Point(288, 104)
Me.button3.Size = New System.Drawing.Size(104, 32)
Me.button3.TabIndex = 2
Me.button3.Text = "Save Order"
Me.ClientSize = New System.Drawing.Size(563, 273)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 134 | P g i n a

Me.Controls.AddRange(New System.Windows.Forms.Control()
{Me.listBox1, Me.button3, Me.button2, Me.button1, Me.textBox1,
Me.checkedListBox1})
Me.Text = "Fruit Order"
End Sub 'InitializeComponent

<STAThread()> _
Public Shared Sub Main()
Application.Run(New Form1())
End Sub 'Main


' Adds the string if the text box has data in it.
Private Sub button1_Click(sender As Object, _
e As System.EventArgs) Handles button1.Click
If textBox1.Text <> "" Then
If checkedListBox1.CheckedItems.Contains(textBox1.Text) =
False Then
checkedListBox1.Items.Add(textBox1.Text,
CheckState.Checked)
End If
textBox1.Text = ""
End If
End Sub 'button1_Click

' Activates or deactivates the Add button.
Private Sub textBox1_TextChanged(sender As Object, _
e As System.EventArgs) Handles textBox1.TextChanged
If textBox1.Text = "" Then
button1.Enabled = False
Else
button1.Enabled = True
End If
End Sub 'textBox1_TextChanged


' Moves the checked items from the CheckedListBox to the listBox.
Private Sub button2_Click(sender As Object, _
e As System.EventArgs) Handles button2.Click
listBox1.Items.Clear()
button3.Enabled = False
Dim i As Integer
For i = 0 To checkedListBox1.CheckedItems.Count - 1
listBox1.Items.Add(checkedListBox1.CheckedItems(i))
Next i
If listBox1.Items.Count > 0 Then
button3.Enabled = True
End If
End Sub 'button2_Click

' Activates the move button if there are checked items.
Private Sub checkedListBox1_ItemCheck(sender As Object, _
e As ItemCheckEventArgs) Handles
checkedListBox1.ItemCheck
If e.NewValue = CheckState.Unchecked Then
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 135 | P g i n a

If checkedListBox1.CheckedItems.Count = 1 Then
button2.Enabled = False
End If
Else
button2.Enabled = True
End If
End Sub 'checkedListBox1_ItemCheck


' Saves the items to a file.
Private Sub button3_Click(sender As Object, _
e As System.EventArgs) Handles button3.Click
' Insert code to save a file.
listBox1.Items.Clear()
Dim myEnumerator As IEnumerator
myEnumerator = checkedListBox1.CheckedIndices.GetEnumerator()
Dim y As Integer
While myEnumerator.MoveNext() <> False
y = CInt(myEnumerator.Current)
checkedListBox1.SetItemChecked(y, False)
End While
button3.Enabled = False
End Sub 'button3_Click
End Class 'Form1
End Namespace 'WindowsApplication1

Componentes WinForm
ErrorProvider
El componente ErrorProvider de formularios Windows Forms se utiliza para validar los datos proporcionados
por el usuario en un formulario o en un control. Normalmente, se utiliza junto con la validacin de los datos
proporcionados por el usuario en un formulario o con la presentacin de errores dentro de un conjunto de
datos. Un proveedor de errores es una alternativa mejor que mostrar un mensaje de error en un cuadro de
mensaje, porque una vez que se descarta un cuadro de mensaje, el mensaje de error deja de estar visible. El
componente ErrorProvider muestra un icono de error ( ) junto al control correspondiente, por ejemplo, un
cuadro de texto; cuando el usuario coloca el puntero del mouse sobre el icono de error, aparece una
informacin sobre herramientas que muestra la cadena del mensaje de error.
Propiedades principales
Las propiedades principales del componente ErrorProvider son DataSource, ContainerControl y Icon. Cuando
se utiliza el componente ErrorProvider con controles enlazados a datos, la propiedad ContainerControl debe
establecerse en el contenedor adecuado (habitualmente el formulario Windows Forms), para que el
componente muestre un icono de error en el formulario. Cuando se agrega el componente en el diseador,
la propiedad ContainerControl se establece en el formulario contenedor; si el usuario agrega el control
mediante cdigo, l debe establecerla.
La propiedad Icon puede establecerse en un icono de error personalizado, en lugar del predeterminado.
Cuando la propiedad DataSource est establecida, el componente ErrorProvider puede mostrar mensajes de
error para un conjunto de datos. El mtodo clave del componente ErrorProvider es el mtodo SetError, que
especifica la cadena del mensaje de error y dnde debe aparecer el icono de error.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 136 | P g i n a

Mostrar iconos de error para la validacin de formularios
Puede utilizar un componente ErrorProvider de formularios Windows Forms para que se muestre un icono
de error cuando el usuario escriba datos no vlidos. El formulario debe tener al menos dos controles para
pasar de un control a otro mediante tabulacin e invocar el cdigo de validacin.
Para mostrar un icono de error cuando el valor de un control no es vlido
1. Agregue dos controles, por ejemplo, cuadros de texto, a un formulario Windows Forms.
2. Agregue un componente ErrorProvider al formulario.
3. Seleccione el primer control y agregue cdigo a su controlador de eventos Validating. Para que este
cdigo se ejecute correctamente, el procedimiento debe estar conectado al evento.
En el cdigo siguiente se comprueba la validez de los datos escritos por el usuario; si los datos no son
vlidos, se llama al mtodo SetError. El primer argumento del mtodo SetError especifica junto a qu
control se muestra el icono. El segundo argumento es el texto de error que debe mostrarse.

Private Sub TextBox1_Validating(ByVal Sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles _
TextBox1.Validating
If Not IsNumeric(TextBox1.Text) Then
ErrorProvider1.SetError(TextBox1, "Not a numeric value.")
Else
' Clear the error.
ErrorProvider1.SetError(TextBox1, "")
End If
End Sub

4. Ejecute el proyecto. Escriba datos no vlidos (en este ejemplo, no numricos) en el primer
control y, a continuacin, utilice el tabulador para pasar al segundo. Cuando se muestre el
icono de error, apunte al icono con el puntero del mouse para ver el texto de error.

ColorDialog

El componente ColorDialog de formularios Windows Forms es un cuadro de dilogo preconfigurado que
permite al usuario seleccionar un color de una paleta y agregar colores personalizados a la paleta. Es el
mismo cuadro de dilogo que se ve en otras aplicaciones para Windows y que permite seleccionar colores.
Utilcelo dentro de la aplicacin para Windows como una solucin sencilla, en lugar de configurar un cuadro
de dilogo propio.
El color seleccionado en el cuadro de dilogo se devuelve en la propiedad Color. Si se establece la propiedad
AllowFullOpen en false, el botn "Definir colores personalizados" se deshabilita y el usuario queda limitado
a los colores predefinidos en la paleta. Si se establece la propiedad SolidColorOnly en true, el usuario no
puede seleccionar colores interpolados. Para que se muestre el cuadro de dilogo, llame al mtodo
ShowDialog.

Cambiar la apariencia del componente ColorDialog de formularios Windows Forms
Puede configurar la apariencia del componente ColorDialog de formularios Windows Forms con varias de
sus propiedades. El cuadro de dilogo tiene dos secciones: una que muestra colores bsicos y otra que
permite al usuario la definicin de colores personalizados.
La mayora de las propiedades restringen los colores que el usuario puede seleccionar en el cuadro de
dilogo. Si se establece la propiedad AllowFullOpen en true, el usuario puede definir colores personalizados.
La propiedad FullOpen es true si el cuadro de dilogo est expandido para definir colores personalizados; de
lo contrario, el usuario debe hacer clic en el botn "Definir colores personalizados". Cuando la propiedad
AnyColor se establece en true, el cuadro de dilogo muestra todos los colores disponibles del conjunto de
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 137 | P g i n a

colores bsicos. Si la propiedad SolidColorOnly se establece en true, el usuario no puede seleccionar colores
interpolados; slo es posible seleccionar colores slidos.
Si la propiedad ShowHelp se establece en true, aparece un botn Ayuda en el cuadro de dilogo. Cuando el
usuario hace clic en el botn Ayuda, se produce el evento HelpRequest del componente ColorDialog.

Establezca las propiedades AllowFullOpen, AnyColor, SolidColorOnly y ShowHelp en los colores deseados.
ColorDialog1.AllowFullOpen = True
ColorDialog1.AnyColor = True
ColorDialog1.SolidColorOnly = False
ColorDialog1.ShowHelp = True

Para elegir un color utilizando el componente ColorDialog
El componente ColorDialog muestra una paleta de colores y devuelve una propiedad que contiene el color
seleccionado por el usuario.
1. Muestre el cuadro de dilogo mediante el mtodo ShowDialog.
2. Utilice la propiedad DialogResult para determinar cmo se cerr el cuadro de dilogo.
3. Utilice la propiedad Color del componente ColorDialog para establecer el color elegido.
En el ejemplo siguiente, el controlador de eventos Click del control Button abre un componente ColorDialog.
Cuando se elige un color y el usuario hace clic en Aceptar, el color de fondo del control Button se define
como el color elegido. En el ejemplo se supone que el formulario tiene un control Button y un componente
ColorDialog.

FontDialog
Pide al usuario que elija una fuente de entre todas las instaladas en el equipo local.

Se debe invocar al miembro heredado ShowDialog para crear este cuadro de dilogo comn especfico. Se
puede reemplazar HookProc para implementar funcionalidad especfica de enlace de cuadros de dilogo.
Cuando se crea una instancia de FontDialog, se establecen algunas propiedades de lectura y escritura en sus
valores iniciales.

Ejemplos
En el siguiente ejemplo de cdigo se utiliza ShowDialog para mostrar FontDialog. En este cdigo se requiere
que ya se haya creado un objeto Form que incluya un objeto TextBox y un botn. Tambin requiere que se
haya creado fontDialog1. Font contiene la informacin de tamao pero no la informacin de color.

Private Sub button1_Click(sender As Object, e As System.EventArgs)
fontDialog1.ShowColor = True

fontDialog1.Font = textBox1.Font
fontDialog1.Color = textBox1.ForeColor

If fontDialog1.ShowDialog() <> DialogResult.Cancel Then
textBox1.Font = fontDialog1.Font
textBox1.ForeColor = fontDialog1.Color
End If
End Sub 'button1_Click

OpenFileDialog
Solicita al usuario que abra un archivo.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 138 | P g i n a


Esta clase permite comprobar si existe un archivo y abrirlo. La propiedad ShowReadOnly determina si
aparece una casilla de slo lectura en el cuadro de dilogo. La propiedad ReadOnlyChecked indica si la casilla
de slo lectura est activada.
La mayor parte de la funcionalidad de esta clase se encuentra en la clase FileDialog.
Si desea dar al usuario la capacidad de seleccionar una carpeta en lugar de un archivo, utilice
FolderBrowserDialog en su lugar.
Ejemplos
En el siguiente ejemplo de cdigo se crea OpenFileDialog, se establecen varias propiedades y se muestra el
cuadro de dilogo mediante el mtodo CommonDialog..::.ShowDialog. En el ejemplo se requiere un
formulario con Button colocado en l y el espacio de nombres System.IO agregado al mismo.

Private Sub button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs)
Dim myStream As Stream = Nothing
Dim openFileDialog1 As New OpenFileDialog()

openFileDialog1.InitialDirectory = "c:\"
openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files
(*.*)|*.*"
openFileDialog1.FilterIndex = 2
openFileDialog1.RestoreDirectory = True

If openFileDialog1.ShowDialog() =
System.Windows.Forms.DialogResult.OK Then
Try
myStream = openFileDialog1.OpenFile()
If (myStream IsNot Nothing) Then
' Insert code to read the stream here.
End If
Catch Ex As Exception
MessageBox.Show("Cannot read file from disk. Original error:
" & Ex.Message)
Finally
' Check this again, since we need to make sure we didn't
throw an exception on open.
If (myStream IsNot Nothing) Then
myStream.Close()
End If
End Try
End If
End Sub

SaveFileDialog
Pregunta al usuario si desea seleccionar una ubicacin para guardar un archivo.

Esta clase permite abrir y sobrescribir un archivo existente o crear un archivo nuevo.
La mayor parte de la funcionalidad de esta clase se encuentra en la clase FileDialog.
Nota de la plataforma Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows CE:
En los dispositivos de Pocket PC, si no se especifica una extensin para el nombre de archivo, el control
anexa la extensin del tipo seleccionado en el cuadro de dilogo. En Windows CE, el control no anexa
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 139 | P g i n a

ninguna extensin. Todas las plataformas admiten la propiedad FilterIndex que devuelve el ndice del filtro
de extensin seleccionado.
Ejemplos
En el ejemplo de cdigo siguiente se muestra la forma de crear un objeto SaveFileDialog, establecer los
miembros, llamar al cuadro de dilogo utilizando el mtodo ShowDialog y guardar el archivo actual. El
ejemplo requiere la existencia de un formulario con un botn.
Private Sub button1_Click(sender As Object, e As System.EventArgs)
Dim myStream As Stream
Dim saveFileDialog1 As New SaveFileDialog()

saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files
(*.*)|*.*"
saveFileDialog1.FilterIndex = 2
saveFileDialog1.RestoreDirectory = True

If saveFileDialog1.ShowDialog() = DialogResult.OK Then
myStream = saveFileDialog1.OpenFile()
If (myStream IsNot Nothing) Then
' Code to write the stream goes here.
myStream.Close()
End If
End If
End Sub

PrintDialog
Permite a los usuarios seleccionar una impresora y elegir qu secciones del documento se van a imprimir
desde una aplicacin de formularios Windows Forms.

Cuando se crea una instancia de PrintDialog, se establecen las propiedades de lectura y escritura en sus
valores iniciales.

Ejemplos
En el ejemplo de cdigo siguiente se muestra cmo utilizar el control PrintDialog para establecer las
propiedades AllowSomePages, ShowHelp y Document. Para ejecutar este ejemplo, pegue el siguiente cdigo
en un formulario que contiene un control PrintDialog denominado PrintDialog1 y un botn denominado
Button1. En este ejemplo se requiere que el evento Click del botn y el evento PrintPage de docToPrint se
hayan conectado a los mtodos de control de eventos definidos en este ejemplo.
' Declare the PrintDocument object.
Private WithEvents docToPrint As New Printing.PrintDocument

' This method will set properties on the PrintDialog object and
' then display the dialog.
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' Allow the user to choose the page range he or she would
' like to print.
PrintDialog1.AllowSomePages = True

' Show the help button.
PrintDialog1.ShowHelp = True

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 140 | P g i n a

' Set the Document property to the PrintDocument for
' which the PrintPage Event has been handled. To display the
' dialog, either this property or the PrinterSettings property
' must be set
PrintDialog1.Document = docToPrint

Dim result As DialogResult = PrintDialog1.ShowDialog()

' If the result is OK then print the document.
If (result = DialogResult.OK) Then
docToPrint.Print()
End If

End Sub

' The PrintDialog will print the document
' by handling the document's PrintPage event.
Private Sub document_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles docToPrint.PrintPage

' Insert code to render the page here.
' This code will be called when the control is drawn.

' The following code will render a simple
' message on the printed document.
Dim text As String = "In document_PrintPage method."
Dim printFont As New System.Drawing.Font _
("Arial", 35, System.Drawing.FontStyle.Regular)

' Draw the content.
e.Graphics.DrawString(text, printFont, _
System.Drawing.Brushes.Black, 10, 10)
End Sub

FolderBrowserDialog
Pide al usuario que seleccione una carpeta.

Esta clase proporciona un modo de preguntar al usuario si desea examinar, crear y, posteriormente,
seleccionar una carpeta. Utilice esta clase si slo desea que el usuario seleccione carpetas, pero no archivos.
Las carpetas se examinan mediante un control de rbol. Slo se pueden seleccionar las carpetas del sistema
de archivos, las carpetas virtuales no.
Normalmente, despus de crear un FolderBrowserDialog nuevo, RootFolder se establece en la ubicacin
desde donde se va a comenzar a examinar. SelectedPath puede establecerse tambin en una ruta de acceso
absoluta a una subcarpeta de RootFolder que se seleccionar inicialmente. Otra posibilidad es establecer la
propiedad Description para proporcionar instrucciones adicionales al usuario. Por ltimo, se llama al mtodo
ShowDialog para que muestre el cuadro de dilogo al usuario. Si se cierra el cuadro de dilogo y el resultado
de ShowDialog es DialogResult..OK, SelectedPath ser una cadena que contenga la ruta de acceso a la
carpeta seleccionada.
Es posible utilizar la propiedad ShowNewFolderButton para controlar si el usuario tiene permiso para crear
carpetas nuevas con el botn Nueva carpeta.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 141 | P g i n a

FolderBrowserDialog es un cuadro de dilogo modal, por lo tanto, cuando se muestra, bloquea el resto de la
aplicacin hasta que el usuario elige una carpeta. Cuando un cuadro de dilogo se muestra en forma modal,
no puede producirse ninguna entrada de datos (mediante teclado o haciendo clic con el mouse), a excepcin
de los objetos del cuadro de dilogo. El programa debe ocultar o cerrar el cuadro de dilogo (normalmente,
como respuesta a alguna accin del usuario) antes de que pueda producirse una entrada de datos en el
programa de llamada.
' The following example displays an application that provides the ability
to
' open rich text files (rtf) into the RichTextBox. The example
demonstrates
' using the FolderBrowserDialog to set the default directory for opening
files.
' The OpenFileDialog class is used to open the file.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.IO

Public Class FolderBrowserDialogExampleForm
Inherits Form

Private folderBrowserDialog1 As FolderBrowserDialog
Private openFileDialog1 As OpenFileDialog

Private richTextBox1 As RichTextBox

Private mainMenu1 As MainMenu
Private fileMenuItem As MenuItem
Private WithEvents folderMenuItem As MenuItem, _
closeMenuItem As MenuItem, _
openMenuItem As MenuItem

Private openFileName As String, folderName As String

Private fileOpened As Boolean = False

Public Sub New()
Me.mainMenu1 = New System.Windows.Forms.MainMenu()
Me.fileMenuItem = New System.Windows.Forms.MenuItem()
Me.openMenuItem = New System.Windows.Forms.MenuItem()
Me.folderMenuItem = New System.Windows.Forms.MenuItem()
Me.closeMenuItem = New System.Windows.Forms.MenuItem()

Me.openFileDialog1 = New System.Windows.Forms.OpenFileDialog()
Me.folderBrowserDialog1 = New
System.Windows.Forms.FolderBrowserDialog()
Me.richTextBox1 = New System.Windows.Forms.RichTextBox()

Me.mainMenu1.MenuItems.Add(Me.fileMenuItem)
Me.fileMenuItem.MenuItems.AddRange( _
New System.Windows.Forms.MenuItem() {Me.openMenuItem,
_

Me.closeMenuItem, _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 142 | P g i n a


Me.folderMenuItem})
Me.fileMenuItem.Text = "File"

Me.openMenuItem.Text = "Open..."

Me.folderMenuItem.Text = "Select Directory..."

Me.closeMenuItem.Text = "Close"
Me.closeMenuItem.Enabled = False

Me.openFileDialog1.DefaultExt = "rtf"
Me.openFileDialog1.Filter = "rtf files (*.rtf)|*.rtf"

' Set the Help text description for the FolderBrowserDialog.
Me.folderBrowserDialog1.Description = _
"Select the directory that you want to use As the default."

' Do not allow the user to create New files via the
FolderBrowserDialog.
Me.folderBrowserDialog1.ShowNewFolderButton = False

' Default to the My Documents folder.
Me.folderBrowserDialog1.RootFolder =
Environment.SpecialFolder.Personal

Me.richTextBox1.AcceptsTab = True
Me.richTextBox1.Location = New System.Drawing.Point(8, 8)
Me.richTextBox1.Size = New System.Drawing.Size(280, 344)
Me.richTextBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or
_
AnchorStyles.Bottom Or
AnchorStyles.Right

Me.ClientSize = New System.Drawing.Size(296, 360)
Me.Controls.Add(Me.richTextBox1)
Me.Menu = Me.mainMenu1
Me.Text = "RTF Document Browser"
End Sub

<STAThread()> _
Shared Sub Main()
Application.Run(New FolderBrowserDialogExampleForm())
End Sub

' Bring up a dialog to open a file.
Private Sub openMenuItem_Click(sender As object, e As
System.EventArgs) _
Handles openMenuItem.Click
' If a file is not opened, then set the initial directory to the
' FolderBrowserDialog.SelectedPath value.
If (not fileOpened) Then
openFileDialog1.InitialDirectory =
folderBrowserDialog1.SelectedPath
openFileDialog1.FileName = nothing
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 143 | P g i n a

End If

' Display the openFile dialog.
Dim result As DialogResult = openFileDialog1.ShowDialog()

' OK button was pressed.
If (result = DialogResult.OK) Then
openFileName = openFileDialog1.FileName
Try
' Output the requested file in richTextBox1.
Dim s As Stream = openFileDialog1.OpenFile()
richTextBox1.LoadFile(s, RichTextBoxStreamType.RichText)
s.Close()

fileOpened = True

Catch exp As Exception
MessageBox.Show("An error occurred while attempting to
load the file. The error is:" _
+ System.Environment.NewLine +
exp.ToString() + System.Environment.NewLine)
fileOpened = False
End Try
Invalidate()

closeMenuItem.Enabled = fileOpened

' Cancel button was pressed.
ElseIf (result = DialogResult.Cancel) Then
return
End If
End Sub

' Close the current file.
Private Sub closeMenuItem_Click(sender As object, e As
System.EventArgs) _
Handles closeMenuItem.Click
richTextBox1.Text = ""
fileOpened = False

closeMenuItem.Enabled = False
End Sub

' Bring up a dialog to chose a folder path in which to open or save a
file.
Private Sub folderMenuItem_Click(sender As object, e As
System.EventArgs) _
Handles folderMenuItem.Click
' Show the FolderBrowserDialog.
Dim result As DialogResult = folderBrowserDialog1.ShowDialog()

If ( result = DialogResult.OK ) Then
folderName = folderBrowserDialog1.SelectedPath
If (not fileOpened) Then
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 144 | P g i n a

' No file is opened, bring up openFileDialog in selected
path.
openFileDialog1.InitialDirectory = folderName
openFileDialog1.FileName = nothing
openMenuItem.PerformClick()
End If
End If
End Sub

End Class


ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 145 | P g i n a

Statusbar
StatusStrip reemplaza el control StatusBar. Las caractersticas especiales de StatusStrip incluyen un diseo
de tabla personalizada, compatibilidad con los controles de tamao y movimiento del formulario y con la
propiedad Spring, que permite que ToolStripStatusLabel rellene automticamente espacio disponible.
Los elementos siguientes estn diseados especficamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Estn disponibles de
forma predeterminada en tiempo de diseo para el control StatusStrip:
ToolStripStatusLabel
ToolStripDropDownButton
ToolStripSplitButton
ToolStripProgressBar
Un control StatusStrip muestra informacin acerca del objeto que se est mostrando en un Form, los
componentes del objeto o informacin contextual relativa a la operacin de ese objeto en la aplicacin.
Normalmente, un control StatusStrip est formado por objetos ToolStripStatusLabel, cada uno de los cuales
muestra texto, un icono o ambas cosas. StatusStrip tambin puede contener controles
ToolStripDropDownButton, ToolStripSplitButton y ToolStripProgressBar.
El control StatusStrip predeterminado no tiene paneles. Para agregar paneles a un StatusStrip, utilice el
mtodo ToolStripItemCollection.AddRange en tiempo de diseo, o utilice Editor de la coleccin de
elementos de StatusStrip en tiempo de diseo para agregar, quitar o reorganizar elementos y modificar
propiedades. Utilice el Tareas de StatusStrip (Cuadro de dilogo) en tiempo de diseo para ejecutar los
comandos comunes.
Aunque StatusStrip reemplaza y ampla el control StatusBar de versiones anteriores, se conserva StatusBar a
efectos de compatibilidad con versiones anteriores y uso futuro, en su caso.
Ejemplos
En el ejemplo de cdigo siguiente se muestra un StatusStrip con varias propiedades comunes establecidas.
Imports System
Imports System.Text
Imports System.Windows.Forms

Public Class Form1
Inherits Form
Private statusStrip1 As StatusStrip
Private toolStripStatusLabel1 As ToolStripStatusLabel

Public Sub New()
InitializeComponent()
End Sub

<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub

Private Sub InitializeComponent()
statusStrip1 = New System.Windows.Forms.StatusStrip()
toolStripStatusLabel1 = New
System.Windows.Forms.ToolStripStatusLabel()
statusStrip1.SuspendLayout()
SuspendLayout()
'
' The following code example demonstrates the syntax for setting
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 146 | P g i n a

' various StatusStrip properties.
statusStrip1.Dock = System.Windows.Forms.DockStyle.Top
statusStrip1.GripStyle =
System.Windows.Forms.ToolStripGripStyle.Visible
statusStrip1.Items.AddRange(New
System.Windows.Forms.ToolStripItem() {toolStripStatusLabel1})
statusStrip1.LayoutStyle =
System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow
statusStrip1.Location = New System.Drawing.Point(0, 0)
statusStrip1.Name = "statusStrip1"
statusStrip1.ShowItemToolTips = True
statusStrip1.Size = New System.Drawing.Size(292, 22)
statusStrip1.SizingGrip = False
statusStrip1.Stretch = False
statusStrip1.TabIndex = 0
statusStrip1.Text = "statusStrip1"
'
' toolStripStatusLabel1
'
toolStripStatusLabel1.Name = "toolStripStatusLabel1"
toolStripStatusLabel1.Size = New System.Drawing.Size(109, 17)
toolStripStatusLabel1.Text = "toolStripStatusLabel1"
'
' Form1
'
ClientSize = New System.Drawing.Size(292, 273)
Controls.Add(statusStrip1)
Name = "Form1"
statusStrip1.ResumeLayout(False)
statusStrip1.PerformLayout()
ResumeLayout(False)
PerformLayout()
End Sub
End Class

NotifyIcon
Especifica un componente que crea un icono en el rea de notificacin.
Los iconos del rea de notificacin son accesos directos a procesos que se ejecutan en segundo plano como,
por ejemplo, un programa de proteccin antivirus o un control de volumen. Estos procesos no incluyen sus
propias interfaces de usuario. La clase NotifyIcon proporciona una manera de programar en esta
funcionalidad. La propiedad Icon define el icono que aparece en el rea de notificacin. Los mens
emergentes de un icono se definen con la propiedad ContextMenu. La propiedad Text asigna texto de
informacin sobre herramientas. Para que el icono aparezca en el rea de notificacin, la propiedad Visible
debe establecerse en true.
Ejemplos
En el ejemplo de cdigo siguiente se muestra la forma de utilizar la clase NotifyIcon para que se muestre un
icono en el rea de notificacin para una aplicacin. En el siguiente ejemplo se muestra la forma de
establecer las propiedades Icon, ContextMenu, Text y Visible y la forma de administrar el evento
DoubleClick. Se asigna un control ContextMenu con un elemento Exit a la propiedad
NotifyIcon.ContextMenu que permite al usuario cerrar la aplicacin. Cuando se produce el evento
DoubleClick, se activa el formulario de la aplicacin mediante una llamada al mtodo Form.Activate.
Imports System
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 147 | P g i n a

Imports System.Drawing
Imports System.Windows.Forms

Public NotInheritable Class Form1
Inherits System.Windows.Forms.Form

Private contextMenu1 As System.Windows.Forms.ContextMenu
Friend WithEvents menuItem1 As System.Windows.Forms.MenuItem
Friend WithEvents notifyIcon1 As System.Windows.Forms.NotifyIcon
Private components As System.ComponentModel.IContainer

<System.STAThread()> _
Public Shared Sub Main()
System.Windows.Forms.Application.Run(New Form1)
End Sub 'Main

Public Sub New()

Me.components = New System.ComponentModel.Container
Me.contextMenu1 = New System.Windows.Forms.ContextMenu
Me.menuItem1 = New System.Windows.Forms.MenuItem

' Initialize contextMenu1
Me.contextMenu1.MenuItems.AddRange(New
System.Windows.Forms.MenuItem() _
{Me.menuItem1})

' Initialize menuItem1
Me.menuItem1.Index = 0
Me.menuItem1.Text = "E&xit"

' Set up how the form should be displayed.
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Text = "Notify Icon Example"

' Create the NotifyIcon.
Me.notifyIcon1 = New
System.Windows.Forms.NotifyIcon(Me.components)

' The Icon property sets the icon that will appear
' in the systray for this application.
notifyIcon1.Icon = New Icon("appicon.ico")

' The ContextMenu property sets the menu that will
' appear when the systray icon is right clicked.
notifyIcon1.ContextMenu = Me.contextMenu1

' The Text property sets the text that will be displayed,
' in a tooltip, when the mouse hovers over the systray icon.
notifyIcon1.Text = "Form1 (NotifyIcon example)"
notifyIcon1.Visible = True
End Sub 'New

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
' Clean up any components being used.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 148 | P g i n a

If disposing Then
If (components IsNot Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub 'Dispose

Private Sub notifyIcon1_DoubleClick(Sender as object, e as EventArgs)
handles notifyIcon1.DoubleClick
' Show the form when the user double clicks on the notify icon.

' Set the WindowState to normal if the form is minimized.
if (me.WindowState = FormWindowState.Minimized) then _
me.WindowState = FormWindowState.Normal

' Activate the form.
me.Activate()
end sub

Private Sub menuItem1_Click(Sender as object, e as EventArgs) handles
menuItem1.Click
' Close the form, which closes the application.
me.Close()
end sub

End Class 'Form1

MenuStrip
Proporciona una estructura de men para un formulario.

MenuStrip es el contenedor de nivel superior que reemplaza a MainMenu. Tambin proporciona las
caractersticas de control de claves y de interfaz de mltiples documentos (MDI). Funcionalmente,
ToolStripDropDownItem y ToolStripMenuItem operan junto con MenuStrip, aunque se derivan de
ToolStripItem.
Los elementos siguientes estn diseados especficamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Estn disponibles de
forma predeterminada en tiempo de diseo para el control MenuStrip:
ToolStripMenuItem
ToolStripTextBox
ToolStripComboBox
El control MenuStrip representa el contenedor para la estructura de men de un formulario. Puede agregar
objetos ToolStripMenuItem al objeto MenuStrip, que representan los comandos de men individuales de la
estructura de men. Cada objeto ToolStripMenuItem puede ser un comando de la aplicacin o un men
primario para otros elementos de submen.
Aunque el control MenuStrip reemplaza y agrega funcionalidad al control MainMenu de versiones
anteriores, se conserva MainMenu a efectos de compatibilidad con versiones anteriores y uso futuro, en su
caso.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 149 | P g i n a

Ejemplos
En el ejemplo de cdigo siguiente se muestra un MenuStrip en un escenario de interfaz de mltiples
documentos (MDI).
' This code example demonstrates how to use ToolStripPanel
' controls with a multiple document interface (MDI).
Public Class Form1
Inherits Form

Public Sub New()
' Make the Form an MDI parent.
Me.IsMdiContainer = True

' Create ToolStripPanel controls.
Dim tspTop As New ToolStripPanel()
Dim tspBottom As New ToolStripPanel()
Dim tspLeft As New ToolStripPanel()
Dim tspRight As New ToolStripPanel()

' Dock the ToolStripPanel controls to the edges of the form.
tspTop.Dock = DockStyle.Top
tspBottom.Dock = DockStyle.Bottom
tspLeft.Dock = DockStyle.Left
tspRight.Dock = DockStyle.Right

' Create ToolStrip controls to move among the
' ToolStripPanel controls.
' Create the "Top" ToolStrip control and add
' to the corresponding ToolStripPanel.
Dim tsTop As New ToolStrip()
tsTop.Items.Add("Top")
tspTop.Join(tsTop)

' Create the "Bottom" ToolStrip control and add
' to the corresponding ToolStripPanel.
Dim tsBottom As New ToolStrip()
tsBottom.Items.Add("Bottom")
tspBottom.Join(tsBottom)

' Create the "Right" ToolStrip control and add
' to the corresponding ToolStripPanel.
Dim tsRight As New ToolStrip()
tsRight.Items.Add("Right")
tspRight.Join(tsRight)

' Create the "Left" ToolStrip control and add
' to the corresponding ToolStripPanel.
Dim tsLeft As New ToolStrip()
tsLeft.Items.Add("Left")
tspLeft.Join(tsLeft)

' Create a MenuStrip control with a new window.
Dim ms As New MenuStrip()
Dim windowMenu As New ToolStripMenuItem("Window")
Dim windowNewMenu As New ToolStripMenuItem("New", Nothing, New
EventHandler(AddressOf windowNewMenu_Click))
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 150 | P g i n a

windowMenu.DropDownItems.Add(windowNewMenu)
CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowImageMargin =
False
CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowCheckMargin =
True

' Assign the ToolStripMenuItem that displays
' the list of child forms.
ms.MdiWindowListItem = windowMenu

' Add the window ToolStripMenuItem to the MenuStrip.
ms.Items.Add(windowMenu)

' Dock the MenuStrip to the top of the form.
ms.Dock = DockStyle.Top

' The Form.MainMenuStrip property determines the merge target.
Me.MainMenuStrip = ms

' Add the ToolStripPanels to the form in reverse order.
Me.Controls.Add(tspRight)
Me.Controls.Add(tspLeft)
Me.Controls.Add(tspBottom)
Me.Controls.Add(tspTop)

' Add the MenuStrip last.
' This is important for correct placement in the z-order.
Me.Controls.Add(ms)
End Sub

' This event handler is invoked when
' the "New" ToolStripMenuItem is clicked.
' It creates a new Form and sets its MdiParent
' property to the main form.
Private Sub windowNewMenu_Click(ByVal sender As Object, ByVal e As
EventArgs)
Dim f As New Form()
f.MdiParent = Me
f.Text = "Form - " + Me.MdiChildren.Length.ToString()
f.Show()
End Sub
End Class

ContextMenuStrip
Representa un men contextual.

ContextMenuStrip reemplaza ContextMenu. Puede asociar un objeto ContextMenuStrip a cualquier control
y, al hacer clic con el botn secundario del mouse, se muestra automticamente el men contextual. Puede
mostrar ContextMenuStrip mediante programacin utilizando el mtodo Show. ContextMenuStrip admite
eventos Opening y Closing, que se pueden cancelar, para controlar escenarios de relleno dinmico y uso de
varios clic. ContextMenuStrip admite imgenes, el estado de activacin de elementos de men, texto, teclas
de acceso, accesos directos y mens en cascada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 151 | P g i n a

Los elementos siguientes estn diseados especficamente para trabajar sin problemas con
ToolStripSystemRenderer y ToolStripProfessionalRenderer en todas las orientaciones. Estn disponibles de
forma predeterminada en tiempo de diseo para el control ContextMenuStrip:
ToolStripMenuItem
ToolStripSeparator
ToolStripTextBox
ToolStripComboBox
Los mens contextuales suelen utilizarse para combinar los distintos elementos de men desde un
MenuStrip de un formulario que son tiles para el usuario dado el contexto de la aplicacin. Por ejemplo, se
puede usar un men contextual asignado a un control TextBox para proporcionar elementos de men que
permitan cambiar la fuente del texto, buscar texto en el control, o funciones del Portapapeles para copiar y
pegar texto. En un men contextual, tambin se pueden mostrar nuevos objetos ToolStripMenuItem que no
se encuentren en un control MenuStrip para proporcionar comandos especficos de la situacin, que no
sera lgico incluir en el control MenuStrip que se va a mostrar.
Normalmente, el men contextual aparece cuando el usuario hace clic con el botn secundario del mouse
en un control o en el propio formulario. Muchos de los controles visibles, adems de los propios controles
Form, tienen una propiedad Control.ContextMenuStrip que enlaza la clase ContextMenuStrip con el control
que muestra el men contextual. Ms de un control puede usar ContextMenuStrip.
Establezca la propiedad ToolStripDropDownMenu.ShowCheckMargin en true para agregar espacio a la
izquierda de un objeto ToolStripMenuItem e incluir una marca de verificacin que indique si dicho elemento
de men est habilitado o seleccionado. La propiedad ToolStripDropDownMenu.ShowImageMargin se
establece en true de manera predeterminada. Utilice este espacio situado a la izquierda del objeto
ToolStripMenuItem para mostrar una imagen para dicho elemento de men.
Aunque ContextMenuStrip reemplaza al control ContextMenu de las versiones anteriores y su funcionalidad
es mayor, el control ContextMenu se ha mantenido para preservar la compatibilidad con las versiones
anteriores y para que pueda utilizarse en el futuro, si as se desea.
Ejemplos
En el ejemplo de cdigo siguiente se muestra un ContextMenuStrip con adicin de elementos dinmica,
determinacin dinmica de SourceControl con reuso y control del evento Opening.
' This code example demonstrates how to handle the Opening event.
' It also demonstrates dynamic item addition and dynamic
' SourceControl determination with reuse.
Class Form3
Inherits Form

' Declare the ContextMenuStrip control.
Private fruitContextMenuStrip As ContextMenuStrip


Public Sub New()
' Create a new ContextMenuStrip control.
fruitContextMenuStrip = New ContextMenuStrip()

' Attach an event handler for the
' ContextMenuStrip control's Opening event.
AddHandler fruitContextMenuStrip.Opening, AddressOf cms_Opening

' Create a new ToolStrip control.
Dim ts As New ToolStrip()

' Create a ToolStripDropDownButton control and add it
' to the ToolStrip control's Items collections.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 152 | P g i n a

Dim fruitToolStripDropDownButton As New
ToolStripDropDownButton("Fruit", Nothing, Nothing, "Fruit")
ts.Items.Add(fruitToolStripDropDownButton)

' Dock the ToolStrip control to the top of the form.
ts.Dock = DockStyle.Top

' Assign the ContextMenuStrip control as the
' ToolStripDropDownButton control's DropDown menu.
fruitToolStripDropDownButton.DropDown = fruitContextMenuStrip

' Create a new MenuStrip control and add a ToolStripMenuItem.
Dim ms As New MenuStrip()
Dim fruitToolStripMenuItem As New ToolStripMenuItem("Fruit",
Nothing, Nothing, "Fruit")
ms.Items.Add(fruitToolStripMenuItem)

' Dock the MenuStrip control to the top of the form.
ms.Dock = DockStyle.Top

' Assign the MenuStrip control as the
' ToolStripMenuItem's DropDown menu.
fruitToolStripMenuItem.DropDown = fruitContextMenuStrip

' Assign the ContextMenuStrip to the form's
' ContextMenuStrip property.
Me.ContextMenuStrip = fruitContextMenuStrip

' Add the ToolStrip control to the Controls collection.
Me.Controls.Add(ts)

'Add a button to the form and assign its ContextMenuStrip.
Dim b As New Button()
b.Location = New System.Drawing.Point(60, 60)
Me.Controls.Add(b)
b.ContextMenuStrip = fruitContextMenuStrip

' Add the MenuStrip control last.
' This is important for correct placement in the z-order.
Me.Controls.Add(ms)
End Sub

' This event handler is invoked when the ContextMenuStrip
' control's Opening event is raised. It demonstrates
' dynamic item addition and dynamic SourceControl
' determination with reuse.
Sub cms_Opening(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs)

' Acquire references to the owning control and item.
Dim c As Control = fruitContextMenuStrip.SourceControl
Dim tsi As ToolStripDropDownItem =
fruitContextMenuStrip.OwnerItem

' Clear the ContextMenuStrip control's
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 153 | P g i n a

' Items collection.
fruitContextMenuStrip.Items.Clear()

' Check the source control first.
If (c IsNot Nothing) Then
' Add custom item (Form)
fruitContextMenuStrip.Items.Add(("Source: " +
c.GetType().ToString()))
ElseIf (tsi IsNot Nothing) Then
' Add custom item (ToolStripDropDownButton or
ToolStripMenuItem)
fruitContextMenuStrip.Items.Add(("Source: " +
tsi.GetType().ToString()))
End If

' Populate the ContextMenuStrip control with its default items.
fruitContextMenuStrip.Items.Add("-")
fruitContextMenuStrip.Items.Add("Apples")
fruitContextMenuStrip.Items.Add("Oranges")
fruitContextMenuStrip.Items.Add("Pears")

' Set Cancel to false.
' It is optimized to true based on empty entry.
e.Cancel = False
End Sub
End Class


Tooltip
Representa una pequea ventana emergente rectangular que muestra una breve descripcin de la finalidad
de un control cuando el usuario sita el puntero sobre el control.

Con la clase ToolTip, puede proporcionar sugerencias a un usuario cuando ste coloca el puntero sobre un
control. Normalmente, la clase ToolTip se utiliza para notificar a los usuarios el uso al que est destinado un
control. Por ejemplo, para un control TextBox que acepta un nombre, podra especificar un texto de
informacin sobre herramientas que indique el formato del nombre que se debe escribir en el control.
Adems de para proporcionar sugerencias, la clase ToolTip se puede utilizar para proporcionar informacin
de estado en tiempo de ejecucin. Por ejemplo, se puede utilizar la clase ToolTip para mostrar datos sobre
la velocidad de conexin y la calidad de la lnea cuando el usuario desplace el puntero sobre un control
PictureBox que muestra el estado de la conexin a Internet.
La clase ToolTip se puede utilizar en cualquier contenedor. Para especificar explcitamente un contenedor,
utilice el constructor ToolTip(IContainer). Un componente ToolTip nico se utiliza normalmente para crear
informacin sobre herramientas para diversos controles en un formulario nico. Despus de crear ToolTip,
utilice una llamada independiente al mtodo SetToolTip para asociar el texto de presentacin de
informacin sobre herramientas a un control individual. A continuacin, cuando el usuario mueve el puntero
sobre un control, se muestra la informacin sobre herramientas con su texto. Puede llamar a SetToolTip ms
de una vez para el mismo control para cambiar el texto que se asocia al control. Para obtener el texto al que
est asociado un control, utilice el mtodo GetToolTip. Para quitar todos los textos de informacin sobre
herramientas asociados a una instancia de la clase ToolTip, utilice el mtodo RemoveAll.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 154 | P g i n a

Nota: La informacin sobre herramientas no se muestra para los controles que estn deshabilitados. A
menos que la propiedad ShowAlways se establezca en true, no se muestra la informacin sobre
herramientas cuando su contenedor est inactivo.

La clase ToolTip proporciona las propiedades y los mtodos siguientes para modificar el comportamiento y
aspecto predeterminados de una informacin sobre herramientas.
Categora Miembros asociados
Presentacin manual Active, Show, Hide, ShowAlways, Popup, StopTimer
Control de tiempo de informacin
sobre herramientas
AutoPopDelay, InitialDelay, ReshowDelay, AutomaticDelay, StopTimer
Contenido
SetToolTip, GetToolTip, StripAmpersands, ToolTipIcon, ToolTipTitle,
RemoveAll
Aspecto BackColor, ForeColor, IsBalloon, OwnerDraw, UseAnimation, UseFading
Si desea que no se muestre ningn texto de informacin sobre herramientas en la aplicacin, utilice la
propiedad Active. Generalmente, la informacin sobre herramientas la dibuja el sistema operativo, pero
para personalizar la apariencia de ToolTip, puede establecer la propiedad OwnerDraw en true y controlar el
evento Draw.
La clase ToolTipTitle implementa la interfaz System.ComponentModel..::.IExtenderProvider, que tiene un
mtodo nico, CanExtend. La informacin sobre herramientas extiende los controles en el mismo formulario
en tiempo de diseo, agregando una propiedad ToolTip.
Ejemplos
En el siguiente ejemplo de cdigo se crea una instancia de la clase ToolTip y la asocia a Form donde se cre
la instancia. Despus, el cdigo inicializa las propiedades de retraso AutoPopDelay, InitialDelay y
ReshowDelay. Adems, la instancia de la clase ToolTip establece la propiedad ShowAlways en true para que
el texto de informacin sobre herramientas se muestre siempre, aunque el formulario no est activo. Por
ltimo, en el ejemplo se asocia el texto de informacin sobre herramientas a dos controles de un formulario,
Button y CheckBox. El ejemplo de cdigo requiere que el mtodo definido en l se encuentre en un Form
que contenga un control Button denominado button1 y un control CheckBox denominado checkBox1 y que
se llame al mtodo desde el constructor de Form.

' This example assumes that the Form_Load event handling method
' is connected to the Load event of the form.
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles
MyBase.Load
' Create the ToolTip and associate with the Form container.
Dim toolTip1 As New ToolTip()

' Set up the delays for the ToolTip.
toolTip1.AutoPopDelay = 5000
toolTip1.InitialDelay = 1000
toolTip1.ReshowDelay = 500
' Force the ToolTip text to be displayed whether or not the form is
active.
toolTip1.ShowAlways = True

' Set up the ToolTip text for the Button and Checkbox.
toolTip1.SetToolTip(Me.button1, "My button1")
toolTip1.SetToolTip(Me.checkBox1, "My checkBox1")
End Sub

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 155 | P g i n a

Programacin Orientada a Objeto

Introduccin a los objetos en Visual Basic
Un objeto es una estructura que contiene la informacin y los mtodos que manipulan los datos. Casi todas
las tareas realizadas en Visual Basic estn asociadas con objetos. Si no tiene experiencia en programacin
orientada a objetos, los siguientes trminos y conceptos le ayudarn a comenzar.

Clases y objetos
Las palabras "clase" y "objeto" se usan con tanta frecuencia en la programacin orientada a objetos que es
fcil confundir los trminos. En general, una class es una representacin abstracta de algo, mientras que
unobjeto es un ejemplo utilizable de lo que representa la clase. La nica excepcin a esta regla la
constituyen los miembros de clases compartidas, que pueden utilizarse en instancias de una clase y en
variables de objeto declaradas como tipo de la clase.

Campos, propiedades, mtodos y eventos
Las clases se componen de campos, propiedades, mtodos y eventos. Los campos y propiedades
representan informacin que contiene un objeto. Los campos se parecen a las variables ya que se pueden
leer y establecer directamente. Por ejemplo, si tiene un objeto denominado "Car", podra almacenar su
color en un campo denominado "Color".
Las propiedades se recuperan y establecen como los campos, pero se implementan mediante los
procedimientos propiedad Get y Set, que proporcionan ms control sobre la forma en que los valores se
establecen o se devuelven. El nivel de direccionamiento indirecto entre el valor que se va a almacenar y los
procedimientos que lo usan ayuda a aislar los datos y permite validar valores antes de asignarlos o
recuperarlos.
Los mtodos representan acciones que un objeto puede realizar. Por ejemplo, un objeto "Car" podra tener
los mtodos "StartEngine", "Drive" y "Stop". Los mtodos se definen agregando procedimientos, ya sean
rutinas o funciones Sub, a la clase.
Los eventos son notificaciones que un objeto recibe de, o transmite a, otros objetos o aplicaciones. Los
eventos permiten a los objetos realizar acciones siempre que se produce un acontecimiento especfico. Un
ejemplo de evento para la clase "Car" sera un evento "Check_Engine". Puesto que Microsoft Windows es un
sistema controlado por eventos, stos pueden proceder de otros objetos, aplicaciones o entradas de usuario
realizadas al hacer clic con el mouse (ratn) o al presionar teclas.

Encapsulacin, herencia y polimorfismo
Los campos, propiedades, mtodos y eventos son solamente la mitad de la ecuacin de la programacin
orientada a objetos. Para que la programacin orientada a objetos sea autntica los objetos deben admitir
tres cualidades: encapsulacin, herencia y polimorfismo.
La encapsulacin significa que un grupo de propiedades, mtodos y otros miembros relacionados se tratan
como si de una sola unidad u objeto se tratase. Los objetos pueden controlar cmo se cambian propiedades
o se ejecutan mtodos. Por ejemplo, un objeto puede validar valores antes de permitir cambios en la
propiedad. La encapsulacin, adems, facilita la posibilidad de realizar cambios en la implementacin
pasado algn tiempo, mediante una actividad denominada ocultacin de datos que permite ocultar los
detalles de implementacin de los objetos.
Herencia describe la posibilidad de crear nuevas clases basadas en una clase existente. La nueva clase
hereda todas las propiedades, mtodos y eventos de la clase base, y puede personalizarse con propiedades
y mtodos adicionales. Por ejemplo, puede crear una nueva clase denominada "Truck" basada en la clase
"Car". La clase "Truck" hereda la propiedad "Color" de la clase "Car" y puede tener propiedades adicionales
como "FourWheelDrive".
Polimorfismo significa que puede tener mltiples clases que se pueden utilizar de forma intercambiable, si
bien cada clase implementa las mismas propiedades o los mismos mtodos de maneras diferentes. El
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 156 | P g i n a

polimorfismo es importante en la programacin orientada a objetos puesto que permite usar elementos que
tienen el mismo nombre, independientemente del tipo de objeto que se est utilizando en ese momento.
Por ejemplo, dada una clase base "Car", el polimorfismo permite al programador definir diferentes mtodos
"StartEngine" para cualquier nmero de clases derivadas. El mtodo "StartEngine" de una clase derivada
denominada "DieselCar" puede ser totalmente diferente del mtodo con el mismo nombre en la clase base.
Otros procedimientos o mtodos pueden usar el mtodo "StartEngine" de las clases derivadas de la misma
forma, con independencia del tipo de objeto "Car" que se est utilizando en ese momento.

Sobrecarga, reemplazo y sombreado
La sobrecarga, el reemplazo y el sombreado son conceptos similares que pueden confundirse fcilmente.
Aunque las tres tcnicas permiten crear miembros con el mismo nombre, existen algunas diferencias
importantes.
Los miembros sobrecargados se utilizan para proporcionar diferentes versiones de una propiedad o
mtodo que tienen el mismo nombre, pero que aceptan un nmero diferente de parmetros, o
parmetros con diferentes tipos de datos.
Las propiedades y mtodos reemplazados se utilizan para reemplazar una propiedad o mtodo
heredados que no son apropiados en una clase derivada. Los miembros reemplazados deben
aceptar el mismo tipo de datos y nmero de argumentos. Las clases derivadas heredan los
miembros reemplazados.
Los miembros sombreados se utilizan para reemplazar localmente un miembro que tiene un mbito
ms amplio. Cualquier tipo puede sombrear cualquier otro tipo. Por ejemplo, puede declarar un
propiedad que sombree un mtodo heredado con el mismo nombre. Los miembros sombreados no
se pueden heredar.

Clases: como planos para objetos
Las clases son representaciones simblicas de objetos; describen las propiedades, campos, mtodos y
eventos que forman objetos de la misma forma que los planos describen los elementos que componen un
edificio. As como un plano puede utilizarse para crear varios edificios, una nica clase puede utilizarse para
crear tantos objetos como sea necesario. Del mismo modo que un plano define qu partes de un edificio son
accesibles a las personas que lo utilizan, las clases tambin pueden controlar el acceso de los usuarios a los
elementos de objetos a travs de la encapsulacin.

Clases y objetos
Los trminos clase y objeto se utilizan a veces indistintamente, pero en realidad, las clases describen
laestructura de los objetos, mientras que los objetos son instancias de clases que se pueden utilizar. Cada
instancia es una copia exacta pero diferente de su clase. Puesto que un objeto es una instancia de una clase,
la accin de crear un objeto se denomina creacin de instancias.
Con la analoga de plano, una clase es un plano y un objeto es un edificio construido a partir de ese plano.
Normalmente, al cambiar los datos en un objeto, no se cambian los datos en ningn otro objeto. (La
excepcin la constituyen los miembros compartidos, miembros de clase declarados con el
modificador Shared, que existen de forma independiente de las instancias especficas de una clase).

Encapsulacin
La encapsulacin es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las
clases proporcionan una de las formas ms comunes de encapsular elementos. En el ejemplo siguiente, la
clase BankAccount encapsula los mtodos, campos y propiedades que describen una cuenta bancaria.
Sin la encapsulacin, debera declarar diferentes procedimientos y variables para almacenar y administrar la
informacin de la cuenta bancaria, y sera difcil trabajar con ms de una cuenta bancaria a la vez. La
encapsulacin permite utilizar datos y procedimientos de la clase BankAccount como una unidad. Puede
trabajar con varias cuentas bancarias al mismo tiempo sin confusin, puesto que cada cuenta se representa
mediante una instancia nica de la clase.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 157 | P g i n a

La encapsulacin tambin permite controlar la forma de utilizar los datos y los procedimientos. Se pueden
utilizar modificadores de acceso, como Private o Protected, para evitar que unos procedimientos externos
ejecuten mtodos de clase o lean y modifiquen datos en propiedades y campos. Debe declarar detalles
internos de una clase como Private para evitar que se utilicen fuera de su clase; esta tcnica se
llamaocultacin de datos y es el modo de proteger informacin del cliente, como un saldo de cuenta por
ejemplo.
Una regla bsica de la encapsulacin es que los datos de clase slo se deben modificar o recuperar mediante
mtodos o procedimientos Property. Al ocultar los detalles de implementacin de las clases se evita que
sean utilizados de forma no deseada y hace posible la modificacin posterior de tales elementos sin
problemas de compatibilidad. Por ejemplo, en las versiones posteriores de la clase BankAccount se podra
cambiar el tipo de datos del campo AccountBalance sin peligro de interrumpir otras aplicaciones que se
basan en que ese campo tenga un tipo de datos especfico.

Herencia
Al igual que para las estructuras de Visual Basic, puede utilizar las clases para definir tipos de datos que
encapsulan un grupo de elementos relacionados. No obstante, a diferencia de las estructuras, las clases de
Visual Basic pueden heredar y extender las caractersticas de otras clases. Las clases que sirven de base para
nuevas clases se denominan clases base. Las clases que se derivan de clases base se denominan clases
derivadas. Las clases derivadas heredan todos los campos, propiedades, mtodos y eventos de la clase base.
Esto significa que puede desarrollar y depurar una clase una vez y reutilizarla despus como base de otras
clases.
En el siguiente ejemplo se define una clase base que representa una cuenta bancaria genrica y una clase
especfica que hereda las propiedades de la clase base pero que se personaliza para describir una cuenta
corriente.

Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
' Return the available balance.
Return AccountBalance
End Get
End Property
End Class

Class CheckingAccount
Inherits BankAccount
Sub ProcessCheck()
' Add code to process a check drawn on this account.
End Sub
End Class

Miembros compartidos
De forma predeterminada, los datos de clase se especifican para cada instancia de la clase, pero en
ocasiones puede ser deseable compartir un solo elemento de datos entre todos los objetos creados a partir
de una clase. En casos como ste, utilice el modificador Shared para hacer que una variable comparta el
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 158 | P g i n a

mismo valor en todas las instancias de una clase (los miembros Shared a veces se llaman "miembros
estticos" en otros lenguajes de programacin). Los mtodos compartidos pueden llamarse directamente
mediante un nombre de clase sin necesidad de crear previamente una instancia de la clase.

Sombrear
Las clases derivadas pueden utilizar la palabra clave Shadows para declarar un miembro con el mismo
nombre que un miembro heredado. El tipo de datos de los miembros sombreados no es necesario que sea
el mismo que el del miembro que se sombrea. Por ejemplo, una propiedad puede sombrear una variable de
tipo Integer.

Clases y mdulos
Tanto las clases como los mdulos son tipos de referencia que encapsulan los elementos definidos en ellos,
pero difieren en la forma en que se realiza el acceso a los elementos desde otros procedimientos.

Diferencias entre clases y mdulos
La diferencia principal entre clases y mdulos consiste en que pueden crearse instancias de clases como
objetos pero no de mdulos. Como slo existe una copia de los datos de un mdulo estndar, cuando una
parte del programa cambia una variable pblica en un mdulo estndar, cualquier otra parte del programa
obtendr el mismo valor si lee luego esa variable. En comparacin, los datos de objeto existen
individualmente para cada objeto con instancias. Otra distincin es que, a diferencia de los mdulos
estndar, las clases pueden implementar interfaces.

Nota:
Cuando el modificador Shared se aplica a un miembro de clase, est asociado con la propia clase en lugar
de con una instancia determinada de la clase. Se tiene acceso directo al miembro mediante el nombre de
clase, de la misma manera que se tiene acceso a los miembros de mdulos.

Las clases y los mdulos tambin emplean mbitos diferentes para sus miembros. Los miembros definidos
dentro de una clase tienen el mbito de una instancia especfica de la clase y slo existen mientras dure el
objeto. Para tener acceso a los miembros de clases desde el exterior de una clase, debe utilizar los nombres
completos con el formato Objeto.Miembro.

Por otro lado, los miembros declarados dentro de un mdulo son de manera predeterminada accesibles
pblicamente y se puede obtener acceso a ellos mediante cualquier cdigo que tenga acceso al mdulo.
Esto significa que las variables en un mdulo estndar son de hecho variables globales porque son visibles
desde cualquier parte del proyecto y existen durante toda la vida til del programa.

Duracin de los objetos: cmo se crean y destruyen
Una instancia de una clase (un objeto) se crea mediante la palabra clave New. A menudo hay que realizar
tareas de inicializacin en los objetos nuevos antes de utilizarlos. Entre las tareas de inicializacin comunes
se incluyen abrir archivos, conectar con bases de datos y leer valores de claves del Registro. Visual Basic
controla la inicializacin de objetos nuevos mediante unos procedimientos denominados constructores
(mtodos especiales que proporcionan control sobre la inicializacin).
Common Language Runtime (CLR) libera un objeto cuando ste ha salido del mbito. Visual Basic controla la
liberacin de recursos del sistema mediante unos procedimientos denominados destructores. Juntos, los
constructores y destructores permiten la creacin de bibliotecas de clases robustas y predecibles.

Sub New y Sub Finalize
Los procedimientos Sub New y Sub Finalize de Visual Basic inicializan y destruyen objetos; reemplazan a los
mtodos Class_Initialize y Class_Terminate que se utilizaban en Visual Basic 6.0 y versiones anteriores. A
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 159 | P g i n a

diferencia de Class_Initialize, el constructor Sub New slo se puede ejecutar una vez cuando se crea una
clase. Slo se le puede llamar explcitamente desde la primera lnea de cdigo de otro constructor en la
misma clase o en una clase derivada. Adems, el cdigo del mtodo Sub New siempre se ejecuta antes de
cualquier otro cdigo en una clase. Visual Basic 2005 y las versiones posteriores crean implcitamente en
tiempo de ejecucin un constructor Sub New si no define explcitamente un procedimiento Sub New para
una clase.
Antes de liberar objetos, CLR llama automticamente al mtodo Finalize para los objetos que definen un
procedimiento Sub Finalize. El mtodo Finalize puede contener cdigo que es necesario ejecutar
inmediatamente antes de destruir un objeto, por ejemplo el cdigo para cerrar archivos y guardar
informacin de estado. Puesto que se produce una ligera disminucin del rendimiento al ejecutar Sub
Finalize, este mtodo slo debe definirse cuando sea necesario liberar objetos explcitamente.

Nota:
El recolector de elementos no utilizados de CLR no se deshace de los objetos no administrados (ni puede
eliminarlos), que son aquellos que el sistema operativo ejecuta directamente, fuera del entorno de CLR.
Esto se debe a que hay que deshacerse de los objetos no administrados diferentes de maneras distintas.
Esa informacin no est asociada directamente al objeto no administrado; se debe buscar en la
documentacin del objeto. Una clase que utiliza objetos no administrados debe deshacerse de ellos en su
mtodo Finalize.

El destructor Finalize es un mtodo protegido al que slo se puede llamar desde la clase a la que pertenece
o desde clases derivadas. El sistema llama automticamente a Finalize cuando se destruye un objeto, por lo
que no se debe llamar explcitamente a Finalize desde fuera de una implementacin de su clase derivada.
A diferencia de Class_Terminate, que se ejecuta en cuanto un objeto se establece en Nothing, normalmente
hay un retardo entre el momento en que un objeto pierde el mbito y el momento en que Visual Basic llama
al destructor Finalize. Visual Basic 2005 y versiones posteriores proporcionan un segundo tipo de
destructor,Dispose, al que se puede llamar explcitamente en cualquier momento para liberar recursos de
forma inmediata.

Nota:
Un destructor Finalize no debera producir excepciones porque la aplicacin no puede controlarlas y
pueden hacer que la aplicacin finalice.

Utilizar constructores y destructores
Los constructores y destructores controlan la creacin y destruccin de objetos.

Constructores
Para crear un constructor para una clase, cree un procedimiento denominado Sub New en cualquier parte
de la definicin de clase. Para crear un constructor parametrizado, especifique los nombres y los tipos de
datos de los argumentos de Sub New tal como lo hara en cualquier otro procedimiento, como en el cdigo
siguiente:

Sub New(ByVal s As String)

Con frecuencia, los constructores estn sobrecargados, como en el cdigo siguiente:

Sub New(ByVal s As String, i As Integer)

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 160 | P g i n a

Cuando se define una clase derivada de otra, la primera lnea del constructor debe ser una llamada al
constructor de la clase base, a no ser que sta tenga un constructor accesible que no requiera parmetros.
Por ejemplo, para llamar a la clase base que contiene el constructor anterior, sera MyBase.New(s). En caso
contrario, MyBase.New es opcional y el tiempo de ejecucin de Visual Basic la llama implcitamente.
Despus de escribir el cdigo para llamar al constructor del objeto primario, puede agregar cualquier cdigo
de inicializacin adicional en el procedimiento Sub New. Sub New puede aceptar argumentos cuando se
realiza la llamada como a un constructor con parmetros. Estos parmetros se pasan desde el
procedimiento que llama al constructor; por ejemplo, Dim AnObject As New ThisClass(X).

Destructores
El cdigo siguiente muestra cmo utilizar Dispose y Finalize para liberar los recursos de una clase base.

Nota:
Debera seguir las instrucciones para implementar IDisposable.

Nota:
Aunque este ejemplo usa Collect para mostrar a qu mtodos llama el recolector de elementos no
utilizados para eliminar mtodos, en general es ms conveniente dejar que Common Language Runtime
(CLR) administre la recoleccin de elementos no utilizados.

Administracin de recursos
Todos los objetos consumen recursos del sistema, como memoria, identificadores de archivo y conexiones
de bases de datos. Common Language Runtime (CLR) administra los recursos automticamente y
generalmente no hay que preocuparse de liberar los objetos innecesarios. No obstante, comprender cmo
funciona la administracin de recursos puede ayudarle a disear las aplicaciones ms eficazmente.

Recoleccin de elementos no utilizados
CLR utiliza un sistema denominado recoleccin de elementos no utilizados para administrar los recursos
asignados. La recoleccin de elementos no utilizados del sistema libera los recursos de un objeto cuando la
ejecucin de cdigo de la aplicacin ya no puede tener acceso al objeto. El algoritmo de la recoleccin de
elementos no utilizados es no determinista, por lo que no se puede determinar cundo los CLR liberarn los
recursos de un objeto. En las siguientes secciones se describen algunos de los cambios en la forma de
administrar los recursos en Visual Basic.

Asignar objetos a Nothing
Nothing es una palabra clave utilizada por Visual Basic para indicar que una variable de objeto no contiene
una referencia a un objeto. En las versiones anteriores de Visual Basic se recomendaba asignar los objetos
no utilizados a Nothing para disociar la variable de objeto y liberar recursos. An pueden asignarse objetos
no utilizados a Nothing, pero debido a la forma en que Visual Basic administra los recursos, este proceso no
garantiza que los objetos queden liberados inmediatamente. En general, slo se deben asignar
a Nothing objetos duraderos (como miembros compartidos o variables globales).

Desechar
Algunos objetos admiten un mtodo denominado Dispose cuya finalidad consiste en liberar recursos del
sistema de forma ms expeditiva. Las clases que admiten el mtodo Dispose deben implementar la
interfaz IDisposable. Es necesario llamar explcitamente al mtodo Disposecuando se deseen liberar recursos
de objetos. Por ejemplo:

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 161 | P g i n a

ThisObject.Dispose()

Finalize
Otro mtodo que admiten algunas clases, Finalize, se ejecuta automticamente cuando se libera un objeto y
puede utilizarse para realizar otras tareas de limpieza. El mtodo Finalize es similar al
mtodo Class_Terminate() utilizado en versiones anteriores de Visual Basic. Despus de que un objeto
quede inaccesible, CLR llamar en el futuro al mtodo Finalize del objeto. Dado que el algoritmo de la
recoleccin de elementos no utilizados es no determinista, se podra llamar al
mtodo Finalize inmediatamente o despus varias horas.

Determinar el tipo de objeto
Las variables de objeto genricas (es decir, variables declaradas como Object) pueden contener objetos de
cualquier clase. Al utilizar variables de tipo Object, puede necesitar tomar medidas diferentes basadas en la
clase del objeto; por ejemplo, algunos objetos no podran admitir una propiedad determinada o mtodo.
Visual Basic proporciona dos formas de determinar qu tipo de objeto se almacena en una variable de
objeto: la funcin TypeName y el operadorTypeOf...Is.

TypeName y TypeOfIs
La funcin TypeName devuelve una cadena y es la opcin ms conveniente si se necesita almacenar o
presentar el nombre de clase de un objeto, como se muestra en el fragmento de cdigo siguiente:

Dim Ctrl As Control = New TextBox
MsgBox(TypeName(Ctrl))

El operador TypeOf...Is es idneo para comprobar el tipo de un objeto, puesto que es mucho ms rpido
que una comparacin de cadenas equivalente que utiliza TypeName. El fragmento de cdigo siguiente
usa TypeOf...Is dentro de una instruccin If...Then...Else:

If TypeOf Ctrl Is Button Then
MsgBox("The control is a button.")
End If

Use este mtodo con precaucin. El operador TypeOf...Is devuelveTrue si un objeto es de un tipo especfico
o si se deriva de un tipo especfico. Casi todas las tareas que se pueden realizar con Visual Basic implican el
uso de objetos, entre ellos algunos elementos que normalmente no se suponen objetos, por ejemplo,
cadenas y enteros. Estos objetos se derivan de Object y heredan mtodos de ellos. Cuando se pasa
un Integer y se evala con Object, el operador TypeOf...Isdevuelve True. El resultado del ejemplo siguiente
declara que el parmetro InParam es a la vez Object e Integer:

Sub CheckType(ByVal InParam As Object)
' Both If statements evaluate to True when an
' Integer is passed to this procedure.
If TypeOf InParam Is Object Then
MsgBox("InParam is an Object")
End If
If TypeOf InParam Is Integer Then
MsgBox("InParam is an Integer")
End If
End Sub

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 162 | P g i n a

En el ejemplo siguiente se utilizan TypeOf...Is y TypeName para determinar el tipo del objeto que se les pasa
en el argumento Ctrl. El procedimiento TestObject llama a ShowType con tres clases de controles diferentes.

Sub ShowType(ByVal Ctrl As Object)
'Use the TypeName function to display the class name as text.
MsgBox(TypeName(Ctrl))
'Use the TypeOf function to determine the object's type.
If TypeOf Ctrl Is Button Then
MsgBox("The control is a button.")
ElseIf TypeOf Ctrl Is CheckBox Then
MsgBox("The control is a check box.")
Else
MsgBox("The object is some other type of control.")
End If
End Sub

Protected Sub TestObject()
'Test the ShowType procedure with three kinds of objects.
ShowType(Me.Button1)
ShowType(Me.CheckBox1)
ShowType(Me.RadioButton1)
End Sub

Cmo: Declarar un objeto usando un inicializador de objeto
Los inicializadores de objeto permiten declarar y crear instancias de una instancia de una clase en una sola
instruccin. Adems, puede inicializar uno o ms miembros de la instancia a la vez, sin invocar ningn
constructor con parmetros.
Al utilizar un inicializador de objeto para crear una instancia de un tipo con nombre, se llama al constructor
predeterminado de la clase, seguido de la inicializacin de los miembros designados en el orden
especificado.
El procedimiento siguiente muestra cmo crear una instancia de una clase Student de tres maneras
diferentes. La clase tiene, entre otros datos, el nombre, apellido y propiedades de ao de clase. Cada una de
las tres declaraciones crea una nueva instancia de Student, con la propiedad First establecida en "Michael",
la propiedad Last establecida en "Tucker" y todos los otros miembros establecidos en sus valores
predeterminados. El resultado de cada declaracin del procedimiento es equivalente al ejemplo siguiente,
que no utiliza ningn inicializador de objeto.

Dim student0 As New Student
With student0
.First = "Michael"
.Last = "Tucker"
End With

Para crear un objeto de una clase con nombre utilizando un inicializador de objeto
1. Comience la declaracin como si pensara utilizar un constructor.

Dim student1 As New Student

2. Escriba la palabra clave With, seguida por una lista de inicializaciones entre llaves.

Dim student1 As New Student With { <initialization list> }
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 163 | P g i n a


3. En la lista de inicializaciones, incluya cada propiedad que desee inicializar y a la que desee asignar
un valor inicial. El nombre de la propiedad va precedido por un punto.

Dim student1 As New Student With {.First = "Michael", _
.Last = "Tucker"}

Puede inicializar uno o ms miembros de la clase.
4. O bien, puede declarar una nueva instancia de la clase y, a continuacin, asignarle un valor.
Primero, declare una instancia de Student:

Dim student2 As Student

5. Comience la creacin de una instancia de Student de la manera normal.

Dim student2 As Student = New Student

6. Escriba With y, a continuacin, un inicializador de objeto para inicializar uno o ms miembros de la
nueva instancia.

Dim student2 As Student = New Student With {.First = "Michael", _
.Last = "Tucker"}

7. Puede simplificar la definicin del paso anterior omitiendo As Student. De esta forma, el
compilador determina que student3 es una instancia de Student utilizando la inferencia de tipo de
variable local.

Dim student3 = New Student With {.First = "Michael", _
.Last = "Tucker"}

Cmo: Utilizar la nueva palabra clave
Para crear una instancia de una clase, utilice la palabra clave New. A diferencia de los tipos de valor, como
Integer y Double, los objetos son tipos de referencia, y debe crearlos de forma explcita antes de poder
utilizarlos. Por ejemplo, observe las siguientes dos lneas de cdigo:

Dim Button1 As System.Windows.Forms.Button
Dim Button2 As New System.Windows.Forms.Button()

La primera instruccin declara una variable de objeto que puede contener una referencia a un objeto de
botn. Sin embargo, la variable Button1 contiene el valor Nothing hasta que le asigne un objeto de
tipo Button. La segunda instruccin tambin define una variable que puede contener un objeto de botn,
pero la palabra clave New crea un objeto de botn y lo asigna a la variableButton2.
Como los formularios y controles son en realidad clases, puede utilizar la palabra clave New para crear
instancias nuevas de estos elementos, cuando sea necesario.

Para crear instancias nuevas de una clase con New
1. Abra un nuevo proyecto de aplicacin para Windows, y coloque un botn de comando y otros
controles diversos en un formulario denominado Form1.
2. Agregue el cdigo siguiente al procedimiento de evento Click del botn de comando:

Dim f As New Form1
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 164 | P g i n a

f.Show()

3. Ejecute la aplicacin, y haga clic en el botn de comando varias veces.
4. Coloque a un lado el formulario frontal. Como el formulario es una clase con una interfaz visible,
puede ver las copias adicionales. Cada copia tiene los mismos controles, en la misma posicin que
los del formulario original en tiempo de diseo.
Puede utilizar la palabra clave New para crear objetos desde dentro de las clases. El procedimiento siguiente
proporciona un ejemplo.

Para ver cmo New crea instancias de una clase
1. Abra un proyecto nuevo, y coloque un botn de comando en un formulario denominadoForm1.
2. En el men Proyecto, elija Agregar clase para agregar una clase al proyecto.
3. Ponga a la clase nueva el nombre de ShowMe.vb.
4. Agregue el procedimiento siguiente a ShowMe:

Public Class ShowMe
Sub ShowFrm()
Dim frmNew As Form1
frmNew = New Form1
frmNew.Show()
frmNew.WindowState = FormWindowState.Minimized
End Sub
End Class

5. Agregue el cdigo siguiente para controlar el evento Click de Button1 de su formulario:

Protected Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim clsNew As New ShowMe
clsNew.ShowFrm()
End Sub

6. Para utilizar este ejemplo, ejecute la aplicacin y haga clic en el botn de comando varias veces.
Aparecer un icono minimizado de formulario en la barra de tareas cada vez que se cree una
instancia nueva de la clase ShowMe.

Propiedades, campos y mtodos de clases
En general, los campos y las propiedades representan informacin sobre un objeto, mientras que los
mtodos representan acciones que un objeto puede realizar.
Los temas siguientes describen los mecanismos para agregar propiedades, campos y mtodos a las clases, y
abordan cuestiones relacionadas con estos elementos.

Propiedades y procedimientos de propiedad
Se pueden utilizar tanto propiedades como campos para almacenar informacin en un objeto. Mientras que
los campos son simplemente variables pblicas, las propiedades utilizan procedimientos de propiedad para
controlar cmo se establecen y devuelven valores. Los procedimientos de propiedad son bloques de cdigo
declarados dentro de las definiciones de propiedad que puede ejecutar cdigo cuando se establece o
recupera el valor de una propiedad.
Visual Basic tiene dos tipos de procedimientos de propiedad: los procedimientos de propiedad Get para
recuperar un valor de una propiedad y los procedimientos de propiedad Set para asignar un valor a una
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 165 | P g i n a

propiedad. Por ejemplo, una propiedad que almacena el saldo de una cuenta bancaria podra utilizar cdigo
en un procedimiento de propiedad Get para notificar el inters y comprobar comisiones por servicios antes
de devolver el saldo disponible. Puede utilizar luego el procedimiento de propiedad Set para validar el
balance y evitar que se actualice incorrectamente. Es decir, los procedimientos de propiedad permiten a un
objeto proteger y validar sus propios datos.
En el siguiente fragmento de cdigo se compara el modo en el que los campos y propiedades validan los
valores.

Protected Sub TestFieldsAndProperties()
' Assume, for this example, that the only valid values for
' the field and property are numbers less than 10.
Dim NewClass As New ThisClass

' Test data validation.

' Works because there is no data validation.
NewClass.ThisField = 36
' Will print 36.
MsgBox("ThisField = " & NewClass.ThisField)

' The attempt to set the field to a value greater than 10 will silently fail.
NewClass.ThisProperty = 36
' The next statement will print the old value of 0 instead.
MsgBox("ThisProperty = " & NewClass.ThisProperty)
End Sub

Public Class ThisClass
' Declare a field.
Public ThisField As Integer
' Field used for Property Set operations.
Private thisPropertyValue As Integer = 0
' Declare a property.
Public Property ThisProperty() As Integer
Get
Return thisPropertyValue
End Get
Set(ByVal Value As Integer)
' Only allow Set operation for values less than 10.
If Value < 10 Then thisPropertyValue = Value
End Set
End Property
End Class

El procedimiento TestFieldsAndProperties crea una instancia de la clase, y establece y recupera los valores
de los campos y propiedades. En este ejemplo se asume que los nicos valores vlidos son nmeros
menores de 10. Dado que no hay forma de validar los valores asignados a los campos, es posible establecer
en el campo el valor 36. No obstante, la propiedad solamente realiza asignaciones para nmeros menores
de 10, de modo que el intento de establecer 36 en el campo no se tiene en cuenta.

Propiedades de slo lectura y escritura
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 166 | P g i n a

La mayora de las propiedades tienen procedimientos de propiedad Get y Set que puede utilizar para leer y
modificar el valor que almacenan. No obstante, puede utilizar los modificadores ReadOnly y WriteOnly para
restringir la modificacin o la lectura de las propiedades.
Las propiedades de slo lectura no pueden tener procedimientos de propiedad Set; estas propiedades son
tiles para elementos que desea exponer, pero cuya modificacin no desea permitir. Por ejemplo, podra
utilizar una propiedad de slo lectura para proporcionar la velocidad del procesador de un equipo.
Las propiedades de slo escritura no pueden tener procedimientos de propiedad Get y son tiles para
configurar objetos con datos que no deben o no se pueden almacenar en el objeto. Por ejemplo, se puede
utilizar una propiedad de slo escritura para tomar una contrasea y cambiar el estado del objeto sin
almacenar la contrasea.

Comparacin de procedimientos de propiedades y campos
Las propiedades y los campos ambos almacenan y recuperan informacin en un objeto. Dada su similitud,
resulta difcil determinar cul es la mejor opcin de programacin en casos concretos.
Utilice procedimientos de propiedad cuando:
Necesite controlar cundo y cmo se establece o recupera un valor.
La propiedad tenga un conjunto de valores bien definidos que no necesiten validacin.
El establecimiento del valor genera algn cambio perceptible en el estado del objeto, como una
propiedad IsVisible.
El establecimiento de la propiedad ocasione cambios en otras variables internas o en los valores de
otras propiedades.
Deban ejecutarse un conjunto de pasos antes de poder establecer o recuperar la propiedad.
Utilice campos cuando:
El valor sea de un tipo de autovalidacin. Por ejemplo, si un valor distinto de True o False se asigna
a una variable Boolean, se produce un error o una conversin de datos automtica.
Sea vlido cualquier valor del intervalo admitido por el tipo de datos. Esto es verdadero en muchas
propiedades de tipo Single o Double.
La propiedad sea un tipo de datos String y no existan restricciones en cuanto al tamao o al valor
de la cadena.

Mtodos de una clase
Los mtodos de una clase son simplemente procedimientos Sub oFunction declarados dentro de la clase.
Por ejemplo, para crear un mtodo Withdrawal para una clase denominada Account, se podra agregar la
funcin Public al mdulo de la clase:

Public Function WithDrawal(ByVal Amount As Decimal, _
ByVal TransactionCode As Byte) As Double
' Add code here to perform the withdrawal,
' return a transaction code,
' or to raise an overdraft error.
End Function

Mtodos compartidos
Los mtodos compartidos pueden llamarse directamente desde la clase sin necesidad de crear previamente
una instancia de la clase. Los mtodos compartidos son tiles cuando se desea asociar un mtodo con una
instancia especfica de una clase. Los mtodos compartidos no se pueden declarar mediante los
modificadores Overridable, NotOverridable o MustOverride. Los mtodos que se declaran en mdulos
estn compartidos implcitamente y no pueden utilizar el modificador Shared explcitamente.

Class ShareClass
Shared Sub SharedSub()
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 167 | P g i n a

MsgBox("Shared method.")
End Sub
End Class

Sub Test()
' Call the method.
ShareClass.SharedSub()
End Sub

Proteccin de los detalles de la implementacin
Los procedimientos de utilidades empleados internamente por una clase se deben declarar
como Private,Protected o Friend. La restriccin de la accesibilidad de tales mtodos protege a los
desarrolladores que utilizan sus objetos, ya que le permite realizar futuros cambios sin que afecte al cdigo
que utiliza los objetos.
La proteccin de los detalles de la implementacin de un objeto es otra faceta de la encapsulacin. La
encapsulacin permite mejorar el rendimiento de los mtodos o cambiar totalmente la forma de
implementar un mtodo, sin necesidad de modificar el cdigo que utiliza el mtodo.

Propiedades y mtodos sobrecargados
La sobrecarga consiste en crear ms de un procedimiento, constructor de instancia o propiedad en una clase
con el mismo nombre y distintos tipos de argumento.

Uso de la sobrecarga
La sobrecarga es especialmente til cuando un modelo de objeto exige el uso de nombres idnticos para
procedimientos que operan en diferentes tipos de datos. Por ejemplo, una clase que puede mostrar
diferentes tipos de datos podra tener procedimientos Display como los siguientes:

Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub

Sin sobrecarga, sera necesario crear distintos nombres para cada procedimiento, aunque realicen el mismo
cometido, como se muestra a continuacin:

Sub DisplayChar(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 168 | P g i n a

La sobrecarga facilita el uso de propiedades o mtodos, puesto que ofrece una seleccin de tipos de datos
que se pueden utilizar. Por ejemplo, se pude llamar al mtodo sobrecargado Display descrito anteriormente
con cualquiera de las siguientes lneas de cdigo:

' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)

En tiempo de ejecucin, Visual Basic llama al procedimiento correcto basndose en los tipos de datos de los
parmetros que se han especificado.

Nota:
La sobrecarga, el reemplazo y el sombreado son conceptos similares que pueden confundirse fcilmente..

Reglas de sobrecarga
Es posible crear un miembro sobrecargado para una clase agregando dos o ms propiedades o mtodos con
el mismo nombre. A excepcin de los miembros derivados sobrecargados, cada miembro sobrecargado
debe tener distintas listas de parmetros, y los elementos que a continuacin se enumeran, no se pueden
utilizar como caractersticas diferenciadoras al sobrecargar una propiedad o un procedimiento:
Modificadores, como por ejemplo ByVal o ByRef, que se aplican a un miembro o parmetros de un
miembro.
Nombres de parmetros
Tipos de valores devueltos de procedimientos
La palabra clave Overloads es opcional en la sobrecarga, aunque si algn miembro sobrecargado la utiliza,
todos los dems miembros sobrecargados con el mismo nombre deben especificarla tambin.
Las clases derivadas pueden sobrecargar miembros heredados con miembros que tengan idnticos
parmetros y tipos de parmetros, un proceso denominado sombrear por nombre y firma. Si se utiliza la
palabra clave Overloads al sombrear por nombre y firma, se utilizar la implementacin de la clase derivada
del miembro en vez de la implementacin de la clase base y todas las dems sobrecargas de dicho miembro
estarn disponibles para las instancias de la clase derivada.
Si se omite la palabra clave Overloads al sobrecargar un miembro heredado con un miembro que tiene
parmetros y tipos de parmetros idnticos, la sobrecarga se denomina sombrear por nombre. El proceso
sombrear por nombre reemplaza a la implementacin heredada de un miembro y hace que todas las dems
sobrecargas no estn disponibles para las instancias de la clase derivada y sus descendientes.
Los modificadores Overloads y Shadows no pueden utilizarse a la vez con la misma propiedad o mtodo.

Invalidar propiedades y mtodos
Una clase derivada hereda las propiedades y mtodos definidos en su clase base. Esto es til porque puede
reutilizar estos elementos cuando son adecuados para la clase derivada. Si la propiedad o mtodo en la clase
base est marcada con la palabra clave Overridable, puede definir una nueva implementacin para el
miembro en la clase derivada. Utilice la palabra clave Overrides para sombrear el miembro volvindolo a
definir en la clase derivada. Esto es til cuando no puede utilizar el miembro "tal cual".
En la prctica, los miembros reemplazados suelen utilizarse para implementar el polimorfismo.
Las siguientes reglas se aplican a los mtodos de reemplazo.
Slo se pueden reemplazar miembros que estn marcados con la palabra clave Overridable en la
clase base.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 169 | P g i n a

De forma predeterminada, las propiedades y los mtodos son NotOverridable.
Los miembros reemplazados deben tener los mismos argumentos que los miembros heredados de
la clase base.
La nueva implementacin de un miembro puede llamar a la implementacin original de la clase
primaria mediante la especificacin de MyBase antes del nombre de mtodo.

Nota:
La sobrecarga, el reemplazo y el sombreado son conceptos similares que pueden confundirse fcilmente..

Ejemplo
Suponga que desea definir clases para controlar la nmina. Podra definir una clase genrica Payroll que
contenga un mtodo RunPayroll para calcular la nmina de una semana tpica. Podra utilizar Payroll como
clase base de una clase ms especializada BonusPayroll que se utilizara para distribuir bonificaciones entre
los empleados.
La clase BonusPayroll puede heredar y reemplazar al mtodo PayEmployee definido en la clase basePayroll.
En el siguiente ejemplo se define una clase base, Payroll, y una clase derivada, BonusPayroll, que reemplaza
a un mtodo heredado, PayEmployee. Un procedimiento, RunPayroll crea y luego pasa un objetoPayroll y un
objeto BonusPayroll a una funcin, Pay, que ejecuta el mtodo PayEmployee de ambos objetos.

Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D

Class Payroll
Overridable Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
As Decimal

PayEmployee = HoursWorked * PayRate
End Function
End Class

Class BonusPayroll
Inherits Payroll
Overrides Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
As Decimal

' The following code calls the original method in the base
' class, and then modifies the returned value.
PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
End Function
End Class

Sub RunPayroll()
Dim PayrollItem As Payroll = New Payroll
Dim BonusPayrollItem As New BonusPayroll
Dim HoursWorked As Decimal = 40

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 170 | P g i n a

MsgBox("Normal pay is: " & _
PayrollItem.PayEmployee(HoursWorked, PayRate))
MsgBox("Pay with bonus is: " & _
BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub

Reemplazar modificadores
Puede utilizar los modificadores NotOverridable y MustOverride en una clase base para controlar cmo las
clases derivadas reemplazan sus propiedades y mtodos.
El modificador NotOverridable define un mtodo de una clase base que no se puede reemplazar en clases
derivadas. Todos los mtodos son NotOverridable a menos que se marquen con el modificadorOverridable.
Puede utilizar el modificador NotOverridable si no desea permitir que un mtodo reemplazado sea
reemplazado de nuevo en una clase derivada.
Los mtodos definidos con el modificador MustOverride no tienen ninguna implementacin en la clase base
y deben implementarse en clases derivadas. Las clases que contienen mtodos MustOverride deben
marcarse con el modificador MustInherit.

Ejemplo
MustInherit Class BaseClass
Public MustOverride Sub aProcedure()
End Class

Class DerivedClass
Inherits BaseClass
Public NotOverridable Overrides Sub aProcedure()
' Override a procedure inherited from the base class
' and mark it with the NotOverridable modifier so that
' it cannot be overridden in classes derived from this class.
End Sub
End Class

Miembros compartidos en Visual Basic
Los miembros compartidos son propiedades, procedimientos y campos que comparten todas las instancias
de una clase o estructura. En algunos lenguajes de programacin estos elementos se denominan miembros
estticos.

Campos y propiedades compartidos
Los campos y propiedades compartidos son tiles cuando se tiene informacin que forma parte de una
clase, pero que no es especfica de ninguna instancia de una clase. Cuando se cambia el valor de un campo y
propiedad compartido, se cambia el valor asociado a la clase y todas las instancias de la clase.
Por otro lado, al cambiar el valor de un campo o propiedad no compartidos asociados a una instancia, el
valor de dicho campo o propiedad no se ve afectado en otras instancias de la clase. Los campos y
propiedades no compartidos existen de forma independiente en cada instancia de una clase.
De esta forma, los campos y propiedades compartidos se comportan como variables globales a las que slo
se puede tener acceso desde instancias de una clase, o con cualificacin del nombre de clase. Sin campos ni
propiedades compartidos, sera necesario utilizar variables en el nivel de mdulo para conseguir el mismo
efecto. No obstante, las variables mdulo pueden dificultar la comprensin y el mantenimiento de las clases.
Adems, el uso de variables en el mbito de mdulo de esta forma infringe el concepto de encapsulacin
que las clases representan.

Procedimientos compartidos
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 171 | P g i n a

Los procedimientos compartidos son mtodos de clase que no estn asociados con una instancia especfica
de una clase. Por ejemplo, el mtodo Cos definido dentro de la clase Math es un mtodo compartido. Se
puede llamar a un procedimiento compartido como un mtodo de un objeto o directamente desde la clase.
Los procedimientos y las propiedades compartidos no tienen acceso a las instancias de la clase. Por este
motivo, en los mtodos compartidos, slo se permiten referencias calificadas a miembros de datos no
compartidos.

Nota:
No conviene escribir cdigo desde el que se pueda tener acceso a un miembro compartido a travs de
una instancia de la clase. Esto se debe a que el compilador no tiene en cuenta la calificacin del miembro
compartido y lo trata como si se obtuviera acceso a l directamente a travs de la clase. En algunas
situaciones, quizs desee que el objeto de cualificacin ejecute cierto cdigo y, por tanto, el compilador
de Visual Basic genere una advertencia de acceso a un miembro compartido a travs de una instancia de
una clase. IntelliSense no muestra los miembros compartidos de una instancia de la clase.

Ejemplo de miembros compartidos
En el ejemplo siguiente se crea un campo compartido, dos campos de instancias y un mtodo compartido
para demostrar cmo funcionan los miembros compartidos en el cdigo:

Public Class Item
Public Shared Count As Integer = 1
Public Shared Sub ShareMethod()
MsgBox("Current value of Count: " & Count)
End Sub

Public Sub New(ByVal Name As String)
' Use Count to initialize SerialNumber.
Me.SerialNumber = Count
Me.Name = Name
' Increment the shared variable
Count += 1
End Sub
Public SerialNumber As Integer
Public Name As String
Public Sub InstanceMethod()
MsgBox("Information in the first object: " & _
Me.SerialNumber & vbTab & Me.Name)
End Sub
End Class

Sub TestShared()
' Create two instances of the class.
Dim part1 As New Item("keyboard")
Dim part2 As New Item("monitor")

part1.InstanceMethod()
part2.InstanceMethod()
Item.ShareMethod()
End Sub

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 172 | P g i n a

Cuando ejecuta el procedimiento TestShared, se crean dos instancias de la clase. El constructor utiliza el
campo compartido Count para inicializar el campo de instancia SerialNumber y, a continuacin,
incrementa Count. Esta tcnica proporciona automticamente a cada instancia un nmero de serie
diferente.
Despus de crear las dos instancias, el mtodo de instanciaInstanceMethod se llama en ambos objetos, y
tambin se llama al mtodo compartido ShareMethod. El resultado es:

Information in the first object: 1 keyboard
Information in the second object: 2 monitor
Current value of the shared Count field: 3

Cmo: Agregar campos y propiedades a una clase
Se pueden utilizar tanto campos como propiedades para almacenar informacin en un objeto. Aunque los
campos y las propiedades son muy difciles de distinguir desde una perspectiva de aplicacin de cliente, se
declaran de forma diferente en una clase. Mientras que los campos son simplemente variables pblicas que
una clase expone, las propiedades utilizan procedimientos Property para controlar cmo se establecen y
devuelven valores.

Para agregar un campo a una clase
Declare una variable pblica en la definicin de clase, como en el cdigo siguiente:

Class ThisClass
Public ThisField As String
End Class

Para agregar una propiedad a una clase
1. Declare una variable local en la clase para almacenar el valor de la propiedad. Este paso es
necesario puesto que las propiedades no asignan almacenamiento por s mismas. A fin de proteger
sus valores contra la modificacin directa, las variables que se utilizan para almacenar valores de
propiedad deben declarase como Private.
2. Escriba modificadores antes de las declaraciones de propiedad, como Public y Shared, segn
corresponda. Utilice la palabra clave Property para declarar el nombre de la propiedad y declare el
tipo de datos que la propiedad almacena y devuelve.
3. Defina los procedimientos de propiedad Get y Set dentro de la definicin de propiedad. Los
procedimientos de propiedad Get se utilizan para devolver el valor de una propiedad y son
aproximadamente equivalentes a las funciones de sintaxis. No aceptan ningn argumento y se
pueden utilizar para devolver el valor de variables local privadas declaradas dentro de la clase
utilizada para almacenar el valor de la propiedad. Los procedimientos de propiedad Set se utilizan
para establecer el valor de una propiedad; tienen un parmetro, llamado normalmente Value, con
el mismo tipo de datos que la propiedad en s. Cada vez que se cambia el valor de la propiedad, se
pasa Value al procedimiento de propiedad Set, donde se puede validar y almacenar en una variable
local.
4. Finalice los procedimientos de propiedad Get y Set con las instrucciones End Get y End
Setcorrespondientes.
5. Finalice el bloque de propiedad con una instruccin End Property.

6. En el siguiente ejemplo se declara una propiedad en una clase:

Class ThisClass
Private m_PropVal As String
Public Property One() As String
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 173 | P g i n a

Get
' Return the value stored in the local variable.
Return m_PropVal
End Get
Set(ByVal Value As String)
' Store the value in a local variable.
m_PropVal = Value
End Set
End Property
End Class

7. Cuando se crea una instancia de ThisClass y se establece el valor de la propiedad One, se llama al
procedimiento de propiedad Set y se pasa el valor en el parmetro Value, que se almacena en una
variable local denominada m_PropVal. Cuando se recupera el valor de esta propiedad, se llama al
procedimiento de propiedad Get como funcin y devuelve el valor almacenado en la variable
localm_PropVal.

Cmo: Establecer y recuperar propiedades
Las propiedades de formularios y controles en Visual Basic pueden establecerse mediante programacin en
tiempo de ejecucin o en modo de diseo en la ventanaPropiedades. Las propiedades de la mayora de los
objetos restantes, como los objetos de los ensamblados o los objetos que haya creado, nicamente pueden
establecerse mediante programacin.
Las propiedades que se pueden establecer y leer se denominan propiedades de lectura y escritura. Las
propiedades que se pueden leer pero no modificar se denominan propiedades de slo lectura. Las
propiedades en las que se puede escribir pero que no se pueden leer se denominan propiedades de slo
escritura.
El valor de una propiedad se establece cuando se desea modificar el aspecto o el comportamiento de un
objeto. Por ejemplo, la propiedad Text de un control de cuadro de texto se cambia para modificar el
contenido del cuadro de texto.
El valor de una propiedad se obtiene cuando se desea conocer el estado de un objeto antes de que el cdigo
ejecute acciones adicionales, tales como asignar el valor a otro objeto. Por ejemplo, se puede devolver la
propiedad Text de un control de cuadro de texto para determinar el contenido del cuadro de texto antes de
ejecutar un cdigo que podra modificar el valor.

Para establecer valores de propiedad
Utilice la sintaxis siguiente:

Objeto.propiedad=expresin

Las instrucciones siguientes proporcionan ejemplos sobre cmo establecer propiedades:

' Set the Top property to 200 twips.
TextBox1.Top = 200
' Display the text box.
TextBox1.Visible = True
' Display 'hello' in the text box.
TextBox1.Text = "hello"

Nota:
Tambin puede establecer una propiedad pasndola a parmetros ByRef, en cuyo caso la propiedad
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 174 | P g i n a

queda modificada por el resultado devuelto por el parmetroByRef.

Para obtener valores de propiedad
Utilice la sintaxis siguiente:

variable=Objeto.propiedad

Tambin puede obtener un valor de propiedad como parte de una expresin ms compleja, sin asignar la
propiedad a una variable. El siguiente cdigo modifica la propiedad Top de un control de botn de opcin:

RadioButton1.Top += 20

Cmo: Realizar acciones con mtodos
Los mtodos son procedimientos asociados a objetos. Excepto los campos y las propiedades, que
representan informacin que puede almacenar un objeto, los mtodos representan acciones que puede
realizar un objeto. Los mtodos pueden afectar a los valores de las propiedades. Por ejemplo, en el caso de
una analoga de radio, se puede emplear un mtodo SetVolume para cambiar el valor de una
propiedad Volume. De igual forma, en Visual Basic, los elementos de cuadros de lista tienen una
propiedad List que puede cambiar con los mtodos Clear y Add.
Al utilizar un mtodo en cdigo, la forma de crear la instruccin depende de cuntos argumentos requiere el
mtodo y de si devuelve un valor. Generalmente, los mtodos se utilizan igual que las subrutinas o las
llamadas de funcin. De forma ms especfica, los mtodos se invocan del mismo modo que los
procedimientos de mdulos, exceptuando que los mtodos se pueden calificar con una expresin
especificando la instancia del objeto a cuyo mtodo debe llamarse. Si no est calificada, la instancia es de
forma implcita la variable Me.

Para utilizar un mtodo que no requiera argumentos
Utilice la sintaxis siguiente:

Objeto.mtodo()

En el ejemplo siguiente, el mtodo Refresh vuelve a dibujar el cuadro de imagen:

' Force the control to repaint.
PictureBox1.Refresh()

Nota:
Algunos mtodos, como Refresh, no tienen argumentos y no devuelven valores.

Para utilizar un mtodo que requiera varios argumentos
Ponga los argumentos entre parntesis y seprelos mediante comas. En el ejemplo siguiente, el
mtodo MsgBox utiliza argumentos que especifican el mensaje que se debe mostrar y el estilo del
cuadro de mensaje:

MsgBox("Database update complete", _
MsgBoxStyle.OKOnly Or MsgBoxStyle.Exclamation, _
"My Application")

Para utilizar un mtodo que devuelva un valor
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 175 | P g i n a

Asigne el valor devuelto a una variable o utilice directamente la llamada al mtodo como
parmetro para otra llamada. El cdigo siguiente almacena el valor devuelto:

Dim Response As MsgBoxResult
Response = MsgBox("Do you want to exit?", _
MsgBoxStyle.YesNo Or MsgBoxStyle.Question, _
"My Application")

Este ejemplo utiliza el valor devuelto desde el mtodo Len como un argumento paraMsgBox.

Dim TestStr As String = "Some String"
' Display the string "String length is : 11".
MsgBox("String length is : " & Len(TestStr))

Cmo: Pasar objetos a procedimientos
Visual Basic permite pasar objetos como argumentos a procedimientos del mismo modo en que se pasan
otros tipos de argumentos. Los procedimientos siguientes le mostrarn cmo hacerlo.
Para pasar una instancia nueva de un formulario a un procedimiento
1. Abra un proyecto, cree un formulario nuevo llamado Form1 y agrguele un botn de comando
denominado Button1.
2. Copie el cdigo siguiente en el formulario:

Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click

Dim newForm As New Form1
newForm.Show()
CenterForm(newForm)
End Sub

Sub CenterForm(ByVal TheForm As Form)
' Centers the form on the screen.
Dim RecForm As Rectangle = Screen.GetBounds(TheForm)
TheForm.Left = CInt((RecForm.Width - TheForm.Width) / 2)
TheForm.Top = CInt((RecForm.Height - TheForm.Height) / 2)
End Sub

Tambin puede pasar un objeto como un argumento por referencia y posteriormente, en el procedimiento,
establecer el argumento a un objeto nuevo.
Para pasar una referencia de objeto a un procedimiento de otro formulario

Public Sub GetPicture(ByVal x As PictureBox)
Dim objX As PictureBox
' Assign the passed-in picture box to an object variable.
objX = x
' Assign the value of the Picture property to the Form1 picture box.
objX.Image = PictureBox2.Image
End Sub

Protected Sub Form1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 176 | P g i n a

Dim newForm2 As New Form2
newForm2.GetPicture(PictureBox1)
End Sub

Cmo: Obtener acceso a miembros compartidos y no compartidos de un objeto
Una vez creado un objeto, puede tener acceso a sus campos, propiedades, mtodos y eventos a travs de la
variable del objeto. Si el miembro es Shared (Visual Basic), no necesita crear un objeto para tener acceso a
l.

Tener acceso a miembros no compartidos
1. Asegrese de que el objeto se ha creado a partir de su clase y se ha asignado a una variable de
objeto.

Dim secondForm As New System.Windows.Forms.Form

2. En la instruccin que tiene acceso al miembro, agregue detrs del nombre de la variable de objeto
el operador de acceso a miembros (.) y, a continuacin, el nombre del miembro.

secondForm.Show()

Tener acceso a miembros compartidos
Agregue detrs del nombre de clase el operador de acceso a miembros (.) y, a continuacin, el
nombre del miembro. Siempre debe tener acceso a un miembro Shared del objeto directamente a
travs del nombre de clase.

MsgBox("This computer is called " & Environment.MachineName)

Si ya ha creado un objeto a partir de la clase, puede tener acceso a un miembro Sharedalternativamente a
travs de la variable del objeto.

Relaciones entre objetos
Los objetos pueden relacionarse entre s de varias maneras. Los tipos principales de relacin
son jerrquicos y contencin.

Relacin jerrquica
Cuando las clases se derivan de las clases ms fundamentales, se dice que tienen una relacin jerrquica. Las
jerarquas de clases son tiles cuando se describen elementos que constituyen un subtipo de una clase ms
general. Por ejemplo, en el espacio de nombresSystem.Windows.Forms, las clases Label y TextBox derivan
las dos de la clase Control. Las clases derivadas heredan miembros de la clase en la que se basan, lo que
permite agregar complejidad a medida que se progresa en una jerarqua de clases.

Relacin de contencin
Otra manera en que se pueden relacionar objetos es una relacin de contencin. Los objetos contenedores
encapsulan lgicamente otros objetos. Por ejemplo, el objeto OperatingSystem contiene lgicamente un
objeto Version que vuelve a travs de su propiedad Version. Observe que el objeto contenedor no contiene
ningn otro objeto fsicamente.

Colecciones
Un tipo de contencin de objetos particular lo representan las colecciones. Las colecciones son grupos de
objetos similares que se pueden enumerar. Visual Basic admite una sintaxis especfica en Instruccin For
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 177 | P g i n a

Each...Next (Visual Basic) que le permite recorrer en iteracin los elementos de una coleccin. Adems, las
colecciones suelen permitir el uso de Item (Propiedad, objeto Collection) para recuperar elementos
mediante su ndice o asocindolos con una cadena nica. Las colecciones pueden ser ms fciles de utilizar
que las matrices puesto que permiten agregar o quitar elementos sin utilizar ndices. Debido a su facilidad
de uso, las colecciones se utilizan frecuentemente para almacenar formularios y controles.

Herencia en Visual Basic
Visual Basic admite el concepto de herencia, que es la posibilidad de definir clases que sirven de base para
clases derivadas. Las clases derivadas heredan, y pueden extender, las propiedades, mtodos y eventos de la
clase base. Las clases derivadas tambin pueden reemplazar mtodos heredados con nuevas
implementaciones. De manera predeterminada, se pueden heredar todas las clases creadas con Visual Basic.
La herencia permite escribir y depurar una clase una vez, y despus volver a usar ese cdigo como base de
nuevas clases. La herencia tambin permite usar el polimorfismo basado en la herencia, que se trata de la
posibilidad de definir clases que pueden usarse de forma intercambiable mediante cdigo cliente en tiempo
de ejecucin, pero con funcionalidad diferente, incluso con mtodos o propiedades denominados de
manera idntica.

Fundamentos de la herencia
La instruccin Inherits se utiliza para declarar una nueva clase, denominada clase derivada, basada en una
clase existente conocida como clase base. Las clases derivadas heredan, y pueden extender, las
propiedades, mtodos, eventos, campos y constantes definidos en la clase base. En la siguiente seccin se
describen algunas de las reglas de herencia, as como los modificadores que se pueden utilizar para cambiar
la forma en que las clases heredan o son heredadas:
De forma predeterminada, todas las clases son heredables a menos que se marquen con la palabra
clave NotInheritable. Las clases pueden heredar de otras clases del proyecto o de clases en otros
ensamblados a los que hace referencia el proyecto.
A diferencia de los lenguajes que permiten la herencia mltiple, Visual Basic solamente permite la
herencia simple en las clases; es decir, las clases derivadas solo pueden tener una clase base.
Aunque no se permite la herencia mltiple en las clases, stas pueden implementar mltiples
interfaces, lo que permite lograr de manera eficaz los mismos fines.
Para evitar la exposicin de elementos restringidos en una clase base, el tipo de acceso de una clase
derivada debe ser igual o ms restrictivo que el de su clase base. Por ejemplo, una clase Publicno
puede heredar una clase Friend o Private, y una claseFriend no puede heredar una clase Private.

Modificadores de herencia
Visual Basic presenta las siguientes instrucciones y modificadores de nivel de clase para ofrecer
compatibilidad con la herencia:
Instruccin Inherits: especifica la clase base.
Modificador NotInheritable: impide que los programadores utilicen la clase como clase base.
Modificador MustInherit: especifica que la clase slo se debe utilizar como clase base. Las
instancias de las clasesMustInherit no se pueden crear directamente; slo se pueden crear como
instancias de clase base de una clase derivada. Otros lenguajes de programacin, como C++ y C#,
utilizan el trmino clase abstracta para describir tal clase.

Reemplazar propiedades y mtodos en clases derivadas
De forma predeterminada, una clase derivada hereda los mtodos y propiedades de su clase base. Si una
propiedad o mtodo heredados tienen que comportarse de manera diferente en la clase derivada, se
pueden invalidar. Es decir, se puede definir una nueva implementacin del mtodo en la clase derivada. Los
siguientes modificadores se utilizan para controlar cmo se reemplazan propiedades y mtodos:
Overridable: permite reemplazar una propiedad o un mtodo de una clase en una clase derivada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 178 | P g i n a

Overrides: reemplaza una propiedad o un mtodoOverridable definido en la clase base.
NotOverridable: evita que una propiedad o un mtodo se invaliden en una clase que hereda. De
forma predeterminada, los mtodos Public son NotOverridable.
MustOverride: requiere que una clase derivada reemplace una propiedad o un mtodo. Cuando se
utiliza la palabra claveMustOverride, la definicin del mtodo est formada simplemente por la
instruccin Sub, Function o Property. No se permite ninguna otra instruccin y no hay
especficamente ninguna instruccin End Sub o End Function. Los mtodosMustOverride se deben
declarar en las clases MustInherit.

La palabra clave MyBase
Puede utilizar la palabra clave MyBase para llamar a mtodos de una clase base cuando invalide mtodos en
una clase derivada. Por ejemplo, suponga que disea una clase derivada que reemplaza un mtodo
heredado de la clase base. El mtodo reemplazado puede llamar al mtodo de la clase base y modificar el
valor devuelto como se muestra en el fragmento de cdigo siguiente:

Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class

En la lista siguiente se describen las restricciones de uso de MyBase:
MyBase hace referencia a la clase base inmediata y a sus miembros heredados. No se puede utilizar
para tener acceso a miembros Private de la clase.
MyBase es una palabra clave, no un objeto real. MyBase no se puede asignar a una variable, pasar
a procedimientos o utilizar en una comparacin Is.
No es necesario definir el mtodo al que certifica MyBase en la clase base inmediata; puede
definirse en una clase base heredada indirectamente. Para compilar correctamente una referencia
certificada mediante MyBase, alguna clase base debe contener un mtodo que se corresponda con
el nombre y los tipos de los parmetros que aparecen en la llamada.
No puede utilizar MyBase para llamar a mtodos de clase base con el modificador MustOverride.
No se puede utilizar MyBase para calificarse a s misma. Por tanto, el siguiente cdigo no es vlido:

MyBase.MyBase.BtnOK_Click()

No se puede utilizar MyBase en mdulos.
No se puede utilizar MyBase para tener acceso a miembros de clase base marcados como Friend si
la clase base est en un ensamblado diferente.

La palabra clave MyClass
La palabra clave MyClass permite llamar a un mtodo Overridableimplementado en la clase y asegurarse de
que se llama a la implementacin del mtodo en esta clase y no a la de un mtodo invalidado en una clase
derivada.
MyClass es una palabra clave, no un objeto real. MyClass no se puede asignar a una variable, pasar
a procedimientos o utilizar en una comparacin Is.
MyClass hace referencia a la clase base inmediata y a sus miembros heredados.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 179 | P g i n a

MyClass puede utilizarse como calificador de miembrosShared.
MyClass no se puede utilizar en mdulos estndar.
MyClass puede utilizarse para calificar un mtodo que est definido en un clase base y que no tiene
ninguna implementacin del mtodo proporcionado en esa clase. Este tipo de referencia tiene el
mismo significado que MyBase.Mtodo.

Cmo: Crear clases derivadas
La instruccin Inherits hace que una clase herede todos los miembros no privados de la clase especificada.
Para heredar de otra clase
Agregue una instruccin Inherits (con el nombre de una clase que desee utilizar como clase base)
como primera instruccin de la clase derivada. La instruccin Inherits debe ser la primera
instruccin sin comentario despus de la instruccin de clase.

Ejemplo
El ejemplo siguiente define dos clases. La primera es una clase base que tiene dos mtodos. La segunda
hereda los dos mtodos de la clase base, reemplaza el segundo mtodo y define un campo denominado
Field.

Class Class1
Sub Method1()
MsgBox("This is a method in the base class.")
End Sub
Overridable Sub Method2()
MsgBox("This is another method in the base class.")
End Sub
End Class

Class Class2
Inherits Class1
Public Field2 As Integer
Overrides Sub Method2()
MsgBox("This is a method in a derived class.")
End Sub
End Class

Protected Sub TestInheritance()
Dim C1 As New Class1
Dim C2 As New Class2
C1.Method1() ' Calls a method in the base class.
C1.Method2() ' Calls another method from the base class.
C2.Method1() ' Calls an inherited method from the base class.
C2.Method2() ' Calls a method from the derived class.
End Sub

Al ejecutar el procedimiento TestInheritance, aparecen los siguientes mensajes:

This is a method in the base class.
This is another method in the base class.
This is a method in the base class.
This is a method in a derived class.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 180 | P g i n a

Cundo utilizar la herencia
La herencia es un concepto de programacin til, pero es fcil utilizarlo de manera poco adecuada. A
menudo, las interfaces solucionan mejor la situacin.
La herencia es una buena opcin cuando:
La jerarqua de herencia representa una relacin de identidad y no una relacin de pertenencia.
Se puede volver a utilizar cdigo de las clases base.
Es necesario aplicar la misma clase y los mismos mtodos a tipos de datos diferentes.
La jerarqua de clases es poco profunda y es poco probable que otros programadores agreguen
muchos ms niveles.
Desea realizar cambios globales en clases derivadas modificando una clase base.

Estas consideraciones se explican en este orden a continuacin.

Herencia y relaciones de identidad
Dos maneras de mostrar las relaciones de clase en la programacin orientada a objetos son las relaciones de
identidad y de pertenencia. En una relacin de identidad, la clase derivada es claramente un tipo de clase
base. Por ejemplo, una clase denominada PremierCustomerrepresenta una relacin de tipo identidad con
una clase base denominada Customer, puesto que un cliente principal es un cliente. No obstante, una clase
denominada CustomerReferral representa una relacin de pertenencia con la clase Customer porque una
cartera de clientes tiene un cliente, pero no es un tipo de cliente.
Los objetos de una jerarqua de herencia deben tener una relacin de identidad con la clase base puesto que
heredan los campos, propiedades, mtodos y eventos definidos en dicha clase. Las clases que representan
una relacin de pertenencia con otras clases no son vlidas para jerarquas de herencia debido a que
podran heredar propiedades y mtodos inadecuados. Por ejemplo, si la claseCustomerReferral se derivase
de la clase Customer descrita anteriormente, podra heredar propiedades que no tendran sentido,
como ShippingPrefs y LastOrderPlaced. Las relaciones de pertenencia como sta deben representarse
mediante clases o interfaces no relacionadas. La siguiente ilustracin muestra ejemplos de relaciones de
tipo "es un" y "tiene un".

Clases base y reutilizacin de cdigo
Otra razn para usar la herencia es la ventaja de poder reutilizar el cdigo. Las clases bien diseadas, una
vez depuradas, pueden utilizarse una y otra vez como base de nuevas clases.
Un ejemplo comn de reutilizacin eficaz de cdigo est relacionado con bibliotecas que administran
estructuras de datos. Por ejemplo, suponga que tiene una gran aplicacin comercial que administra varias
clases de listas en la memoria. Una es una copia en memoria de la base de datos de clientes, que se lee
desde una base de datos al iniciar la sesin para conseguir mayor velocidad.

Clases derivadas intercambiables
Las clases derivadas de una jerarqua de clases pueden a veces intercambiarse con la clase base, un proceso
denominado polimorfismo basado en la herencia. Este enfoque combina las mejores caractersticas del
polimorfismo basado en la interfaz con la opcin de reutilizar o reemplazar cdigo de una clase base.

Jerarquas de clases poco profundas
La herencia se adapta mejor a jerarquas de clases relativamente poco profundas. Las jerarquas de clases
complejas y profundas en exceso pueden ser difciles de desarrollar. La decisin de utilizar una jerarqua de
clases implica sopesar sus ventajas y su complejidad. Como norma general, las jerarquas deberan limitarse
a seis niveles o menos. No obstante, la profundidad mxima de una jerarqua de clases concreta depende de
varios factores, incluida la complejidad de cada nivel.

Cambios globales en clases derivadas a travs de la clase base
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 181 | P g i n a

Una de las caractersticas ms eficaces de la herencia es la posibilidad de realizar cambios en una clase base
que se propagan a las clases derivadas. Si se usa con cuidado, puede actualizarse la implementacin de un
solo mtodo y decenas, e incluso cientos, de clases derivadas podrn utilizar el nuevo cdigo. No obstante,
esta prctica puede resultar peligrosa puesto que tales cambios podran generar problemas en clases
heredadas diseadas por otras personas. Debe tenerse cuidado para asegurarnos de que la nueva clase es
compatible con las clases que utilizan la original. Concretamente, debe evitarse cambiar el nombre o el tipo
de los miembros de la clase base.

Cmo: Heredar de una clase en Visual Basic
Este ejemplo define las clases Circle y Rectangle que los dos heredan de la clase Shape y la clase Square que
hereda de la clase Rectangle.

Ejemplo
Este ejemplo de cdigo tambin est disponible en el fragmento de cdigo de IntelliSense. En el selector de
fragmentos de cdigo, se encuentra en Lenguaje Visual Basic.

Public Class Shape
' Definitions of properties, methods, fields, and events.
End Class
Public Class Circle : Inherits Shape
' Specialized properties, methods, fields, events for Circle.
End Class
Public Class Rectangle : Inherits Shape
' Specialized properties, methods, fields, events for Rectangle.
End Class
Public Class Square : Inherits Rectangle
' Specialized properties, methods, fields, events for Square.
End Class

Polimorfismo
Tradicionalmente, el polimorfismo en Visual Basic se realizaba mediante interfaces, y stas an pueden
usarse para este propsito. Sin embargo, ahora, Visual Basic proporciona la opcin de usar la herencia para
conseguir el polimorfismo.
Como en otros temas de la programacin orientada a objetos, la opcin que debe utilizarse depende de los
requisitos especficos. En general, use la herencia cuando desee crear funcionalidad bsica que las clases
derivadas puedan extender; use interfaces cuando varias implementaciones diferentes deban proporcionar
funcionalidad similar.

Polimorfismo basado en la herencia
La mayora de los sistemas de programacin orientada a objetos proporcionan polimorfismo a travs de la
herencia. El polimorfismo basado en la herencia implica definir mtodos en una clase base y reemplazarlos
con nuevas implementaciones en clases derivadas.
Por ejemplo, podra definir una clase, BaseTax, que proporciona la funcionalidad bsica para calcular los
impuestos sobre ventas en un estado. Las clases derivadas de BaseTax, como CountyTax o CityTax, podran
implementar mtodos como CalculateTax segn las necesidades.
El polimorfismo se deriva del hecho de que se podra llamar al mtodoCalculateTax de un objeto
perteneciente a cualquier clase derivada deBaseTax, sin saber a qu clase perteneca el objeto.
El procedimiento TestPoly del siguiente ejemplo muestra el polimorfismo basado en la herencia:

' %5.3 State tax
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 182 | P g i n a

Const StateRate As Double = 0.053
' %2.8 City tax
Const CityRate As Double = 0.028
Public Class BaseTax
Overridable Function CalculateTax(ByVal Amount As Double) As Double
' Calculate state tax.
Return Amount * StateRate
End Function
End Class

Public Class CityTax
' This method calls a method in the base class
' and modifies the returned value.
Inherits BaseTax
Private BaseAmount As Double
Overrides Function CalculateTax(ByVal Amount As Double) As Double
' Some cities apply a tax to the total cost of purchases,
' including other taxes.
BaseAmount = MyBase.CalculateTax(Amount)
Return CityRate * (BaseAmount + Amount) + BaseAmount
End Function
End Class

Sub TestPoly()
Dim Item1 As New BaseTax
Dim Item2 As New CityTax
' $22.74 normal purchase.
ShowTax(Item1, 22.74)
' $22.74 city purchase.
ShowTax(Item2, 22.74)
End Sub

Sub ShowTax(ByVal Item As BaseTax, ByVal SaleAmount As Double)
' Item is declared as BaseTax, but you can
' pass an item of type CityTax instead.
Dim TaxAmount As Double
TaxAmount = Item.CalculateTax(SaleAmount)
MsgBox("The tax is: " & Format(TaxAmount, "C"))
End Sub

En este ejemplo, el procedimiento ShowTax acepta un parmetro denominado Item de tipo BaseTax, pero
tambin puede pasar cualquiera de las clases derivadas de la clase BaseTax, como CityTax. La ventaja de
este diseo es que se pueden agregar nuevas clases derivadas de la clase BaseTax sin cambiar el cdigo
cliente en el procedimiento ShowTax.

Polimorfismo basado en la interfaz
Las interfaces proporcionan otro mtodo de conseguir el polimorfismo en Visual Basic. Las interfaces
describen propiedades y mtodos como clases, pero a diferencia de stas, no pueden proporcionar ninguna
implementacin. Las interfaces mltiples tienen la ventaja de permitir la evolucin de los sistemas de
componentes de software sin interrumpir el cdigo existente.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 183 | P g i n a

Para conseguir el polimorfismo con interfaces, se implementa una interfaz de diferentes formas en varias
clases distintas. Las aplicaciones cliente pueden utilizar la implementacin nueva o la antigua, exactamente
de la misma manera. La ventaja del polimorfismo basado en interfaz es que no es necesario volver a
compilar aplicaciones cliente existentes para que funcionen con nuevas implementaciones de interfaz.
El siguiente ejemplo define una interfaz denominada Shape2 que se implementa en una clase
denominada RightTriangleClass2 yRectangleClass2. Un mtodo denominado ProcessShape2 llama al mtodo
de instancias CalculateArea de RightTriangleClass2 oRectangleClass2:

Sub TestInterface()
Dim RectangleObject2 As New RectangleClass2
Dim RightTriangleObject2 As New RightTriangleClass2
ProcessShape2(RightTriangleObject2, 3, 14)
ProcessShape2(RectangleObject2, 3, 5)
End Sub

Sub ProcessShape2(ByVal Shape2 As Shape2, ByVal X As Double, _
ByVal Y As Double)
MsgBox("The area of the object is " _
& Shape2.CalculateArea(X, Y))
End Sub

Public Interface Shape2
Function CalculateArea(ByVal X As Double, ByVal Y As Double) As Double
End Interface

Public Class RightTriangleClass2
Implements Shape2
Function CalculateArea(ByVal X As Double, _
ByVal Y As Double) As Double Implements Shape2.CalculateArea
' Calculate the area of a right triangle.
Return 0.5 * (X * Y)
End Function
End Class

Public Class RectangleClass2
Implements Shape2
Function CalculateArea(ByVal X As Double, _
ByVal Y As Double) As Double Implements Shape2.CalculateArea
' Calculate the area of a rectangle.
Return X * Y
End Function
End Class

Interfaces en Visual Basic
Las Interfaces definen las propiedades, mtodos y eventos que pueden implementar las clases. Las
interfaces le permiten definir caractersticas como grupos pequeos de propiedades, mtodos y eventos
estrechamente relacionados; de esta forma se reducen los problemas de compatibilidad, ya que pueden
desarrollarse implementaciones mejoradas para las interfaces sin poner en peligro el cdigo existente. Se
pueden agregar nuevas caractersticas en cualquier momento, mediante el desarrollo de implementaciones
e interfaces adicionales.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 184 | P g i n a

En versiones anteriores de Visual Basic, poda utilizar interfaces pero no crearlas directamente. En esta
versin, puede utilizar la instruccin Interface, que permite definir interfaces reales como entidades
diferenciadas a partir de clases e implementarlas con una versin mejorada de la palabra clave Implements.

Informacin general sobre interfaces
Las interfaces, como las clases, definen un conjunto de propiedades, mtodos y eventos. Pero de forma
contraria a las clases, las interfaces no proporcionan implementacin. Se implementan como clases y se
definen como entidades separadas de las clases.
Una interfaz representa un contrato, en el cual una clase que implementa una interfaz debe implementar
cualquier aspecto de dicha interfaz exactamente como est definido.
Con las interfaces, puede definir caractersticas como grupos pequeos de miembros relacionados
estrechamente. Puede desarrollar implementaciones mejoradas para sus interfaces sin poner en peligro el
cdigo existente, minimizando de este modo los problemas de compatibilidad. Tambin puede agregar
nuevas caractersticas en cualquier momento, mediante el desarrollo de implementaciones e interfaces
adicionales.
A pesar de que las implementaciones de interfaces pueden evolucionar, las propias interfaces no pueden
cambiarse una vez editadas. Los cambios que se realicen en una interfaz editada pueden interrumpir el
cdigo existente. Si piensa en una interfaz como si fuera un contrato, resulta evidente que ambas partes del
contrato tienen un papel especfico. El editor de una interfaz se compromete a no cambiar nunca la interfaz,
y la persona que la implementa se compromete a implementarla exactamente tal y como haya sido
diseada.
En versiones anteriores de Visual Basic, poda utilizar interfaces pero no crearlas directamente. Ahora puede
definir verdaderas interfaces mediante la instruccin Interface e implementarlas con una versin mejorada
de la palabra clave Implements.

Definicin de interfaz
Las definiciones de interfaz se encuentran dentro de las instrucciones Interface y End Interface. Despus de
la instruccin Interface, puede agregar una instruccin Inherits opcional que proporciona una lista de una o
varias interfaces heredadas. Las instrucciones Inherits deben ir antes que el resto de instrucciones de una
declaracin, a excepcin de los comentarios. El resto de instrucciones de una definicin de interfaz deberan
ser instrucciones Event, Sub,Function, Property, Interface, Class, Structure y Enum. Las interfaces no
pueden contener cdigo de implementacin ni instrucciones asociadas a cdigo de implementacin,
como End Sub o End Property.
En un espacio de nombres, las instrucciones de interfaz son de manera predeterminada Friend, pero
tambin se pueden declarar explcitamente como Public o Friend. Las interfaces definidas dentro de las
clases, mdulos, interfaces y estructuras son de manera predeterminada Public, pero tambin se pueden
declarar explcitamente como Public, Friend,Protected o Private.

Nota:
La palabra clave Shadows se puede aplicar a todos los miembros de la interfaz. La palabra
clave Overloads se puede aplicar a las instrucciones declaradas Sub, Function y Property en la definicin
de una interfaz. Adems, las instrucciones Propertypueden tener los modificadores Default, ReadOnly
o WriteOnly. No se permite ninguno del resto de los modificadores: Public, Private, Friend, Protected,
Shared, Overrides, MustOverride o Overridable.

Palabra clave Implements e instruccin Implements
La palabra reservada Implements de Visual Basic se utiliza de dos formas. La
instruccin Implements significa que una clase o estructura implementa una interfaz. La palabra
clave Implements significa que un miembro de clase o de estructura implementa un miembro de interfaz
especfico.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 185 | P g i n a


Instruccin de implementacin
Si una clase o estructura implementa una o ms interfaces, debe incluir la
instruccin Implements inmediatamente despus de la instruccinClass o Structure. La
instruccin Implements exige que una lista separada por comas de interfaces sea implementada por una
clase. La clase o estructura debe implementar todos los miembros de interfaz mediante la palabra
clave Implements.

La palabra clave Implements
La palabra clave Implements requiere una lista separada por comas de los miembros de la interfaz que
deben implementarse. Por lo general, se especifica solamente un nico miembro de interfaz, pero se
pueden especificar varios miembros. La especificacin de un miembro de interfaz consta del nombre de la
interfaz, que debe especificarse en una instruccin Implements dentro de la clase, un punto y el nombre del
evento, propiedad o funcin miembro que debe implementarse. El nombre de un miembro que implementa
un miembro de interfaz puede utilizar cualquier identificador permitido y no se limita a la
convencinInterfaceName_MethodName que se utilizaba en las versiones anteriores de Visual Basic.
Por ejemplo, el cdigo siguiente muestra cmo declarar una subrutina denominada Sub1 que implementa
un mtodo de una interfaz:

Class Class1
Implements interfaceclass.interface2

Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
End Sub
End Class

Los tipos de parmetro y de valores devueltos del miembro que realiza la implementacin deben coincidir
con la propiedad de interfaz o la declaracin de miembro de la interfaz. La forma ms habitual de
implementar un elemento de una interfaz es con un miembro que tenga el mismo nombre que la interfaz,
como se muestra en el ejemplo anterior.
Para declarar la implementacin de un mtodo de interfaz, puede utilizar cualquier atributo permitido en las
declaraciones de mtodo de instancia, incluidos Overloads, Overrides, Overridable, Public, Private,
Protected, Friend, Protected Friend, MustOverride,Default y Static. El atributo Shared no est permitido, ya
que define una clase en lugar de un mtodo de instancia.
Con Implements tambin puede crear un nico mtodo que implemente varios mtodos definidos en una
interfaz, como en el ejemplo siguiente:

Class Class2
Implements I1, I2

Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
End Sub
End Class

Puede utilizar un miembro privado para implementar un miembro de interfaz. Cuando un miembro privado
implementa un miembro de una interfaz, el miembro pasa a estar disponible por medio de la interfaz,
aunque no est disponible directamente en las variables de objeto para la clase.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 186 | P g i n a

Cundo se deben utilizar interfaces
Las interfaces son una herramienta de programacin eficaz porque le permiten separar la definicin de
objetos de su implementacin. La herencia de clases y las interfaces tienen ventajas e inconvenientes, y
puede que al final decida utilizar una combinacin de ambas en sus proyectos.

Flexibilidad en la implementacin
Existen otras razones por las que se podra desear utilizar interfaces en lugar de la herencia de clases:
Las interfaces admiten mejor las situaciones en las cuales las aplicaciones necesitan el mayor
nmero de tipos de objetos no relacionados posible para proporcionar determinadas funciones.
Las interfaces son ms flexibles que las clases de base, porque puede definir una nica
implementacin que puede implementar interfaces mltiples.
Las interfaces son mejores en situaciones en las que no es necesario heredar una implementacin
de una clase de base.
Las interfaces son tiles cuando no se puede usar la herencia de clases. Por ejemplo, las estructuras
no pueden heredarse de las clases, pero pueden implementar interfaces.

Cmo: Crear e implementar interfaces
Como se explica en Informacin general sobre interfaces, las interfaces describen las propiedades, mtodos
y eventos de una clase sin proporcionar ninguna implementacin.

Para crear una interfaz
1. Defina la interfaz agregndole cdigo, de tal forma que empiece con la palabra clave Interface y el
nombre de la interfaz, y que acabe con la instruccin End Interface. Por ejemplo, el siguiente
cdigo define una interfaz denominada IAsset.

Interface IAsset
End Interface

2. Agregue instrucciones que definan las propiedades, mtodos y eventos que sean compatibles con
la interfaz. Por ejemplo, el siguiente cdigo define una funcin, una propiedad y un evento.

Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface

Para implementar una interfaz
1. Si la interfaz que est implementando no forma parte del proyecto, agregue una referencia al
ensamblado que contiene la interfaz.
2. Cree una clase nueva que implemente la interfaz, e incluya la palabra clave Implements en la lnea
que sigue al nombre de clase. Por ejemplo, para implementar la interfaz IAsset, podra darle a la
clase de implementacin el nombre Computer, como en el cdigo siguiente.

Class Computer
Implements IAsset
End Class

3. Agregue procedimientos para implementar las propiedades, mtodos y eventos de la clase como en
el cdigo siguiente, que se basa en el ejemplo del paso anterior:

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 187 | P g i n a

Class Computer
Implements IAsset

Public Event ComittedChange(ByVal Success As Boolean) _
Implements IAsset.ComittedChange

Private divisionValue As String

Public Property Division() As String _
Implements IAsset.Division

Get
Return divisionValue
End Get
Set(ByVal value As String)
divisionValue = value
RaiseEvent ComittedChange(True)
End Set
End Property

Private IDValue As Integer

Public Function GetID() As Integer _
Implements IAsset.GetID

Return IDValue
End Function

Public Sub New(ByVal Division As String, ByVal ID As Integer)
Me.divisionValue = Division
Me.IDValue = ID
End Sub
End Class

Eventos y controladores de eventos
A pesar de que puede visualizar un proyecto de Visual Studio como una serie de procedimientos que se
ejecutan consecutivamente, en realidad la mayora de los programas estn dirigidos por eventos, es decir, el
flujo de ejecucin est determinado por elementos externos denominados eventos.
Un evento es una seal que comunica a una aplicacin que ha sucedido algo importante. Por ejemplo,
cuando un usuario hace clic en un control de un formulario, el formulario puede provocar un evento Click y
llamar a un procedimiento que controla el evento. Los eventos tambin permiten que las tareas separadas
se comuniquen. Suponga, por ejemplo, que una aplicacin realiza una tarea de ordenacin
independientemente de la aplicacin principal. Si un usuario cancela la ordenacin, la aplicacin puede
enviar un evento de cancelacin que ordene la detencin del proceso de ordenacin.

Conceptos y trminos de los eventos
Esta seccin describe los trminos y conceptos que se utilizan con eventos en Visual Basic.
Declarar eventos
Los eventos se declaran en clases, estructuras, mdulos e interfaces mediante la palabra claveEvent, como
se muestra en el siguiente ejemplo:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 188 | P g i n a


Event AnEvent(ByVal EventNumber As Integer)

Producir eventos
Un evento es como un mensaje que anuncia que ha pasado algo importante. A la accin de difundir el
mensaje se le llama producir el evento. En Visual Basic, los eventos se producen con la
instruccin RaiseEvent, como en el ejemplo siguiente:

RaiseEvent AnEvent(EventNumber)

Los eventos se deben provocar dentro del mbito de la clase, mdulo o estructura donde se declaran. Por
ejemplo, una clase derivada no puede producir eventos heredados de una clase base.

Remitentes de eventos
Cualquier objeto capaz de producir un evento es un remitente de eventos, y tambin recibe el nombre
de origen de eventos. Los formularios, controles y objetos definidos por el usuario son ejemplos de
remitentes de eventos.

Controladores de eventos
Los controladores de eventos son procedimientos llamados cuando se produce un evento correspondiente.
Puede utilizar cualquier subrutina vlida con una firma coincidente como controlador de eventos. No
obstante, no puede utilizar una funcin como controlador de eventos, porque no puede devolver un valor al
origen del evento.
Visual Basic utiliza una convencin de nomenclatura estndar para controladores de eventos que combina el
nombre del remitente del evento, un signo de subrayado y el nombre del evento. Por ejemplo, el
evento Click de un botn denominado button1 recibira el nombre de Sub button1_Click.

Nota:
Es recomendable utilizar esta convencin de nomenclatura al definir controladores de eventos para sus
propios eventos, pero no es estrictamente necesario; puede utilizar cualquier nombre de subrutina vlido.

Asociar eventos a controladores de eventos
Para que un controlador de eventos se pueda utilizar, primero debe asociarse a un evento mediante la
instruccin Handles o AddHandler.
La instruccin WithEvents y la clusula Handles proporcionan una forma declarativa de especificar
controladores de eventos. Los eventos provocados por un objeto declarado conWithEvents los puede
controlar cualquier subrutina con una clusula Handles que d nombre a este evento. Aunque la
clusula Handles es la forma estndar de asociar un evento a un controlador de eventos, est limitada a
asociar eventos a controladores de eventos en tiempo de compilacin.
Las instrucciones AddHandler y RemoveHandler son ms flexibles que la clusula Handles. Le permiten
conectar y desconectar de forma dinmica los eventos con uno o varios controladores de eventos en tiempo
de ejecucin, y no requieren que declare variables de objeto mediante WithEvents. Sin embargo, hay
algunas restricciones en el uso deWithEvents.
En algunos casos, como con eventos asociados a formularios o controles, Visual Basic finaliza
automticamente un controlador de eventos vaco y lo asocia con un evento. Por ejemplo, al hacer doble
clic en un botn de comando en un formulario en modo de diseo, Visual Basic crea un controlador de
eventos vaco y una variable WithEvents para el botn de comando, como en el cdigo siguiente:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click(ByVal sender As System.Object, _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 189 | P g i n a

ByVal e As System.EventArgs) Handles Button1.Click
End Sub

WithEvents y la clusula Handles
La instruccin WithEvents y la clusula Handlesproporcionan una forma declarativa de especificar
controladores de eventos. Los eventos provocados por un objeto declarado con la palabra
clave WithEventspueden controlarse mediante cualquier procedimiento con una instruccin Handles para
ese evento, tal y como se muestra en el ejemplo siguiente:

' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub

' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub

Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class

La instruccin WithEvents y la clusula Handles son a menudo la mejor opcin para los controladores de
eventos, ya que la sintaxis declarativa que utilizan hace que el control de eventos sea ms sencillo de
codificar, leer y depurar. No obstante, tenga en cuenta las siguientes limitaciones en la utilizacin de las
variables WithEvents:
No se puede utilizar una variable WithEvents como variable de objeto. Es decir, no es posible
declararla como Object; se debe especificar el nombre de clase al declarar la variable.
Dado que los eventos compartidos no estn asociados a instancias de clase, no se puede
usar WithEvents para controlar los eventos mediante declaraciones compartidas. De forma
parecida, no se puede utilizar WithEvents ni Handles para controlar los eventos desde una
estructura Structure. En ambos casos, puede utilizar la instruccinAddHandler para controlar esos
eventos.
No se pueden crear matrices de variables WithEvents.
Las variables WithEvents permiten que un solo controlador controle uno o ms tipos de eventos,
as como que uno o ms controladores de eventos controlen el mismo tipo de evento.

AddHandler y RemoveHandler
La instruccin AddHandler se parece a la clusulaHandles en que las dos permiten especificar un
controlador de eventos. Sin embargo, AddHandler, utilizado con RemoveHandler, proporciona ms
flexibilidad que la clusula Handles, lo que permite agregar, quitar y cambiar de forma dinmica el
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 190 | P g i n a

controlador de errores asociado con un evento. Si desea controlar eventos compartidos o eventos de una
estructura, debe utilizar AddHandler.
AddHandler toma dos argumentos: el nombre de un evento de un remitente de evento, como un control, y
una expresin que evala a un delegado. No necesita especificar explcitamente la clase delegada al
utilizar AddHandler, ya que la instruccin AddressOf siempre devuelve una referencia al delegado. El
ejemplo siguiente asocia un controlador de eventos a un evento provocado por un objeto:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, que desconecta un evento de un controlador de eventos, utiliza la misma sintaxis
que AddHandler. Por ejemplo:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Cmo: Agregar eventos a una clase
Se agregan eventos a una clase declarndolos con la instruccin Events. La declaracin incluye el nombre del
evento y los argumentos que utiliza.
La accin de agregar un evento a una clase determina que un objeto de esta clase puede provocar un evento
especfico. Para conseguir que se produzca un evento, se debe utilizar la instruccin RaiseEvent. Puede
utilizar la palabra claveHandles o la instruccin AddHandler para asociar el evento a un procedimiento
controlador de eventos. Los eventos deben producirse dentro del mbito en el que se han declarado. Por
ejemplo, una clase derivada no puede producir eventos heredados de una clase base.

Nota:
Los eventos no pueden tener valores devueltos, argumentos opcionales o argumentos ParamArray.

Para agregar un evento a una clase
En la seccin Declaraciones del mdulo de clase que define la clase, utilice la instruccin Event para
declarar el evento con cualquier argumento que desee que tenga. Por ejemplo:

Public Event PercentDone(ByVal Percent As Single, _
ByRef Cancel As Boolean)

Cmo: Provocar un evento (Visual Basic)
En este ejemplo se define un evento (TimeExpired) y se utiliza la instruccin RaiseEvent para hacer que se
produzca el evento.

Ejemplo
Public Event TimeExpired(ByVal Status As String)
Public Sub RaiseTimeExpiredEvent()
RaiseEvent TimeExpired("Your time has run out")
End Sub

Cmo: Crear un evento y un controlador (Visual Basic)
En este ejemplo se define un evento,TimeExpired, y un controlador de eventos, HandleTimeExpired, y se
utiliza la instruccin AddHandler para asociarlos.

Ejemplo
Public Event TimeExpired(ByVal Status As String)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 191 | P g i n a

Public Sub HandleTimeExpired(ByVal Status As String)
' Perform desired processing for when time has expired.
MsgBox("HandleTimeExpired caught the TimeExpired event" & _
vbCrLf & "Status = " & Status)
End Sub
Public Sub SetUpEventHandler()
AddHandler TimeExpired, AddressOf HandleTimeExpired
End Sub

Cmo: Escribir controladores de eventos
La forma de crear un controlador de eventos depende de cmo quiera asociarlo a los eventos. La manera
estndar de crear un controlador de eventos consiste en usar la palabra claveHandles con la palabra
clave WithEvents. Visual Basic proporciona una segunda forma de controlar los eventos: la
instruccin AddHandler.AddHandler y RemoveHandler le permiten iniciar y detener dinmicamente el
control de un evento especfico. Es posible utilizar ambos enfoques, pero no se debe
utilizar WithEvents y AddHandler en el mismo evento.

Controlar eventos mediante WithEvents
La palabra clave WithEvents permite crear variables de objeto en el nivel de mdulo o clase que pueden
utilizarse con la clusula Handles en controladores de eventos.

Para controlar eventos mediante WithEvents y la clusula Handles
1. Cree una clase simple que contiene un evento.

Class Class1
Public Event AnEvent(ByVal EventNumber As Integer)
End Class

2. En la clase o el mdulo que controlar el evento, utilice la palabra claveWithEvents para declarar
una variable de objeto para el cdigo fuente de los eventos, como en el ejemplo siguiente:

Public WithEvents ClassInst As Class1

3. En el Editor de cdigo, elija la variable WithEvents que acaba de declarar en la lista
desplegable Nombre de clase de la parte izquierda.
4. Elija el evento que desea controlar de la lista desplegable Method Nameen la parte derecha. El
Editor de cdigo crea el procedimiento controlador de eventos vaco con una clusula Handles.

Nota:
Este paso es opcional. Puede crear el procedimiento controlador de eventos de forma manual mientras el
procedimiento que se crea sea una subrutina, tenga la lista de argumentos correcta para que coincida con
el evento que se controla y tenga una clusula Handles que especifique el evento que se controla.

5. Agregue cdigo de control de eventos al procedimiento controlador de eventos utilizando los
argumentos suministrados. El cdigo siguiente proporciona un ejemplo:

Public Sub ClassInst_AnEvent(ByVal EventNumber As Integer) _
Handles ClassInst.AnEvent
MsgBox("Received event number: " & CStr(EventNumber))
End Sub
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 192 | P g i n a


Delegados de Visual Basic
Los delegados son una forma de puntero de funcin orientado a objetos que permite invocar una funcin
indirectamente mediante una referencia a la funcin. Los delegados se pueden utilizar para enlazar
controladores de eventos y pasar un procedimiento de un procedimiento a otro.

Los delegados y el operador AddressOf
Los delegados son objetos que puede utilizar para llamar a los mtodos de otros objetos. Algunas veces
estn descritos como punteros de funcin con seguridad de tipos porque son parecidos a los punteros de
funcin utilizados en otros lenguajes de programacin. Sin embargo, a diferencia de los punteros a funcin,
los delegados de Visual Basic son un tipo de referencia basado en la clase System.Delegate. Los delegados
pueden hacer referencia a los dos mtodos compartidos, mtodos a los que se pueden llamar sin una
instancia especfica de una clase, y a mtodos de instancia.

Delegados y eventos
Los delegados son tiles en situaciones donde es necesario un intermediario entre el procedimiento que
realiza una llamada y el procedimiento que la recibe. Por ejemplo, puede que desee que un objeto que
provoca eventos sea capaz de llamar a diferentes controladores de eventos bajo diferentes circunstancias.
Desafortunadamente, el objeto que provoca los eventos no puede saber por adelantado qu controlador de
eventos controla un evento especfico. Visual Basic permite asociar dinmicamente los controladores de
eventos a los eventos creando un delegado para el usuario cuando usa la instruccin AddHandler. En tiempo
de ejecucin, el delegado remite las llamadas al controlador de eventos adecuado.
Aunque puede crear sus propios delegados, en la mayora de los casos Visual Basic crea el delegado y se
ocupa de los detalles. Por ejemplo, una instruccin Event define de forma implcita una clase delegada
denominada <EventName>EventHandler como clase anidada de la clase que contiene la instruccin Event, y
con la misma firma que el evento. La instruccin AddressOf crea de forma implcita una instancia de un
delegado. Por ejemplo, las siguientes dos lneas de cdigo son equivalentes:

AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)

Puede utilizar el mtodo abreviado para crear delegados en cualquier lugar donde el compilador pueda
determinar el tipo de delegado por el contexto.

Declarar eventos que utilicen un tipo de delegado existente
En algunas situaciones, puede que desee declarar un evento para que utilice un tipo de delegado existente
como delegado subyacente. La sintaxis siguiente describe cmo hacerlo:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Esto resulta til cuando se desea enrutar diversos eventos hacia el mismo controlador.

Variables delegadas y parmetros
Puede utilizar delegados para otras tareas, no relacionadas con eventos, como un subprocesamiento libre o
con procedimientos que necesiten llamar a diferentes versiones de funciones en tiempo de compilacin.
Por ejemplo, suponga que tiene una aplicacin de anuncio clasificado que incluye un cuadro de lista con
nombres de coches. Los anuncios estn ordenados por ttulos, que normalmente son las marcas de los
coches. Un problema con el que puede encontrarse se produce cuando algunos coches incluyen el ao del
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 193 | P g i n a

coche antes de la marca. El problema es que la funcionalidad de ordenacin integrada del cuadro de lista
ordena nicamente por cdigos de carcter; primero coloca todos los anuncios que empiezan por el ao y, a
continuacin, los anuncios que empiezan por la marca.
Para corregir este problema, puede crear un procedimiento de ordenacin en una clase que utilice la
ordenacin alfabtica estndar en la mayora de los cuadros de lista, pero que pueda cambiar en tiempo de
ejecucin al procedimiento de ordenacin personalizado para anuncios de coches. Para ello, pasa el
procedimiento de ordenacin personalizado a la clase de ordenacin en tiempo de ejecucin, utilizando
delegados.
Cada clase delegada define un constructor al cual se pasa la especificacin de un mtodo de objeto. Un
argumento para un constructor delegado debe ser una referencia a un mtodo o una expresin lambda.
Para especificar una referencia a un mtodo, utilice la sintaxis siguiente:

AddressOf [expression.]methodName

El tipo de tiempo de compilacin de expression debe ser el nombre de una clase o interfaz que contenga un
mtodo del nombre especificado cuya firma coincida con la firma de la clase delegada. methodName puede
ser un mtodo compartido o un mtodo de instancia. Aunque se cree un delegado para el mtodo
predeterminado de la clase, methodName no es opcional.
Para especificar una expresin lambda, utilice la sintaxis siguiente:

Function ([parm como type, parm2 como type2, ...]) expression

La firma de la funcin debe coincidir con la del tipo de delegado.

Cmo: Invocar un mtodo delegado
Este ejemplo muestra cmo asociar un mtodo a un delegado e invocar luego este mtodo a travs del
delegado.

Cree el delegado y los procedimientos correspondientes
1. Cree un delegado denominado MySubDelegate.

Delegate Sub MySubDelegate(ByVal x As Integer)

2. Declare una clase que contenga un mtodo con la misma firma que el delegado.

Class class1
Sub Sub1(ByVal x As Integer)
MsgBox("The value of x is: " & CStr(x))
End Sub
End Class

3. Defina un mtodo que cree una instancia del delegado e invoque el mtodo asociado al delegado
llamando al mtodo Invokeintegrado.

Protected Sub DelegateTest()
Dim c1 As New class1
' Create an instance of the delegate.
Dim msd As MySubDelegate = AddressOf c1.Sub1
' Call the method.
msd.Invoke(10)
End Sub
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 194 | P g i n a


Colecciones en Visual Basic
En trminos generales, una coleccin es un objeto utilizado para agrupar y administrar objetos relacionados.
Por ejemplo, cada formulario Form tiene una coleccin de controles. (Puede tener acceso a esta coleccin a
travs de la propiedad Controls del formulario.) Esta coleccin es un objeto que representa todos los
controles de ese formulario. Le permite recuperar un control de la coleccin utilizando su ndice y recorrer
en iteracin los elementos de la coleccin utilizando una Instruccin For Each...Next (Visual Basic).
Sin embargo, hay varios tipos de colecciones y se diferencian entre s de varias maneras.

Diferentes tipos de colecciones
Visual Basic tambin proporciona una clase Collection, con la que puede definir y crear sus propias
colecciones. Al igual que la coleccin Controls de un formulario, la clase Collectiontambin proporciona la
funcionalidad integrada que permite recorrer en iteracin los miembros mediante For Each...Next y
recuperar los elementos usando su ndice.

Sin embargo, los dos tipos de colecciones no interoperan entre s. Por ejemplo, el cdigo siguiente genera
un error del compilador:

Dim localControls As Collection
' The following line generates a COMPILER ERROR.
localControls = Me.Controls()

Las colecciones son incompatibles porque la coleccin Controls es una coleccin de .NET Framework,
mientras que la variable localControls es una Collection de Visual Basic. Los dos tipos de colecciones se
implementan a partir de distintas clases. Sus mtodos son similares pero no idnticos y sus esquemas de
indizacin son diferentes.

Colecciones basadas en cero y en uno
Una coleccin puede ser basada en cero o basada en uno, segn cul sea su ndice de comienzo. La primera
de ellas significa que el ndice del primer elemento de la coleccin es 0, y la ltima, que es 1. Un ejemplo de
coleccin basada en cero es la coleccin Controls de .NET Framework, explicada anteriormente en esta
pgina. El objeto Collection de Visual Basic es un ejemplo de una coleccin basada en uno.
Las colecciones basadas en uno pueden resultar ms intuitivas para los usuarios de Visual Basic, porque el
intervalo del ndice se extiende desde 1 hasta el valor de Count (Propiedad, objeto Collection), que devuelve
el nmero de elementos existentes en una coleccin. En cambio, el ndice de una coleccin basada en cero
vara desde cero hasta el valor de la propiedad Countmenos uno. Esto puede ser adecuado cuando los
valores de ndice son desplazamientos respecto a un valor base o corresponder a miembros de una
enumeracin basada en cero.
Las colecciones de .NET Framework estn basadas en cero con el fin de seguir un esquema estndar. La
clase Collection de Visual Basic est basada en uno con el fin de proporcionar compatibilidad con versiones
anteriores.

Valores de ndice y de clave
Las instancias de la clase Collection de Visual Basic permiten tener acceso a un elemento utilizando un ndice
numrico o una clave String. Puede agregar elementos a los objetosCollection de Visual Basic especificando
una clave o sin especificarla. Si agrega un elemento sin una clave, debe utilizar su ndice numrico para tener
acceso a l.
Por contraste, las colecciones como System.Collections.ArrayList slo permiten un ndice numrico. No se
pueden asociar claves con los elementos de estas colecciones, a menos que construya las suyas propias
basadas en asignaciones, por ejemplo, en una matriz de String que contiene las claves.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 195 | P g i n a


Agregar y quitar elementos
Las colecciones se diferencian en si se les puede o no agregar elementos y, en caso afirmativo, en cmo se
pueden agregar. Puesto que el objeto Collection de Visual Basic es una herramienta de programacin de uso
general, es ms flexible que algunas otras colecciones. Tiene un Add (Mtodo, objeto Collection) para
colocar elementos en la coleccin y un Remove (Mtodo, objeto Collection) para quitar elementos de ella.
Por otra parte, ciertas colecciones especializadas no permiten agregar o quitar elementos mediante cdigo.
Por ejemplo, la propiedad CheckedListBox.CheckedItems devuelve una coleccin de referencias a elementos
por ndice, pero su cdigo no puede agregar elementos a la coleccin ni quitarlos de ella. Slo el usuario
puede hacer esta operacin, activando o desactivando la casilla de verificacin correspondiente en la
interfaz de usuario. Por tanto, no hay ningn mtodo Add ni Remove para esta coleccin.

Administrar grupos de objetos
En muchas aplicaciones se desea poder crear y administrar grupos de objetos relacionados. Existen dos
formas de agrupar objetos: mediante la creacin de matrices de objetos y mediante la creacin de
colecciones de objetos.

Matrices de objetos
Las matrices son estructuras relativamente inflexibles. Si desea cambiar el tamao de una matriz en tiempo
de ejecucin, debe utilizar Instruccin ReDim (Visual Basic) para volver a declararla. Todos los elementos de
la matriz deben ser del mismo tipo. Por otra parte, las matrices permiten procesar secuencialmente todos
los elementos y pueden existir elementos de una matriz vacos. Por estos motivos, las matrices son muy
tiles para crear y trabajar con un nmero fijo de objetos con establecimiento inflexible de tipos.

Colecciones de objetos
Las colecciones proporcionan un mtodo ms flexible de trabajar con grupos de objetos. Una coleccin es
una clase, de modo que antes de poder agregar elementos a una nueva coleccin, debe declararla. A
diferencia de las matrices, el grupo de objetos con el que trabaja puede aumentar y reducirse
dinmicamente a medida que cambian las necesidades de la aplicacin. Puede asignar una clave a cualquier
objeto que incluya en una coleccin, de manera que puede recuperarlo y manipularlo basndose en esa
clave.
Puede crear una coleccin generalizada a partir de Clase de coleccin de Visual Basic. Si quiere una
funcionalidad especfica en una coleccin, por ejemplo un diccionario o una lista vinculada, puede crearla a
partir de una de las clases en el espacio de nombres System.Collections de .NET Framework. Las clases de
colecciones especializadas estn disponibles en el espacio de nombres System.Collections.Specialized.
Si su coleccin se limita a los elementos de slo un tipo de datos, puede utilizar una de las clases en el
espacio de nombres System.Collections.Generic. Una coleccin genrica cumple laseguridad de tipos para
que ningn otro tipo de datos se pueda agregar a ella. Cuando recupera un elemento de una coleccin
genrica, no tiene que determinar su tipo de datos ni convertirlo.

Cmo: Agregar, eliminar y recuperar los elementos de una coleccin
La clase Collection de Visual Basic contiene funcionalidad integrada, que permite agregar, eliminar y
recuperar elementos.
Es posible que desee agregar un elemento a una coleccin en cuanto se crea o se obtiene el
elemento, por ejemplo un nuevo cliente.
Puede desear eliminar un elemento de una coleccin cuando ya no pertenece a la coleccin, por
ejemplo cuando un empleado deja su compaa.
Es posible que desee recuperar un elemento de una coleccin para editar su contenido, por
ejemplo cambiar el nmero de telfono de un estudiante.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 196 | P g i n a

Nota:
Los objetos Collection actualizan sus nmeros de ndice numricos automticamente cuando agrega y
elimina elementos. Por ello, el ndice numrico de un elemento determinado puede cambiar a menudo.
Por ello, cuando guarde un valor de ndice numrico, no espere recuperar el mismo elemento
posteriormente en el programa. Para este propsito utilice claves.

Para agregar un elemento a una coleccin
Utilice Add (Mtodo, objeto Collection) y especifique el elemento por su Key.

object.Add(Item, Key [, {Before | After}])

Por ejemplo, para agregar un objeto de orden de trabajo a una coleccin de rdenes de trabajo utilizando
como clave la propiedad ID de la orden de trabajo, puede realizar la siguiente llamada:

workOrders.Add(woNew, woNew.ID)

La llamada anterior supone que la propiedad ID es una cadena. Si es un nmero (por ejemplo, un
entero Long ), utilice su mtodo ToString para convertirlo en el valor String necesario para el argumento
Key.

workOrders.Add(woNew, woNew.ID.ToString())

El uso de una clave es opcional. Si no desea asociar una clave al objeto de su coleccin, puede agregarlo sin
una clave.

workOrders.Add(woNew)

Puede utilizar los argumentos Before y After para mantener una coleccin ordenada de objetos. El miembro
que se agrega se coloca en la coleccin antes o despus del miembro identificado por el
argumento Before o After respectivamente. Por ejemplo, si estable Beforeigual a 1, se inserta un elemento al
principio de la coleccin porque los objetos Collectionestn basados en 1.

workOrders.Add(woNew, woNew.ID, 1)

De forma similar, el argumento After agrega un elemento despus del ndice especificado. El siguiente
ejemplo agrega un tercer elemento.

workOrders.Add(woNew, woNew.ID,,2)

Se puede especificar un valor para Before o para After, pero no para ambos.

Para eliminar un elemento de una coleccin
Utilice Remove (Mtodo, objeto Collection) y especifique el elemento por su Index o su Key.

object.Remove({Index | Key})

El argumento Index es la posicin del elemento que desea eliminar. El argumento Key es la misma cadena
que ha utilizado para agregar el elemento a la coleccin. Si la clave del tercer elemento de una coleccin es
"W017493", puede utilizar cualquiera de las dos instrucciones siguientes para eliminarlo.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 197 | P g i n a

workOrders.Remove(3)
workOrders.Remove("W017493")

Para eliminar todos los elementos de una coleccin
Use Clear (Mtodo, objeto Collection).

object.Clear()

El mtodo Clear vaca la coleccin.

Para recuperar un elemento de una coleccin
1. Utilice Item (Propiedad, objeto Collection) y especifique el elemento por su Index o su Key.

variable = object.Item({Index | Key})

Igual que con el mtodo Remove, el argumento Index es la posicin del elemento en la coleccin y el
argumento Key es la cadena utilizada al agregar el elemento. Con el mismo ejemplo del mtodo Remove,
cualquiera de las instrucciones siguientes recupera el tercer elemento de la coleccin:

woCurrent = workOrders.Item(3)
woCurrent = workOrders.Item("W017493")

Nota:
Si utiliza nmeros como claves, debe utilizar sus mtodos ToString para convertirlos en las cadenas antes
de pasarlos al mtodo Add o Remove o a la propiedad Item. Un objeto de Visual BasicCollection supone
siempre que un nmero es un ndice, en vez de una cadena de clave.

2. Si conoce la clave en el tiempo de compilacin, puede utilizar alternativamente el operador (!) de
acceso a diccionario para tener acceso a un elemento de la coleccin sin incluir la clave entre
comillas o parntesis. La llamada anterior se puede escribir del modo siguiente.

woCurrent = workOrders!W017493

Cmo: Recorrer en iteracin una coleccin de Visual Basic
Puede utilizar un bucle For Each para recorrer en iteracin los elementos de una coleccin.

Ejemplo
El ejemplo siguiente utiliza Instruccin For Each...Next (Visual Basic) para tener acceso a todos los elementos
de una coleccin.

Dim testCollection As New Microsoft.VisualBasic.Collection()
' The collection is empty until you add one or more items to it.
For Each collectionItem As Object In testCollection
' Perform desired processing on each item.
Next collectionItem

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 198 | P g i n a

Expresiones lambda
Una expresin lambda es una funcin sin nombre que calcula y devuelve un solo valor. Se pueden utilizar las
expresiones lambda dondequiera que un tipo de delegado sea vlido.

Nota:
La instruccin RemoveHandler es una excepcin. No puede pasar ninguna expresin lambda para el
parmetro de delegado de RemoveHandler.

El ejemplo siguiente es una expresin lambda que incrementa su argumento y devuelve el valor.

Function (num As Integer) num + 1

Dado que una expresin lambda es una expresin, slo se puede utilizar como parte de una instruccin.
Por ejemplo, puede asignar la funcin a un nombre de variable, especialmente si desea utilizarlo ms de una
vez.

Dim add1 = Function(num As Integer) num + 1
Para llamar a la funcin, enve un valor al parmetro.
Visual Basic
' The following line prints 6.
Console.WriteLine(add1(5))

O bien, puede declarar y ejecutar la funcin al mismo tiempo.

Console.WriteLine((Function(num As Integer) num + 1)(5))

Una expresin lambda se puede devolver como el valor de una llamada de funcin (como se muestra en el
ejemplo de la seccin Contexto ms adelante en este tema) o pasar como argumento a un parmetro de
delegado. En el ejemplo siguiente, las expresiones lambda de tipo booleano se pasan como argumento al
mtodo testResult. El mtodo aplica la prueba booleana a un argumento de tipo entero, value, y muestra
"Correcto" si la expresin lambda devuelveTrue cuando se aplica a value o "Error" si devuelve False.

Module Module2

Sub Main()
' The following line will print Success, because 4 is even.
testResult(4, Function(num) num Mod 2 = 0)
' The following line will print Failure, because 5 is not > 10.
testResult(5, Function(num) num > 10)
End Sub

' Sub testResult takes two arguments, an integer value and a
' Boolean function.
' If the function returns True for the integer argument, Success
' is displayed.
' If the function returns False for the integer argument, Failure
' is displayed.
Sub testResult(ByVal value As Integer, ByVal fun As Func(Of Integer, Boolean))
If fun(value) Then
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 199 | P g i n a

Console.WriteLine("Success")
Else
Console.WriteLine("Failure")
End If
End Sub

End Module

Expresiones lambda en consultas
En Language-Integrated Query (LINQ), las expresiones lambda estn debajo de muchos de los operadores de
consulta estndar. El compilador crea las expresiones lambda para capturar los clculos definidos en los
mtodos de consulta bsicos como Where, Select, Order By, Take While, etc.
Por ejemplo, considere la siguiente consulta:

Dim londonCusts = From cust In db.Customers
Where cust.City = "London"
Select cust

Este ejemplo est compilado en el cdigo siguiente:

Dim londonCusts = db.Customers _
.Where(Function(cust) cust.City = "London") _
.Select(Function(cust) cust)

Sintaxis de la expresin lambda
La sintaxis de una expresin lambda se parece a la de una funcin estndar. Las diferencias son las
siguientes:
Una expresin lambda no tiene nombre.
Las expresiones lambda no pueden tener modificadores, como Overloads u Overrides.
Las expresiones lambda no utilizan una clusula As para designar el tipo de valor devuelto de la
funcin. En su lugar, el tipo se deduce del valor en el que se evala el cuerpo de la expresin
lambda. Por ejemplo, si el cuerpo de la expresin lambda esWhere cust.City = "London", su tipo de
valor devuelto es Boolean.
El cuerpo de la funcin debe ser una expresin, no una instruccin. El cuerpo puede estar formado
por una llamada a un procedimiento de funcin, pero no una llamada a un subprocedimiento.
No hay ninguna instruccin Return. El valor devuelto por la funcin es el valor de la expresin del
cuerpo de la funcin.
No hay ninguna instruccin End Function.
Todos los parmetros deben de tener tipos de datos especificados o se deben deducir.
No se permite los parmetros Optional y ParamArray.
No se permiten los parmetros Generic.
Como resultado de estas restricciones y de las maneras en las que se utilizan las expresiones lambda, stas
suelen ser cortas y sencillas.

Contexto
Una expresin lambda comparte su contexto con el mtodo dentro del que se define. Tiene los mismos
derechos de acceso que cualquier cdigo escrito en el mtodo contenedor. Esto incluye el acceso a las
variables miembro, funciones y subs, Me, as como a los parmetros y las variables locales del mtodo
contendor.
El acceso a las variables locales y a los parmetros del mtodo contenedor se puede ampliar una vez
transcurrida la duracin de dicho mtodo. En tanto que un delegado que hace referencia a una expresin
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 200 | P g i n a

lambda no est disponible para la recoleccin de elementos no utilizados, se conserva el acceso a las
variables del entorno original. En el ejemplo siguiente, la variabletarget es local respecto a makeTheGame,
el mtodo en el que se define la expresin lambdaplayTheGame. Observe que la expresin lambda devuelta,
asignada a takeAGuess en Main, todava tiene acceso a la variable local target.

Module Module1

Sub Main()
' Variable takeAGuess is a Boolean function. It stores the target
' number that is set in makeTheGame.
Dim takeAGuess As gameDelegate = makeTheGame()

' Set up the loop to play the game.
Dim guess As Integer
Dim gameOver = False
While Not gameOver
guess = CInt(InputBox("Enter a number between 1 and 10 (0 to quit)", "Guessing Game", "0"))
' A guess of 0 means you want to give up.
If guess = 0 Then
gameOver = True
Else
' Tests your guess and announces whether you are correct. Method takeAGuess
' is called multiple times with different guesses. The target value is not
' accessible from Main and is not passed in.
gameOver = takeAGuess(guess)
Console.WriteLine("Guess of " & guess & " is " & gameOver)
End If
End While

End Sub

Delegate Function gameDelegate(ByVal aGuess As Integer) As Boolean

Public Function makeTheGame() As gameDelegate

' Generate the target number, between 1 and 10. Notice that
' target is a local variable. After you return from makeTheGame,
' it is not directly accessible.
Randomize()
Dim target As Integer = CInt(Int(10 * Rnd() + 1))

' Print the answer if you want to be sure the game is not cheating
' by changing the target at each guess.
Console.WriteLine("(Peeking at the answer) The target is " & target)

' The game is returned as a lambda expression. The lambda expression
' carries with it the environment in which it was created. This
' environment includes the target number. Note that only the current
' guess is a parameter to the returned lambda expression, not the target.

' Does the guess equal the target?
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 201 | P g i n a

Dim playTheGame = Function(guess As Integer) guess = target

Return playTheGame

End Function

End Module

El ejemplo siguiente muestra la amplia gama de derechos de acceso de la expresin lambda anidada.
Cuando la expresin lambda devuelta se ejecuta desde Main como aDel, tiene acceso a estos elementos:
Un campo de la clase en la que se define: aField
Una propiedad de la clase en la que se define: aProp
Un parmetro de mtodo functionWithNestedLambda en el que se define: level1
Una variable local de functionWithNestedLambda: localVar
Un parmetro de la expresin lambda en la que est anidada: level2

Module Module3

Sub Main()
' Create an instance of the class, with 1 as the value of
' the property.
Dim lambdaScopeDemoInstance = New LambdaScopeDemoClass _
With {.Prop = 1}

' Variable aDel will be bound to the nested lambda expression
' returned by the call to functionWithNestedLambda.
' The value 2 is sent in for parameter level1.
Dim aDel As aDelegate = _
lambdaScopeDemoInstance.functionWithNestedLambda(2)

' Now the returned lambda expression is called, with 4 as the
' value of parameter level3.
Console.WriteLine("First value returned by aDel: " & aDel(4))

' Change a few values to verify that the lambda expression has
' access to the variables, not just their original values.
lambdaScopeDemoInstance.aField = 20
lambdaScopeDemoInstance.Prop = 30
Console.WriteLine("Second value returned by aDel: " & aDel(40))
End Sub

Delegate Function aDelegate(ByVal delParameter As Integer) _
As Integer

Public Class LambdaScopeDemoClass
Public aField As Integer = 6
Dim aProp As Integer

Property Prop() As Integer
Get
Return aProp
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 202 | P g i n a

End Get
Set(ByVal value As Integer)
aProp = value
End Set
End Property

Public Function functionWithNestedLambda _
(ByVal level1 As Integer) As aDelegate
Dim localVar As Integer = 5

' When the nested lambda expression is executed the first
' time, as aDel from Main, the variables have these values:
' level1 = 2
' level2 = 3, after aLambda is called in the Return statement
' level3 = 4, after aDel is called in Main
' locarVar = 5
' aField = 6
' aProp = 1
' The second time it is executed, two values have changed:
' aField = 20
' aProp = 30
' level3 = 40
Dim aLambda = Function(level2 As Integer) _
Function(level3 As Integer) _
level1 + level2 + level3 + localVar _
+ aField + aProp

' The function returns the nested lambda, with 3 as the
' value of parameter level2.
Return aLambda(3)
End Function

End Class
End Module

Convertir en un tipo de delegado
Una expresin lambda se puede convertir implcitamente en un tipo de delegado compatible.
Adems, al asignar expresiones lambda a los delegados, puede especificar los nombres de parmetro pero
omitir sus tipos de datos, permitiendo que stos se tomen del delegado. En el ejemplo siguiente, se asigna
una expresin lambda a una variable denominada del de tipoExampleDel, delegado que toma dos
parmetros, un entero y una cadena. Observe que no se especifican los tipos de datos de los parmetros en
la expresin lambda. Sin embargo, delrequiere un argumento de tipo entero y un argumento de cadena,
como se especifica en la definicin de ExampleDel.

' Definition of function delegate ExampleDel.
Delegate Function ExampleDel(ByVal arg1 As Integer, _
ByVal arg2 As String) As Integer

' Declaration of del as an instance of ExampleDel, with no data
' type specified for the parameters, m and s.
Dim del As ExampleDel = Function(m, s) m
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 203 | P g i n a


' Valid call to del, sending in an integer and a string.
Console.WriteLine(del(7, "up"))

' Neither of these calls is valid. Function del requires an integer
' argument and a string argument.
' Not valid.
' Console.WriteLine(del(7, 3))
' Console.WriteLine(del("abc"))

Ejemplos
El ejemplo siguiente define una expresin lambda que devuelve True si el argumento que acepta
valores NULL tiene un valor asignado y False si su valor es Nothing.

Dim notNothing = Function(num? As Integer) _
num IsNot Nothing
Dim arg As Integer = 14
Console.WriteLine("Does the argument have an assigned value?")
Console.WriteLine(notNothing(arg))

El ejemplo siguiente define una expresin lambda que devuelve el ndice del ltimo elemento de
una matriz.

Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim lastIndex = Function(intArray() As Integer) _
intArray.Length - 1
For i = 0 To lastIndex(numbers)
numbers(i) = numbers(i) + 1
Next

Tipos annimos
Visual Basic 2008 presenta los tipos annimos, que permiten crear objetos sin escribir ninguna definicin de
clase para el tipo de datos. En su lugar, el compilador genera una clase. La clase no tiene ningn nombre que
se pueda usar, hereda directamente de Object y contiene las propiedades especificadas al declarar el objeto.
Dado que no se especifica el nombre del tipo de datos, se hace referencia a l como tipo annimo.
El ejemplo siguiente declara y crea la variable product como instancia de un tipo annimo que tiene dos
propiedades, Name y Price.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Una expresin de consulta utiliza los tipos annimos para combinar las columnas de datos seleccionadas por
una consulta. No puede definir el tipo del resultado de antemano, ya que no puede predecir las columnas
que podra seleccionar una consulta determinada. Los tipos annimos permiten escribir una consulta que
selecciona cualquier nmero de columnas, en cualquier orden. El compilador crea un tipo de datos que
coincide con las propiedades y el orden especificados.
En los ejemplos siguientes, products es una lista de objetos de producto, cada uno de los cuales tiene
muchas propiedades. La variable namePriceQuery contiene la definicin de una consulta que, cuando se
ejecuta, devuelve una coleccin de instancias de un tipo annimo con dos propiedades, Name y Price.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 204 | P g i n a

Dim namePriceQuery = From prod In products _
Select prod.Name, prod.Price

La variable nameQuantityQuery contiene la definicin de una consulta que, cuando se ejecuta, devuelve una
coleccin de instancias de un tipo annimo con dos propiedades, Name y OnHand.

Dim nameQuantityQuery = From prod In products _
Select prod.Name, prod.OnHand

Precaucin:
El compilador genera el nombre del tipo annimo y quiz cambie de una compilacin a otra. El cdigo no
debe usar ni depender del nombre de un tipo annimo porque el nombre podra cambiar cuando se
vuelva a compilar el proyecto.

Declarar un tipo annimo
La declaracin de una instancia de un tipo annimo utiliza una lista de inicializadores para especificar las
propiedades del tipo. Slo puede especificar las propiedades al declarar un tipo annimo, y no otros
elementos de clase como mtodos o eventos. En el ejemplo siguiente,product1 es una instancia de un tipo
annimo que tiene dos propiedades: Name y Price.

' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}

Si designa las propiedades como propiedades de clave, puede utilizarlas con el fin de comparar dos
instancias de tipo annimas para comprobar la igualdad. Sin embargo, los valores de las propiedades de
clave no se pueden cambiar.
Observe que declarar una instancia de un tipo annimo es como declarar una instancia de un tipo con
nombre utilizando un inicializador de objeto:

' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}

Propiedades principales
Las propiedades de clave difieren de las propiedades no lo son de varias maneras bsicas:
Slo los valores de las propiedades de clave se comparan para determinar si dos instancias son
iguales.
Los valores de las propiedades de clave son de slo lectura y no se pueden cambiar.
Slo los valores de las propiedades de clave se incluyen en el algoritmo del cdigo hash generado
por compilador para un tipo annimo.

Igualdad
Las instancias de tipos annimos slo pueden ser iguales si son instancias del mismo tipo annimo. El
compilador trata las dos instancias como instancias del mismo tipo si cumplen las condiciones siguientes:
Se declaran en el mismo ensamblado.
Sus propiedades tienen los mismos nombres, los mismos tipos deducidos y se declaran en el mismo
orden. Las comparaciones de nombres no distinguen maysculas de minsculas.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 205 | P g i n a

Las mismas propiedades de cada una se marcan como propiedades de clave.
Por lo menos una propiedad de cada declaracin es una propiedad de clave.
Una instancia de un tipo annimo que no tiene ninguna propiedad de clave slo es igual a s misma.

' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))

' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))

Dos instancias del mismo tipo annimo son iguales si los valores de sus propiedades de clave son iguales. Los
ejemplos siguientes muestran cmo se comprueba la igualdad.

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29, _
.OnHand = 423}
' The following line displays False, because prod5 and prod6 do not
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29, _
.OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29, _
.OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

Valores de slo lectura
Los valores de las propiedades de clave no se pueden cambiar. Por ejemplo, en prod8 del ejemplo anterior,
los campos Name y Price son read-only, pero OnHand se puede cambiar.

' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"

' OnHand is not a Key property. Its value can be changed.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 206 | P g i n a

prod8.OnHand = 22

Tipos annimos a partir de expresiones de consulta
Las expresiones de consulta no siempre requieren la creacin de tipos annimos. Siempre que es posible,
utilizan un tipo existente para contener los datos de la columna. Esto se produce cuando la consulta
devuelve los registros completos desde el origen de datos o slo un campo de cada registro. En los ejemplos
de cdigo siguientes, customers es una coleccin de objetos de una clase Customer. La clase tiene muchas
propiedades y puede incluir una o ms en el resultado de la consulta, en cualquier orden. En los dos
primeros ejemplos, no se requiere ningn tipo annimo porque las consultas seleccionan los elementos de
tipos con nombre:
custs1 contiene una coleccin de cadenas, porque cust.Name es una cadena.

Dim custs1 = From cust In customers _
Select cust.Name

custs2 contiene una coleccin de objetos Customer, porque cada elemento decustomers es un
objeto Customer y la consulta selecciona el elemento completo.

Dim custs2 = From cust In customers _
Select cust

Sin embargo, los tipos con nombre adecuados no siempre estn disponibles. Quiz desee seleccionar
nombres y direcciones de clientes con una finalidad, nmeros de identificador y ubicaciones de clientes con
otra y nombres, direcciones e historiales de pedidos de clientes con una tercera. Los tipos annimos
permiten seleccionar cualquier combinacin de propiedades, en cualquier orden, sin declarar primero un
nuevo tipo con nombre para contener el resultado. En su lugar, el compilador crea un tipo annimo para
cada compilacin de propiedades. La consulta siguiente slo selecciona el nmero de identificacin del
cliente desde cada objeto Customer decustomers. Por consiguiente, el compilador crea un tipo annimo que
contiene slo esas dos propiedades.

Dim custs3 = From cust In customers _
Select cust.Name, cust.ID

Tanto los nombres como los tipos de datos de las propiedades del tipo annimo se toman de los
argumentos de Select, cust.Name y cust.ID. Las propiedades de un tipo annimo creado por una consulta
siempre son las propiedades de clave. Cuando custs3 se ejecuta en el bucle For Each siguiente, el resultado
es una coleccin de instancias de un tipo annimo con dos propiedades de clave, Name e ID.

For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next

Los elementos de la coleccin representada por custs3 tienen establecimiento inflexible de tipos y se puede
utilizar IntelliSense para navegar por las propiedades disponibles y comprobar sus tipos.

Decidir si se usan tipos annimos
Antes de crear un objeto como instancia de una clase annima, tenga en cuenta si es la mejor opcin. Por
ejemplo, si desea crear un objeto temporal para que contenga datos relacionados y no necesita el resto de
los campos o mtodos que pudiera contener una clase completa, un tipo annimo es una buena solucin.
Los tipos annimos tambin son adecuados si desea una seleccin diferente de propiedades para cada
declaracin o si desea cambiar el orden de las propiedades. Sin embargo, si el proyecto incluye varios
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 207 | P g i n a

objetos con las mismas propiedades, en un orden fijo, puede declararlas ms fcilmente utilizando un tipo
con nombre con un constructor de clase. Por ejemplo, con un constructor adecuado es ms fcil declarar
varias instancias de una clase Product que declarar varias instancias de un tipo annimo.

' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)

' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}

Otra ventaja de los tipos con nombre es que el compilador puede detectar un error ortogrfico accidental
del nombre de una propiedad. En los ejemplos anteriores, la finalidad
de firstProd2,secondProd2 y thirdProd2 es ser instancias del mismo tipo annimo. Sin embargo, si fuera a
declarar accidentalmente thirdProd2 de una de las siguientes formas, su tipo sera diferente del
de firstProd2 y secondProd2.

' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}

Mucho ms importante es que existen limitaciones de uso de los tipos annimos que no se aplican a las
instancias de tipos con nombre. firstProd2, secondProd2 y thirdProd2 son instancias del mismo tipo
annimo. Sin embargo, el nombre del tipo annimo compartido no est disponible y no puede aparecer en
los lugares donde se espera un nombre de tipo en el cdigo. Por ejemplo, un tipo annimo no se puede
utilizar para definir una firma de mtodo, declarar otra variable o campo ni en ninguna declaracin de tipos.
Como resultado, los tipos annimos no son adecuados cuando los mtodos deben compartir informacin.

Definicin de tipo annimo
En respuesta a la declaracin de una instancia de un tipo annimo, el compilador crea una nueva definicin
de clase que contiene las propiedades especificadas.
Si el tipo annimo contiene al menos una propiedad de clave, la definicin invalida tres miembros
heredados de Object: Equals, GetHashCode y ToString. El cdigo generado para comprobar la igualdad y
determinar el valor de cdigo hash tiene en cuenta slo las propiedades de clave. Si el tipo annimo no
contiene ninguna propiedad de clave, slo se invalida ToString. Explcitamente las propiedades con nombre
de un tipo annimo no pueden estar en conflicto con estos mtodos generados. Es decir, no puede
utilizar .Equals, .GetHashCodeni .ToString para asignar un nombre a una propiedad.
Las definiciones de tipo annimas que tienen por lo menos una propiedad de clave tambin implementan la
interfaz System.IEquatable(T), donde T es el tipo del tipo annimo.

Mtodos de extensin (Visual Basic)
Visual Basic 2008 ofrece mtodos de extensin, que permiten a los programadores agregar funcionalidad
personalizada a los tipos de datos ya definidos sin crear un nuevo tipo derivado. Los mtodos de extensin
permiten escribir un mtodo al que se puede llamar como si fuera un mtodo de instancia del tipo existente.

Comentarios
Un mtodo de extensin puede ser nicamente un procedimiento Sub o un procedimientoFunction. No se
puede definir ninguna propiedad, campo o evento de extensin. Todos los mtodos de extensin se deben
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 208 | P g i n a

marcar con el atributo de extensin, <Extension()>, del espacio de
nombres System.Runtime.CompilerServices.
El primer parmetro de una definicin de mtodo de extensin especifica qu tipo de datos extiende el
mtodo. Cuando se ejecuta el mtodo, el primer parmetro se enlaza a la instancia del tipo de datos que
invoca al mtodo.

Ejemplo
Descripcin
En el siguiente ejemplo se define una extensin Print para el tipo de datos String. El mtodo
usa Console.WriteLine para mostrar una cadena. El parmetro del mtodo Print, aString, establece que el
mtodo de extensin extiende la clase String.

Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

End Module

Observe que la definicin de mtodo de extensin se marca con el atributo de extensin<Extension()>.
Marcar el mdulo en el que se define el mtodo es opcional, pero se debe marcar cada mtodo de
extensin. System.Runtime.CompilerServices se debe importar para tener acceso al atributo de extensin.
Los mtodos de extensin se pueden declarar nicamente dentro de los mdulos. Normalmente, el mdulo
en el que se define un mtodo de extensin no es el mismo que el mdulo en el que se llama. En su lugar, se
importa el mdulo que contiene el mtodo de extensin, si fuera necesario, para incluirlo en el mbito.
Despus de que el mdulo que contiene Print est en el mbito, se puede llamar al mtodo como si fuera un
mtodo de instancia ordinario que no toma argumentos, como ToUpper:

Imports ConsoleApplication2.StringExtensions

Module Module1
Sub Main()

Dim example As String = "Hello"
' Call to extension method Print.
example.Print()

' Call to instance method ToUpper.
example.ToUpper()
example.ToUpper.Print()
End Sub
End Module

En el ejemplo siguiente, PrintAndPunctuate, tambin es una extensin de String, esta vez definida con dos
parmetros. El primer parmetro, aString, establece que el mtodo de extensin extiende String. El segundo
parmetro, punc, est pensado para ser una cadena de signos de puntuacin que se pasa como argumento
cuando se llama al mtodo. El mtodo muestra la cadena seguida de los signos de puntuacin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 209 | P g i n a


<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

Se llama al mtodo enviando un argumento de cadena para punc:example.PrintAndPunctuate(".")
En el ejemplo siguiente se muestra cmo definir y llamar a Print y PrintAndPunctuate.
System.Runtime.CompilerServices se importa en el mdulo de definicin para permitir el acceso al atributo
de extensin.

Cdigo
Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

End Module

Despus, los mtodos de extensin se incluyen en el mbito y se llaman.

Imports ConsoleApplication2.StringExtensions
Module Module1
Sub Main()
Dim example As String = "Example string"
example.Print()
example = "Hello"
example.PrintAndPunctuate(".")
example.PrintAndPunctuate("!!!!")
End Sub
End Module

Comentarios
Todo esto es necesario para poder ejecutar estos mtodos o mtodos de extensin similares que estn en el
mbito. Si el mdulo que contiene un mtodo de extensin est en el mbito, est visible en IntelliSense y
se le llama como si fuera un mtodo de instancia normal.
Observe que cuando se invocan los mtodos, no se enva ningn argumento para el primer parmetro. El
parmetro, aString en las definiciones de mtodo anteriores, se enlaza aexample, la instancia de String que
los llama. El compilador usar example como el argumento que se enva al primer parmetro.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 210 | P g i n a

Tipos que se pueden extender
Puede definir un mtodo de extensin en la mayora de los tipos que se pueden representar en una lista de
parmetros de Visual Basic, incluidos los siguientes:
Clases (tipos de referencia)
Estructuras (tipos de valor)
Interfaces
Delegados
Argumentos ByRef y ByVal
Parmetros de mtodo genrico
Matrices
Puesto que el primer parmetro especifica el tipo de datos que el mtodo de extensin extiende, es
obligatorio y no puede ser opcional. Por esa razn, los parmetros Optional y ParamArrayno pueden ser el
primer parmetro de la lista de parmetros.

Procedimientos recomendados
Los mtodos de extensin proporcionan una manera conveniente y eficaz de extender un tipo existente. Sin
embargo, para usarlos correctamente se deben tener en cuenta algunos puntos. Estas consideraciones se
aplican principalmente a los autores de bibliotecas de clases, pero podran afectar a cualquier aplicacin que
use mtodos de extensin.
Ms en general, los mtodos de extensin que agrega a los tipos de los que no es propietario son ms
vulnerables que los mtodos de extensin agregados a los tipos que controla. Se pueden producir algunos
conflictos en las clases de las que no es propietario que pueden interferir con sus mtodos de extensin.
Si existe cualquier miembro de instancia accesible con una firma compatible con los argumentos en
la instruccin de llamada, sin requerir conversiones de restriccin del argumento al parmetro, el
mtodo de instancia se usar antes que cualquier mtodo de extensin. Por consiguiente, si se
agrega un mtodo de instancia adecuado a una clase en un momento dado, puede que un miembro
de extensin existente en el que confa se vuelva inaccesible.
El autor de un mtodo de extensin no puede evitar que otros programadores escriban mtodos de
extensin conflictivos que pueden tener prioridad sobre la extensin original.
Puede mejorar la solidez colocando los mtodos de extensin en su propio espacio de nombres.
Entonces, los usuarios de su biblioteca pueden incluir un espacio de nombres o excluirlo, o bien
seleccionar entre los espacios de nombres, por separado en el resto de la biblioteca.
Puede ser ms seguro extender interfaces que extender clases, sobre todo si no posee la interfaz o
la clase. Un cambio en una interfaz afecta a cada clase que la implementa. Por consiguiente, es
menos probable que el autor pueda agregar o cambiar mtodos en una interfaz. Sin embargo, si
una clase implementa dos interfaces que tienen mtodos de extensin con la misma firma, ninguno
de los mtodos de extensin est visible.
Extienda el tipo ms especfico que pueda. En una jerarqua de tipos, si selecciona un tipo del que
se derivan muchos otros tipos, hay niveles de posibilidades para la inclusin de mtodos de
instancia u otros mtodos de extensin que podran interferir con el suyo.

Mtodos de extensin, mtodos de instancia y propiedades
Cuando un mtodo de instancia dentro del mbito tiene una firma que es compatible con los argumentos de
una instruccin de llamada, se elige el mtodo de instancia de preferencia a cualquier mtodo de extensin.
El mtodo de instancia tiene la prioridad aun cuando el mtodo de extensin tenga una mejor coincidencia.
En el ejemplo siguiente, ExampleClass contiene un mtodo de instancia denominado ExampleMethod que
tiene un parmetro de tipo Integer. El mtodo de extensin ExampleMethod extiende ExampleClass y tiene
un parmetro de tipoLong.

Class ExampleClass
' Define an instance method named ExampleMethod.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 211 | P g i n a

Public Sub ExampleMethod(ByVal m As Integer)
Console.WriteLine("Instance method")
End Sub
End Class

<Extension()> _
Sub ExampleMethod(ByVal ec As ExampleClass, _
ByVal n As Long)
Console.WriteLine("Extension method")
End Sub

La primera llamada a ExampleMethod en el cdigo siguiente llama al mtodo de extensin,
porque arg1 es Long y slo es compatible con el parmetro Long en el mtodo de extensin. La segunda
llamada a ExampleMethod tiene un argumento Integer, arg2, y llama al mtodo de instancia.

Sub Main()
Dim example As New ExampleClass
Dim arg1 As Long = 10
Dim arg2 As Integer = 5

' The following statement calls the extension method.
example.ExampleMethod(arg1)
' The following statement calls the instance method.
example.ExampleMethod(arg2)
End Sub

Ahora invierta los tipos de datos de los parmetros en los dos mtodos:

Class ExampleClass
' Define an instance method named ExampleMethod.
Public Sub ExampleMethod(ByVal m As Long)
Console.WriteLine("Instance method")
End Sub
End Class

<Extension()> _
Sub ExampleMethod(ByVal ec As ExampleClass, _
ByVal n As Integer)
Console.WriteLine("Extension method")
End Sub

Ahora el cdigo de Main llama al mtodo de instancia las dos veces. Esto se debe a que arg1 yarg2 tienen
una conversin de ampliacin a Long, y el mtodo de instancia tiene prioridad sobre el mtodo de extensin
en ambos casos.

Sub Main()
Dim example As New ExampleClass
Dim arg1 As Long = 10
Dim arg2 As Integer = 5

' The following statement calls the instance method.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 212 | P g i n a

example.ExampleMethod(arg1)
' The following statement calls the instance method.
example.ExampleMethod(arg2)
End Sub

Por lo tanto, un mtodo de extensin no puede reemplazar a un mtodo de instancia existente. Sin
embargo, cuando un mtodo de extensin tiene el mismo nombre que un mtodo de instancia pero las
firmas no entran en conflicto, se puede tener acceso a ambos mtodos. Por ejemplo, si la
clase ExampleClass contiene un mtodo denominado ExampleMethod que no toma ningn argumento, se
permiten mtodos de extensin con el mismo nombre pero con firmas diferentes, como se muestra en el
cdigo siguiente.

Imports ConsoleApplication2.ExtensionExample
Module Module1

Sub Main()
Dim ex As New ExampleClass
' The following statement calls the extension method.
ex.ExampleMethod("Extension method")
' The following statement calls the instance method.
ex.ExampleMethod()
End Sub

Class ExampleClass
' Define an instance method named ExampleMethod.
Public Sub ExampleMethod()
Console.WriteLine("Instance method")
End Sub
End Class

End Module
Imports System.Runtime.CompilerServices

' Define an extension method named ExampleMethod.
Module ExtensionExample
<Extension()> _
Sub ExampleMethod(ByVal ec As ExampleClass, _
ByVal stringParameter As String)
Console.WriteLine(stringParameter)
End Sub

End Module

Los resultados de este cdigo son los siguientes:
Extension method
Instance method

La situacin es ms fcil con propiedades: si un mtodo de extensin tiene el mismo nombre que una
propiedad de la clase que extiende, el mtodo de extensin no est visible y no se puede tener acceso a l.

Prioridad del mtodo de extensin
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 213 | P g i n a

Cuando dos mtodos de extensin con firmas idnticas estn en el mbito y se encuentran accesibles, se
invoca al de mayor prioridad. La prioridad de un mtodo de extensin se basa en el mecanismo que se usa
para incluir al mtodo en el mbito. La lista siguiente muestra la jerarqua de prioridad, de mayor a menor.
1. Mtodos de extensin definidos dentro del mdulo actual.
2. Mtodos de extensin definidos dentro de los tipos de datos en el espacio de nombres actual o
cualquiera de sus elementos primarios. Los espacios de nombres secundarios tienen mayor
prioridad que los espacios de nombres primarios.
3. Mtodos de extensin definidos dentro de cualquier tipo de importaciones en el archivo actual.
4. Mtodos de extensin definidos dentro de cualquier importacin de espacio de nombres en el
archivo actual.
5. Mtodos de extensin definidos dentro de cualquier tipo de importaciones de nivel de proyecto.
6. Mtodos de extensin definidos dentro de cualquier importacin de espacio de nombres de nivel
de proyecto.
Si la prioridad no resuelve la ambigedad, puede usar el nombre completo para especificar el mtodo al que
est llamando. Si el mtodo Print del ejemplo anterior se define en un mdulo
denominado StringExtensions, el nombre completo es StringExtensions.Print(example)en vez
de example.Print().

Cmo: Escribir un mtodo de extensin
Los mtodos de extensin permiten agregar mtodos a una clase existente. Se puede llamar al mtodo de
extensin como si fuera una instancia de esa clase.
Para definir un mtodo de extensin
1. Abra en Visual Studio una aplicacin de Visual Basic nueva o existente.
2. En la parte superior del archivo en el que desea definir un mtodo de extensin, incluya la
instruccin de importacin siguiente:

Imports System.Runtime.CompilerServices

3. Dentro de un mdulo de una aplicacin nueva o existente, comience la definicin de mtodo con el
atributo de extensin:

<Extension()>

Si desea continuar la declaracin de mtodo en la lnea siguiente, agregue el carcter de continuacin de
lnea, que es un subrayado:

<Extension()> _

4. Declare el mtodo como lo hara normalmente, salvo que el tipo del primer parmetro debe ser el
tipo de datos que desea extender.

<Extension()> _
Public Sub subName (ByVal para1 As ExtendedType, <other parameters>)
' < Body of the method >
End Sub

Ejemplo
En el ejemplo siguiente se declara un mtodo de extensin en un mdulo StringExtensions. Un segundo
mdulo, Module1, importa StringExtensions y llama al mtodo. Cuando se llama al mtodo de extensin,
debe estar en mbito. El mtodo de extensin PrintAndPunctuateextiende la clase String con un mtodo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 214 | P g i n a

que muestra la instancia de la cadena seguida de una cadena de signos de puntuacin enviada como un
parmetro.

' Declarations will typically be in a separate module.
Imports System.Runtime.CompilerServices

Module StringExtensions
<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

End Module
' Import the module that holds the extension method you want to use,
' and call it.

Imports ConsoleApplication2.StringExtensions

Module Module1

Sub Main()
Dim example = "Hello"
example.PrintAndPunctuate("?")
example.PrintAndPunctuate("!!!!")
End Sub

End Module

Observe que el mtodo se define con dos parmetros y se llama solamente con uno. El primer
parmetro, aString, en la definicin de mtodo se enlaza a example, la instancia de String que llama al
mtodo. El resultado del ejemplo es el siguiente:

Hello?
Hello!!!!

Introduccin a SQL Server 2005
El Motor de base de datos de SQL Server 2005) de Microsoft es el servicio principal para almacenar, procesar
y proteger datos. El Database Engine (Motor de base de datos) proporciona acceso controlado y
procesamiento de transacciones rpido para cumplir con los requisitos de las aplicaciones consumidoras de
datos ms exigentes de su empresa. El Database Engine (Motor de base de datos) tambin proporciona
compatibilidad completa para mantener una alta disponibilidad.

Reseas de RDBMS
Microsoft SQL Server 2005 ofrece una serie de mejoras y nuevas caractersticas en el motor de base de
datos.
Caractersticas mejoradas del motor de base de datos
A continuacin se muestran las reas en las que ha mejorado el Database Engine.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 215 | P g i n a

rea Descripcin
Mejoras en la
programacin del motor
de base de datos
Se pueden escribir objetos de base de datos, como desencadenadores,
procedimientos almacenados y tipos definidos por el usuario en lenguajes .NET,
como Microsoft Visual C#. El desarrollo y la depuracin estn integrados en el
entorno de Microsoft Visual Studio, lo que permite a los desarrolladores utilizar las
mismas herramientas para desarrollar objetos de base de datos que las que
utilizan para desarrollar componentes y servicios .NET. Se ha ampliado el lenguaje
Transact-SQL con una serie de funciones como, por ejemplo, un control de errores
mejorado y compatibilidad con consultas recursivas.
Mejoras en la
administracin del
motor de base de datos
Se ha simplificado la administracin del Database Engine gracias a la configuracin
dinmica de instancias, como la administracin dinmica de memoria AWE y la
afinidad de CPU y E/S dinmica. Se han incluido una serie de caractersticas para
mejorar la seguridad, como la posibilidad de que puedan concederse todos los
permisos y la separacin de usuarios y esquemas.
Mejoras en las consultas
distribuidas del Motor
de base de datos
Se ha mejorado la funcionalidad de las consultas distribuidas con los cambios en
Transact-SQL, la compatibilidad con nuevos tipos de datos y la adicin de nuevos
eventos de Traza de SQL.
Mejoras en la
disponibilidad del motor
de base de datos
La disponibilidad de las bases de datos de SQL Server ha mejorado gracias a las
operaciones de indizacin en lnea; se ha conseguido una rpida recuperacin
durante operaciones de recuperacin tras un bloqueo y conmutacin por error de
creacin de reflejo de base de datos al permitir que la base de datos est
disponible durante la fase Deshacer, con una disponibilidad parcial durante las
operaciones de restauracin, sumas de comprobacin de pginas de base de datos
y creacin de reflejo de medios de copia de seguridad. La creacin de reflejo de la
base de datos permite la creacin de servidores en espera activa que proporcionan
una compatibilidad para la conmutacin por error rpida, sin que se produzca
ninguna prdida de datos derivada de las transacciones confirmadas.
Importante: Las directivas de compatibilidad de Microsoft no se aplican a la
caracterstica de creacin de reflejo de la base de datos en SQL Server 2005. La
creacin de reflejo de la base de datos est actualmente deshabilitada de forma
predeterminada, pero puede habilitarla solamente con fines de evaluacin
mediante la marca de traza 1400 como parmetro de inicio. La creacin de reflejo
de la base de datos no debe utilizarse en entornos de produccin. Los servicios de
soporte tcnico de Microsoft no ofrecern soporte a bases de datos o aplicaciones
que utilicen la creacin de reflejo de la base de datos. La documentacin sobre la
creacin de reflejo de la base de datos se incluye en SQL Server 2005 solamente
con fines de evaluacin y la Directiva de documentacin para soporte y
actualizacin de SQL Server 2005 no se aplica a la documentacin sobre la creacin
de reflejo de la base de datos.

Mejoras en el motor de
base de datos que
afectan al XML
Ahora, el Database Engine admite un tipo de datos XML para almacenar
documentos XML en columnas de tabla o variables Transact-SQL. Tambin admite
el lenguaje XQuery, incluido el lenguaje de manipulacin de datos XML (XML DML).
Mejoras en la
escalabilidad y el
rendimiento del motor
de base de datos
Se ha producido una mejora en la particin de datos gracias a la particin de
ndices y tablas nativas. La simultaneidad de las aplicaciones ha mejorado gracias al
uso del nuevo nivel de aislamiento de instantnea y a la posibilidad de disponer de
varios conjuntos de resultados activos en una nica conexin.
Mejoras internacionales
del motor de base de
datos
Ahora, las intercalaciones y juegos de caracteres del Database Engine, y sus
interfaces, incluyen compatibilidad con caracteres complementarios y caracteres
con codificacin GB18030.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 216 | P g i n a


Exploracin de SSMS
A continuacin se listan las principales caractersticas de la interfaz de SQL Server Management Studio.
Compatibilidad con la mayora de las tareas administrativas de SQL Server 2005 y SQL Server 2000.
Un entorno nico integrado para administracin y edicin del Motor de base de datos de SQL
Server.
Nuevos cuadros de dilogo de administracin para la administracin de objetos del Motor de base
de datos de SQL Server, Analysis Services, Reporting Services, Notification Services y SQL Server
Mobile, lo que permite ejecutar las acciones inmediatamente, enviarlas a un editor de cdigo o
escribirlas en secuencias de comandos para ejecutarlas posteriormente.
Cuadros de dilogo no modales y de tamao variable que permiten obtener acceso a varias
herramientas mientras un cuadro de dilogo est abierto.
Un cuadro de dilogo comn de programacin que permite realizar acciones de los cuadros de
dilogo de administracin en otro momento.
Exportacin e importacin del registro de servidor de SQL Server Management Studio desde un
entorno de Management Studio a otro.
Guardado o impresin de archivos de plan de presentacin XML o de interbloqueo generados por el
Analizador de SQL Server, revisin posterior o envo a los administradores para su anlisis.
Un nuevo cuadro de mensaje de error e informativo que presenta mucha ms informacin, permite
enviar a Microsoft un comentario sobre los mensajes, copiar mensajes en el Portapapeles y enviar
fcilmente los mensajes por correo electrnico al equipo de soporte.
Un explorador Web integrado para una rpida exploracin de MSDN o la Ayuda en pantalla.
Integracin de la Ayuda de comunidades en lnea.
Un tutorial sobre SQL Server Management Studio para ayudarle a aprovechar las ventajas de las
numerosas caractersticas nuevas y a que sea ms productivo de forma inmediata.
Un nuevo monitor de actividad con filtro y actualizacin automtica.
Interfaces de Correo electrnico de base de datos integradas.

Nuevas funciones de las secuencias de comandos
El Editor de cdigo de SQL Server Management Studio contiene editores de secuencias de comandos
integrados para crear secuencias de comandos Transact-SQL, MDX, DMX, XML/A y XML. Ofrece las
caractersticas siguientes:
Ayuda dinmica para el acceso inmediato a la informacin relevante mientras se trabaja.
Un amplio conjunto de plantillas y la posibilidad de crear plantillas personalizadas.
Compatibilidad con la escritura y modificacin de consultas o secuencias de comandos sin
necesidad de conexin a un servidor.
Compatibilidad con secuencias de comandos para consultas y secuencias de comandos SQLCMD.
Una nueva interfaz para ver resultados XML.
Control de cdigo fuente integrado para proyectos de secuencias de comandos y soluciones
compatibles con el almacenamiento y la conservacin de copias de secuencias de comandos a
medida que evolucionan.
Compatibilidad de Microsoft IntelliSense con instrucciones MDX.

Caractersticas del Explorador de objetos
El Explorador de objetos de SQL Server Management Studio es una herramienta integrada para ver y
administrar objetos en todo tipo de servidores. Ofrece las caractersticas siguientes:
Visualizacin de objetos por tipo o esquema.
Filtrado por todo o parte de un nombre, esquema o fecha.
Llenado asincrnico de objetos, con la posibilidad de filtrar objetos segn sus metadatos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 217 | P g i n a

Acceso al Agente SQL Server en los servidores de rplica para administracin.

Principales ventanas y su funcionalidad
SQL Server Management Studio proporciona un gran nmero de eficaces ventanas de herramientas para
todas las fases del desarrollo y la administracin. Algunas herramientas se pueden utilizar en cualquier
componente de SQL Server, mientras que otras son slo para ciertos componentes. En la tabla siguiente se
identifican las herramientas que se pueden utilizar con todos los componentes de SQL Server.
Herramienta Finalidad
Explorador de
objetos
Examinar servidores, crear y ubicar objetos, administrar orgenes de datos y ver
registros. A esta herramienta se obtiene acceso desde el men Ver.
Administracin de
servidores
registrados
Almacenar informacin de conexin de servidores a los que se obtiene acceso con
frecuencia. A esta herramienta se obtiene acceso desde el men Ver.
Explorador de
soluciones
Almacenar y organizar secuencias de comandos e informacin de conexin relacionada
en proyectos denominados Secuencias de comandos de SQL Server. Es posible
almacenar varias Secuencias de comandos de SQL Server como Soluciones y utilizar el
control de cdigo fuente para administrar las secuencias de comandos a medida que
evolucionan. A esta herramienta se obtiene acceso desde el men Ver.
Plantillas de SQL
Server Management
Studio
Crear consultas basadas en las plantillas existentes. Tambin es posible crear consultas
personalizadas o modificar las plantillas existentes de modo que se ajusten a su
situacin. A esta herramienta se obtiene acceso desde el men Ver.
Ayuda dinmica
Mostrar una lista de temas relacionados de la Ayuda cuando se hace clic en un
componente o en un tipo de cdigo.
Las herramientas de SQL Server Management Studio funcionan conjuntamente, lo que significa que puede
utilizar las ventanas de herramientas distintas al mismo tiempo. Por ejemplo, puede:
Registrar un servidor con el Explorador de objetos.
Abrir una ventana del Editor SQL conectada a una base de datos especfica del Explorador de
objetos.

Tipos de datos
En SQL Server 2005, cada columna, variable local, expresin y parmetro tiene un tipo de datos relacionado.
Un tipo de datos es un atributo que especifica el tipo de datos que el objeto puede contener: datos enteros,
de caracteres, de moneda, de fecha y hora, cadenas binarias, etc.
SQL Server proporciona un conjunto de tipos de datos del sistema que define todos los tipos de datos que
pueden utilizarse con SQL Server. Tambin puede definir sus propios tipos de datos en Transact-SQL o
Microsoft .NET Framework. Los tipos de datos de alias estn basados en los tipos de datos proporcionados
por el sistema. Para obtener ms informacin acerca de los tipos de datos de alias, vea Trabajar con tipos de
datos de alias. Los tipos definidos por el usuario obtienen sus caractersticas de los mtodos y los
operadores de una clase que se crean mediante uno de los lenguajes de programacin compatibles con .NET
Framework. Para obtener ms informacin, vea Trabajar con tipos definidos por el usuario para CLR.
Cuando dos expresiones que tienen tipos de datos, intercalaciones, precisin, escala o longitud diferentes
son combinadas por un operador, las caractersticas del resultado vienen determinadas por lo siguiente:
El tipo de datos del resultado viene determinado por la aplicacin de las reglas de precedencia de
tipos de datos a los tipos de datos de las expresiones de entrada.
La intercalacin del resultado viene determinada por las reglas de precedencia de intercalacin
cuando el tipo de datos del resultado es char, varchar, text, nchar, nvarchar o ntext. La precisin,
escala y longitud del resultado dependen de la precisin, escala y longitud de las expresiones de
entrada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 218 | P g i n a

Categoras de tipos de datos
Los tipos de datos de SQL Server 2005 se organizan en las siguientes categoras:
Numricos exactos Cadenas de caracteres Unicode
Numricos aproximados Cadenas binarias
Fecha y hora Otros tipos de datos
Cadenas de caracteres
En SQL Server 2005, segn las caractersticas de almacenamiento, algunos tipos de datos estn designados
como pertenecientes a los siguientes grupos:
Tipos de datos de valores grandes: varchar(max), nvarchar(max) y varbinary(max)
Tipos de datos de objetos grandes: text, ntext, image, varchar(max), nvarchar(max),
varbinary(max) y xml
Nota: sp_help devuelve -1 como la longitud del valor de gran tamao y de los tipos de datos xml.
Numricos exactos
bigint decimal
int numeric
smallint money
tinyint smallmoney
bit
Numricos aproximados
float real
Fecha y hora
datetime smalldatetime
Cadenas de caracteres
char text
varchar

Cadenas de caracteres Unicode
nchar ntext
nvarchar

Cadenas binarias
binary image
varbinary

Otros tipos de datos
cursor timestamp
sql_variant uniqueidentifier
table xml

Creacin de base de datos y tablas Usando SSMS
Crear una base de datos
1. En el Explorador de objetos, conctese a una instancia del SQL Server 2005 Database Engine (Motor de
base de datos de SQL Server 2005) y expndala.
2. Haga clic con el botn secundario en Bases de datos y, a continuacin, en Nueva base de datos.
3. En Nueva base de datos, especifique un nombre de base de datos.
4. Si desea crear la base de datos aceptando todos los valores predeterminados, haga clic en Aceptar; de
lo contrario, contine con siguientes los pasos opcionales.
5. Para cambiar el nombre de nombre del propietario, haga clic en () para seleccionar otro propietario.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 219 | P g i n a

6. Para habilitar la bsqueda de texto en la base de datos, active la casilla de verificacin Indizacin de
texto. Para obtener ms informacin, vea Conceptos de la bsqueda de texto.
7. Para cambiar los valores predeterminados de los archivos de datos y de registro de transacciones
principales, en la cuadrcula Archivos de la base de datos, haga clic en la celda correspondiente y
especifique el nuevo valor
8. Para cambiar la intercalacin de la base de datos, seleccione la pgina Opciones y una intercalacin de
la lista.
9. Para cambiar el modelo de recuperacin, seleccione la pgina Opciones y un modelo de recuperacin
de la lista.
10. Para cambiar opciones de base de datos, seleccione la pgina Opciones y modifique las opciones de la
base de datos
11. Para agregar un nuevo grupo de archivos, haga clic en la pgina Grupos de archivos. Haga clic en
Agregar y especifique los valores para el grupo de archivos.
12. Para agregar una propiedad extendida a la base de datos, seleccione la pgina Propiedades extendidas.
a. En la columna Nombre, escriba un nombre para la propiedad extendida.
b. En la columna Valor, escriba el texto de la propiedad extendida. Por ejemplo, una o varias
instrucciones que describan la base de datos.
13. Para crear la base de datos, haga clic en Aceptar.
Crear y modificar tablas
Tras disear una base de datos, puede crear las tablas que almacenarn los datos en la base de datos.
Normalmente, los datos se almacenan en tablas permanentes; no obstante, tambin se pueden crear tablas
temporales. Las tablas se almacenan en los archivos de base de datos hasta que se eliminan, y estn
disponibles para cualquier usuario que cuente con los permisos necesarios.
Propiedades de la tabla
Puede definir hasta 1,024 columnas por tabla. Los nombres de las tablas y de las columnas deben seguir las
reglas de los identificadores; tienen que ser nicos dentro de una tabla especfica, pero puede utilizar el
mismo nombre de columna en distintas tablas de la misma base de datos.
Aunque los nombres de las tablas tienen que ser nicos para cada esquema de una base de datos, puede
crear varias tablas con el mismo nombre si especifica distintos esquemas para cada una. Puede crear dos
tablas denominadas employees y designar Jonah como esquema de una y Sally como esquema de la otra.
Cuando necesite trabajar con una de las tablas employees, puede distinguirlas si especifica el esquema con
el nombre de la tabla.
Tablas temporales
Las tablas temporales son similares a las permanentes, salvo por el hecho de que las tablas temporales se
almacenan en tempdb y se eliminan automticamente cuando ya no se utilizan.
Hay dos tipos de tablas temporales: locales y globales. Se diferencian entre s por los nombres, la visibilidad
y la disponibilidad. Las tablas temporales locales tienen como primer carcter de sus nombres un solo signo
de nmero (#); slo son visibles para el usuario de la conexin actual y se eliminan cuando el usuario se
desconecta de la instancia de SQL Server. Las tablas temporales globales presentan dos signos de nmero
(##) antes del nombre; son visibles para cualquier usuario despus de su creacin y se eliminan cuando
todos los usuarios que hacen referencia a la tabla se desconectan de la instancia de SQL Server.
Por ejemplo, si crea la tabla denominada employees, la puede utilizar cualquier persona que cuente con los
correspondientes permisos de seguridad establecidos para la base de datos hasta que se elimine la tabla. Si
una sesin de base de datos crea una tabla temporal local denominada #employees, slo la sesin puede
trabajar con la tabla, que se elimina cuando se desconecta la sesin. Si crea la tabla temporal global
##employees, cualquier usuario de la base de datos podr trabajar con ella. Si ningn otro usuario trabaja
con esta tabla despus de que la cree, la tabla se eliminar cuando se desconecte. Si otro usuario trabaja
con la tabla despus de que la cree, SQL Server la elimina cuando se desconecte y todas las dems sesiones
ya no la utilicen activamente.
Es posible reemplazar muchos usos de las tablas temporales por variables con el tipo de datos table. Para
obtener ms informacin acerca de cmo usar las variables table, vea table (Transact-SQL).
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 220 | P g i n a

Modificar tablas
Despus de crear una tabla, puede cambiar muchas de las opciones que fueron definidas cuando se cre
originalmente. Entre ellas figuran las siguientes:
Agregar, modificar o eliminar columnas. Por ejemplo, se puede cambiar el nombre, la longitud, el
tipo de datos, la precisin, la escala y la aceptacin de valores NULL de la columna, aunque hay
algunas restricciones.
Si la tabla tiene particiones, se puede volver a crear las particiones, o bien se pueden agregar o
eliminar particiones concretas.
Agregar o eliminar restricciones PRIMARY KEY y FOREIGN KEY.
Agregar o eliminar restricciones UNIQUE y CHECK, as como definiciones DEFAULT y objetos.
Agregar o eliminar una columna de identificadores mediante las propiedades IDENTITY o
ROWGUIDCOL. Asimismo, es posible agregar o quitar la propiedad ROWGUIDCOL de una columna
existente, aunque en una tabla slo puede haber una columna que tenga la propiedad
ROWGUIDCOL.
Registrar una tabla y las columnas seleccionadas de una tabla para la indizacin de texto.
Para obtener ms informacin acerca de las modificaciones que pueden realizarse en una tabla, vea ALTER
TABLE (Transact-SQL).
Asimismo, puede cambiar el nombre o el esquema de una tabla. Cuando lo haga, tambin deber cambiar el
nombre de la tabla en todos los desencadenadores, procedimientos almacenados, secuencias de comandos
Transact-SQL u otros cdigos de programacin que utilicen el nombre o esquema anterior de la tabla
Sentencia DML (Lenguaje de Manipulacin de Datos)
SELECT
Una consulta es una solicitud de datos almacenados en SQL Server 2005. Una consulta se puede emitir de
varias formas:
Un usuario de MS Query o de Microsoft Access puede usar una interfaz grfica de usuario (GUI)
para elegir los datos que desea ver de una o varias tablas de SQL Server.
Un usuario de SQL Server Management Studio o de osql puede emitir una instruccin SELECT.
Una aplicacin cliente o de nivel intermedio, como una aplicacin de Microsoft Visual Basic, puede
asignar los datos de una tabla de SQL Server a un control enlazado, como una cuadrcula.
A pesar de que las consultas interactan con el usuario de diferentes formas, todas realizan la misma tarea:
presentan el conjunto de resultados de una instruccin SELECT al usuario. Incluso si el usuario no especifica
nunca una instruccin SELECT, como suele suceder con las herramientas grficas como el Diseador de
consultas de Visual Studio, el software de cliente transforma la consulta de cada usuario en una instruccin
SELECT que se enva a SQL Server.
La instruccin SELECT recupera los datos de SQL Server y los devuelve al usuario en uno o ms conjuntos de
resultados. Un conjunto de resultados es una organizacin tabular de los datos obtenidos de SELECT. Al igual
que una tabla SQL, el conjunto de resultados se compone de columnas y filas.
La sintaxis completa de la instruccin SELECT es compleja, aunque la mayor parte de las instrucciones
SELECT describen las cuatro propiedades principales de un conjunto de resultados:
El nmero y los atributos de las columnas del conjunto de resultados. Los siguientes atributos se
definen para cada columna del conjunto de resultados:
El tipo de datos de la columna.
El tamao de la columna y, para las columnas numricas, la precisin y escala.
El origen del valor de los datos devueltos en la columna.
Las tablas cuyos datos del conjunto de resultados se recuperan y cualquier relacin lgica entre las
tablas.
Las condiciones que deben cumplir las filas de las tablas de origen para satisfacer los requisitos de
la instruccin SELECT. Las filas que no cumplen las condiciones se omiten.
La secuencia en la que se ordenan las filas del conjunto de resultados.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 221 | P g i n a


La sintaxis completa de la instruccin SELECT es compleja, aunque las clusulas principales se pueden
resumir del modo siguiente:
SELECT select_list
[ INTO new_table_name ]
FROM table_list
[ WHERE search_conditions ]
[ GROUP BY group_by_list ]
[ HAVING search_conditions ]
[ ORDER BY order_list [ ASC | DESC ] ]

select_list
Describe las columnas del conjunto de resultados. Es una lista de expresiones separadas por comas. Cada
expresin define tanto el formato (tipo de datos y tamao) como el origen de los datos para la columna del
conjunto de resultados. Cada expresin de lista de seleccin suele ser una referencia a una columna de la
tabla o vista de origen de la que provienen los datos, aunque puede ser cualquier otra expresin, como una
constante o una funcin Transact-SQL. Al usar la expresin * en una lista de seleccin, se especifica que se
devolvern todas las columnas de la tabla de origen.
INTO new_table_name
Especifica que el conjunto de resultados se usa para crear una tabla nueva. new_table_name especifica el
nombre de la nueva tabla.
FROM table_list
Contiene una lista de las tablas cuyos datos del conjunto de resultados se recuperan. Estos orgenes pueden
ser:
Tablas base en el servidor local que ejecuta SQL Server 2005.
Vistas en la instancia local de SQL Server. SQL Server resuelve internamente la referencia de una
vista a las referencias en las tablas base que componen la vista.
Tablas vinculadas. Estas tablas se encuentran en orgenes de datos OLE DB a los que puede tener
acceso SQL Server. Este elemento se denomina consulta distribuida. Desde SQL Server se puede
tener acceso a los orgenes de datos OLE DB si se vinculan como un servidor vinculado o se hace
referencia al origen de datos en una funcin OPENROWSET u OPENQUERY.
La clusula FROM tambin puede contener especificaciones de combinacin. Estas especificaciones definen
la ruta de acceso especfica que va a utilizar SQL Server para desplazarse entre las tablas.
La clusula FROM se usa tambin en las instrucciones DELETE y UPDATE para definir las tablas que se
modifican.
WHERE search_conditions
La clusula WHERE es un filtro que define las condiciones que debe cumplir cada fila de las tablas de origen
para satisfacer los requisitos de la instruccin SELECT. Slo las filas que cumplen las condiciones contribuyen
con datos al conjunto de resultados. Los datos de las filas que no cumplen las condiciones no se usan.
La clusula WHERE se usa tambin en las instrucciones DELETE y UPDATE para definir las filas de las tablas
de destino que deben modificarse.
GROUP BY group_by_list
La clusula GROUP BY divide en grupos el conjunto de resultados segn los valores de las columnas de
group_by_list. Por ejemplo, la tabla AdventureWorks Sales.SalesOrderHeader incluye diez valores en
TerritoryID. Una clusula GROUP BY TerritoryID divide el conjunto de resultados en 10 grupos, uno por cada
valor de TerritoryID.
HAVING search_conditions
La clusula HAVING es un filtro condicional que se aplica al conjunto de resultados. Lgicamente, la clusula
HAVING filtra las filas del conjunto intermedio de resultados que se genera como consecuencia de la
aplicacin de alguna clusula FROM, WHERE o GROUP BY en la instruccin SELECT. Las clusulas HAVING se
usan normalmente con una clusula GROUP BY, aunque no se necesita una clusula GROUP BY antes de una
clusula HAVING.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 222 | P g i n a

ORDER BY order_list[ ASC | DESC ]
La clusula ORDER BY define el orden de las filas del conjunto de resultados. order_list especifica las
columnas del conjunto de resultados que forman la lista de clasificacin. Las palabras clave ASC y DESC se
utilizan para especificar si las filas se ordenan en una secuencia ascendente o descendente.
La clusula ORDER BY es importante porque la teora relacional especifica que no se puede suponer que las
filas de un conjunto de resultados tengan secuencias, a menos que se especifique ORDER BY. ORDER BY
debe usarse en cualquier instruccin SELECT para la que sea importante el orden de las filas del conjunto de
resultados.
Las clusulas de una instruccin SELECT deben especificarse en el orden correcto.
Cada referencia a un objeto de base de datos debe ser inequvoco. La ambigedad puede estar provocada
por los siguientes elementos:
Es posible que haya varios objetos con el mismo nombre en un sistema. Por ejemplo, Schema1 y
Schema2 pueden contener una tabla denominada TableX. Para resolver la ambigedad y
especificar la tabla TableX que pertenece a Schema1, califique el nombre de la tabla, como mnimo,
con el nombre de esquema:
SELECT *
FROM Schema1.TableX
La base de datos en la que reside el objeto puede que no sea siempre la base de datos actual
cuando se ejecute la instruccin SELECT. Para asegurar que se usa siempre el objeto correcto,
independientemente de la configuracin de la base de datos actual, califique el nombre del objeto
con la base de datos y el esquema:
SELECT *
FROM AdventureWorks.Purchasing.ShipMethod
Las tablas y vistas especificadas en la clusula FROM pueden tener nombres duplicados de
columna. Con frecuencia, las claves externas tienen el mismo nombre de columna que su clave
principal relacionada. Para resolver la ambigedad entre los nombres duplicados, el nombre de la
columna debe calificarse con el nombre de la tabla o de la vista:
SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
FROM Sales.Customer JOIN Sales.Store ON
( Sales.Customer.CustomerID = Sales.Store.CustomerID)
WHERE Sales.Customer.TerritoryID = 1
Esta sintaxis se vuelve muy complicada cuando los propios nombres de la tabla y de la vista deben
ser completos. Este problema se puede resolver si se asigna un nombre de correlacin, conocido
tambin como variable de intervalo o alias, a la tabla mediante la incorporacin de la palabra clave
AS en la clusula FROM. El nombre completo de la tabla o vista slo tiene que especificarse en la
clusula FROM. Todas las dems referencias a la tabla o vista pueden usar el nombre de
correlacin. Al aplicarse nombres de correlacin y calificar completamente las tablas del ejemplo
anterior se obtiene como resultado la siguiente instruccin SELECT:

SELECT DISTINCT c.CustomerID, s.Name
FROM Sales.Customer AS c
JOIN
Sales.Store AS s
ON ( c.CustomerID = s.CustomerID)
WHERE c.TerritoryID = 1

INSERT y SELECT INTO
La instruccin INSERT agrega una o ms filas nuevas a una tabla. Tratada de forma simplificada, INSERT tiene
la siguiente forma:
INSERT [INTO] table_or_view [(column_list)] data_values
La instruccin hace que data_values se inserte como una o ms filas en la tabla o vista que se nombra. El
argumento column_list es una lista separada por comas de los nombres de tablas que se pueden utilizar
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 223 | P g i n a

para especificar las columnas para las que se suministran datos. Si no se especifica column_list, todas las
columnas de la tabla o vista reciben datos.
Cuando column_list no enumera todas las columnas de la tabla o vista, se inserta el valor predeterminado, si
se ha definido alguno para la columna, o un valor de NULL en aquellas columnas que no se hayan
enumerado en la lista. Todas las columnas no especificadas en la lista de columnas deben permitir valores
NULL o tener un valor predeterminado asignado.
Las instrucciones INSERT no especifican valores para los siguientes tipos de columna porque SQL Server 2005
Database Engine (Motor de base de datos de SQL Server 2005) genera los valores de las columnas de los
siguientes tipos:
Columnas con una propiedad IDENTITY que genera los valores para la columna.
Columnas que tengan un valor predeterminado que utilice la funcin NEWID para generar un valor
GUID exclusivo.
Columnas calculadas. Se trata de columnas virtuales que se definieron como una expresin
calculada a partir de una o varias columnas en la instruccin CREATE TABLE, como:
CREATE TABLE TestTable
(ColA INT PRIMARY KEY,
ColB INT NOT NULL,
ColC AS (ColA + ColB) * 2)
Los valores de datos suministrados deben coincidir con la lista de columnas. El nmero de valores de datos
debe ser el mismo que el nmero de columnas y el tipo de datos, precisin y escala de cada valor de datos
debe coincidir con los de la columna correspondiente. Puede especificar los valores de datos de la siguiente
manera:
Utilizar una clusula VALUES para especificar los valores de datos para una fila, por ejemplo:
INSERT INTO MyTable (PriKey, Description)
VALUES (123, 'A description of part 123.')
La palabra clave VALUES especifica los valores de una fila de una tabla. Los valores se especifican como una
lista separada por comas de expresiones escalares cuyos tipos de datos, precisin y escala deben ser iguales,
o implcitamente convertibles, a la columna correspondiente de la lista de columnas. Si no se especifica una
lista de columnas, los valores deben especificarse en la misma secuencia que las columnas de la tabla o
vista.

Utilizar una subconsulta SELECT para especificar los valores de datos para una o ms filas, por
ejemplo:
INSERT INTO MyTable (PriKey, Description)
SELECT ForeignKey, Description
FROM SomeView

La subconsulta SELECT de la instruccin INSERT se puede utilizar para agregar valores a una tabla de una o
ms tablas o vistas. Adems, utilizar una subconsulta SELECT permite insertar ms de una fila al mismo
tiempo.

La lista de seleccin de la subconsulta debe coincidir con la lista de columnas de la instruccin INSERT. Si no
se especifica ninguna lista de columnas, la lista de seleccin debe coincidir con las columnas de la tabla o
vista en la que se inserta.
Otro de los usos de la instruccin INSERTSELECT es insertar datos de un origen externo a SQL Server 2005.
SELECT en la instruccin INSERT se puede utilizar para lo siguiente:
Hacer referencia a una tabla remota en un servidor vinculado mediante un nombre de cuatro
partes.
Hacer referencia a una tabla remota al utilizar OPENROWSET.
Utilizar el conjunto de resultados de una consulta ejecutada en un servidor remoto.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 224 | P g i n a

SELECT INTO
La instruccin SELECT INTO crea una nueva tabla y la llena con el conjunto de resultados de la instruccin
SELECT. SELECT INTO se puede emplear para combinar datos de varias tablas o vistas en una tabla. Tambin
se puede utilizar para crear una nueva tabla que contenga datos seleccionados de un servidor vinculado.
La estructura de la nueva tabla se define con los atributos de las expresiones de la lista de seleccin. En el
ejemplo siguiente se crea la tabla dbo.EmployeeAddresses mediante la seleccin de siete columnas de varias
tablas relacionadas con empleados y direcciones.
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, e.Title, a.AddressLine1, a.City, sp.Name
AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e ON e.ContactID = c.ContactID
JOIN HumanResources.EmployeeAddress AS ea ON ea.EmployeeID = e.EmployeeID
JOIN Person.Address AS a on a.AddressID = ea.AddressID
JOIN Person.StateProvince as sp ON sp.StateProvinceID =
a.StateProvinceID;
GO

UPDATE
Una vez creadas las tablas y agregados los datos, la modificacin o actualizacin de los datos de las tablas se
convierte en uno de los procesos diarios de mantenimiento de una base de datos. A continuacin se indican
las formas que ofrece SQL Server 2005 para cambiar los datos de una tabla existente.

La instruccin UPDATE puede cambiar los valores de filas individuales, grupos de filas o todas las filas de una
tabla o vista. Tambin se puede utilizar para actualizar las filas de un servidor remoto utilizando un nombre
de servidor vinculado o las funciones OPENROWSET, OPENDATASOURCE y OPENQUERY, siempre que el
proveedor de OLE DB utilizado para obtener acceso al servidor remoto admita actualizaciones. Una
instruccin UPDATE que haga referencia a una tabla o vista slo puede cambiar los datos de una tabla a la
vez.
La instruccin UPDATE tiene las siguientes clusulas principales:
SET: Contiene una lista separada por comas de las columnas que deben actualizarse y el nuevo
valor de cada columna, con el formato column_name = expression. El valor suministrado por las
expresiones incluye elementos tales como constantes, valores seleccionados de una columna de
otra tabla o vista, o valores calculados por una expresin compleja.
FROM: Identifica las tablas o vistas que suministran los valores de las expresiones de la clusula
SET, y las condiciones de combinacin opcional entre las tablas o vistas de origen.
WHERE: Especifica la condicin de bsqueda que define las filas de las tablas y vistas de origen que
estn calificadas para proporcionar valores para las expresiones de la clusula SET.
En el siguiente ejemplo se utiliza la instruccin UPDATE para aumentar un 10 por ciento el precio de todos
los productos de AdventureWorks asociados al modelo de producto 37:
USE AdventureWorks;
GO
UPDATE AdventureWorks.Production.Product
SET ListPrice = ListPrice * 1.1
WHERE ProductModelID = 37;
GO
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 225 | P g i n a

Clusula SET
SET especifica las columnas que deben cambiarse y sus nuevos valores. Los valores de las columnas
especificadas se actualizan con los valores indicados en SET, en todas las filas que coincidan con la condicin
de bsqueda de la clusula WHERE.
En el ejemplo siguiente se cambia el valor del cdigo postal en las filas que coinciden con una ciudad
especificada.
USE AdventureWorks;
GO
UPDATE Person.Address
SET PostalCode = '98000'
WHERE City = 'Bothell';
GO
Si no se especifica una clusula WHERE, se actualizan todas las filas. Por ejemplo, esta instruccin actualiza
los valores de las columnas Bonus, CommissionPct y SalesQuota en todas las filas de la tabla SalesPerson.
USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO
En una operacin de actualizacin se pueden calcular y usar los valores de las columnas calculadas. En el
ejemplo siguiente se duplica el valor de la columna ListPrice para todas las filas de la tabla Product.
USE AdventureWorks ;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO
Las expresiones que se utilizan en la clusula SET tambin pueden ser subconsultas que devuelven un nico
valor. En este ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas ms
recientes registradas en la tabla SalesOrderHeader. Las subconsultas suman las ventas de cada vendedor de
la instruccin UPDATE.
USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID =
so.SalesPersonID)
AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO

Clusula WHERE
La clusula WHERE realiza las funciones siguientes:
Especifica las filas que deben actualizarse.
Indica las filas de las tablas de origen que pueden suministrar los valores de la actualizacin si se
especifica tambin una clusula FROM.
Si no se especifica ninguna clusula WHERE, se actualizarn todas las filas de la tabla.
En el ejemplo siguiente se implementa un cambio de uno de los nombres de la tabla SalesReason. La
clusula WHERE limita la actualizacin de filas a las que incluyan el nombre Other.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 226 | P g i n a

UPDATE AdventureWorks.Sales.SalesReason
SET Name = N'Unknown'
WHERE Name = N'Other';

Clusula FROM
Utilice la clusula FROM para extraer datos de una o ms tablas o vistas, e insertarlos en la tabla que desea
actualizar. En este ejemplo se modifica la columna SalesYTD de la tabla SalesPerson para reflejar las ventas
ms recientes registradas en la tabla SalesOrderHeader.
USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
ON sp.SalesPersonID = so.SalesPersonID
AND so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID =
sp.SalesPersonID);
GO
En el ejemplo anterior se asume que slo se registra una venta para un determinado vendedor en una fecha
determinada y que las actualizaciones son recientes. Si se puede registrar ms de una venta para un
vendedor determinado el mismo da, el ejemplo que se muestra no funcionar correctamente. Se ejecuta
sin errores, pero cada valor de SalesYTD se actualiza con una sola venta, independientemente del nmero
de ventas que se produjeron ese da realmente. Esto es debido a que una sola instruccin UPDATE nunca
actualiza la misma fila dos veces.
Si puede haber ms de una venta el mismo da para un vendedor especificado, todas las ventas de cada
vendedor se deben agregar en la instruccin UPDATE, tal como se muestra en el siguiente ejemplo:
USE AdventureWorks;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID =
so.SalesPersonID)
AND Sales.SalesPerson.SalesPersonID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO

DELETE
La instruccin DELETE quita una o varias filas de una tabla o vista.
A continuacin se expone una forma simplificada de la sintaxis de DELETE:
DELETE table_or_view
FROM table_sources
WHERE search_condition
El parmetro table_or_view indica la tabla o vista de la que se van a eliminar las filas. Se eliminarn todas las
filas de table_or_view que renan los requisitos de la condicin de bsqueda de la clusula WHERE. Si no se
especifica ninguna clusula WHERE, se eliminarn todas las filas de table_or_view. La clusula FROM
especifica tablas o vistas y condiciones de combinacin adicionales que los predicados de la condicin de
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 227 | P g i n a

bsqueda de la clusula WHERE pueden utilizar para calificar las filas que se eliminarn de table_or_view..
Las filas no se eliminan de las tablas mencionadas en la clusula FROM, slo de la tabla mencionada en
table_or_view.
Las tablas de las que se quitan todas las filas permanecen en la base de datos. La instruccin DELETE slo
elimina filas de la tabla, pero la tabla en s se debe quitar de la base de datos mediante la instruccin DROP
TABLE.
Ejemplos
En el ejemplo siguiente se eliminan todas las filas de la tabla SalesPersonQuotaHistory porque no se utiliza
una clusula WHERE para limitar el nmero de filas eliminadas.
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO
En el ejemplo siguiente se eliminan todas las filas de la tabla ProductCostHistory en las que el valor de la
columna StandardCost es superior a 1000.00.
USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO
En este ejemplo se muestra la extensin de Transact-SQL que se utiliza para eliminar registros de una tabla
base que se basa en una combinacin o subconsulta correlacionada. La primera instruccin DELETE muestra
la solucin de subconsulta compatible con SQL-2003 y la segunda instruccin DELETE muestra la extensin
de Transact-SQL. Ambas consultas quitan filas de la tabla SalesPersonQuotaHistory basndose en las ventas
del ao hasta la fecha almacenadas en la tabla SalesPerson.
-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE SalesPersonID IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesYTD > 2500000.00);
GO

ADO.NET
ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para programadores de .NET
Framework. ADO.NET ofrece abundancia de componentes para la creacin de aplicaciones de uso
compartido de datos distribuidas. Constituye una parte integral de .NET Framework y proporciona acceso a
datos relacionales, XML y de aplicaciones. ADO.NET satisface diversas necesidades de desarrollo, como la
creacin de clientes de base de datos front-end y objetos empresariales de nivel medio que utilizan
aplicaciones, herramientas, lenguajes o exploradores de Internet.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 228 | P g i n a

Arquitectura de ADO.NET


Elegir un DataReader o un DataSet
A la hora de decidir si su aplicacin debe utilizar un DataReader, debe tener en cuenta el tipo de
funcionalidad que su aplicacin requiere. Use un DataSet para hacer lo siguiente:
Almacene datos en la memoria cach de la aplicacin para poder manipularlos. Si solamente
necesita leer los resultados de una consulta, el DataReader es la mejor eleccin.
Utilizar datos de forma remota entre un nivel y otro o desde un servicio web XML.
Interactuar con datos dinmicamente, por ejemplo para enlazar con un control de formularios
Windows Forms o para combinar y relacionar datos procedentes de varios orgenes.
Realizar procesamientos exhaustivos de datos sin necesidad de tener una conexin abierta con el
origen de datos, lo que libera la conexin para que la utilicen otros clientes.
Si no necesita la funcionalidad proporcionada por el DataSet, puede mejorar el rendimiento de su aplicacin
si utiliza el DataReader para devolver sus datos de slo avance y de slo lectura.
Aunque DataAdapter utiliza DataReaderpara rellenar el contenido de un DataSet, al utilizar
el DataReader puede mejorar el rendimiento porque no usar la memoria que utilizara el DataSet, adems
de evitar el procesamiento necesario para crear y rellenar el contenido de DataSet.

LINQ to DataSet
LINQ to DataSet proporciona capacidades de consulta y comprobacin de tipo en tiempo de compilacin de
los datos almacenados en cach de un objeto DataSet. Permite escribir consultas en uno de los lenguajes de
desarrollo de .NET Framework, como C# o Visual Basic.

LINQ to SQL
LINQ to SQL admite consultas en un modelo de objetos asignado a las estructuras de datos de una base de
datos relacional sin utilizar un modelo conceptual intermedio. Cada tabla se representa mediante una clase
distinta, acoplando de manera precisa el modelo de objetos al esquema de la base de datos relacional. LINQ
to SQL traduce Language-integrated queries del modelo de objetos a Transact-SQL y lo enva a la base de
datos para su ejecucin. Cuando la base de datos devuelve los resultados, LINQ to SQL los vuelve a traducir a
objetos.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 229 | P g i n a

ADO.NET Entity Framework
ADO.NET Entity Framework est diseado para permitir que los desarrolladores creen aplicaciones de
acceso a los datos programando en un modelo de aplicacin conceptual en lugar de programar
directamente en un esquema de almacenamiento relacional. El objetivo es disminuir la cantidad de cdigo y
mantenimiento necesario para las aplicaciones orientadas a datos.

Servicios de datos de ADO.NET
El marco de trabajo de los servicios de datos de ADO.NET se usa para implementar los servicios de datos en
la Web o en intranet. Los datos se estructuran como entidades y relaciones de acuerdo a las especificaciones
de Entity Data Model. Los datos implementados en este modelo se pueden direccionar mediante el
protocolo HTTP estndar.

XML y ADO.NET
ADO.NET aprovecha la eficacia de XML para proporcionar acceso a datos sin conexin. ADO.NET fue
diseado teniendo en cuenta las clases de XML incluidas en .NET Framework; ambos son componentes de
una nica arquitectura.
ADO.NET y las clases de XML incluidas en .NET Framework convergen en el objeto DataSet. DataSet se
puede rellenar con datos procedentes de un origen XML, ya sea ste un archivo o una secuencia
XML. DataSet se puede escribir como XML compatible con el consorcio World Wide Web (W3C), que incluye
su esquema como esquema lenguaje de definicin de esquemas XML, independientemente del origen de los
datos incluidos en DataSet. Puesto que el formato nativo de serializacin del DataSet es XML, es un medio
excelente para mover datos de un nivel a otro, por lo que DataSet es idneo para utilizar datos y contextos
de esquemas de interaccin remota desde y hacia un servicio web XML.

Proveedores de datos de .NET Framework (ADO.NET)
Los proveedores de datos de .NET Framework sirven para conectarse a una base de datos, ejecutar
comandos y recuperar resultados. Esos resultados se procesan directamente, se colocan en un DataSet con
el fin de que el usuario pueda verlos cuando los necesite, se combinan con datos de varios orgenes o se
utilizan de forma remota entre niveles. Los proveedores de datos de .NET Framework son ligeros, de manera
que crean un nivel mnimo entre el origen de datos y el cdigo, con lo que aumenta el rendimiento sin
sacrificar funcionalidad.
En la tabla siguiente se enumeran los proveedores de datos que se incluyen en .NET Framework.
(.NET Framework) Proveedor de
datos
Descripcin
(.NET Framework)Proveedor de
datos para SQL Server
Proporciona acceso a datos para Microsoft SQL Server versin 7.0 o
posterior. Utiliza el espacio de nombres System.Data.SqlClient.
(.NET Framework)Proveedor de
datos para OLE DB
Para orgenes de datos que se exponen mediante OLE DB. Utiliza el
espacio de nombres System.Data.OleDb.
(.NET Framework)Proveedor de
datos para ODBC
Para orgenes de datos que se exponen mediante ODBC. Utiliza el
espacio de nombres System.Data.Odbc.
(.NET Framework)Proveedor de
datos para Oracle
Para orgenes de datos de Oracle. El proveedor de datos de .NET
Framework para Oracle es compatible con la versin 8.1.7 y
posteriores del software de cliente de Oracle y utiliza el espacio de
nombres System.Data.OracleClient.
Proveedor EntityClient Proporciona acceso a datos para las aplicaciones de Entity Data Model
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 230 | P g i n a

(EDM). Utiliza el espacio de nombres System.Data.EntityClient.

Objetos principales de los proveedores de datos de .NET Framework
En la tabla siguiente se describen los cuatro objetos centrales que constituyen un proveedor de datos de
.NET Framework.
Objeto Descripcin
Connection Establece una conexin a un origen de datos determinado. La clase base para todos los
objetos Connection es DbConnection.
Command Ejecuta un comando en un origen de datos. Expone Parameters y puede ejecutarse en el
mbito de un objeto Transaction desde Connection. La clase base para todos los
objetos Command es DbCommand.
DataReader Lee una secuencia de datos de slo avance y slo lectura desde un origen de datos. La
clase base para todos los objetos DataReader es DbDataReader.
DataAdapter Llena un DataSet y realiza las actualizaciones necesarias en el origen de datos. La clase
base para todos los objetos DataAdapter es DbDataAdapter.

Adems de las clases principales citadas en la tabla expuesta anteriormente en este documento, los
proveedores de datos de .NET Framework tambin incluyen las que se enumeran en la tabla siguiente.
Objeto Descripcin
Transaction Incluye comandos en las transacciones que se realizan en el origen de datos.
La clase base para todos los objetos Transaction es DbTransaction. ADO.NET
es tambin compatible con las transacciones que usan clases en el espacio de
nombres System.Transactions.
CommandBuilder Un objeto auxiliar que genera automticamente las propiedades de comando
de un DataAdapter o que obtiene de un procedimiento almacenado
informacin acerca de parmetros con la que puede rellenar la
coleccin Parameters de un objeto Command. La clase base para todos los
objetos CommandBuilder es DbCommandBuilder.
ConnectionStringBuilder Un objeto auxiliar que proporciona un modo sencillo de crear y administrar el
contenido de las cadenas de conexin utilizadas por los objetos Connection. La
clase base para todos los
objetosConnectionStringBuilder es DbConnectionStringBuilder.
Parameter Define los parmetros de entrada, salida y valores devueltos para los
comandos y procedimientos almacenados. La clase base para todos los
objetos Parameter es DbParameter.
Exception Se devuelve cuando se detecta un error en el origen de datos. En el caso de
que el error se detecte en el cliente, los proveedores de datos de .NET
Framework generan una excepcin de .NET Framework. La clase base para
todos los objetos Exception es DbException.
Error Expone la informacin relacionada con una advertencia o error devueltos por
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 231 | P g i n a

Objeto Descripcin
un origen de datos.
ClientPermission Se proporciona para los atributos de seguridad de acceso del cdigo de los
proveedores de datos de .NET Framework. La clase base para todos los
objetos ClientPermission es DBDataPermission.

.Proveedor de datos de .NET Framework para servidor SQL Server (SqlClient)
El proveedor de datos de .NET Framework para SQL Server (SqlClient) usa su propio protocolo para
comunicarse con SQL Server. Es ligero y presenta un buen rendimiento porque est optimizado para tener
acceso a SQL Server directamente, sin agregar una capa OLE DB u ODBC. En la siguiente ilustracin se
compara el proveedor de datos de .NET Framework para SQL Server y el proveedor de datos de .NET
Framework para OLE DB. El proveedor de datos de .NET Framework para OLE DB se comunica con un origen
de datos OLE DB tanto a travs del componente de servicio OLE DB, que proporciona agrupacin de
conexiones y servicios de transaccin, como del proveedor OLE DB correspondiente al origen de datos.

Nota:
El proveedor de datos de .NET Framework para ODBC cuenta con una arquitectura similar a la del
proveedor de datos de .NET Framework para OLE DB; por ejemplo, llama a un componente de servicio
ODBC.

Para utilizar el proveedor de datos de .NET Framework para SQL Server, debe tener acceso a SQL Server 7.0
o posterior. Las clases del proveedor de datos de .NET Framework para SQL Server se encuentran en el
espacio de nombres System.Data.SqlClient. Para versiones anteriores de SQL Server, utilice el proveedor de
datos de .NET Framework para OLE DB con el proveedor de datos OLE DB de SQL Server System.Data.OleDb.
El proveedor de datos de .NET Framework para SQL Server admite tanto transacciones locales como
transacciones distribuidas. En el caso de las transacciones distribuidas, el proveedor de datos de .NET
Framework para SQL Server se inscribe automticamente y de forma predeterminada en una transaccin y
obtiene los detalles de la misma a travs de los servicios de componentes de Windows o
de System.Transactions.
En el siguiente ejemplo de cdigo se muestra cmo puede incluir el espacio de
nombres System.Data.SqlClient en sus aplicaciones.

Imports System.Data.SqlClient

Ejemplos de cdigo de ADO.NET
Los listados de cdigo de este tema muestran cmo recuperar datos de una base de datos utilizando las
tecnologas ADO.NET siguientes:
Proveedores de datos de ADO.NET:
.NET Framework Data Provider for SQL Server (System.Data.SqlClient)
.NET Framework Data Provider for OLE DB (System.Data.OleDb)

Ejemplos del proveedor de datos de ADO.NET
En los listados de cdigo siguientes se muestra cmo recuperar datos de una base de datos usando
proveedores de datos de ADO.NET. Los datos se devuelven en DataReader.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 232 | P g i n a

SqlClient
En el cdigo de este ejemplo se asume que puede conectarse a la base de datos de ejemploNorthwind en
Microsoft SQL Server 7.0 o en una versin posterior. El cdigo creaSqlCommand para seleccionar filas de la
tabla Products, que aade SqlParameter para limitar los resultados a las filas con un UnitPrice mayor que el
valor de parmetro especificado, en este caso 5. SqlConnection se abre dentro de un bloque using, que
garantiza que los recursos se cierran y se eliminan cuando termina la ejecucin del cdigo. El cdigo ejecuta
el comando utilizando SqlDataReader y muestra los resultados en la ventana de la consola.

Imports System
Imports System.Data
Imports System.Data.SqlClient

Public Class Program
Public Shared Sub Main()

Dim connectionString As String = GetConnectionString()
Dim queryString As String = _
"SELECT CategoryID, CategoryName FROM dbo.Categories;"

Using connection As New SqlConnection(connectionString)
Dim command As SqlCommand = connection.CreateCommand()
command.CommandText = queryString
Try
connection.Open()
Dim dataReader As SqlDataReader = _
command.ExecuteReader()
Do While dataReader.Read()
Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", _
dataReader(0), dataReader(1))
Loop
dataReader.Close()

Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Using
End Sub

Private Shared Function GetConnectionString() As String
' To avoid storing the connection string in your code,
' you can retrieve it from a configuration file.
Return "Data Source=(local);Initial Catalog=Northwind;" _
& "Integrated Security=SSPI;"
End Function
End Class

Recuperacin y modificacin de datos en ADO.NET
La principal funcin de cualquier aplicacin de base de datos es conectarse a un origen de datos y recuperar
los datos que contiene. Los proveedores de datos de .NET Framework para ADO.NET sirven como puente
entre una aplicacin y un origen de datos, permitindole ejecutar comandos y recuperar datos mediante
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 233 | P g i n a

un DataReader o un DataAdapter. Una funcin clave de cualquier aplicacin de base de datos es la
capacidad de actualizar los datos almacenados en la misma. En ADO.NET, los datos se actualizan mediante
los objetos DataAdapter, DataSet y Command y tambin mediante transacciones.

Conectar con un origen de datos (ADO.NET)
En ADO.NET se utiliza un objeto Connection para conectar con un determinado origen de datos mediante
una cadena de conexin en la que se proporciona la informacin de autenticacin necesaria. El
objetoConnection utilizado depende del tipo de origen de datos.
Cada proveedor de datos de .NET Framework incluido en .NET Framework cuenta con un objeto
DbConnection: el proveedor de datos de .NET Framework para OLE DB incluye un objeto OleDbConnection,
el proveedor de datos de .NET Framework para SQL Server incluye un objeto SqlConnection, el proveedor de
datos de .NET Framework para ODBC incluye un objeto OdbcConnection y el proveedor de datos de .NET
Framework para Oracle incluye un objeto OracleConnection.

Establecer la conexin (ADO.NET)
Para conectarse a Microsoft SQL Server 7.0 o posterior, utilice el objeto SqlConnection del proveedor de
datos de .NET Framework para SQL Server. Para conectarse a un origen de datos OLE DB o a Microsoft SQL
Server 6.xo una versin anterior, utilice el objeto OleDbConnectiondel proveedor de datos de .NET
Framework para OLE DB. Para conectarse a un origen de datos ODBC, utilice el objeto OdbcConnection del
proveedor de datos de .NET Framework para ODBC. Para conectarse a un origen de datos Oracle, utilice el
objeto OracleConnection del proveedor de datos de .NET Framework para ODBC.

Cierre de conexiones
Recomendamos cerrar siempre la conexin cuando termine de utilizarla, para que la conexin pueda
regresar al grupo. El bloque Using de Visual Basic o C# elimina automticamente la conexin cuando el
cdigo sale del bloque, incluso en el caso de una excepcin no controlada.
Tambin puede utilizar los mtodos Close o Dispose del objeto de conexin correspondiente al proveedor
que est utilizando. Es posible que las conexiones que no se cierran explcitamente no se puedan agregar ni
puedan regresar al grupo. Por ejemplo, una conexin que se ha salido del mbito pero que no se ha cerrado
explcitamente slo se devolver al grupo de conexin si se ha alcanzado el tamao mximo del grupo y la
conexin an es vlida.

Nota:
No llame a Close o a Dispose en un objeto Connection, un objeto DataReadero cualquier otro objeto
administrado en el mtodo Finalize de la clase. En un finalizador, libere slo los recursos no
administrados que pertenezcan directamente a su clase. Si la clase no dispone de recursos no
administrados, no incluya un mtodo Finalize en la definicin de clase.

Conexin a SQL Server
El proveedor de datos de .NET Framework para SQL Server admite un formato de cadena de conexin que es
similar al de OLE DB (ADO). Para consultar los nombres y valores vlidos de formato de cadena, vea la
propiedad ConnectionString del objeto SqlConnection. Tambin puede usar la
clase SqlConnectionStringBuilder para crear cadenas de conexin sintcticamente vlidas en tiempo de
ejecucin.
El siguiente cdigo de ejemplo demuestra cmo crear y abrir una conexin a una base de datos SQL Server
7.0 o posterior.

' Assumes connectionString is a valid connection string.
Using connection As New SqlConnection(connectionString)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 234 | P g i n a

connection.Open()
' Do work here.
End Using

Cadenas de conexin (ADO.NET)
.NET Framework 2.0 incorpor nuevas capacidades para trabajar con cadenas de conexin, incluida la
introduccin de nuevas palabras clave en las clases generadoras de cadenas de conexin, que facilitan la
creacin de cadenas de conexin vlidas en tiempo de ejecucin.
Una cadena de conexin contiene informacin de inicializacin que se transfiere como un parmetro desde
un proveedor de datos a un origen de datos. La sintaxis depende del proveedor de datos y la cadena de
conexin se analiza durante el intento para abrir una conexin. Los errores de sintaxis generan una
excepcin en tiempo de ejecucin, pero otros errores slo se producen despus de que el origen de datos
recibe la informacin de conexin. Una vez validada la cadena de conexin, el origen de datos aplica las
opciones especificadas en ella y abre la conexin.
El formato de una cadena de conexin es una lista de pares de parmetros de clave y valor delimitados por
punto y coma.
keyword1=value; keyword2=value;
Las palabras clave no distinguen entre maysculas y minsculas y los espacios entre los pares de clave-valor
se omiten. Sin embargo, los valores pueden distinguir entre maysculas y minsculas, en funcin del origen
de datos. Los valores que contengan un punto y coma, caracteres de comilla sencilla o caracteres de comilla
doble deben colocarse entre comillas dobles.
La sintaxis vlida de cadena de conexin depende del proveedor y ha evolucionado a lo largo de los aos
desde las primeras API como ODBC. El proveedor de datos de .NET Framework para SQL Server (SqlClient)
incorpora muchos elementos de la sintaxis antigua y, por lo general, es ms flexible con la sintaxis comn de
cadena de conexin. Con frecuencia existen sinnimos igualmente vlidos para los elementos de sintaxis de
la cadena de conexin, pero algunos errores de sintaxis y ortografa pueden generar problemas. Por
ejemplo, "Integrated Security=true" es vlido, en tanto que "IntegratedSecurity=true" genera un error.
Adems, las cadenas de conexin construidas en tiempo de ejecucin a partir de entrada de usuario no
validada pueden dar lugar a ataques de inyeccin de cadenas, lo que pone en peligro la seguridad en el
origen de datos.
Para solucionar estos problemas, ADO.NET 2.0 incorpor nuevos generadores de cadenas de conexin para
cada proveedor de datos de .NET Framework. Las palabras clave se exponen como propiedades, lo que
permite validar la sintaxis de la cadena de conexin antes de su envo al origen de datos.

Generar cadenas de conexin a partir de archivos de configuracin
Si determinados elementos de una cadena de conexin se conocen de antemano, se pueden almacenar en
un archivo de configuracin y recuperar en tiempo de ejecucin para construir una cadena de conexin
completa. Por ejemplo, se puede conocer por adelantado el nombre de la base de datos, pero no el del
servidor. Tambin es posible que desee que un usuario indique un nombre y una contrasea en tiempo de
ejecucin sin que pueda inyectar otros valores en ella.
Uno de los constructores sobrecargados de un generador de cadenas de conexin toma String como
argumento, lo que permite proporcionar una cadena de conexin parcial que se puede completar despus
con los datos introducidos por el usuario. La cadena de conexin parcial se puede almacenar en un archivo
de configuracin y recuperarse en tiempo de ejecucin.

Nota:
El espacio de nombres System.Configuration permite el acceso mediante programacin a archivos de
configuracin que usanWebConfigurationManager en aplicaciones web yConfigurationManager en
aplicaciones para Windows.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 235 | P g i n a


Ejemplo
En este ejemplo se muestra la recuperacin de una cadena de conexin incluida en un archivo de
configuracin y cmo se completa mediante el establecimiento de las
propiedades DataSource, UserID y Password deSqlConnectionStringBuilder. El archivo de configuracin se
define de la siguiente forma.

<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="System.Data.SqlClient" />
</connectionStrings>

Nota:
Para ejecutar el cdigo, debe establecer una referencia al archivo System.Configuration.dll del proyecto.

Private Sub BuildConnectionString(ByVal dataSource As String, _
ByVal userName As String, ByVal userPassword As String)

' Retrieve the partial connection string named databaseConnection
' from the application's app.config or web.config file.
Dim settings As ConnectionStringSettings = _
ConfigurationManager.ConnectionStrings("partialConnectString")

If Not settings Is Nothing Then
' Retrieve the partial connection string.
Dim connectString As String = settings.ConnectionString
Console.WriteLine("Original: {0}", connectString)

' Create a new SqlConnectionStringBuilder based on the
' partial connection string retrieved from the config file.
Dim builder As New SqlConnectionStringBuilder(connectString)

' Supply the additional values.
builder.DataSource = dataSource
builder.UserID = userName
builder.Password = userPassword

Console.WriteLine("Modified: {0}", builder.ConnectionString)
End If
End Sub

Cadenas de conexin SqlClient
La sintaxis de una cadena de conexin de SqlConnection se documenta en la propiedad ConnectionString.
Puede usar la propiedad ConnectionString para obtener o establecer una cadena de conexin para una base
de datos SQL Server 7.0 o posterior. Si necesita conectarse a una versin anterior de SQL Server, debe usar
el proveedor de datos de .NET Framework para OleDb (System.Data.OleDb). La mayora de las palabras clave
de cadenas de conexin se corresponden tambin con las propiedades de SqlConnectionStringBuilder.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 236 | P g i n a

En cada una de las siguientes formas de sintaxis se utilizar autenticacin de Windows para conectarse a la
base de datos AdventureWorks en un servidor local.

"Persist Security Info=False;Integrated Security=true;
Initial Catalog=AdventureWorks;Server=MSSQL1"
"Persist Security Info=False;Integrated Security=SSPI;
database=AdventureWorks;server=(local)"
"Persist Security Info=False;Trusted_Connection=True;
database=AdventureWorks;server=(local)"

Inicios de sesin de SQL Server
Es preferible utilizar la autenticacin de Windows para conectarse a SQL Server. No obstante, si se requiere
autenticacin de SQL Server, deber utilizar la siguiente sintaxis para especificar un nombre de usuario y una
contrasea. En este ejemplo, los asteriscos representan un nombre de usuario y una contrasea vlidos.

"Persist Security Info=False; User ID=***;Password=***; Initial Catalog=AdventureWorks;
Server=MySqlServer"

Nota de seguridad:
La configuracin predeterminada de la palabra clavePersistSecurity Info es false. Si se establece
en true o yes, permite obtener informacin de seguridad confidencial de la conexin, incluidos el
identificador de usuario y la contrasea, una vez abierta la conexin. Mantenga el valor PersistSecurity
Infoestablecido en false para garantizar que los orgenes que no sean de confianza no puedan tener acceso
a informacin confidencial de la cadena de conexin.

Para conectarse a una instancia con nombre de SQL Server, utilice la sintaxisnombre de servidor\nombre de
instancia.

Data Source=MySqlServer\MSSQL1;"

Comandos y parmetros (ADO.NET)
Una vez establecida una conexin a un origen de datos, puede ejecutar comandos y devolver resultados
desde el mismo mediante un objeto DbCommand. Para crear un comando, puede utilizar uno de los
constructores de comando del proveedor de datos de .NET Framework con el que est trabajando. Los
constructores pueden aceptar argumentos opcionales, como una instruccin SQL para ejecutar en el origen
de datos, un objeto DbConnection o un objetoDbTransaction. Tambin puede configurar dichos objetos
como propiedades del comando. Tambin puede crear un comando para una determinada conexin
mediante el mtodo CreateCommand de un objeto DbConnection. La instruccin SQL que ejecuta el
comando se puede configurar mediante la propiedadCommandText.
Cada proveedor de datos de .NET Framework incluido en .NET Framework cuenta con un objeto Command:
El proveedor de datos de .NET Framework para OLE DB incluye un objeto OleDbCommand, el proveedor de
datos de .NET Framework para SQL Server incluye un objeto SqlCommand, el proveedor de datos de .NET
Framework para ODBC incluye un objeto OdbcCommand y el proveedor de datos de .NET Framework para
Oracle incluye un objeto OracleCommand.

Ejecutar un comando (ADO.NET)
Cada proveedor de datos de .NET Framework incluido en .NET Framework dispone de su propio objeto
command que hereda de DbCommand. El proveedor de datos de .NET Framework para OLE DB incluye un
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 237 | P g i n a

objetoOleDbCommand, el proveedor de datos de .NET Framework para SQL Server incluye un
objeto SqlCommand, el proveedor de datos de .NET Framework para ODBC incluye un
objeto OdbcCommand y el proveedor de datos de .NET Framework para Oracle incluye un
objeto OracleCommand. Cada uno de estos objetos expone mtodos para ejecutar comandos que se basan
en el tipo de comando y el valor devuelto deseado, tal como se describe en la tabla siguiente.

Comando Valor devuelto
ExecuteReader Devuelve un objeto DataReader.
ExecuteScalar Devuelve un solo valor escalar.
ExecuteNonQuery Ejecuta un comando que no devuelve ninguna fila.
ExecuteXMLReader Devuelve un valor XmlReader. Slo est disponible para un objeto SqlCommand.

Cada objeto command con establecimiento inflexible de tipos admite tambin una
enumeracin CommandType que especifica cmo se interpreta una cadena de comando, tal como se
describe en la tabla siguiente.

CommandType Descripcin
Text Comando de SQL que define las instrucciones que se van a ejecutar en el origen de
datos.
StoredProcedure Nombre del procedimiento almacenado. Puede usar la propiedad Parameters de un
comando para tener acceso a los parmetros de entrada y de salida y a los valores
devueltos, independientemente del mtodo Execute al que se llame. Al
usar ExecuteReader, no es posible el acceso a los valores devueltos y los parmetros
de salida hasta que se cierraDataReader.
TableDirect Nombre de una tabla.

Ejemplo
En el ejemplo de cdigo siguiente se muestra cmo se crea un objetoSqlCommand para ejecutar un
procedimiento almacenado mediante el establecimiento de sus propiedades. Para especificar el parmetro
de entrada del procedimiento almacenado se usa un objeto SqlParameter. El comando se ejecuta con el
mtodo ExecuteReader y el resultado de SqlDataReader se muestra en la ventana de consola.

Shared Sub GetSalesByCategory(ByVal connectionString As String, _
ByVal categoryName As String)

Using connection As New SqlConnection(connectionString)

' Create the command and set its properties.
Dim command As SqlCommand = New SqlCommand()
command.Connection = connection
command.CommandText = "SalesByCategory"
command.CommandType = CommandType.StoredProcedure

' Add the input parameter and set its properties.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 238 | P g i n a

Dim parameter As New SqlParameter()
parameter.ParameterName = "@CategoryName"
parameter.SqlDbType = SqlDbType.NVarChar
parameter.Direction = ParameterDirection.Input
parameter.Value = categoryName

' Add the parameter to the Parameters collection.
command.Parameters.Add(parameter)

' Open the connection and execute the reader.
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()

If reader.HasRows Then
Do While reader.Read()
Console.WriteLine("{0}: {1:C}", _
reader(0), reader(1))
Loop
Else
Console.WriteLine("No rows returned.")
End If
End Using
End Sub

Configurar parmetros y tipos de datos de parmetros (ADO.NET)
Los objetos de comando usan parmetros para pasar valores a instrucciones SQL o procedimientos
almacenados que permiten realizar operaciones de comprobacin de tipos y validacin. A diferencia del
texto de comando, la entrada de parmetros se trata como un valor literal, y no como cdigo ejecutable. De
esta forma, se protege contra ataques por "inyeccin de cdigo SQL", en los que un atacante inserta un
comando que pone en peligro la seguridad del servidor en una instruccin SQL.
Los comandos parametrizados tambin pueden mejorar el rendimiento de ejecucin de la consulta, ya que
ayudan al servidor de base de datos a que haga coincidir precisamente el comando entrante con un plan de
consulta almacenado en cach adecuado. Adems de las ventajas en la seguridad y el rendimiento, los
comandos con parmetros proporcionan un mtodo prctico para organizar los valores que se pasan a un
origen de datos.
Para crear un objeto DbParameter, se puede usar su constructor o bien se puede agregar
a DbParameterCollection mediante una llamada al mtodo Add de la coleccin DbParameterCollection. El
mtodo Add acepta como entrada argumentos del constructor o cualquier objeto de parmetro ya
existente, en funcin del proveedor de datos.

Proporcionar la propiedad ParameterDirection
Cuando se agregan parmetros distintos de los parmetros de entrada, se debe proporcionar una
propiedad ParameterDirection. En la tabla siguiente se muestran los valores de ParameterDirection que se
pueden usar con la enumeracin ParameterDirection.

Nombre del
miembro
Descripcin
Input Se trata de un parmetro de entrada. ste es el valor predeterminado.
InputOutput El parmetro se puede comportar tanto de entrada como de salida.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 239 | P g i n a

Output Se trata de un parmetro de salida.
ReturnValue El parmetro representa un valor devuelto de una operacin como, por ejemplo, un
procedimiento almacenado, una funcin integrada o una funcin definida por el
usuario.

Trabajar con marcadores de posicin de parmetros
La sintaxis de los marcadores de posicin de parmetros vara en funcin del origen de datos. Los
proveedores de datos de .NET Framework administran la asignacin de nombres y la especificacin de
parmetros y de marcadores de posicin de parmetros de forma diferente. Esta sintaxis se personaliza para
un origen de datos especfico, como se describe en la tabla siguiente.

Proveedor de datos Sintaxis de denominacin de parmetros
System.Data.SqlClient Usa parmetros con nombre con el formato @nombreDeParmetro.
System.Data.OleDb Usa marcadores de parmetro de posicin, indicados con un signo de
interrogacin (?).
System.Data.Odbc Usa marcadores de parmetro de posicin, indicados con un signo de
interrogacin (?).
System.Data.OracleClient Usa parmetros con nombre, con el formato :nombreDeParmetro
(onombreDeParmetro).

Especificar tipos de datos de parmetro
El tipo de datos de un parmetro es especfico del proveedor de datos de .NET Framework. Al especificar el
tipo, el valor de Parameter se convierte en el tipo del proveedor de datos de .NET Framework antes de
pasar el valor al origen de datos. Si lo desea, puede especificar el tipo de un objeto Parameter de forma
genrica estableciendo la propiedad DbType del objeto Parameter en un DbType determinado.
El tipo del proveedor de datos de .NET Framework de un objeto Parameter se deduce del tipo de .NET
Framework del Value del objeto Parameter, o delDbType del objeto Parameter. En la siguiente tabla se
muestra el tipo deducido de Parameter en funcin del objeto que se ha pasado como valorParameter o
del DbType especificado.

Tipo de .NET
Framework
DbType SqlDbType
bool Boolean Bit
byte Byte TinyInt
byte[] Binary VarBinary. Esta conversin implcita generar un error en el caso
de que la matriz de bytes tenga un tamao superior al tamao
mximo de un tipo VarBinary, que es de 8.000 bytes. En matrices
de bytes con ms de 8.000 bytes, establezca de forma explcita el
tipoSqlDbType.
char No se admite la deduccin de un tipoSqlDbType a partir de char.
DateTime DateTime DateTime
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 240 | P g i n a

Tipo de .NET
Framework
DbType SqlDbType
DateTimeOff
set
DateTimeOffset DateTimeOffset en SQL Server 2008. La deduccin de un
elementoSqlDbType a partir de DateTimeOffset no se admite en
versiones de SQL Server anteriores a SQL Server 2008.
Decimal Decimal Decimal
double Double Float
float Single Real
Guid Guid UniqueIdentifier
Int16 Int16 SmallInt
Int32 Int32 Int
Int64 Int64 BigInt
object Object Variant
string String NVarChar. Esta conversin implcita generar un error en el caso
de que la cadena tenga un tamao superior al tamao mximo de
un tipo NVarChar, que es de 4.000 caracteres. En cadenas con ms
de 4.000 caracteres, establezca de forma explcita el
tipoSqlDbType.
Timespan Time Time en SQL Server 2008. La deduccin de un
elementoSqlDbType a partir de TimeSpan no se admite en
versiones de SQL Server anteriores a SQL Server 2008.
UInt16 UInt16 No se admite la deduccin de un elementoSqlDbType a partir de
UInt16.
UInt32 UInt32 No se admite la deduccin de un tipoSqlDbType a partir de UInt32.
UInt64 UInt64 No se admite la deduccin de un tipoSqlDbType a partir de UInt64.
AnsiString VarChar
AnsiStringFixedLength Char
Currency Money
Date Date en SQL Server 2008. La deduccin de un
elementoSqlDbType a partir de Date no se admite en versiones de
SQL Server anteriores a SQL Server 2008.
SByte No se admite la deduccin de un elementoSqlDbType a partir de
SByte.
StringFixedLength NChar
Time Time en SQL Server 2008. La deduccin de un
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 241 | P g i n a

Tipo de .NET
Framework
DbType SqlDbType
elementoSqlDbType a partir de Time no se admite en versiones de
SQL Server anteriores a SQL Server 2008.
VarNumeric No se admite la deduccin de un elementoSqlDbType a partir de
VarNumeric.

Nota:
Las conversiones de valores de tipo decimal en otros tipos de valor son conversiones de restriccin que
redondean el valor decimal al valor entero ms prximo a cero. Si el resultado de la conversin no puede
representarse en el tipo de destino, se produce OverflowException.
Cuando se enva un valor de parmetro null al servidor, se debe especificar DBNull en lugar
de null (Nothing en Visual Basic). El valor nulo en el sistema es un objeto vaco que no tiene ningn valor.
Para representar los valores nulos, se usa DBNull.

Derivar la informacin de parmetros
Los parmetros tambin se pueden derivar de un procedimiento almacenado mediante la
clase DbCommandBuilder. Las clases SqlCommandBuilder yOleDbCommandBuilder proporcionan un
mtodo esttico,DeriveParameters, que rellena automticamente la coleccin de parmetros de un objeto
de comando que usa informacin de parmetros procedente de un procedimiento almacenado. Tenga en
cuenta que DeriveParameterssobrescribir toda la informacin de parmetros existente en el comando.

Nota:
La derivacin de informacin de parmetros afecta al rendimiento, ya que precisa un viaje adicional de
ida y vuelta (round trip) al origen de datos para recuperar la informacin. Si la informacin de los
parmetros se conoce en tiempo de diseo, se puede mejorar el rendimiento de la aplicacin si se
establecen los parmetros con los valores correspondientes de forma explcita.

Usar parmetros con SqlCommand y con un procedimiento almacenado
Los procedimientos almacenados ofrecen numerosas ventajas en el caso de aplicaciones que procesan
datos. Mediante el uso de procedimientos almacenados, las operaciones de bases de datos se pueden
encapsular en un solo comando, optimizar para lograr el mejor rendimiento, y mejorar con seguridad
adicional. Aunque se pueda llamar a un procedimiento almacenado mediante el paso del nombre del
procedimiento almacenado seguido de los argumentos de los parmetros como instruccin SQL, mediante
el uso de la coleccin de Parameters del objeto ADO.NET DbCommand puede definir ms explcitamente los
parmetros del procedimiento almacenado y tener acceso a los parmetros de salida y a los valores
devueltos.

Nota:
Las instrucciones con parmetros se ejecutan en el servidor utilizando sp_executesql,; esto permite
volver a utilizar el plan de consultas. Los cursores o las variables locales del lote desp_executesql no son
visibles para el lote que llama asp_executesql. Los cambios en el contexto de base de datos slo se
mantienen hasta el final de la instruccin sp_executesql.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 242 | P g i n a


Cuando se usan parmetros con SqlCommand para ejecutar un procedimiento almacenado de SQL Server,
los nombres de los parmetros agregados a la coleccin Parameters deben coincidir con los nombres de los
marcadores de parmetro del procedimiento almacenado. El proveedor de datos de .NET Framework para
SQL Server no admite el uso del marcador de posicin de signo de interrogacin de cierre (?) para pasar
parmetros a una instruccin SQL o a un procedimiento almacenado. Este proveedor trata los parmetros
del procedimiento almacenado como parmetros con nombre y busca marcadores de parmetros
coincidentes. Por ejemplo, el procedimiento almacenadoCustOrderHist se define usando un parmetro
denominado @CustomerID. Cuando el cdigo ejecuta el procedimiento almacenado, tambin debe usar un
parmetro denominado @CustomerID.

Shared Sub GetSalesByCategory(ByVal connectionString As String, _
ByVal categoryName As String)

Using connection As New SqlConnection(connectionString)

' Create the command and set its properties.
Dim command As SqlCommand = New SqlCommand()
command.Connection = connection
command.CommandText = "SalesByCategory"
command.CommandType = CommandType.StoredProcedure

' Add the input parameter and set its properties.
Dim parameter As New SqlParameter()
parameter.ParameterName = "@CategoryName"
parameter.SqlDbType = SqlDbType.NVarChar
parameter.Direction = ParameterDirection.Input
parameter.Value = categoryName

' Add the parameter to the Parameters collection.
command.Parameters.Add(parameter)

' Open the connection and execute the reader.
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()

If reader.HasRows Then
Do While reader.Read()
Console.WriteLine("{0}: {1:C}", _
reader(0), reader(1))
Loop
Else
Console.WriteLine("No rows returned.")
End If
End Using
End Sub

Modificar datos con procedimientos almacenados (ADO.NET)
Los procedimientos almacenados pueden aceptar datos como parmetros de entrada y pueden devolver
datos como parmetros de salida, conjuntos de resultados o valores de retorno. En el ejemplo siguiente se
muestra cmo ADO.NET enva y recibe parmetros de entrada, parmetros de salida y valores de retorno. El
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 243 | P g i n a

ejemplo inserta un nuevo registro en una tabla cuya columna de clave principal es una columna de identidad
en una base de datos de SQL Server.

Nota:
Si est utilizando procedimientos almacenados de SQL Server para editar o eliminar datos
con SqlDataAdapter, asegrese de que no utiliza SET NOCOUNT ON en la definicin del procedimiento
almacenado. Esto hace que el recuento de filas afectadas vuelva a cero, lo que DataAdapter interpreta
como un conflicto de concurrencia. En este caso, se iniciar una DBConcurrencyException.

Ejemplo
En el ejemplo se utiliza el siguiente procedimiento almacenado para insertar una nueva categora en la
tabla Categories de Northwind. El procedimiento almacenado recibe el valor de la
columna CategoryName como parmetro de entrada y usa la funcin SCOPE_IDENTITY() para recuperar el
nuevo valor del campo de identidad, CategoryID, y devolverlo en un parmetro de salida. La instruccin

RETURN utiliza la funcin @@ROWCOUNT para devolver el nmero de filas insertadas.
CREATE PROCEDURE dbo.InsertCategory
@CategoryName nvarchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()
RETURN @@ROWCOUNT

Obtener un nico valor de una base de datos (ADO.NET)
En ocasiones se debe devolver informacin de bases de datos consistente en un nico valor, en lugar de una
tabla o una secuencia de datos. Por ejemplo, puede que desee devolver el resultado de una funcin de
agregada como COUNT(*), SUM(Price) o AVG(Quantity). El objeto Command permite devolver valores
nicos mediante el mtodo ExecuteScalar. El mtodo ExecuteScalar devuelve como valor escalar el valor
correspondiente a la primera columna de la primera fila del conjunto de resultados.
El ejemplo de cdigo siguiente inserta un valor nuevo en la base de datos utilizando SqlCommand. El
mtodo ExecuteScalar se utiliza para devolver el valor de columna de identidad para el registro insertado.

Public Function AddProductCategory( _
ByVal newName As String, ByVal connString As String) As Integer
Dim newProdID As Int32 = 0
Dim sql As String = _
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " _
& "SELECT CAST(scope_identity() AS int);"

Using conn As New SqlConnection(connString)
Dim cmd As New SqlCommand(sql, conn)
cmd.Parameters.Add("@Name", SqlDbType.VarChar)
cmd.Parameters("@Name").Value = newName
Try
conn.Open()
newProdID = Convert.ToInt32(cmd.ExecuteScalar())
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 244 | P g i n a

End Using

Return newProdID
End Function

Actualizar datos en un origen de datos (ADO.NET)
Las instrucciones SQL que modifican datos (por ejemplo INSERT, UPDATE o DELETE) no devuelven ninguna
fila. De la misma forma, muchos procedimientos almacenados realizan alguna accin pero no devuelven
filas. Para ejecutar comandos que no devuelvan filas, cree un objeto Command con el comando SQL
adecuado y una Connection, incluidos los Parameters necesarios. El comando se debe ejecutar con el
mtodo ExecuteNonQuery del objeto Command.
El mtodo ExecuteNonQuery devuelve un entero que representa el nmero de filas que se ven afectadas
por la instruccin o por el procedimiento almacenado que se haya ejecutado. Si se ejecutan varias
instrucciones, el valor devuelto es la suma de los registros afectados por todas las instrucciones ejecutadas.

Ejemplo
En el ejemplo de cdigo siguiente se ejecuta una instruccin INSERT para insertar un registro en una base de
datos mediante el mtodo ExecuteNonQuery.

' Assumes connection is a valid SqlConnection.
connection.Open()

Dim queryString As String = "INSERT INTO Customers " & _
"(CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')"

Dim command As SqlCommand = New SqlCommand(queryString, connection)
Dim recordsAffected As Int32 = command.ExecuteNonQuery()

En el ejemplo de cdigo siguiente se ejecuta el procedimiento almacenado que se cre con el ejemplo de
cdigo de la seccin Realizar operaciones de catlogo. El procedimiento almacenado no devuelve ninguna
fila, por lo que se utiliza el mtodo ExecuteNonQuery, aunque el procedimiento almacenado reciba un
parmetro de entrada y devuelva un parmetro de salida y un valor devuelto.
En el caso del objeto OleDbCommand, se debe agregar en primer lugar el parmetro ReturnValue a la
coleccin Parameters.

' Assumes connection is a valid SqlConnection.
Dim command As SqlCommand = _
New SqlCommand("InsertCategory" , connection)
command.CommandType = CommandType.StoredProcedure

Dim parameter As SqlParameter = _
command.Parameters.Add("@RowCount", SqlDbType.Int)
parameter.Direction = ParameterDirection.ReturnValue

parameter = command.Parameters.Add( _
"@CategoryName", SqlDbType.NChar, 15)

parameter = command.Parameters.Add("@Identity", SqlDbType.Int)
parameter.Direction = ParameterDirection.Output

command.Parameters("@CategoryName").Value = "New Category"
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 245 | P g i n a

command.ExecuteNonQuery()

Dim categoryID As Int32 = CInt(command.Parameters("@Identity").Value)
Dim rowCount As Int32 = CInt(command.Parameters("@RowCount").Value)

Realizar operaciones de catlogo (ADO.NET)
Para ejecutar un comando que modifique una base de datos o un catlogo, por ejemplo una instruccin
CREATE TABLE o CREATE PROCEDURE, debe crear un objeto Command mediante las instrucciones SQL
adecuadas y un objetoConnection. El comando se debe ejecutar con el mtodo ExecuteNonQuery del
objeto Command.
En el ejemplo de cdigo siguiente se crea un procedimiento almacenado en una base de datos de Microsoft
SQL Server.

' Assumes connection is a valid SqlConnection.
Dim queryString As String = "CREATE PROCEDURE InsertCategory " & _
"@CategoryName nchar(15), " & _
"@Identity int OUT " & _
"AS " & _
"INSERT INTO Categories (CategoryName) VALUES(@CategoryName) " & _
"SET @Identity = @@Identity " & _
"RETURN @@ROWCOUNT"

Dim command As SqlCommand = New SqlCommand(queryString, connection)
command.ExecuteNonQuery()

Recuperar datos mediante DataReader (ADO.NET)
La recuperacin de datos mediante DataReaderimplica crear una instancia del objeto Command y de
un DataReader a continuacin, para lo cual se llama a Command.ExecuteReader a fin de recuperar filas de
un origen de datos. En el ejemplo siguiente se muestra cmo se utiliza un DataReader,
donde reader representa un DataReader vlido ycommand representa un objeto Command vlido.
reader = command.ExecuteReader();
Puede utilizar el mtodo Read del objeto DataReader para obtener una fila a partir de los resultados de una
consulta. Para tener acceso a cada columna de la fila devuelta, puede pasar a DataReader el nombre o
referencia numrica de la columna en cuestin. Sin embargo, el mejor rendimiento se logra con los mtodos
que ofrece DataReader y que permiten tener acceso a los valores de las columnas en sus tipos de datos
nativos (GetDateTime,GetDouble, GetGuid, GetInt32, etc). Para obtener una lista de mtodos de descriptor
de acceso con tipo para DataReaders de proveedores de datos especficos, vea las secciones
OleDbDataReader y SqlDataReader. Si se utilizan los mtodos de descriptor de acceso con tipo, dando por
supuesto que se conoce el tipo de datos subyacentes, se reduce el nmero de conversiones de tipo
necesarias para recuperar el valor de una columna.

Nota:
En la versin de .NET Framework de Windows Server 2003 se incluye una propiedad adicional para
el DataReader, HasRows, que permite determinar si el DataReader ha devuelto algn resultado antes de
realizar una lectura del mismo.

En el ejemplo de cdigo siguiente se repite por un objeto DataReader y se devuelven dos columnas de cada
fila.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 246 | P g i n a

Private Sub HasRows(ByVal connection As SqlConnection)
Using connection
Dim command As SqlCommand = New SqlCommand( _
"SELECT CategoryID, CategoryName FROM Categories;", _
connection)
connection.Open()

Dim reader As SqlDataReader = command.ExecuteReader()

If reader.HasRows Then
Do While reader.Read()
Console.WriteLine(reader.GetInt32(0) _
& vbTab & reader.GetString(1))
Loop
Else
Console.WriteLine("No rows found.")
End If

reader.Close()
End Using
End Sub

DataReader proporciona una secuencia de datos sin bfer que permite a la lgica de los procedimientos
procesar eficazmente y de forma secuencial los resultados procedentes de un origen de
datos. DataReader es la mejor opcin cuando se trata de recuperar grandes cantidades de datos, ya que
stos no se almacenan en la memoria cach.
Cerrar el DataReader
Siempre debe llamar al mtodo Close cuando haya terminado de utilizar el objetoDataReader.
Si Command contiene parmetros de salida o valores devueltos, stos no estarn disponibles hasta que se
cierre el DataReader.
Tenga en cuenta que mientras est abierto un DataReader, ste utiliza de forma exclusiva el
objeto Connection. No se podr ejecutar ningn comando para el objeto Connection hasta que se cierre
el DataReader original, incluida la creacin de otro DataReader.

Nota:
No llame a Close o Dispose para objetos Connection o DataReader ni para ningn otro objeto
administrado en el mtodo Finalize de su clase. En un finalizador, libere slo los recursos no
administrados que pertenezcan directamente a su clase. Si la clase no dispone de recursos no
administrados, no incluya un mtodo Finalize en la definicin de clase.

Recuperar varios conjuntos de resultados con NextResult
En el caso en que se devuelvan varios resultados, el DataReader proporciona el mtodoNextResult para
recorrer los conjuntos de resultados en orden. En el siguiente ejemplo se muestra
el SqlDataReader mientras procesa los resultados de las dos instrucciones SELECT mediante el
mtodo ExecuteReader.

Private Sub RetrieveMultipleResults(ByVal connection As SqlConnection)
Using connection
Dim command As SqlCommand = New SqlCommand( _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 247 | P g i n a

"SELECT CategoryID, CategoryName FROM Categories;" & _
"SELECT EmployeeID, LastName FROM Employees", connection)
connection.Open()

Dim reader As SqlDataReader = command.ExecuteReader()

Do While reader.HasRows
Console.WriteLine(vbTab & reader.GetName(0) _
& vbTab & reader.GetName(1))

Do While reader.Read()
Console.WriteLine(vbTab & reader.GetInt32(0) _
& vbTab & reader.GetString(1))
Loop

reader.NextResult()
Loop
End Using
End Sub

Rellenar un objeto DataSet desde un objeto DataAdapter (ADO.NET)
DataSet de ADO.NET es una representacin residente en memoria de datos que proporciona un modelo de
programacin relacional coherente e independiente del origen de datos. DataSet representa un conjunto
completo de datos que incluye tablas, restricciones y relaciones entre las tablas. Dado que DataSet es
independiente del origen de datos, DataSet puede incluir datos locales de la aplicacin y datos de otros
muchos orgenes. La interaccin con los orgenes de datos existentes se controla mediante el DataAdapter.
La propiedad SelectCommand de DataAdapter es un objeto Command que recupera datos del origen de
datos. Las propiedades InsertCommand, UpdateCommand yDeleteCommand de DataAdapter son
objetos Command que permiten administrar las actualizaciones de los datos en el origen de datos para
reflejar las modificaciones efectuadas en los datos de DataSet. Estas propiedades se describen ms
detalladamente en Actualizar orgenes de datos con DataAdapters (ADO.NET).
El mtodo Fill de DataAdapter se usa para rellenar un objeto DataSet con los resultados del
elemento SelectCommand de DataAdapter. Fill toma como argumentos un elementoDataSet que se debe
rellenar y un objeto DataTable, o su nombre, que se debe rellenar con las filas que
devuelve SelectCommand.

Nota:
El uso de DataAdapter para recuperar la totalidad de una tabla lleva tiempo, en especial si la tabla incluye
un gran nmero de filas. Esto se debe a que el acceso a la base de datos, la localizacin y el procesamiento
de los datos, y la posterior transferencia de los mismos al cliente son procesos largos. La extraccin de la
tabla completa al cliente tambin bloquea todas las filas en el servidor. Para mejorar el rendimiento,
puede usar la clusula WHERE para reducir en gran medida el nmero de filas que se devuelven al cliente.
Tambin puede reducir la cantidad de datos que se devuelven al cliente si enumera de forma explcita las
columnas necesarias en la instruccin SELECT. Otra solucin consiste en recuperar las filas por lotes (por
ejemplo varios cientos de filas de una vez) y recuperar solo el siguiente lote cuando el cliente haya
finalizado con el lote actual.

El mtodo Fill utiliza el objeto DataReader de forma implcita para devolver los nombres y tipos de columna
que se usan para crear las tablas de DataSet, y los datos para rellenar las filas de las tablas en DataSet. Las
tablas y columnas slo se crean cuando no existen; en caso contrario, Fill utiliza el esquema existente
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 248 | P g i n a

de DataSet. Los tipos de columna se crean como tipos de .NET Framework de acuerdo con las tablas que
figuran en Asignar tipos de datos en ADO.NET. No se crean claves principales a menos que existan en el
origen de datos yDataAdapter.MissingSchemaAction se establezca enMissingSchemaAction.AddWithKey.
Si el mtodo Fill encuentra que una tabla tiene una clave principal, sobrescribe los datos de DataSet con los
del origen de datos en las filas donde los valores de columna de clave principal coinciden con los de la fila
que devuelve el origen de datos. Si no se detecta ninguna clave principal, los datos se agregan a las tablas
de DataSet.Fill utiliza las asignaciones que puedan existir cuando se rellene DataSet.

Nota:
Si SelectCommand devuelve los resultados de OUTER JOIN, DataAdapter no establece un
valor PrimaryKey para el objeto DataTable resultante. Debe definir PrimaryKey para asegurarse de que
las filas duplicadas se resuelven correctamente.

En el ejemplo de cdigo siguiente se crea una instancia de SqlDataAdapter que utiliza un objeto
SqlConnection a la base de datos Northwind de Microsoft SQL Server y se rellena un objeto DataTable en
un DataSet con la lista de clientes. La instruccin SQL y los argumentos SqlConnection pasados al
constructor SqlDataAdapter se utilizan para crear la propiedad SelectCommand del SqlDataAdapter.

Ejemplo
' Assumes that connection is a valid SqlConnection object.
Dim queryString As String = _
"SELECT CustomerID, CompanyName FROM dbo.Customers"
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
queryString, connection)

Dim customers As DataSet = New DataSet
adapter.Fill(customers, "Customers")

Nota:
El cdigo que se muestra en este ejemplo no abre ni cierra explcitamente el objeto Connection. El
mtodo Fill abre de forma implcita el objetoConnection que DataAdapter utiliza cuando encuentra que la
conexin no est abierta todava. Si el mtodo Fill ha abierto la conexin, tambin la cierra cuando
termina de utilizarla. Este hecho simplifica el cdigo cuando se trabaja con una operacin nica,
como Fill o Update. Sin embargo, en el caso de que se estn realizando varias operaciones que necesiten
tener abierta una conexin, se puede mejorar el rendimiento de la aplicacin llamando explcitamente al
mtodo Open de Connection, realizando las operaciones en el origen de datos y, finalmente, llamando al
mtodo Close de Connection. Es conveniente mantener abiertas las conexiones con el origen de datos el
menor tiempo posible para liberar recursos, de manera que estn disponibles para otras aplicaciones
cliente.

Parmetros DataAdapter (ADO.NET)
DbDataAdapter tiene cuatro propiedades que se utilizan para recuperar y actualizar datos en el origen de
datos: la propiedad SelectCommand devuelve datos del origen de datos y las propiedades InsertCommand,
UpdateCommand y DeleteCommand se utilizan para administrar los cambios en el origen de datos. La
propiedad SelectCommanddebe establecerse antes de llamar al mtodo Fill de DataAdapter. Las
propiedades InsertCommand, UpdateCommand o DeleteCommand se deben establecer antes llamar al
mtodo Update de DataAdapter, en funcin de las modificaciones realizadas en los datos en DataTable. Por
ejemplo, si se han agregado filas, se debe establecer InsertCommandantes de llamar a Update.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 249 | P g i n a

Cuando Update procesa una fila insertada, actualizada o eliminada,DataAdapter utiliza la propiedad
Command que corresponde a la accin en cuestin. La informacin actual relacionada con la fila modificada
se pasa al objeto Command a travs de la coleccin Parameters.
Cuando actualice una fila en el origen de datos, llame a la instruccin UPDATE que utiliza un identificador
nico para identificar la fila de la tabla que debe actualizarse. El identificador nico suele ser el valor del
campo de clave principal. La instruccin UPDATE utiliza parmetros que contienen el identificador nico y
las columnas y valores que se van a actualizar, como muestra la siguiente instruccin Transact-SQL.

UPDATE Customers SET CompanyName = @CompanyName
WHERE CustomerID = @CustomerID

Nota:
La sintaxis de los marcadores de posicin de parmetros depende del origen de datos. En este ejemplo se
muestran marcadores de posicin para un origen de datos de SQL Server. Utilice signos de interrogacin
de cierre (?) como marcadores de posicin de para los
parmetros System.Data.OleDb ySystem.Data.Odbc.

En este ejemplo de Visual Basic, el campo CompanyName se actualiza con el valor del
parmetro @CompanyName para la fila cuyo CustomerID coincida con el valor del parmetro@CustomerID.
Los parmetros recuperan informacin de la fila modificada mediante la propiedad SourceColumn del
objeto SqlParameter. A continuacin se muestran los parmetros del ejemplo anterior de la instruccin
UPDATE. En el cdigo se parte de que el adapter de la variable representa a un
objeto SqlDataAdapter vlido.

adapter.Parameters.Add( _
"@CompanyName", SqlDbType.NChar, 15, "CompanyName")
Dim parameter As SqlParameter = _
adapter.UpdateCommand.Parameters.Add("@CustomerID", _
SqlDbType.NChar, 5, "CustomerID")
parameter.SourceVersion = DataRowVersion.Original

El mtodo Add de la coleccin Parameters toma el nombre del parmetro, el tipo de datos, el tamao (si
corresponde al tipo) y el nombre de la propiedad SourceColumn de DataTable. Tenga en cuenta
que SourceVersion del parmetro @CustomerID se establece en Original. De esta forma se garantiza que la
fila existente en el origen de datos se actualice cuando el valor de la columna o columnas identificadas haya
cambiado en la fila DataRow modificada. En ese caso, el valor de la fila Original coincidira con el valor actual
en el origen de datos y el valor de la fila Current contendra el valor actualizado. No se asigna ningn valor
a SourceVersionpara el parmetro @CompanyName, por lo que se utiliza el valor predeterminado, el de la
filaCurrent.

Nota:
En las operaciones Fill de DataAdapter y los mtodos Get de DataReader, el tipo .NET Framework se
deduce del tipo devuelto desde el proveedor de datos de .NET Framework.

Parameter.SourceColumn, Parameter.SourceVersion
SourceColumn y SourceVersion se pueden pasar como argumentos al constructorParameter, o tambin se
pueden establecer como propiedades de un Parameter existente.SourceColumn es el nombre
de DataColumn de DataRow en la que se recupera el valor deParameter . SourceVersion especifica la
versin de DataRow que utiliza DataAdapterpara recuperar el valor.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 250 | P g i n a

En la tabla siguiente se muestran los valores de la enumeracin DataRowVersion disponibles para su uso
con SourceVersion.

Enumeracin
DataRowVersion Descripcin
Current El parmetro utiliza el valor actual de la columna. ste es el valor predeterminado.
Default El parmetro utiliza el DefaultValue de la columna.
Original El parmetro utiliza el valor original de la columna.
Proposed El parmetro utiliza un valor propuesto.

En el ejemplo de cdigo de SqlClient de la siguiente seccin se define un parmetro
paraUpdateCommand donde la columna CustomerID se utiliza como SourceColumn para dos parmetros:
@CustomerID (SET CustomerID = @CustomerID) y @OldCustomerID (WHERE CustomerID =
@OldCustomerID). El parmetro @CustomerID se utiliza para actualizar la columna CustomerID de forma
que tenga el valor actual de DataRow. Como resultado, se usa CustomerID SourceColumn con
SourceVersion de Current. El parmetro@OldCustomerID se utiliza para identificar la fila actual en el origen
de datos. Dado que el valor de la columna coincidente se encuentra en la versin Original de la fila, tambin
se usa el mismo objeto SourceColumn (CustomerID) con SourceVersion de Original.

Trabajar con parmetros SqlClient
En el ejemplo siguiente se muestra cmo crear SqlDataAdapter y establecer MissingSchemaAction en
AddWithKey para recuperar informacin de esquema adicional de la base de datos. Las propiedades
SelectCommand, InsertCommand, UpdateCommand yDeleteCommand establecen sus correspondientes
objetos SqlParameter agregados a la coleccin Parameters . El mtodo devuelve un objeto SqlDataAdapter.

Public Function CreateSqlDataAdapter( _
ByVal connection As SqlConnection) As SqlDataAdapter

Dim adapter As SqlDataAdapter = New SqlDataAdapter
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

' Create the commands.
adapter.SelectCommand = New SqlCommand( _
"SELECT CustomerID, CompanyName FROM CUSTOMERS", connection)
adapter.InsertCommand = New SqlCommand( _
"INSERT INTO Customers (CustomerID, CompanyName) " & _
"VALUES (@CustomerID, @CompanyName)", connection)
adapter.UpdateCommand = New SqlCommand( _
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = " & _
"@CompanyName WHERE CustomerID = @oldCustomerID", connection)
adapter.DeleteCommand = New SqlCommand( _
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection)

' Create the parameters.
adapter.InsertCommand.Parameters.Add("@CustomerID", _
SqlDbType.Char, 5, "CustomerID")
adapter.InsertCommand.Parameters.Add("@CompanyName", _
SqlDbType.VarChar, 40, "CompanyName")
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 251 | P g i n a


adapter.UpdateCommand.Parameters.Add("@CustomerID", _
SqlDbType.Char, 5, "CustomerID")
adapter.UpdateCommand.Parameters.Add("@CompanyName", _
SqlDbType.VarChar, 40, "CompanyName")
adapter.UpdateCommand.Parameters.Add("@oldCustomerID", _
SqlDbType.Char, 5, "CustomerID").SourceVersion = _
DataRowVersion.Original

adapter.DeleteCommand.Parameters.Add("@CustomerID", _
SqlDbType.Char, 5, "CustomerID").SourceVersion = _
DataRowVersion.Original

Return adapter
End Function

Realizar operaciones por lotes mediante DataAdapters (ADO.NET)
La compatibilidad con las operaciones por lotes en ADO.NET permite que un DataAdapter agrupe
operaciones INSERT, UPDATE y DELETE desde unDataSet o una DataTable al servidor, en lugar de enviar las
operaciones de una en una. La reduccin del nmero de viajes de ida y vuelta (round trip) al servidor tiene
como resultado una mejora considerable del rendimiento. Las actualizaciones por lotes son compatibles con
los proveedores de datos de .NET para SQL Server (System.Data.SqlClient) y Oracle
(System.Data.OracleClient).
Al actualizar una base de datos con modificaciones de un DataSet en versiones anteriores de ADO.NET, el
mtodo Update de un DataAdapter realizaba actualizaciones de las filas de la base de datos de una en una.
A medida que recorra las filas de la DataTable especificada, examinaba cada DataRow para ver si se haba
modificado. Si se haba modificado la fila, llamaba al UpdateCommand, InsertCommand o DeleteCommand
apropiado, en funcin del valor de la propiedad RowState de la fila. Cada actualizacin de una fila implicaba
un viaje de ida y vuelta (round trip) a la base de datos.
A partir de ADO.NET 2.0, DbDataAdapter expone una propiedad UpdateBatchSize. Si se establece
el UpdateBatchSize en un valor entero positivo, se producen actualizaciones en la base de datos que se
envan como lotes del tamao especificado. Por ejemplo, si se establece el UpdateBatchSize en 10, se
agrupan 10 instrucciones separadas y se envan en un nico lote. Si se establece el UpdateBatchSize en 0,
el DataAdapter utilizar el mayor tamao de lote admitido por el servidor. Si se establece el valor en 1, se
deshabilitan las actualizaciones por lotes y las filas se envan de una en una.
Si se ejecuta un lote demasiado grande, el rendimiento podra verse afectado. Por tanto, es conveniente
realizar pruebas a fin de determinar el valor ptimo del tamao del lote antes de implementar la aplicacin.

Utilizar la propiedad UpdateBatchSize
Al habilitar las actualizaciones por lotes, el valor de la propiedad UpdatedRowSource deUpdateCommand,
InsertCommand y DeleteCommand del DataAdapter debe establecerse en None o OutputParameters. Al
realizar una actualizacin por lotes, el valorFirstReturnedRecord o Both de la propiedad UpdatedRowSource
del comando no es vlido.
En el siguiente procedimiento se muestra cmo se utiliza la propiedad UpdateBatchSize. En el
procedimiento se toman dos argumentos, un objeto DataSet con columnas que representan los
campos ProductCategoryID y Name en la tabla Production.ProductCategory, y un entero que representa el
tamao del lote, es decir, el nmero de filas del mismo. El cdigo crea un objeto SqlDataAdapter nuevo y se
establecen las propiedades UpdateCommand,InsertCommand y DeleteCommand. En el cdigo se supone
que el objeto DataSet tiene filas modificadas. Se establece la propiedad UpdateBatchSize y se ejecuta la
actualizacin.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 252 | P g i n a

Public Sub BatchUpdate( _
ByVal dataTable As DataTable, ByVal batchSize As Int32)
' Assumes GetConnectionString() returns a valid connection string.
Dim connectionString As String = GetConnectionString()

' Connect to the AdventureWorks database.
Using connection As New SqlConnection(connectionString)
' Create a SqlDataAdapter.
Dim adapter As New SqlDataAdapter()

'Set the UPDATE command and parameters.
adapter.UpdateCommand = New SqlCommand( _
"UPDATE Production.ProductCategory SET " _
& "Name=@Name WHERE ProductCategoryID=@ProdCatID;", _
connection)
adapter.UpdateCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.UpdateCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.UpdateCommand.UpdatedRowSource = _
UpdateRowSource.None

'Set the INSERT command and parameter.
adapter.InsertCommand = New SqlCommand( _
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);", _
connection)
adapter.InsertCommand.Parameters.Add("@Name", _
SqlDbType.NVarChar, 50, "Name")
adapter.InsertCommand.UpdatedRowSource = _
UpdateRowSource.None

'Set the DELETE command and parameter.
adapter.DeleteCommand = New SqlCommand( _
"DELETE FROM Production.ProductCategory " _
& "WHERE ProductCategoryID=@ProdCatID;", connection)
adapter.DeleteCommand.Parameters.Add("@ProdCatID", _
SqlDbType.Int, 4, " ProductCategoryID ")
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None

' Set the batch size.
adapter.UpdateBatchSize = batchSize

' Execute the update.
adapter.Update(dataTable)
End Using
End Sub

Controlar errores y eventos relacionados con la actualizacin por lotes
DataAdapter tiene dos eventos relacionados con la actualizacin: RowUpdating yRowUpdated. En las
versiones anteriores de ADO.NET, cuando se deshabilita el procesamiento por lotes, cada uno de estos
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 253 | P g i n a

eventos se genera una vez para cada fila procesada. RowUpdating se genera antes de que tenga lugar la
actualizacin yRowUpdated se genera una vez completada la actualizacin de la base de datos.

Cambios en el comportamiento de eventos con actualizaciones por lotes
Si se habilita el procesamiento por lotes, se actualizan varias filas en una nica operacin de base de datos.
Por tanto, slo se produce un evento RowUpdated para cada lote, mientras que el evento RowUpdating se
produce para cada fila procesada. Si se deshabilita el procesamiento por lotes, los dos eventos se activan
con entrelazado individualizado, donde los eventos RowUpdating y RowUpdated se activan para una fila y,
a continuacin, se activan los eventos RowUpdating y RowUpdated para la siguiente fila, hasta que se
hayan procesado todas las filas.
Obtener acceso a filas actualizadas
Si se deshabilita el procesamiento por lotes, se puede obtener acceso a la fila que se est actualizando
mediante la propiedad Row de la clase RowUpdatedEventArgs.
Cuando se habilita el procesamiento por lotes, se genera un nico evento RowUpdated para varias filas. Por
tanto, el valor de la propiedad Row para cada fila es nulo. An as, los eventos RowUpdating se generarn
para cada fila. El mtodo CopyToRows de la claseRowUpdatedEventArgs permite obtener acceso a las filas
procesadas al copiar referencias a las mismas en una matriz. Si no se est procesando ninguna
fila, CopyToRows inicia unaArgumentNullException. Utilice la propiedad RowCount para devolver el nmero
de filas procesadas antes de llamar al mtodo CopyToRows.

Controlar errores de datos
La ejecucin por lotes tiene el mismo efecto que la ejecucin de cada instruccin por separado. Las
instrucciones se ejecutan en el mismo orden en el que se agregaron al lote. Los errores se controlan de la
misma forma en el modo de procesamiento por lotes que cuando ste se encuentra deshabilitado. Cada fila
se procesa por separado. Slo aquellas filas procesadas correctamente en la base de datos se actualizarn
en la DataRowcorrespondiente dentro de la DataTable.
El proveedor de datos y el servidor de base de datos back-end determinan qu construcciones SQL son
compatibles para la ejecucin por lotes. Es posible que se inicie una excepcin si se enva una instruccin no
compatible para su ejecucin.

Transacciones y simultaneidad (ADO.NET)
Una transaccin consiste en un comando nico o en un grupo de comandos que se ejecutan como un
paquete. Las transacciones permiten combinar varias operaciones en una sola unidad de trabajo. Si en un
punto de la transaccin se produjera un error, todas las actualizaciones podran revertirse y devolverse al
estado que tenan antes de la transaccin.
Una transaccin debe ajustarse a las propiedades ACID (atomicidad, coherencia, aislamiento y durabilidad)
para poder garantizar la coherencia de datos. La mayora de los sistemas de bases de datos relacionales,
como Microsoft SQL Server, admiten transacciones, al proporcionar funciones de bloqueo, registro y
administracin de transacciones cada vez que una aplicacin cliente realiza una operacin de actualizacin,
insercin o eliminacin.

Nota:
Las transacciones que requieren varios recursos pueden reducir la simultaneidad si la duracin del
bloqueo es demasiado larga. Por ello, haga la transaccin lo ms corta posible.

Las transacciones explcitas en procedimientos almacenados suelen dar mejores resultados cuando una
transaccin implica el uso de varias tablas en la misma base de datos o servidor. Se pueden crear
transacciones en procedimientos almacenados de SQL Server mediante las instrucciones BEGIN
TRANSACTION, COMMIT TRANSACTION o ROLLBACK TRANSACTIONde Transact-SQL.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 254 | P g i n a

Las transacciones que implican varios administradores de recursos, como un a transaccin entre SQL Server
y Oracle, requieren una transaccin distribuida.

Transacciones locales (ADO.NET)
Las transacciones de ADO.NET se utilizan cuando se desea enlazar varias tareas para que se ejecuten como
una sola unidad de trabajo. Por ejemplo, imagine que una aplicacin realiza dos tareas. Primero, actualiza
una tabla con informacin de pedidos. Luego, actualiza una tabla que contiene la informacin de inventario,
cargando en cuenta los elementos pedidos. Si alguna de las tareas da error, ambas actualizaciones se
revierten.

Determinacin del tipo de transaccin
Una transaccin se considera local cuando consta de una nica fase y es controlada directamente por la
base de datos. Las transacciones se consideran distribuidas cuando se coordinan mediante un monitor de
transacciones y utilizan mecanismos a prueba de errores (como confirmacin en dos fases) en la resolucin
de transacciones.
Cada proveedor de datos de .NET Framework tiene su propio objeto Transaction para realizar transacciones
locales. Si necesita que se realice una transaccin en una base de datos de SQL Server, seleccione una
transaccin de System.Data.SqlClient. En transacciones de Oracle, utilice el proveedor
System.Data.OracleClient. Adems, existe una nueva clase DbTransaction disponible para la escritura de
cdigo independiente del proveedor que requiere transacciones.

Nota:
Las transacciones son ms eficientes cuando se realizan en el servidor. Si trabaja con una base de datos de
SQL Server que hace uso masivo de transacciones explcitas, debera estudiar la posibilidad de escribirlas
como procedimientos almacenados mediante la instruccin BEGIN TRANSACTION de Transact-SQL.

Realizacin de una transaccin mediante una nica conexin
En ADO.NET, las transacciones se controlan con el objeto Connection. Puede iniciar una transaccin local
con el mtodo BeginTransaction. Una vez iniciada una transaccin, puede inscribir un comando en esa
transaccin con la propiedad Transaction de un objetoCommand. Luego, puede confirmar o revertir las
modificaciones realizadas en el origen de datos segn el resultado correcto o incorrecto de los componentes
de la transaccin.

Nota:
El mtodo EnlistDistributedTransaction no se debe emplear en transacciones locales.

El mbito de la transaccin est limitado a la conexin. En el siguiente ejemplo se realiza una transaccin
explcita que consta de por dos comandos independientes en el bloque try. Los comandos ejecutan
instrucciones INSERT con respecto a la tabla Production.ScrapReason de la base de datos de ejemplo
AdventureWorks de SQL Server 2005, que se confirman si no se produce ninguna excepcin. El cdigo del
bloque catch revierte la transaccin si se produce una excepcin. Si la transaccin se anula o la conexin se
cierra antes de que se haya completado la transaccin, sta se revierte automticamente.

Ejemplo
Para llevar a cabo una transaccin, siga estos pasos.
1. Llame al mtodo BeginTransaction del objeto SqlConnection para marcar el comienzo de la
transaccin. El mtodo BeginTransaction devuelve una referencia a la transaccin. Esta referencia
se asigna a los objetos SqlCommand que estn inscritos en la transaccin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 255 | P g i n a

2. Asigne el objeto Transaction a la propiedad Transaction del objeto SqlCommand que se va a
ejecutar. Si el comando se ejecuta en una conexin con una transaccin activa y el
objeto Transaction no se ha asignado a la propiedad Transaction del objetoCommand, se inicia una
excepcin.
3. Ejecute los comandos necesarios.
4. Llame al mtodo Commit del objeto SqlTransaction para completar la transaccin, o al
mtodo Rollback para finalizarla. Si la conexin se cierra o elimina antes de que se hayan ejecutado
los mtodos Commit o Rollback, la transaccin se revierte.
En el siguiente cdigo de ejemplo se muestra la lgica transaccional utilizando ADO.NET con Microsoft SQL
Server.

Using connection As New SqlConnection(connectionString)
connection.Open()

' Start a local transaction.
Dim sqlTran As SqlTransaction = connection.BeginTransaction()

' Enlist a command in the current transaction.
Dim command As SqlCommand = connection.CreateCommand()
command.Transaction = sqlTran

Try
' Execute two separate commands.
command.CommandText = _
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')"
command.ExecuteNonQuery()
command.CommandText = _
"INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')"
command.ExecuteNonQuery()

' Commit the transaction
sqlTran.Commit()
Console.WriteLine("Both records were written to database.")

Catch ex As Exception
' Handle the exception if the transaction fails to commit.
Console.WriteLine(ex.Message)

Try
' Attempt to roll back the transaction.
sqlTran.Rollback()

Catch exRollback As Exception
' Throws an InvalidOperationException if the connection
' is closed or the transaction has already been rolled
' back on the server.
Console.WriteLine(exRollback.Message)
End Try
End Try
End Using

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 256 | P g i n a

Transacciones distribuidas (ADO.NET)
Entre otras cosas, una transaccin es un conjunto de tareas relacionadas que se ejecutan correctamente
(confirman) o dan error (anulan) como una unidad. Una transaccin distribuida es una transaccin que
afecta a varios recursos. Para que una transaccin distribuida se confirme, todos los participantes deben
garantizar que los cambios en los datos sern permanentes. Los cambios deben mantenerse a pesar de
bloqueos del sistema u otros eventos imprevistos. Si alguno de los participantes no cumple esta garanta,
toda la transaccin da error y se revertirn los cambios en los datos en el mbito de la transaccin.

Nota:
Si intenta confirmar o revertir una transaccin al iniciar un DataReader mientras la transaccin est
activa, se produce una excepcin.

Trabajo con System.Transactions
En .NET Framework, las transacciones distribuidas se administran a travs de la API del espacio de
nombres System.Transactions. Cuando hay implicados varios administradores de recursos persistentes, la
API System.Transactions delegar el control de las transacciones distribuidas en un monitor de transacciones
como el Coordinador de transacciones distribuidas de Microsoft (MS DTC).
ADO.NET 2.0 incorpor la compatibilidad con la inscripcin en una transaccin distribuida mediante el
mtodo EnlistTransaction, que inscribe una conexin en una instancia deTransaction. En las versiones
anteriores de ADO.NET, la inscripcin explcita en transacciones distribuidas se realizaba mediante el
mtodo EnlistDistributedTransaction de una conexin que inscriba sta en una instancia ITransaction, en la
que se permita la compatibilidad con versiones anteriores.
Cuando se utiliza una transaccin System.Transactions con el proveedor de datos de .NET Framework para
SQL Server en una base de datos SQL Server 2005, se usar automticamente una Transaction ligera. A
continuacin, la transaccin se puede promover a una transaccin distribuida completa si es necesario.

Nota:
El nmero mximo de transacciones distribuidas en las que puede participar una base de datos de Oracle
a la vez se establece de forma predeterminada en 10. Despus de la dcima transaccin en una conexin
a una base de datos de Oracle, se inicia una excepcin. Oracle no admite DDL en las transacciones
distribuidas.

Inscripcin automtica en una transaccin distribuida
La inscripcin automtica es el mtodo predeterminado (y preferido) de integrar conexiones ADO.NET
con System.Transactions. Un objeto de conexin se inscribir automticamente en una transaccin
distribuida existente si se determina que hay una transaccin activa, que, en trminos
de System.Transaction, significa que Transaction.Current no es nula. La inscripcin automtica en
transacciones tiene lugar cuando se abre la conexin. No ocurrir despus, incluso si se ejecuta un comando
dentro del mbito de una transaccin. Puede deshabilitar la inscripcin automtica en transacciones
existentes si especifica Enlist=falsecomo un parmetro de cadena de conexin para una ConnectionString,
o OLE DB Services=-7 como un parmetro de cadena de conexin para una ConnectionString.

Inscripcin manual en una transaccin distribuida
Si la inscripcin automtica est deshabilitada o es necesario inscribir la conexin en una transaccin que se
ha iniciado despus de abierta la conexin, puede inscribirla en una transaccin distribuida existente
mediante el mtodo EnlistTransaction del objetoDbConnection correspondiente al proveedor con el que
est trabajando. La inscripcin en una transaccin distribuida existente garantiza que, si la transaccin se
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 257 | P g i n a

confirma o revierte, tambin se confirmarn o revertirn las modificaciones realizadas por el cdigo en el
origen de datos.
La inscripcin en transacciones distribuidas es especialmente conveniente al agrupar objetos empresariales.
Si se agrupa un objeto empresarial con una conexin abierta, la inscripcin automtica en transacciones slo
se produce cuando se abre esa conexin. Si se realizan varias transacciones con el objeto empresarial
agrupado, la conexin abierta para ese objeto no se inscribir automticamente en las transacciones recin
iniciadas. En este caso, puede deshabilitar la inscripcin automtica de la conexin en la transaccin e
inscribir la conexin en las transacciones mediante EnlistTransaction.
EnlistTransaction acepta un nico argumento del tipo Transaction que es una referencia a la transaccin
existente. Despus de llamar al mtodo EnlistTransaction de la conexin, todas las modificaciones
realizadas en el origen de datos mediante la conexin se incluyen en la transaccin. Si se pasa un valor nulo,
se anula la inscripcin de la conexin de su inscripcin actual en transacciones distribuidas. Tenga en cuenta
que la conexin se debe abrir antes de llamar a EnlistTransaction.

Nota:
Una vez que una conexin se inscribe explcitamente en una transaccin, no se puede anular su
inscripcin ni inscribirse en otra transaccin hasta que finaliza la primera transaccin.
Precaucin:
Si la conexin ya ha comenzado una transaccin mediante el mtodoBeginTransaction de la
conexin, EnlistTransaction inicia una excepcin. No obstante, si la transaccin es una transaccin local
iniciada en el origen de datos (por ejemplo, al ejecutar la instruccin BEGIN TRANSACTION de forma
explcita mediante un SqlCommand), EnlistTransaction la revertir e inscribir en la transaccin
distribuida existente como se ha solicitado. No recibir aviso de que la transaccin local se ha revertido y
deber administrar todas las transacciones locales no iniciadas mediante BeginTransaction. Si utiliza el
proveedor de datos de .NET Framework para SQL Server (SqlClient) con SQL Server 2005, al intentar una
inscripcin se producir una excepcin. Todos los dems casos no se detectarn.

Transacciones promocionadas en SQL Server 2005
SQL Server 2005 admite transacciones promocionadas en las que una transaccin ligera se puede promover
automticamente a distribuida solamente cuando es necesario. Las transacciones promocionadas no
invocan la sobrecarga adicional de las transacciones distribuidas a menos que sea necesario.

Configuracin de transacciones distribuidas
Es posible que deba habilitar el MS DTC a travs de la red para usar transacciones distribuidas en un sistema
operativo ms nuevo con los ltimos Service Packs aplicados, como Windows XP o Windows Server 2003. Si
tiene habilitado Firewall de Windows (valor predeterminado en Windows XP Service Pack 2), debe permitir
que el servicio MS DTC use la red o debe abrir el puerto de MS DTC.

Integracin de System.Transactions con SQL Server (ADO.NET)
.NET Framework versin 2.0 incorpor un nuevo marco de trabajo de transacciones al que se puede obtener
acceso a travs del espacio de nombres System.Transactions. Este marco de trabajo expone las
transacciones de tal forma que se integra completamente en .NET Framework, incluyendo ADO.NET.
Adems de las mejoras de programacin, System.Transactions y ADO.NET pueden funcionar juntos para
coordinar las optimizaciones al trabajar con transacciones. Una transaccin promocionada es una
transaccin ligera (local) que, en caso necesario, se puede promover automticamente a una transaccin
completamente distribuida.
A partir de ADO.NET 2.0, System.Data.SqlClient admite las transacciones promocionadas al trabajar con SQL
Server 2005. Las transacciones promocionadas no invocan la sobrecarga adicional de las transacciones
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 258 | P g i n a

distribuidas a menos que sea necesario. son automticas, es decir, no necesitan que intervenga el
programador.
Las transacciones promocionadas solo estn disponibles cuando se utiliza el proveedor de datos de .NET
Framework para SQL Server (SqlClient) con SQL Server 2005.

Creacin de transacciones promocionadas
El proveedor de .NET Framework para SQL Server ofrece compatibilidad con transacciones promocionadas,
que se administran a travs de las clases del espacio de nombresSystem.Transactions de .NET Framework.
Las transacciones promocionadas optimizan las transacciones distribuidas ya que aplazan la creacin de las
mismas hasta que es necesario. Si slo se necesita un administrador de recursos, no tiene lugar ninguna
transaccin distribuida.

Nota:
En un caso que no es de plena confianza, se requiere DistributedTransactionPermission cuando la
transaccin aumenta al nivel de transaccin distribuida.

Situaciones de uso de transacciones promocionadas
Normalmente, las transacciones distribuidas consumen muchos recursos del sistema, siendo el encargado
de administrarlas Microsoft DTC (Coordinador de transacciones distribuidas), que integra todos los
administradores de recursos a los que se tiene acceso en la transaccin. Una transaccin promocionada es
una forma especial de transaccin de System.Transactionsque delega con efectividad el trabajo en una
transaccin de SQL Server 2005 simple.System.Transactions, System.Data.SqlClient y SQL Server 2005
coordinan el trabajo que supone administrar la transaccin y promoverla a una transaccin completamente
distribuida cuando es necesario.
La ventaja de utilizar transacciones promocionadas es que cuando se abre una conexin utilizando una
transaccin TransactionScope activa, y no hay ninguna otra conexin abierta, la transaccin se confirma
como una transaccin ligera, en lugar de incurrir en la sobrecarga adicional de una transaccin
completamente distribuida.

Uso de TransactionScope
La clase TransactionScope crea un bloque de cdigo transaccional al inscribir implcitamente las conexiones
en una transaccin distribuida. Debe llamar al mtodo Complete al final del bloque TransactionScope antes
de abandonarlo. Al salir del bloque se invoca el mtodoDispose. Si se ha producido una excepcin que
ocasiona que el cdigo salga del mbito, la transaccin se considera anulada.
Se recomienda el uso de un bloque using para asegurarse de que se llama a Dispose en el
objeto TransactionScope cuando se sale de dicho bloque. Si no se confirman ni revierten las transacciones
pendientes, el rendimiento puede verse seriamente afectado ya que el tiempo de espera predeterminado
de TransactionScope es un minuto. Si no utiliza una instruccinusing, todo el trabajo deber realizarlo en un
bloque Try y llamar explcitamente al mtodoDispose en el bloque Finally.
Si se produce una excepcin en TransactionScope, la transaccin se marca como incoherente y se abandona.
Se revertir cuando se elimine el TransactionScope. Si no se produce ninguna excepcin, las transacciones
participantes se confirman.

Nota:
La clase TransactionScope crea una transaccin con un IsolationLevelpredeterminado de Serializable.
Dependiendo de la aplicacin, podra estudiar la posibilidad de reducir el nivel de aislamiento para evitar
una elevada contencin en la aplicacin.
Nota:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 259 | P g i n a

Se recomienda que slo realice actualizaciones, inserciones y eliminaciones en transacciones distribuidas,
ya que consumen una cantidad considerable de recursos de base de datos. Las instrucciones SELECT
pueden bloquear los recursos de base de datos de forma innecesaria y, en algunas situaciones, es posible
que tengan que utilizarse transacciones para las selecciones. Todo el trabajo que no sea de base de datos
debe realizarse fuera del mbito de la transaccin, a menos que estn implicados otros administradores
de recursos de transaccin. Aunque una excepcin en el mbito de la transaccin impide que se confirme
la misma, la clase TransactionScope no deja revertir los cambios que haya realizado el cdigo fuera del
mbito de la propia transaccin. Si es necesario realizar alguna accin cuando se revierta la transaccin,
deber escribir su propia implementacin de la interfazIEnlistmentNotification y darla de alta
explcitamente en la transaccin.

Ejemplo
Trabajar con System.Transactions requiere disponer de una referencia a System.Transactions.dll.
La siguiente funcin muestra cmo crear una transaccin promocionada en dos instancias de SQL Server
diferentes, representadas por dos objetos SqlConnection diferentes, que se incluyen en un
bloque TransactionScope. El cdigo crea el bloque TransactionScope con una instruccin using y abre la
primera conexin, que automticamente se da de alta enTransactionScope. La transaccin se inscribe
inicialmente como una transaccin ligera y no como una completamente distribuida. La segunda conexin se
inscribe en TransactionScopenicamente si el comando de la primera conexin no produce una excepcin.
Cuando se abre la segunda conexin, la transaccin se promociona automticamente a una transaccin
completamente distribuida. Se invoca el mtodo Complete, que confirma la transaccin nicamente si no se
han producido excepciones. Si en algn punto del bloqueTransactionScope se ha producido una excepcin,
no se llamar a Complete y, cuando se elimine TransactionScope al final de su bloque using, se revertir la
transaccin distribuida.

' This function takes arguments for the 2 connection strings and commands in order
' to create a transaction involving two SQL Servers. It returns a value > 0 if the
' transaction committed, 0 if the transaction rolled back. To test this code, you can
' connect to two different databases on the same server by altering the connection string,
' or to another RDBMS such as Oracle by altering the code in the connection2 code block.
Public Function CreateTransactionScope( _
ByVal connectString1 As String, ByVal connectString2 As String, _
ByVal commandText1 As String, ByVal commandText2 As String) As Integer

' Initialize the return value to zero and create a StringWriter to display results.
Dim returnValue As Integer = 0
Dim writer As System.IO.StringWriter = New System.IO.StringWriter

' Create the TransactionScope in which to execute the commands, guaranteeing
' that both commands will commit or roll back as a single unit of work.
Using scope As New TransactionScope()
Using connection1 As New SqlConnection(connectString1)
Try
' Opening the connection automatically enlists it in the
' TransactionScope as a lightweight transaction.
connection1.Open()

' Create the SqlCommand object and execute the first command.
Dim command1 As SqlCommand = New SqlCommand(commandText1, connection1)
returnValue = command1.ExecuteNonQuery()
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 260 | P g i n a

writer.WriteLine("Rows to be affected by command1: {0}", returnValue)

' If you get here, this means that command1 succeeded. By nesting
' the Using block for connection2 inside that of connection1, you
' conserve server and network resources by opening connection2
' only when there is a chance that the transaction can commit.
Using connection2 As New SqlConnection(connectString2)
Try
' The transaction is promoted to a full distributed
' transaction when connection2 is opened.
connection2.Open()

' Execute the second command in the second database.
returnValue = 0
Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
returnValue = command2.ExecuteNonQuery()
writer.WriteLine("Rows to be affected by command2: {0}", returnValue)

Catch ex As Exception
' Display information that command2 failed.
writer.WriteLine("returnValue for command2: {0}", returnValue)
writer.WriteLine("Exception Message2: {0}", ex.Message)
End Try
End Using

Catch ex As Exception
' Display information that command1 failed.
writer.WriteLine("returnValue for command1: {0}", returnValue)
writer.WriteLine("Exception Message1: {0}", ex.Message)
End Try
End Using

' If an exception has been thrown, Complete will
' not be called and the transaction is rolled back.
scope.Complete()
End Using

' The returnValue is greater than 0 if the transaction committed.
If returnValue > 0 Then
writer.WriteLine("Transaction was committed.")
Else
' You could write additional business logic here, notify the caller by
' throwing a TransactionAbortedException, or log the failure.
writer.WriteLine("Transaction rolled back.")
End If

' Display messages.
Console.WriteLine(writer.ToString())

Return returnValue
End Function
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 261 | P g i n a


Datasets de ADO.NET
El objeto DataSet es esencial para la compatibilidad con escenarios de datos distribuidos desconectados con
ADO.NET. El objeto DataSet es una representacin residente en memoria de datos que proporciona un
modelo de programacin relacional coherente independientemente del origen de datos. Se puede utilizar
con muchos y distintos orgenes de datos, con datos XML o para administrar datos locales de la aplicacin.
El DataSet representa un conjunto completo de datos que incluye tablas relacionadas y restricciones, as
como relaciones entre las tablas. En la siguiente ilustracin se muestra el modelo de objetosDataSet.

Modelo de objetos DataSet


Los mtodos y objetos de un DataSet concuerdan con los del modelo de base de datos relacional.

El objeto DataSet tambin puede mantener y recargar su contenido como XML y su esquema como
esquema de lenguaje de definicin de esquemas XML (XSD.

DataTableCollection
Un objeto DataSet de ADO.NET contiene una coleccin de cero o ms tablas representadas por
objetos DataTable. La DataTableCollection contiene todos los objetos DataTable de unDataSet.
La DataTable se define en el espacio de nombres System.Data y representa una nica tabla de datos
residentes en memoria. Contiene una coleccin de columnas representadas por una DataColumnCollection,
as como restricciones representadas por unaConstraintCollection, que juntas definen el esquema de la
tabla. Una DataTable tambin contiene una coleccin de filas representadas por la DataRowCollection, que
contiene los datos de la tabla. Una DataRow conserva, junto con su estado actual, sus versiones actual y
original para identificar los cambios en los valores almacenados en la fila.

Clase DataView
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 262 | P g i n a

Una DataView le permite crear diferentes vistas de los datos almacenados en una DataTable, una capacidad
que suele utilizarse en aplicaciones de enlace a datos. Mediante DataViewpuede exponer los datos de una
tabla con distintos criterios de ordenacin y filtrar los datos por el estado de fila o basndose en una
expresin de filtro.

DataRelationCollection
Un DataSet contiene relaciones en su objeto DataRelationCollection. Una relacin, representada por el
objeto DataRelation, asocia las filas de una DataTable con las filas de otra DataTable. Las relaciones son
anlogas a las rutas de acceso de unin que podran existir entre columnas de claves principales y externas
en una base de datos relacional. UnaDataRelation identifica las columnas coincidentes en dos tablas de
un DataSet.
Las relaciones habilitan la navegacin entre tablas de un objeto DataSet. Los elementos esenciales de
una DataRelation son el nombre de la relacin, el nombre de las tablas que se relacionan y las columnas
relacionadas de cada tabla. Es posible crear relaciones con ms de una columna por tabla si se especifica una
matriz de objetos DataColumn como columnas de claves. Cuando agrega una relacin al
DataRelationCollection, puede agregar opcionalmente una UniqueKeyConstraint y una
ForeignKeyConstraint para exigir restricciones de integridad cuando se realizan cambios en valores de
columna relacionados.

XML
Es posible llenar un DataSet a partir de una secuencia o un documento XML. Se puede utilizar la secuencia o
el documento XML para suministrar datos al DataSet, informacin de esquema o ambas cosas. La
informacin suministrada desde la secuencia o el documento XML puede combinarse con datos o
informacin de esquema existente ya presente en elDataSet.

ExtendedProperties
DataSet, DataTable y DataColumn tienen todos una propiedad ExtendedProperties.ExtendedProperties es
una PropertyCollection en la que puede colocar informacin personalizada, como la instruccin SELECT que
se ha utilizado para generar el conjunto de resultados o la hora en que se generaron los datos. La
coleccin ExtendedProperties se mantiene con la informacin de esquema del DataSet.

LINQ to DataSet
LINQ to DataSet proporciona capacidades Language-Integrated Query para los datos desconectados
almacenados en un objeto DataSet. LINQ to DataSet utiliza sintaxis estndar de LINQ y proporciona
comprobacin de sintaxis en tiempo de compilacin, tipos estticos y compatibilidad con IntelliSense
cuando se utiliza la IDE de Visual Studio.

DataSets, DataTables y DataViews (ADO.NET)
El DataSet de ADO.NET es una representacin de datos residente en memoria que proporciona un modelo
de programacin relacional coherente independientemente del origen de datos que contiene.
Un DataSet representa un conjunto completo de datos, incluyendo las tablas que contienen, ordenan y
restringen los datos, as como las relaciones entre las tablas.
Hay varias maneras de trabajar con un DataSet, que se pueden aplicar de forma independiente o
conjuntamente. Puede:
Crear mediante programacin una DataTable, DataRelation y una Constraint en unDataSet y
rellenar las tablas con datos.
Llenar el DataSet con tablas de datos de un origen de datos relacional existente
mediante DataAdapter.
Cargar y hacer persistente el contenido de DataSet mediante XML.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 263 | P g i n a

Tambin se puede transportar un DataSet con establecimiento inflexible de tipos mediante un servicio web
XML. El diseo del DataSet lo convierte en idneo para el transporte de datos mediante servicios web XML.

Crear un DataSet (ADO.NET)
Puede crear una instancia de DataSet llamando al constructor DataSet. Si lo desea, especifique un nombre
de argumento. Si no especifica ningn nombre para el DataSet, se establecer el nombre "NewDataSet".

Tambin es posible crear un nuevo DataSet basado en un DataSetexistente. El nuevo DataSet puede ser una
copia exacta del DataSet existente; un clon del DataSet que copia la estructura relacional o el esquema, pero
que no contiene ningn dato del DataSet existente; o un subconjunto del DataSet, que contiene solamente
las filas modificadas del DataSet existente mediante el mtodo GetChanges.

En el siguiente ejemplo de cdigo se muestra cmo construir una instancia de un DataSet.

Dim customerOrders As DataSet = New DataSet("CustomerOrders")

Agregar DataTable a DataSet (ADO.NET)
ADO.NET permite crear objetos DataTable y agregarlos a un DataSet existente. Es posible establecer
informacin de restricciones para unaDataTable mediante las propiedades PrimaryKey yUnique.

Ejemplo
En el siguiente ejemplo se construye un DataSet, se agrega un objeto DataTable nuevo alDataSet y, a
continuacin, se agregan tres objetos DataColumn a la tabla. Por ultimo, el cdigo establece una columna
como columna de clave principal.

Dim customerOrders As DataSet = New DataSet("CustomerOrders")
Dim ordersTable As DataTable = customerOrders.Tables.Add("Orders")
Dim pkOrderID As DataColumn = ordersTable.Columns.Add( _
"OrderID", Type.GetType("System.Int32"))
ordersTable.Columns.Add("OrderQuantity", Type.GetType("System.Int32"))
ordersTable.Columns.Add("CompanyName", Type.GetType("System.String"))

ordersTable.PrimaryKey = New DataColumn() {pkOrderID}

Distinguir maysculas de minsculas
Pueden existir dos o ms tablas o relaciones con el mismo nombre, pero que difieran en maysculas y
minsculas, en un DataSet. En estos casos, las referencias a tablas y relaciones por nombre distinguen
maysculas y minsculas. Por ejemplo, si el DataSet dataSet contiene las tablas Table1 y table1, se hace
referencia por nombre aTable1 como dataSet.Tables["Table1"] y se hace referencia a table1 como
dataSet.Tables["table1"]. Si se intentara hacer referencia a cualquiera de las tablas mediante
dataSet.Tables["TABLE1"] se generara una excepcin.
El comportamiento de distincin entre maysculas y minsculas no se aplica si slo hay una tabla o relacin
con un nombre concreto. Por ejemplo, si el DataSet slo tiene Table1, se puede hacer referencia a sta
mediante dataSet.Tables["TABLE1"].

Nota:
La propiedad CaseSensitive del DataSet no afecta a este comportamiento. La propiedad CaseSensitive
se aplica a los datos del DataSet y afecta a la ordenacin, la bsqueda, el filtrado, la aplicacin de
restricciones, etc.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 264 | P g i n a


Agregar DataRelations (ADO.NET)
En un DataSet que contiene varios objetos DataTable, es posible utilizar objetos DataRelation para
relacionar una tabla con otra, navegar por las tablas y devolver filas secundarias o primarias de una tabla
relacionada.
Los argumentos necesarios para crear una DataRelation son un nombre para laDataRelation que se va a
crear y una matriz de una o ms referencias DataColumn a las columnas que actan como columnas
primaria y secundaria en la relacin. Una vez creado un objeto DataRelation, es posible utilizarlo para
navegar por las tablas y recuperar valores.
Al agregar una DataRelation a una DataSet, se agrega de forma predeterminada unaUniqueConstraint a la
tabla primaria y una ForeignKeyConstraint a la tabla secundaria.
En el siguiente ejemplo de cdigo se crea una DataRelation mediante dos objetos DataTableen un DataSet.
Cada DataTable contiene una columna denominada CustID, que acta como vnculo entre los dos
objetos DataTable. En el ejemplo se agrega una nica DataRelation a la coleccin Relations del DataSet. El
primer argumento del ejemplo especifica el nombre de laDataRelation que se va a crear. El segundo
argumento establece la DataColumn primaria y el tercer argumento establece la DataColumn secundaria.

customerOrders.Relations.Add("CustOrders", _
customerOrders.Tables("Customers").Columns("CustID"), _
customerOrders.Tables("Orders").Columns("CustID"))

Una DataRelation tiene tambin una propiedad Nested que, cuando tiene el valor true, hace que las filas de
la tabla secundaria se aniden dentro de la fila asociada de la tabla primaria cuando se escriben como
elementos XML mediante WriteXml.

Navegar por DataRelations (ADO.NET)
Una de las principales funciones de una DataRelationes permitir la navegacin de una DataTable a otra
dentro de un DataSet. Esto permite recuperar todos los objetos DataRow relacionados de
una DataTablecuando se da una nica DataRow de una DataTablerelacionada. Por ejemplo, despus de
establecer una DataRelation entre una tabla de clientes y una tabla de pedidos, es posible recuperar todas
las filas de pedidos de una fila de clientes determinada mediante GetChildRows.
En el siguiente ejemplo de cdigo se crea una DataRelation entre la tabla Customers y la tabla Orders de
un DataSet, y se devuelven todos los pedidos de cada cliente.

Dim customerOrdersRelation As DataRelation = _
customerOrders.Relations.Add("CustOrders", _
customerOrders.Tables("Customers").Columns("CustomerID"), _
customerOrders.Tables("Orders").Columns("CustomerID"))

Dim custRow, orderRow As DataRow

For Each custRow In customerOrders.Tables("Customers").Rows
Console.WriteLine("Customer ID:" & custRow("CustomerID").ToString())

For Each orderRow In custRow.GetChildRows(customerOrdersRelation)
Console.WriteLine(orderRow("OrderID").ToString())
Next
Next

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 265 | P g i n a

Combinar contenido de DataSet (ADO.NET)
Se puede utilizar el mtodo Merge para combinar el contenido de DataSet, DataTable o matriz
deDataRow en un DataSet existente. Hay varios factores y opciones que afectan a cmo se combinan los
datos nuevos en un DataSet existente.

Claves principales
Si la tabla que recibe datos y esquema nuevos a partir de una combinacin tiene una clave principal, las
nuevas filas de los datos entrantes se hacen coincidir con las filas existentes que tienen los mismos valores
de clave principal Original que los de los datos entrantes. Si las columnas del esquema entrante coinciden
con las del esquema existente, se modificarn los datos de las filas existentes. Las columnas que no
coincidan con el esquema existente se pasarn por alto o se agregarn en funcin del
parmetro MissingSchemaAction. Las nuevas filas con valores de clave principal que no coincidan con las
filas existentes se agregarn a la tabla existente.
Si las filas entrantes o las existentes tienen un estado Added, se harn coincidir sus valores de clave principal
mediante el valor de clave principal Current de la fila Added, ya que no existe ninguna versin de
fila Original.
Si una tabla entrante y una tabla existente tienen una columna con el mismo nombre pero con distintos
tipos de datos, se iniciar una excepcin y se generar el evento MergeFailedde DataSet. Si una tabla
entrante y una tabla existente tienen claves definidas, pero las claves principales corresponden a columnas
diferentes, se iniciar una excepcin y se provocar el evento MergeFailed de DataSet.
Si la tabla que recibe nuevos datos de una combinacin no tiene una clave principal, las nuevas filas de los
datos entrantes no se pueden hacer coincidir con las filas existentes de la tabla y se agregarn a la tabla
existente.

Nombres de tabla y espacios de nombres
A los objetos DataTable se les puede asignarse tambin un valor de propiedad Namespace. Cuando se
asignan los valores Namespace, DataSet puede contener varios objetosDataTable con el mismo valor
TableName. Durante las operaciones de combinacin, se utilizan tanto TableName como Namespace para
identificar el destino de una combinacin. Si no se ha asignado Namespace slo se utiliza TableName para
identificar el destino de una combinacin.

Nota:
Este comportamiento ha cambiado en la versin 2.0 de .NET Framework. En la versin 1.1, se admitan los
espacios de nombres pero eran pasados por alto durante las operaciones de combinacin. Por ello,
un DataSet que utiliza valores de propiedad Namespace tendr diferentes comportamientos en funcin
de la versin de .NET Framework que se ejecute. Por ejemplo, suponga que tiene dos DataSets que
contienen DataTables con los mismos valores de propiedad TableName pero distintos valores de
propiedadNamespace. En la versin 1.1 de .NET Framework, los nombres Namespacedistintos sern
pasados por alto cuando se combinen dos objetos DataSet. Sin embargo, a partir de la versin 2.0 de .NET
Framework, la combinacin produce dos nuevos DataTables para crearse en el DataSet de destino.
ElDataTables original no se ver afectado por la combinacin.

PreserveChanges
Cuando se pasa una matriz de DataSet, DataTable o DataRow al mtodo Merge, es posible incluir
parmetros opcionales que especifiquen si se conservarn o no los cambios en el DataSet existente y cmo
tratar los nuevos elementos de esquema de los datos entrantes. El primero de estos parmetros despus de
los datos entrantes es un marcador booleano, PreserveChanges, que especifica si se conservarn o no los
cambios en elDataSet existente. Si el marcador PreserveChanges est establecido en true, los valores
entrantes no sobrescriben los existentes en la versin de fila Current de la fila existente. Si el
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 266 | P g i n a

marcador PreserveChanges est establecido en false, los valores entrantes sobrescriben los existentes en la
versin de fila Current de la fila existente. Si el marcadorPreserveChanges no est especificado, de forma
predeterminada se establece en false.
Cuando PreserveChanges es true, los datos de la fila existente se mantienen en la versin de fila Current de
la fila existente, mientras que los datos de la versin de filaOriginal de la fila existente se sobrescriben con
los datos de la versin de fila Original de la fila entrante. El RowState de la fila existente se establece
en Modified. Se aplican las excepciones siguientes:
Si la fila existente tiene un RowState de Deleted, RowState se mantiene enDeleted y no se
establece en Modified. En este caso, los datos de la fila entrante se almacenarn en la versin de
fila Original de la fila existente, sobrescribiendo la versin de fila Original de la fila existente (a
menos que la fila entrante tenga unRowState de Added).
Si la fila entrante tiene un RowState de Added, los datos de la versin de filaOriginal de la fila
existente no se sobrescribirn con datos de la fila entrante, ya que sta no tiene una versin de
fila Original.

Cuando PreserveChanges es false, las versiones de fila Current y Original de la fila existente se sobrescriben
con datos de la fila entrante y el RowState de la fila existente se establece como el RowState de la fila
entrante. Se aplican las excepciones siguientes:
Si la fila entrante tiene un RowState de Unchanged y la fila existente tiene
unRowState de Modified, Deleted o Added, el RowState de la fila existente se establece
en Modified.
Si la fila entrante tiene un RowState de Added y la fila existente tiene
un RowStatede Unchanged, Modified o Deleted, el RowState de la fila existente se establece
en Modified. Adems, los datos de la versin de fila Original de la fila existente no se sobrescriben
con datos de la fila entrante, ya que sta no tiene una versin de filaOriginal.

MissingSchemaAction
Es posible utilizar el parmetro opcional MissingSchemaAction del mtodo Merge para especificar cmo
tratar Merge los elementos del esquema de los datos entrantes que no formen parte
del DataSet existente.

En la siguiente tabla se describen las opciones de MissingSchemaAction.
Opcin
MissingSchemaAction
Descripcin
Add Agrega al DataSet la nueva informacin de esquema y rellena las nuevas
columnas con los valores entrantes. ste es el valor predeterminado.
AddWithKey Agrega al DataSet la nueva informacin de esquema y de clave principal y
rellena las nuevas columnas con los valores entrantes.
Error Inicia una excepcin si se encuentra informacin de esquema no coincidente.
Ignore Pasa por alto la nueva informacin de esquema.

Restricciones
Con el mtodo Merge no se comprueban las restricciones hasta que se agregan todos los datos nuevos
al DataSet existente. Una vez agregados los datos, se aplican restricciones en los valores actuales
del DataSet. Hay que asegurarse de que el cdigo controla las excepciones que puedan iniciarse debido a
infracciones de las restricciones.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 267 | P g i n a

Tomemos como ejemplo un caso en el que una fila existente de un DataSet es una filaUnchanged con un
valor de clave principal de 1. Durante una operacin de combinacin con una fila entrante Modified cuyo
valor de clave principal Original es 2 y de clave principal Current es 1, la fila existente y la fila entrante no se
consideran coincidentes porque los valores de clave principal Original son diferentes. Sin embargo, cuando
se completa la combinacin y se comprueban las restricciones, se iniciar una excepcin porque los valores
de clave principal Current infringen la restriccin nica de la columna de clave principal.

Nota:
Cuando las filas estn insertadas en una base de datos con columnas de incremento automtico como
puede ser una columna de identidad, el valor de columna de identidad devuelto por la insercin no
coincide con el valor deDataSet, lo que da lugar a que las filas devueltas se agreguen en lugar de
combinarse.

En el siguiente ejemplo de cdigo se combinan dos objetos DataSet con esquemas diferentes en
un DataSet con los esquemas combinados de los dos objetos DataSet entrantes.

Using connection As SqlConnection = New SqlConnection( _
connectionString)

Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
"SELECT CustomerID, CompanyName FROM Customers", connection)

connection.Open()

Dim customers As DataSet = New DataSet()
adapter.FillSchema(customers, SchemaType.Source, "Customers")
adapter.Fill(customers, "Customers")

Dim orders As DataSet = New DataSet()
orders.ReadXml("Orders.xml", XmlReadMode.ReadSchema)
orders.AcceptChanges()

customers.Merge(orders, True, MissingSchemaAction.AddWithKey)
End Using

En el siguiente ejemplo de cdigo se toma un DataSet existente con actualizaciones y se pasan esas
actualizaciones a un DataAdapter para que se procesen en el origen de datos. Los resultados se combinan
entonces en el DataSet original. Despus de rechazar los cambios que produjeron un error, se confirman los
cambios combinados conAcceptChanges.

Dim customers As DataTable = dataSet.Tables("Customers")

' Make modifications to the Customers table.

' Get changes to the DataSet.
Dim dataSetChanges As DataSet = dataSet.GetChanges()

' Add an event handler to handle the errors during Update.
AddHandler adapter.RowUpdated, New SqlRowUpdatedEventHandler( _
AddressOf OnRowUpdated)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 268 | P g i n a


connection.Open()
adapter.Update(dataSetChanges, "Customers")
connection.Close()

' Merge the updates.
dataSet.Merge(dataSetChanges, True, MissingSchemaAction.Add)

' Reject changes on rows with errors and clear the error.
Dim errRows() As DataRow = dataSet.Tables("Customers").GetErrors()
Dim errRow As DataRow
For Each errRow In errRows
errRow.RejectChanges()
errRow.RowError = Nothing
Next

' Commit the changes.
dataSet.AcceptChanges()

Private Sub OnRowUpdated( _
ByVal sender As Object, ByVal args As SqlRowUpdatedEventArgs)
If args.Status = UpdateStatus.ErrorsOccurred Then
args.Row.RowError = args.Errors.Message
args.Status = UpdateStatus.SkipCurrentRow
End If
End Sub

Copiar contenido de DataSet (ADO.NET)
Se puede crear una copia de DataSet de forma que se pueda trabajar con datos sin afectar a los datos
originales o bien se puede trabajar con un subconjunto de los datos desde un DataSet. Al copiar
un DataSet es posible:
Crear una copia exacta del DataSet, incluyendo el esquema, los datos, la informacin de estado de
fila y las versiones de fila.
Crear un DataSet que contenga el esquema de un DataSet existente, pero slo las filas modificadas.
Se pueden devolver todas las filas modificadas o especificar unDataRowState determinado.
Copiar el esquema, o estructura relacional, del DataSet nicamente, sin copiar ninguna fila. Las filas
se pueden importar en una DataTable existente medianteImportRow.
Para crear una copia exacta del DataSet que incluya tanto el esquema como los datos, utilice el
mtodo Copy del DataSet. En el ejemplo siguiente se muestra cmo se crea una copia exacta del DataSet.

Dim copyDataSet As DataSet = customerDataSet.Copy()

Para crear una copia del DataSet que incluya el esquema y slo los datos que representen
filas Added, Modified o Deleted, utilice el mtodo GetChanges del DataSet. Tambin es posible
utilizar GetChanges para devolver nicamente las filas que tengan un estado de fila determinado si se pasa
el valor DataRowState al llamar a GetChanges. En el siguiente ejemplo de cdigo se muestra cmo pasar
un DataRowState al llamar a GetChanges.

' Copy all changes.
Dim changeDataSet As DataSet = customerDataSet.GetChanges()
' Copy only new rows.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 269 | P g i n a

Dim addedDataSetAs DataSet = _
customerDataSet.GetChanges(DataRowState.Added)

Para crear una copia de un DataSet que slo incluya el esquema, utilice el mtodo Clone delDataSet.
Tambin es posible agregar filas existentes al DataSet clonado mediante el mtodo
ImportRow de DataTable.ImportRow agrega datos, el estado de fila e informacin de versin de fila a la
tabla especificada. Los valores de columna slo se agregan cuando los nombres de columna coinciden y el
tipo de datos es compatible.
En el siguiente ejemplo de cdigo se crea un clon de un DataSet y se agregan la filas delDataSet original a la
tabla Customers del DataSet clonado para aquellos clientes cuya columna CountryRegion tenga el valor
"Germany".

Dim germanyCustomers As DataSet = customerDataSet.Clone()

Dim copyRows() As DataRow = _
customerDataSet.Tables("Customers").Select("CountryRegion = 'Germany'")

Dim customerTable As DataTable = germanyCustomers.Tables("Customers")
Dim copyRow As DataRow

For Each copyRow In copyRows
customerTable.ImportRow(copyRow)
Next

DataTables (ADO.NET)
Un objeto DataSet est formado por una coleccin de tablas, relaciones y restricciones. En ADO .NET, los
objetos DataTable se utilizan para representar las tablas de un DataSet. Un objeto DataTablerepresenta una
tabla de datos relacionales de la memoria; los datos son locales de la aplicacin basada en .NET en la que
residen, pero se pueden llenar desde un origen de datos como Microsoft SQL Server mediante
un DataAdapter.
La clase DataTable es miembro del espacio de nombres System.Data dentro de la biblioteca de clases de
.NET Framework. Se puede crear y utilizar DataTable de manera independiente o como miembro de
un DataSet y los objetos DataTable se pueden utilizar tambin en combinacin con otros objetos de .NET
Framework, incluido DataView. Al conjunto de tablas de un DataSet se puede tener acceso mediante la
propiedad Tables del objeto DataSet.
El esquema o la estructura de una tabla se representan mediante columnas y restricciones. El esquema de
una DataTable se define mediante objetos DataColumn, ForeignKeyConstraint yUniqueConstraint. Las
columnas de una tabla se pueden asignar a columnas de un origen de datos, pueden contener valores
calculados de expresiones, aumentar sus valores automticamente o contener valores de clave principal.
Adems del esquema, un objeto DataTable debe tener tambin filas en las que albergar y ordenar los datos.
La clase DataRow representa los datos reales que contiene una tabla. La clase DataRow, sus propiedades y
mtodos se utilizan para recuperar, evaluar y manipular los datos de una tabla. Cuando se tiene acceso a los
datos de una fila y se cambian, el objetoDataRow mantiene tanto su estado actual como el original.
Se pueden crear relaciones primarias-secundarias entre tablas utilizando una o varias columnas relacionadas
de las tablas. Se pueden crear relaciones entre objetos DataTablemediante un objeto DataRelation. Los
objetos DataRelation se pueden utilizar despus para devolver las filas relacionadas, secundaria o primaria,
de una fila concreta.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 270 | P g i n a

Crear DataTable (ADO.NET)
Un objeto DataTable, que representa una tabla de datos relacionales en la memoria, se puede crear y usar
de manera independiente o lo pueden usar otros objetos de .NET Framework, normalmente como miembro
de un objeto DataSet.
Puede crear un objeto DataTable mediante el constructor DataTable adecuado. Puede agregarlo
alDataSet mediante el mtodo Add que lo agregar a la coleccin Tables del objetoDataTable.
Tambin se pueden crear objetos DataTable dentro de un DataSet mediante los mtodos Fill o FillSchema
del objeto DataAdapter o desde un esquema XML predefinido o deducido, mediante los mtodos ReadXml,
ReadXmlSchema o InferXmlSchema del DataSet. Tenga en cuenta que una vez que se ha agregado
DataTable como miembro de la coleccin Tablesde un DataSet, no se puede agregar a la coleccin de tablas
de ningn otro DataSet.
La primera vez que se crea un DataTable, no tiene esquema (estructura). Para definir el esquema de la tabla,
es necesario crear objetos DataColumn y agregarlos a la coleccinColumns de la tabla. Tambin se puede
definir una columna de claves principales para la tabla y crear objetos Constraint y agregarlos a la
coleccin Constraints de la tabla. Una vez que se ha definido el esquema de DataTable, se pueden agregar
filas de datos a la tabla, agregando objetos DataRow a la coleccin Rows de la tabla.
No es necesario proporcionar un valor para la propiedad TableName cuando se crea unaDataTable: dicha
propiedad se puede especificar en otro momento o se puede dejar vaca. Sin embargo, cuando se agrega
una tabla sin valor TableName a un DataSet, la tabla recibir un nombre predeterminado incremental con el
formato TableN y comenzando con "Table" para Table0.

Nota:
Es aconsejable evitar la convencin de nomenclatura "TableN" al proporcionar un valor TableName, ya
que el nombre proporcionado podra entrar en conflicto con un nombre de tabla predeterminado
existente en el DataSet. Si el nombre proporcionado ya existe, se inicia una excepcin.

En el ejemplo siguiente se crea una instancia de un objeto DataTable, a la que se asigna el nombre
"Customers".

Dim workTable as DataTable = New DataTable("Customers")

En el siguiente ejemplo se crea una instancia de una DataTable agregndola a la coleccinTables de
un DataSet.

Dim customers As DataSet = New DataSet
Dim customersTable As DataTable = _
customers.Tables.Add("CustomersTable")

Agregar columnas a la DataTable (ADO.NET)
DataTable contiene una coleccin de objetosDataColumn a los que hace referencia la propiedadColumns de
la tabla. Esta coleccin de columnas, junto con las restricciones que haya, define el esquema, o estructura,
de la tabla.
Los objetos DataColumn de una tabla se crean con el constructor DataColumn o llamando al mtodo Add de
la propiedad Columns de la tabla, que es una DataColumnCollection. El mtodo Add acepta argumentos
ColumnName, DataType y Expression opcionales y crea una nueva DataColumn como miembro de la
coleccin. Tambin acepta un objetoDataColumn existente y lo agrega a la coleccin y devuelve una
referencia a la DataColumnagregada si se solicita. Puesto que los objetos DataTable no son especficos de
ningn origen de datos, al especificar el tipo de datos de una DataColumn se usan los tipos de .NET
Framework.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 271 | P g i n a

En el siguiente ejemplo, se agregan cuatro columnas a DataTable.

Dim workTable As DataTable = New DataTable("Customers")
Dim workCol As DataColumn = workTable.Columns.Add( _
"CustID", Type.GetType("System.Int32"))
workCol.AllowDBNull = false
workCol.Unique = true
workTable.Columns.Add("CustLName", Type.GetType("System.String"))
workTable.Columns.Add("CustFName", Type.GetType("System.String"))
workTable.Columns.Add("Purchases", Type.GetType("System.Double"))

En el ejemplo, advierta que las propiedades de la columna CustID se configuran de manera que no admitan
valores DBNull y restrinjan los valores para que sean nicos. Sin embargo, si se define la
columna CustID como columna de clave principal de la tabla, la propiedadAllowDBNull se establecer
automticamente en false y la propiedad Unique se establecer automticamente en true.

Precaucin:
Si no se proporciona un nombre para una determinada columna, sta recibe el nombre predeterminado
incremental ColumnN, (que empieza por "Column1"), cuando la columna se agrega a la
coleccin DataColumnCollection. Se recomienda evitar la convencin de nomenclatura "ColumnN" al
proporcionar un nombre de columna, ya que el nombre que se proporcione podra entrar en conflicto con
un nombre de columna predeterminado existente enDataColumnCollection. Si el nombre proporcionado
ya existe, se inicia una excepcin.

Crear columnas de expresin (ADO.NET)
Se puede definir una expresin para una columna, a fin de que pueda contener un valor calculado a partir de
los valores de otra columna de la misma fila o de los valores de columna de varias filas de la tabla. Para
definir la expresin que se va a evaluar, utilice la propiedad Expression de la columna de destino y la
propiedad ColumnName para hacer referencia a otras columnas en la expresin. El DataType para la
columna de expresin debe ser adecuado para el valor que dicha expresin devuelve.

En la tabla siguiente se enumeran varios usos posibles de las columnas de expresin de una tabla.
Tipo de expresin Ejemplo
Comparacin "Total >= 500"
Clculo "UnitPrice * Quantity"
Agregacin Sum(Precio)

Se puede establecer la propiedad Expression en un objeto DataColumn existente, o se puede incluir la
propiedad como el tercer argumento que se pasa al constructor DataColumn, como se muestra en el
ejemplo siguiente.

workTable.Columns.Add("Total",Type.GetType("System.Double"))
workTable.Columns.Add("SalesTax", Type.GetType("System.Double"), _
"Total * 0.086")

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 272 | P g i n a

Las expresiones pueden hacer referencia a otras columnas de expresin; sin embargo, una referencia
circular, en la que dos expresiones se hacen referencia una a otra, generar una excepcin.

Crear columnas AutoIncrement (ADO.NET)
Para garantizar que los valores de una columna son nicos, stos se pueden establecer de manera que se
incrementen automticamente cuando se agregan filas a la tabla. Para crear una DataColumn que se
incrementa automticamente, establezca la propiedad AutoIncrement de la columna en true.
La DataColumn comienza entonces con el valor definido en la propiedad AutoIncrementSeed y, con cada fila
agregada, el valor de la columna AutoIncrement aumenta en funcin del valor definido en la
propiedad AutoIncrementStep de la columna.
En el caso de las columnas AutoIncrement, se recomienda que la propiedad ReadOnly de laDataColumn se
establezca en true.
En el ejemplo siguiente se muestra cmo se crea una columna que comienza con un valor de 200 y va
aumentando de tres en tres.

Dim workColumn As DataColumn = workTable.Columns.Add( _
"CustomerID", typeof(Int32))
workColumn.AutoIncrement = true
workColumn.AutoIncrementSeed = 200
workColumn.AutoIncrementStep = 3

Definir claves principales (ADO.NET)
Generalmente, una tabla de base de datos tiene una columna o grupo de columnas que identifican de
manera exclusiva cada fila de la tabla. Esta columna o grupo de columnas de identificacin se denomina
clave principal.
Al identificar una nica DataColumn como la PrimaryKey para una DataTable, la tabla establece
automticamente la propiedad AllowDBNull de la columna como false y la propiedad Unique como true.
Para las claves principales de varias columnas slo se establece de forma automtica la
propiedad AllowDBNull en false.
La propiedad PrimaryKey de una DataTable recibe como valor una matriz de uno o varios objetos
DataColumn, como se muestra en los ejemplos siguientes. En el primer ejemplo se define una sola columna
como clave principal.

workTable.PrimaryKey = New DataColumn() {workTable.Columns("CustID")}

' Or

Dim columns(1) As DataColumn
columns(0) = workTable.Columns("CustID")
workTable.PrimaryKey = columns

En el siguiente ejemplo se definen dos columnas como clave principal.

workTable.PrimaryKey = New DataColumn() {workTable.Columns("CustLName"), _
workTable.Columns("CustFName")}

' Or

Dim keyColumn(2) As DataColumn
keyColumn(0) = workTable.Columns("CustLName")
keyColumn(1) = workTable.Columns("CustFName")
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 273 | P g i n a

workTable.PrimaryKey = keyColumn

Restricciones de DataTable (ADO.NET)
Se pueden utilizar restricciones para exigir restricciones sobre los datos de un objeto DataTablecon el fin de
mantener la integridad de los datos. Una restriccin es una regla automtica que se aplica a una columna, o
a varias columnas relacionadas, que determina cmo proceder cuando se modifica de alguna manera el
valor de una fila. Las restricciones se exigen cuando la propiedad EnforceConstraints del DataSet es true.
Existen dos tipos de restricciones en ADO.NET: ForeignKeyConstraint y UniqueConstraint. De forma
predeterminada, las dos restricciones se crean automticamente al crear una relacin entre dos o ms
tablas agregando DataRelation al DataSet. Sin embargo, se puede deshabilitar este comportamiento
especificando createConstraints = false al crear la relacin.

ForeignKeyConstraint
ForeignKeyConstraint exige reglas sobre cmo se propagan las actualizaciones y eliminaciones a las tablas
relacionadas. Por ejemplo, si se actualiza o elimina el valor de una fila de una tabla y el mismo valor tambin
se utiliza en una o varias tablas relacionadas,ForeignKeyConstraint determinar qu sucede en las tablas
relacionadas.

Las propiedades DeleteRule y UpdateRule de ForeignKeyConstraint definen la accin que se ha de realizar
cuando el usuario intente eliminar o actualizar una fila en una tabla relacionada. En la tabla siguiente se
describen las distintas configuraciones disponibles para las propiedades DeleteRule y UpdateRule de
ForeignKeyConstraint

Establecimiento
de reglas
Descripcin
Cascade Elimina o actualiza las filas relacionadas.
SetNull Establece los valores de las filas relacionadas en DBNull.
SetDefault Establece los valores de las filas relacionadas en el valor predeterminado.
Ninguna No realiza ninguna accin en las filas relacionadas. ste es el valor predeterminado.

ForeignKeyConstraint puede restringir, adems de propagar, los cambios en las columnas relacionadas.
Dependiendo de las propiedades establecidas para la ForeignKeyConstraintde una columna, y si la
propiedad EnforceConstraints del DataSet es true, realizar ciertas operaciones en la fila primaria generar
una excepcin. Por ejemplo, si la propiedadDeleteRule de ForeignKeyConstraint es None, una fila primaria
no se puede eliminar si tiene filas secundarias.
Se puede crear una restriccin de clave externa entre columnas individuales o entre una matriz de columnas
utilizando el constructor ForeignKeyConstraint. Pase el objetoForeignKeyConstraint resultante al
mtodo Add de la propiedad Constraints de la tabla, que es una ConstraintCollection. Tambin puede pasar
argumentos de constructor a varias sobrecargas del mtodo Add de ConstraintCollection para crear una
ForeignKeyConstraint.
Al crear una ForeignKeyConstraint, se pueden pasar los valores DeleteRule yUpdateRule al constructor
como argumentos, o se pueden configurar como propiedades, como en el ejemplo siguiente (en que el
valor DeleteRule se establece como None).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
custDS.Tables("CustTable").Columns("CustomerID"), _
custDS.Tables("OrdersTable").Columns("CustomerID"))
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 274 | P g i n a

custOrderFK.DeleteRule = Rule.None
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)

AcceptRejectRule
Los cambios realizados en filas se pueden aceptar con el mtodo AcceptChanges o cancelar con el
mtodo RejectChanges de DataSet, DataTable o DataRow. Si unDataSet contiene ForeignKeyConstraints, al
invocar los mtodos AcceptChanges o RejectChanges se exige AcceptRejectRule. La propiedad
AcceptRejectRule de ForeignKeyConstraint determina qu accin se tomar en las filas secundarias cuando
se llame a AcceptChanges o RejectChanges en la fila primaria.

En la siguiente tabla se incluyen los valores disponibles para AcceptRejectRule.
Establecimiento de
reglas Descripcin
Cascade Acepta o rechaza los cambios en filas secundarias.
Ninguna No realiza ninguna accin en las filas secundarias. ste es el valor
predeterminado.

UniqueConstraint
El objeto UniqueConstraint, que se puede asignar a una sola columna o a una matriz de columnas de
una DataTable, garantiza que todos los datos de las columnas especificadas son nicos en cada fila. Se
puede crear una restriccin nica para una columna o matriz de columnas con el
constructor UniqueConstraint. Pase el objeto UniqueConstraintresultante al mtodo Add de la
propiedad Constraints de la tabla, que es unaConstraintCollection. Tambin puede pasar argumentos de
constructor a varias sobrecargas del mtodo Add de una ConstraintCollection para crear
unaUniqueConstraint. Al crear una UniqueConstraint para una columna o columnas, se puede especificar
opcionalmente si la columna o columnas son una clave principal.
Tambin se puede crear una restriccin nica para una sola columna estableciendo su
propiedad Unique en true. Por otra parte, si se establece la propiedad Unique de una sola columna
en false se quita cualquier restriccin nica que pudiera existir. Si se define una o varias columnas como
clave principal de una tabla se crear automticamente una restriccin nica para la columna o columnas
especificadas. Si quita una columna mediante la propiedad PrimaryKey de una DataTable, se quita
la UniqueConstraint.

En el ejemplo siguiente se crea una UniqueConstraint para dos columnas de una DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUnique As UniqueConstraint = _
New UniqueConstraint(New DataColumn() {custTable.Columns("CustomerID"), _
custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUnique)

Manipular datos en DataTable
Despus de crear una DataTable en un DataSet, se pueden realizar las mismas actividades que al utilizar una
tabla de una base de datos. Se puede agregar, ver, modificar y eliminar datos en la tabla, supervisar los
errores y eventos y consultar los datos de la tabla. Al modificar los datos de una DataTable, tambin se
puede comprobar si los cambios son precisos y determinar si aceptarlos o rechazarlos mediante
programacin.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 275 | P g i n a

Agregar datos a DataTable
Despus de crear una DataTable y definir su estructura usando columnas y restricciones, se le pueden
agregar nuevas filas de datos. Para agregar una nueva fila, declare una nueva variable como tipoDataRow.
Se devuelve un nuevo objeto DataRowcuando se llama al mtodo NewRow. A continuacin,
la DataTable crea el objeto DataRow basndose en la estructura de la tabla, definida por
la DataColumnCollection.

En el ejemplo siguiente se muestra cmo se crea una nueva fila llamando al mtodo NewRow.

Dim workRow As DataRow = workTable.NewRow()

A continuacin, la fila recin agregada se puede manipular mediante un ndice o nombre de columna, como
se muestra en el siguiente ejemplo.

workRow("CustLName") = "Smith"
workRow(1) = "Smith"

Una vez que se han insertado datos en la nueva fila, se utiliza el mtodo Add para agregar la fila a
la DataRowCollection, como se muestra en el siguiente cdigo.

workTable.Rows.Add(workRow)

Tambin se puede llamar al mtodo Add para agregar una nueva fila pasando una matriz de valores, con el
tipo Object, tal y como se muestra en el ejemplo siguiente.

workTable.Rows.Add(new Object() {1, "Smith"})

Si se pasa una matriz de objetos con el tipo Object al mtodo Add, se crea una nueva fila dentro de la tabla y
se establece sus valores de columna en los valores de la matriz de objetos. Tenga en cuenta que los valores
de la matriz se hacen coincidir en secuencia con las columnas, basndose en el orden en que aparecen en la
tabla.

En el siguiente ejemplo se agregan diez filas a la tabla Customers recin creada.

Dim workRow As DataRow
Dim i As Integer

For i = 0 To 9
workRow = workTable.NewRow()
workRow(0) = i
workRow(1) = "CustName" & I.ToString()
workTable.Rows.Add(workRow)
Next

Ver datos en DataTable
Puede tener acceso al contenido de una DataTable mediante las colecciones Rows y Columns de
laDataTable. Se puede utilizar tambin el mtodoSelect() para devolver subconjuntos de los datos de
una DataTable segn ciertos criterios como, por ejemplo, criterios de bsqueda, orden de clasificacin y
estado de la fila. Adems, se puede utilizar el mtodo Find de una DataRowCollection cuando se busque una
fila determinada mediante el valor de una clave principal.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 276 | P g i n a

El mtodo Select del objeto DataTable devuelve un conjunto de objetos DataRow que cumplen con los
criterios especificados. Select toma argumentos opcionales de una expresin de filtro, expresin de
ordenacin y DataViewRowState. La expresin de filtro identifica qu filas se van a devolver basndose en
valores de DataColumn como, por ejemplo, LastName = 'Smith'. La expresin de ordenacin sigue
convenciones SQL estndar para ordenar columnas, por ejemplo LastName ASC, FirstName ASC.

Sugerencia:
Cuando se realizan varias llamadas al mtodo Select de una DataTable, se puede aumentar el rendimiento
mediante la creacin de una DataView para laDataTable. Al crear la DataView, las filas de la tabla se colocan
en un ndice. A continuacin, el mtodo Select utiliza ese ndice, lo que reduce considerablemente el tiempo
necesario para generar el resultado de la consulta..

El mtodo Select determina qu versin de las filas se debe ver o manipular, segn un DataViewRowState.
En la siguiente tabla se recogen los posibles valores de la enumeracinDataViewRowState.

Valor
DataViewRowState
Descripcin
CurrentRows Filas actuales, incluidas las filas sin modificar, agregadas y modificadas.
Deleted Una fila eliminada.
ModifiedCurrent Una versin actual, que es una versin modificada de los datos originales.
(Vea ModifiedOriginal.)
ModifiedOriginal Versin original de todas las filas modificadas. La versin actual est disponible
utilizando ModifiedCurrent.
Added Una fila nueva.
Ninguna Ninguna.
OriginalRows Filas originales, incluidas las filas sin modificar y las eliminadas.
Unchanged Una fila sin modificar.

En el ejemplo siguiente, el objeto DataSet se filtra de manera que se trabaje slo con las filas
cuyo DataViewRowState est establecido en CurrentRows.

Dim column As DataColumn
Dim row As DataRow

Dim currentRows() As DataRow = _
workTable.Select(Nothing, Nothing, DataViewRowState.CurrentRows)

If (currentRows.Length < 1 ) Then
Console.WriteLine("No Current Rows Found")
Else
For Each column in workTable.Columns
Console.Write(vbTab & column.ColumnName)
Next
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 277 | P g i n a


Console.WriteLine(vbTab & "RowState")

For Each row In currentRows
For Each column In workTable.Columns
Console.Write(vbTab & row(column).ToString())
Next

Dim rowState As String = _
System.Enum.GetName(row.RowState.GetType(), row.RowState)
Console.WriteLine(vbTab & rowState)
Next
End If

El mtodo Select se puede utilizar para devolver filas con valores de RowState o valores de campo distintos.
En el ejemplo siguiente se devuelve una matriz DataRow que hace referencia a todas las filas que se han
eliminado y se devuelve otra matriz DataRow que hace referencia a todas las filas, ordenadas
por CustLName, donde la columna CustID es mayor que 5.

' Retrieve all deleted rows.
Dim deletedRows() As DataRow = workTable.Select(Nothing, Nothing, DataViewRowState.Deleted)

' Retrieve rows where CustID > 5, and order by CustLName.
Dim custRows() As DataRow = workTable.Select( _
"CustID > 5", "CustLName ASC")

El mtodo Load
Se puede utilizar el mtodo Load para cargar unaDataTable con filas desde un origen de datos. Se trata de
un mtodo sobrecargado que, en su formato ms sencillo, acepta un nico parmetro, unDataReader. En
este formato, simplemente se cargan filas en la DataTable. Si lo desea, puede especificar el
parmetro LoadOption para controlar el modo en que se agregan los datos a la DataTable.
El parmetro LoadOption resulta especialmente til en aquellos casos en los que laDataTable ya contiene
filas de datos, porque describe como se combinan los datos que provienen del origen de datos con los datos
que ya existentes en la tabla. Por ejemplo,PreserveCurrentValues (predeterminado) especifica que en
aquellos casos en los que una fila se marque como Added en la DataTable, el valor Original de cada columna
se establece en el valor del contenido de la fila coincidente del origen de datos. El valor Current conserva los
valores asignados al agregarse la fila y el RowState de la fila se establece enChanged.

En la siguiente tabla se ofrece una breve descripcin de los valores de enumeracin LoadOption.
Valor LoadOption Descripcin
OverwriteRow Si las filas entrantes tienen el mismo valorPrimaryKey que una fila ya
existente en laDataTable, los valores Original y Current de cada columna se
sustituyen por los valores de la fila entrante y la propiedad RowState se
establece enUnchanged.
Las filas del origen de datos que an no existen en la DataTable se agregan
con un valor RowState deUnchanged.
Esta opcin activa actualiza el contenido de laDataTable, para que coincida
con el del origen de datos.
PreserveCurrentValues Si las filas entrantes tienen el mismo valorPrimaryKey que una fila ya
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 278 | P g i n a

(predeterminado) existente en laDataTable, el valor Original se establece en el valor del
contenido de la fila entrante y no se modifica el valor Current.
Si el RowState es Added o Modified, se establece en Modified.
Si el RowState fue Deleted, sigue siendo Deleted.
Las filas del origen de datos que an no existen en la DataTable se agregan y
el RowState se establece en Unchanged.
UpdateCurrentValues Si las filas entrantes tienen el mismo valorPrimaryKey que la fila existente en
la DataTable, se copia el valor Current al valor Original y, a continuacin, el
valor Current se establece en el contenido de la fila entrante.
Si el RowState de la DataTable fue Added, elRowState sigue siendo Added.
Las filas marcadas como Modified o Deleted, el RowState es Modified.
Las filas del origen de datos que an no existen en la DataTable se agregan y
el RowState se establece en Added.

En el siguiente ejemplo se utiliza el mtodo Load para mostrar una lista de cumpleaos de los empleados de
la base de datos Northwind.

Private Sub LoadBirthdays(ByVal connectionString As String)
' Assumes that connectionString is a valid connection string
' to the Northwind database on SQL Server.
Dim queryString As String = _
"SELECT LastName, FirstName, BirthDate " & _
" FROM dbo.Employees " & _
"ORDER BY BirthDate, LastName, FirstName"

' Open and fill a DataSet.
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
queryString, connectionString)
Dim employees As New DataSet
adapter.Fill(employees, "Employees")

' Create a SqlDataReader for use with the Load Method.
Dim reader As DataTableReader = employees.GetDataReader()

' Create an instance of DataTable and assign the first
' DataTable in the DataSet.Tables collection to it.
Dim dataTableEmp As DataTable = employees.Tables(0)

' Fill the DataTable with data by calling Load and
' passing the SqlDataReader.
dataTableEmp.Load(reader, LoadOption.OverwriteRow)

' Loop through the rows collection and display the values
' in the console window.
Dim employeeRow As DataRow
For Each employeeRow In dataTableEmp.Rows
Console.WriteLine("{0:MM\\dd\\yyyy}" & ControlChars.Tab & _
"{1}, {2}", _
employeeRow("BirthDate"), _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 279 | P g i n a

employeeRow("LastName"), _
employeeRow("FirstName"))
Next employeeRow

' Keep the window opened to view the contents.
Console.ReadLine()
End Sub

Editar DataTable
Cuando se cambian los valores de las columnas en una DataRow, los cambios se sitan inmediatamente en
el estado actual de la fila. A continuacin, elDataRowState se establece en Modified y los cambios se
aceptan o se rechazan mediante los mtodos AcceptChanges o RejectChanges de la DataRow. DataRow
proporciona tambin tres mtodos que se pueden usar para suspender el estado de la fila mientras se est
editando. Estos mtodos son BeginEdit, EndEdit y CancelEdit.
Cuando se modifican los valores de columna de una DataRow directamente, DataRowadministra los valores
de columna mediante las versiones de fila Current, Default yOriginal. Adems de estas versiones de fila, los
mtodos BeginEdit, EndEdit y CancelEditutilizan una cuarta versin de fila: Proposed.
La versin de fila Proposed propuesta existe mientras dura una operacion de edicin que se inicia llamando
a BeginEdit y finaliza mediante EndEdit o CancelEdit, o bien llamando aAcceptChanges o RejectChanges.
Durante la operacin de edicin se puede aplicar la lgica de validacin a las columnas individualmente
evaluando el ProposedValue del evento ColumnChanged de la DataTable. El evento ColumnChanged
contiene DataColumnChangeEventArgs que guardan una referencia a la columna que se est cambiando y
al ProposedValue. Despus de evaluar el valor propuesto, se puede modificar o cancelar la edicin. Cuando
termina la operacin de edicin, la fila abandona el estado de Proposed.
Las modificaciones se pueden confirmar llamando a EndEdit o cancelar llamando aCancelEdit. Tenga en
cuenta que aunque EndEdit confirma las modificaciones, DataSet no las acepta realmente hasta que se
llama a AcceptChanges. Tambin hay que tener en cuenta que si se llama a AcceptChanges antes de finalizar
la operacin de edicin conEndEdit o CancelEdit, dicha edicin finaliza y los valores de fila Proposed se
aceptan en las dos versiones de fila: Current y Original. De la misma manera, si se llama aRejectChanges, se
finaliza la edicin y se descartan las versiones de fila Current yProposed. Una llamada a EndEdit o CancelEdit
despus de llamar a AcceptChanges oRejectChanges no tiene ningn efecto porque la edicin ya ha
finalizado.
En el ejemplo siguiente se muestra cmo se utilizan BeginEdit con EndEdit y CancelEdit. En el ejemplo
tambin se comprueba el ProposedValue del evento ColumnChanged y se decide si cancelar la edicin.

Dim workTable As DataTable = New DataTable
workTable.Columns.Add("LastName", Type.GetType("System.String"))

AddHandler workTable.ColumnChanged, _
New DataColumnChangeEventHandler(AddressOf OnColumnChanged)

Dim workRow As DataRow = workTable.NewRow()
workRow(0) = "Smith"
workTable.Rows.Add(workRow)

workRow.BeginEdit()
' Causes the ColumnChanged event to write a message and cancel the edit.
workRow(0) = ""
workRow.EndEdit()

' Displays "Smith, New".
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 280 | P g i n a

Console.WriteLine("{0}, {1}", workRow(0), workRow.RowState)


Private Shared Sub OnColumnChanged( _
sender As Object, args As DataColumnChangeEventArgs)
If args.Column.ColumnName = "LastName" Then
If args.ProposedValue.ToString() = "" Then
Console.WriteLine("Last Name cannot be blank. Edit canceled.")
args.Row.CancelEdit()
End If
End If
End Sub

Estados de fila y versiones de fila
ADO .NET administra las filas de las tablas mediante estados de fila y versiones de fila. Un estado de fila
indica el estado de una fila; las versiones de fila mantienen los valores almacenados en una fila en cuanto se
modifica, incluyendo los valores actuales, originales y predeterminados. Por ejemplo, despus de realizar
una modificacin en una columna de una fila, sta adquiere el estado de fila Modified y dos versiones de
fila:Current, que contiene los valores actuales de fila, y Original, que contiene los valores de fila antes de la
modificacin de la columna.
Cada objeto DataRow cuenta con la propiedad RowState que puede examinar para determinar el estado
actual de la fila. En la siguiente tabla se ofrece una breve descripcin de los valores de enumeracin
de RowState.

Valor de
RowState Descripcin
Unchanged No se han hecho cambios desde la ltima llamada aAcceptChanges o desde
que DataAdapter.Fill cre la fila.
Added Se ha agregado la fila a la tabla, pero no se ha llamado aAcceptChanges.
Modified Se ha cambiado algn elemento de la fila.
Deleted Se ha eliminado la fila de una tabla y no se ha llamado aAcceptChanges.
Detached La fila no forma parte de ninguna DataRowCollection. El valor deRowState de una fila
recin creada se establece en Detached. Una vez que se ha agregado la nueva DataRow a
DataRowCollection llamando al mtodo Add, el valor de la propiedad RowState se
establece en Added.
Tambin se establece Detached en una fila que se ha quitado de una DataRowCollection
con el mtodo Remove, o mediante el mtodo Delete seguido del mtodo AcceptChanges.

Si se llama a AcceptChanges en un objeto DataSet, DataTable o DataRow, se quitan todas las filas con el
estado de fila Deleted. Las filas que quedan reciben el estado de filaUnchanged y los valores de la versin de
fila Original se sobrescriben con los valores de la versin de fila Current. Si se llama a RejectChanges, se
quitan todas las filas con el estado de fila Added. Las filas que quedan reciben el estado de fila Unchanged y
los valores de la versin de fila Current se sobrescriben con los valores de la versin de fila Original.
Las distintas versiones de una fila se pueden ver pasando un parmetro DataRowVersion con la referencia
de la columna, como se muestra en el ejemplo siguiente.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 281 | P g i n a

Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()

En la siguiente tabla se ofrece una breve descripcin de los valores de enumeracin deDataRowVersion.
Valor de
DataRowVersion Descripcin
Current Valores actuales de la fila. Esta versin de fila no est disponible para filas con un
valor Deleted en RowState.
Default sta es la versin de fila predeterminada para una fila determinada. La versin de fila
predeterminada para una fila Added, Modified o Unchanged es Current. La versin
de fila predeterminada para una fila Deleted es Original. La versin de fila
predeterminada para una fila Detached esProposed.
Original Valores originales de la fila. Esta versin de fila no est disponible para filas con un
valor Added en RowState.
Proposed Valores propuestos para la fila. Esta versin de fila existe mientras dura una
operacin de edicin en una fila, o para una fila que no forma parte de
una DataRowCollection.

Se puede comprobar si una DataRow tiene una versin de fila concreta llamando al mtodo HasVersion y
pasando DataRowVersion como argumento.
Por ejemplo, DataRow.HasVersion(DataRowVersion.Original) devolver false para las filas recin agregadas
antes de llamar a AcceptChanges.
En el siguiente ejemplo de cdigo, se muestran los valores en todas las filas eliminadas de una tabla. Las
filas Deleted no tienen una versin de fila Current y, por lo tanto, debe pasar
DataRowVersion.Original cuando obtenga acceso a los valores de columna.

Dim catTable As DataTable = catDS.Tables("Categories")

Dim delRows() As DataRow = catTable.Select(Nothing, Nothing, DataViewRowState.Deleted)

Console.WriteLine("Deleted rows:" & vbCrLf)

Dim catCol As DataColumn
Dim delRow As DataRow

For Each catCol In catTable.Columns
Console.Write(catCol.ColumnName & vbTab)
Next
Console.WriteLine()

For Each delRow In delRows
For Each catCol In catTable.Columns
Console.Write(delRow(catCol, DataRowVersion.Original) & vbTab)
Next
Console.WriteLine()
Next

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 282 | P g i n a

Eliminar DataRow
Existen dos mtodos para eliminar un objeto DataRowde un objetoDataTable: el mtodo Remove del
objeto DataRowCollection y el mtodo Delete del objeto DataRow. Mientras que el mtodo Removeelimina
un objeto DataRow de laDataRowCollection, el mtodo Delete nicamente lo marca para su eliminacin. La
eliminacin propiamente dicha se produce cuando la aplicacin llama al mtodo AcceptChanges. Si se
usa Delete, se puede comprobar mediante programacin qu filas estn marcadas para eliminacin antes de
quitarlas. Cuando una fila est marcada para eliminacin, su propiedad RowState est establecida
en Deleted.
Si utiliza un DataSet o una DataTable en combinacin con un DataAdapter y un origen de datos relacional,
utilice el mtodo Delete de la DataRow para quitar la fila. El mtodo Deletemarca la fila
como Deleted en DataSet o DataTable pero no la quita. En su lugar, cuando elDataAdapter encuentra una
fila marcada como Deleted, ejecuta el mtodo DeleteCommand para eliminar la fila en el origen de datos. A
continuacin se puede quitar la fila permanentemente utilizando el mtodo AcceptChanges. Si
utiliza Remove para quitar la fila, sta desaparecer por completo de la tabla, pero el DataAdapter no
eliminar la fila del origen de datos.
El mtodo Remove de la DataRowCollection toma una DataRow como argumento y la quita de la coleccin,
como se muestra en el ejemplo siguiente.

workTable.Rows.Remove(workRow)

Por el contrario, en el siguiente ejemplo se muestra cmo se llama al mtodo Delete en unaDataRow para
cambiar el RowState a Deleted.

workRow.Delete

Si una fila est marcada para eliminacin y se llama al mtodo AcceptChanges del objetoDataTable, la fila se
quita de la DataTable. Por el contrario, si se llama a RejectChanges, el RowState de la fila vuelve a ser el que
era antes de que se marcara como Deleted.

Nota:
Si el RowState de una DataRow se Added, lo que quiere decir que se acaba de agregar a la tabla y, a
continuacin, se marca como Deleted, se quita de la tabla.

AcceptChanges y RejectChanges
Despus de comprobar la exactitud de los cambios realizados en una DataTable, se pueden aceptar con el
mtodo AcceptChanges de DataRow, DataTable oDataSet, que configurar los valores de fila Currentde
modo que sean los valores Original y establecer la propiedad RowState en Unchanged. Si se aceptan o se
rechazan los cambios, se elimina la informacin de RowError y se establece la propiedad HasErrors en false.
Aceptar o rechazar cambios tambin puede afectar a la actualizacin de datos en el origen de datos.
Si hay restricciones de clave externa en la DataTable, los cambios que se acepten o se rechacen
con AcceptChanges y RejectChanges se propagan a las filas secundarias de laDataRow de acuerdo con
la ForeignKeyConstraint.AcceptRejectRule.
En el ejemplo siguiente se comprueba si hay filas con errores, se resuelven los errores que haya y se
rechazan las filas en las que no se puede resolver el error. Tenga en cuenta que, en los errores que se
resuelven, el valor RowError se restablece en una cadena vaca, con lo que la propiedad HasErrors se
establece en false. Una vez que se han resuelto o rechazado todas las filas con errores, se llama
a AcceptChanges para aceptar todos los cambios de toda la DataTable.

If workTable.HasErrors Then
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 283 | P g i n a

Dim errRow As DataRow

For Each errRow in workTable.GetErrors()

If errRow.RowError = "Total cannot exceed 1000." Then
errRow("Total") = 1000
errRow.RowError = "" ' Clear the error.
Else
errRow.RejectChanges()
End If
Next
End If

workTable.AcceptChanges()

DataViews (ADO.NET)
Una DataView le permite crear diferentes vistas de los datos almacenados en una DataTable, una capacidad
que suele utilizarse en aplicaciones de enlace a datos. Mediante una DataView puede exponer los datos de
una tabla con distintos criterios de ordenacin y filtrar los datos por el estado de fila o basndose en una
expresin de filtro.
Una DataView proporciona una vista de datos dinmica en la DataTable subyacente: el contenido, el orden
y la pertenencia reflejan los cambios en cuanto se producen. Este comportamiento difiere del
mtodo Select de la DataTable, que devuelve una matriz deDataRow de una tabla basada en un filtro o un
orden determinados: estecontenido refleja cambios en la tabla subyacente, pero la pertenencia y la
ordenacin siguen siendo estticas. Las capacidades dinmicas de la DataView hacen que resulte ideal para
las aplicaciones de enlace a datos.
Una DataView proporciona una vista dinmica de un nico conjunto de datos, similar a la vista de una base
de datos, a la que puede aplicar distintos criterios de ordenacin y filtrado. Sin embargo, al contrario que
una vista de base de datos, una DataView no puede tratarse como una tabla y no puede proporcionar una
vista de tablas combinadas. Tampoco puede excluir columnas que existen en la tabla de origen ni puede
anexar columnas, como columnas de clculo, que no existen en la tabla de origen.
Puede utilizar un DataViewManager para administrar la configuracin de vista para todas las tablas de
un DataSet. El DataViewManager proporciona una forma cmoda de administrar la configuracin de vista
predeterminada para cada tabla. Al enlazar un control a ms de una tabla de un DataSet, el enlace a
un DataViewManager es la eleccin ideal.

Crear DataView (ADO.NET)
Hay dos formas de crear una DataView. Puede utilizar el constructor DataView o puede crear una referencia
a la propiedad DefaultView de laDataTable. El constructor DataView puede estar vaco o puede aceptar
tambin DataTable como nico argumento o DataTable junto con el criterio de filtro o de ordenacin, y un
filtro de estado de fila.
Como el ndice de una DataView se crea al mismo tiempo que DataView y cuando se modifica alguna de las
propiedades Sort, RowFilter o RowStateFilter, conseguir un rendimiento ptimo si suministra cualquier
criterio inicial de ordenacin o filtro como argumentos del constructor al crear la DataView. Al crear
una DataView sin especificar criterios de ordenacin o de filtro y establecer posteriormente las
propiedades Sort,RowFilter o RowStateFilter hace que el ndice se construya dos veces como mnimo: una
vez al crear la DataView y otra vez ms al modificar cualquiera de las propiedades de ordenacin o filtro.
Tenga en cuenta que si crea la DataView con el constructor que no toma ningn argumento, no podr
utilizar la DataView hasta que no establezca la propiedad Table.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 284 | P g i n a

En el ejemplo de cdigo siguiente se muestra cmo crear una DataView con el constructorDataView. Con
la DataTable se suministran un RowFilter, una columna Sort y unDataViewRowState.

Dim custDV As DataView = New DataView(custDS.Tables("Customers"), _
"Country = 'USA'", _
"ContactName", _
DataViewRowState.CurrentRows)

En el siguiente ejemplo de cdigo se muestra cmo obtener una referencia a la DataViewpredeterminada
de una DataTable mediante la propiedad DefaultView de la tabla.

Dim custDV As DataView = custDS.Tables("Customers").DefaultView

Ordenar y filtrar datos (ADO.NET)
La DataView proporciona varias formas de ordenacin y filtrado de datos en una DataTable:
Mediante la propiedad Sort puede especificar criterios simples o mltiples de ordenacin de
columnas e incluir parmetros ASC (ascendente) y DESC (descendente).
Mediante la propiedad ApplyDefaultSort puede crear automticamente un criterio de ordenacin,
en orden ascendente, basado en la columna o columnas de clave principal de la
tabla. ApplyDefaultSort slo se aplica cuando la propiedad Sort es una referencia nula o una cadena
vaca y cuando la tabla tiene definida una clave principal.
Mediante la propiedad RowFilter puede especificar subconjuntos de filas basndose en sus valores
de columna.
Si desea devolver los resultados de una consulta determinada en los datos, en lugar de proporcionar una
vista dinmica de un subconjunto de los datos, para conseguir el mximo rendimiento utilice los
mtodos Find o FindRows de la DataView en lugar de establecer la propiedad RowFilter. El establecimiento
de la propiedad RowFilter hace que se vuelva a generar el ndice de los datos, lo que agrega sobrecarga a la
aplicacin y reduce el rendimiento. La propiedad RowFilter es ms idnea en una aplicacin enlazada a
datos donde un control enlazado muestra resultados filtrados. Los mtodosFind y FindRows aprovechan el
ndice actual, sin necesidad de volver a generarlo.
Mediante la propiedad RowStateFilter puede especificar las versiones de fila que desea ver.
La DataView administra implcitamente qu versin de fila exponer, dependiendo del RowState de
la fila subyacente. Por ejemplo, si el RowStateFilter est establecido
como DataViewRowState.Deleted, la DataView expone la versin de filaOriginal de todas las
filas Deleted porque no hay ninguna versin de fila Current. Mediante la propiedad RowVersion de
la DataRowView puede determinar qu versin de una fila se est exponiendo.

En la siguiente tabla se muestran las opciones de DataViewRowState.
Opciones de
DataViewRowState
Descripcin
CurrentRows La versin de fila Current de todas las filas Unchanged, Added y Modified. ste es el
valor predeterminado.
Added La versin de fila Current de todas las filas Added.
Deleted La versin de fila Original de todas las filas Deleted.
ModifiedCurrent La versin de fila Current de todas las filas Modified.
ModifiedOriginal La versin de fila Original de todas las filas Modified.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 285 | P g i n a

Ninguna Ninguna fila.
OriginalRows La versin de fila Original de todas las filas Unchanged, Modified y Deleted.
Unchanged La versin de fila Current de todas las filas Unchanged.

En el siguiente ejemplo de cdigo se crea una vista que muestra todos los productos cuyo nmero de
unidades en existencia es menor o igual que el nivel de nuevo pedido, ordenados en primer lugar por id. de
proveedor y despus por nombre de producto.

Dim prodView As DataView = New DataView(prodDS.Tables("Products"), _
"UnitsInStock <= ReorderLevel", _
"SupplierID, ProductName", _
DataViewRowState.CurrentRows)

DataRows y DataRowViews (ADO.NET)
Un DataView expone una coleccin enumerable de objetos DataRowView. Los objetos DataRowView
exponen valores como matrices de objetos indizadas por el nombre o la referencia ordinal de la columna de
la tabla subyacente. Mediante la propiedad Row puede tener acceso a la DataRow expuesta por la
propiedad DataRowView de laDataRowView.
Cuando se ven valores mediante DataRowView, la propiedad RowStateFilter de la DataView determina qu
versin de fila de la DataRow subyacente se expone.
El siguiente ejemplo de cdigo muestra todos los valores actuales y originales de una tabla.

Dim catView As DataView = New DataView(catDS.Tables("Categories"))
Console.WriteLine("Current Values:")
WriteView(catView)
Console.WriteLine("Original Values:")
catView.RowStateFilter = DataViewRowState.ModifiedOriginal
WriteView(catView)

Public Shared Sub WriteView(thisDataView As DataView)
Dim rowView As DataRowView
Dim i As Integer

For Each rowView In thisDataView
For i = 0 To thisDataView.Table.Columns.Count - 1
Console.Write(rowView(i) & vbTab)
Next
Console.WriteLine()
Next
End Sub

Buscar filas (ADO.NET)
Es posible buscar filas en funcin de los valores clave de ordenacin mediante los
mtodos Find y FindRowsde la DataView. La diferenciacin entre maysculas y minsculas de los valores de
bsqueda en los mtodos Find y FindRows est determinada por la propiedad CaseSensitive de
la DataTablesubyacente. Los valores de bsqueda deben coincidir en su totalidad con los valores de clave de
ordenacin existentes para que se devuelva un resultado.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 286 | P g i n a

El mtodo Find devuelve un entero con el ndice de la DataRowView que coincide con los criterios de
bsqueda. Si ms de una fila coincide con los criterios de bsqueda, slo se devolver el ndice de la
primera DataRowView coincidente. Si no se encuentra ninguna coincidencia, Find devuelve -1.
Para devolver resultados de la bsqueda que coincidan con varias filas, utilice el
mtodoFindRows. FindRows funciona igual que el mtodo Find, excepto en que devuelve una matriz
de DataRowView que hace referencia a todas las filas coincidentes de la DataView. Si no se encuentra
ninguna coincidencia, la matriz de DataRowView estar vaca.
Para utilizar los mtodos Find o FindRows debe especificar un criterio de ordenacin; para ello,
establezca ApplyDefaultSort como true o utilice la propiedad Sort. Si no se especifica ningn criterio de
ordenacin, se inicia una excepcin.
Los mtodos Find y FindRows toman como entrada una matriz de valores cuya longitud coincide con el
nmero de columnas del criterio de ordenacin. En el caso de una ordenacin por una nica columna,
puede pasar un nico valor. Para los criterios de ordenacin que contienen varias columnas, debe pasar una
matriz de objetos. Tenga en cuenta que para una ordenacin segn varias columnas, los valores de la matriz
de objetos deben coincidir con el orden de las columnas especificado en la propiedad Sort de DataView.
En el siguiente ejemplo de cdigo se muestra una llamada al mtodo Find en una DataViewcon un criterio
de ordenacin de una nica columna.

Dim custView As DataView = _
New DataView(custDS.Tables("Customers"), "", _
"CompanyName", DataViewRowState.CurrentRows)

Dim rowIndex As Integer = custView.Find("The Cracker Box")

If rowIndex = -1 Then
Console.WriteLine("No match found.")
Else
Console.WriteLine("{0}, {1}", _
custView(rowIndex)("CustomerID").ToString(), _
custView(rowIndex)("CompanyName").ToString())
End If

Si la propiedad Sort especifica varias columnas, debe pasar una matriz de objetos con los valores de
bsqueda de cada columna en el orden especificado por la propiedad Sort, como en el siguiente ejemplo de
cdigo.

Dim custView As DataView = _
New DataView(custDS.Tables("Customers"), "", _
"CompanyName, ContactName", _
DataViewRowState.CurrentRows)

Dim foundRows() As DataRowView = _
custView.FindRows(New object() {"The Cracker Box", "Liu Wong"})

If foundRows.Length = 0 Then
Console.WriteLine("No match found.")
Else
Dim myDRV As DataRowView
For Each myDRV In foundRows
Console.WriteLine("{0}, {1}", _
myDRV("CompanyName").ToString(), myDRV("ContactName").ToString())
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 287 | P g i n a

Next
End If

Modificar objetos DataView (ADO.NET)
Puede utilizar DataView para agregar, eliminar o modificar filas de datos de la tabla subyacente. La
posibilidad de utilizar DataView para modificar los datos de la tabla subyacente se controla estableciendo
una de las tres propiedades booleanas de DataView. Dichas propiedades son AllowNew, AllowEdit y
AllowDelete. Estn establecidas como true de forma predeterminada.
Si AllowNew tiene el valor true, puede utilizar el mtodo AddNew de la DataView para crear una
nueva DataRowView. Tenga en cuenta que no se agrega realmente una nueva fila a laDataTable subyacente
hasta que se llama al mtodo EndEdit de la DataRowView. Si se llama al mtodo CancelEdit de
la DataRowView, se descartar la nueva fila. Tenga en cuenta tambin que slo puede modificar
una DataRowView cada vez. Si se llama al mtodoAddNew o BeginEdit de la DataRowView mientras hay
una fila pendiente, se llamar implcitamente a EndEdit en la fila pendiente. Cuando se llama a EndEdit se
aplican los cambios a la DataTable subyacente; ms tarde se pueden confirmar o rechazar mediante los
mtodos AcceptChanges o RejectChanges del objeto DataTable, DataSet o DataRow. Cuando AllowNew
tiene el valor false, se iniciar una excepcin si llama al mtodo AddNewde la DataRowView.
Si AllowEdit tiene el valor true, puede modificar el contenido de la DataRow medianteDataRowView. Puede
confirmar los cambios realizados en la fila subyacente medianteDataRowView.EndEdit o rechazarlos
con DataRowView.CancelEdit. Tenga en cuenta que slo puede modificar una fila cada vez. Si se llama al
mtodo AddNew o BeginEdit de laDataRowView mientras hay una fila pendiente, se llamar implcitamente
a EndEdit en la fila pendiente. Cuando se llama a EndEdit, los cambios propuestos se ponen en la versin de
filaCurrent de la DataRow subyacente; ms tarde se pueden confirmar o rechazar mediante los
mtodos AcceptChanges o RejectChanges del objeto DataTable, DataSet o DataRow. Cuando AllowEdit
tiene el valor false, se iniciar una excepcin si intenta modificar un valor de la DataRowView.
Cuando se est modificando una DataRowView existente, seguirn provocndose eventos con los cambios
propuestos de la DataTable subyacente. Tenga en cuenta que si llama aEndEdit o a CancelEdit en
la DataRow subyacente, los cambios pendientes se aplicarn o se cancelarn independientemente de que se
llame o no a EndEdit o a CancelEdit en laDataRowView.
Si AllowDelete tiene el valor true, puede eliminar filas en la DataView mediante el mtodoDelete del
objeto DataView o DataRowView y las filas se eliminarn de la DataTablesubyacente. Ms tarde puede
confirmar o rechazar las eliminaciones medianteAcceptChanges o RejectChanges, respectivamente. Cuando
AllowDelete tiene el valorfalse, se iniciar una excepcin si llama al mtodo Delete del
objeto DataView oDataRowView.
En el siguiente ejemplo de cdigo se deshabilita el uso de DataView para eliminar filas y se agrega una
nueva fila a la tabla subyacente mediante la DataView.

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custView As DataView = custTable.DefaultView
custView.Sort = "CompanyName"

custView.AllowDelete = False

Dim newDRV As DataRowView = custView.AddNew()
newDRV("CustomerID") = "ABCDE"
newDRV("CompanyName") = "ABC Products"
newDRV.EndEdit()

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 288 | P g i n a

Administrar DataViews (ADO.NET)
Puede utilizar un DataViewManager para administrar la configuracin de vista para todas las tablas de
unDataView. Si tiene un control que desea enlazar a varias tablas, como una cuadrcula que navega por
relaciones, es ideal utilizar un DataViewManager.
El DataViewManager contiene una coleccin de objetos DataViewSetting que se utilizan para establecer la
configuracin de vista de las tablas del DataSet. La DataViewSettingCollection contiene un objeto
DataViewSetting para cada tabla de un DataSet. Puede establecer las propiedades ApplyDefaultSort,
Sort, RowFilter y RowStateFilter predeterminadas de la tabla a la que se hace referencia mediante
su DataViewSetting. Puede hacer referencia alDataViewSetting de una tabla determinada por su nombre o
por su referencia ordinal, o si pasa una referencia a dicho objeto de tabla. Puede tener acceso a la coleccin
de objetosDataViewSetting de un DataViewManager mediante la propiedad DataViewSettings.
En el siguiente cdigo de ejemplo se rellena un DataSet con las tablas Customers, Orders yOrder Details de
la base de datos Northwind de SQL Server, se crean las relaciones entre las tablas, se utiliza
un DataViewManager para establecer la configuracin predeterminada de DataView y se enlaza
una DataGrid al DataViewManager. En el ejemplo se establece la configuracin predeterminada
de DataView para todas las tablas del DataSet de manera que se ordene segn la clave principal de la tabla
(ApplyDefaultSort = true) y se modifica el criterio de ordenacin de la tabla Customers para que se ordene
por CompanyName.

' Assumes connection is a valid SqlConnection to Northwind.
' Create a Connection, DataAdapters, and a DataSet.
Dim custDA As SqlDataAdapter = New SqlDataAdapter( _
"SELECT CustomerID, CompanyName FROM Customers", connection)
Dim orderDA As SqlDataAdapter = New SqlDataAdapter( _
"SELECT OrderID, CustomerID FROM Orders", connection)
Dim ordDetDA As SqlDataAdapter = New SqlDataAdapter( _
"SELECT OrderID, ProductID, Quantity FROM [Order Details]", connection)

Dim custDS As DataSet = New DataSet()

' Open the Connection.
connection.Open()

' Fill the DataSet with schema information and data.
custDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
orderDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
ordDetDA.MissingSchemaAction = MissingSchemaAction.AddWithKey

custDA.Fill(custDS, "Customers")
orderDA.Fill(custDS, "Orders")
ordDetDA.Fill(custDS, "OrderDetails")

' Close the Connection.
connection.Close()

' Create relationships.
custDS.Relations.Add("CustomerOrders", _
custDS.Tables("Customers").Columns("CustomerID"), _
custDS.Tables("Orders").Columns("CustomerID"))

custDS.Relations.Add("OrderDetails", _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 289 | P g i n a

custDS.Tables("Orders").Columns("OrderID"), _
custDS.Tables("OrderDetails").Columns("OrderID"))

' Create default DataView settings.
Dim viewManager As DataViewManager = New DataViewManager(custDS)

Dim viewSetting As DataViewSetting
For Each viewSetting In viewManager.DataViewSettings
viewSetting.ApplyDefaultSort = True
Next

viewManager.DataViewSettings("Customers").Sort = "CompanyName"

' Bind to a DataGrid.
Dim grid As System.Windows.Forms.DataGrid = New System.Windows.Forms.DataGrid()
grid.SetDataBinding(viewManager, "Customers")

LINQ

Introduccin a LINQ en Visual Basic
Language-Integrated Query (LINQ) agrega funcionalidades de consulta a Visual Basic y proporciona
funcionalidades sencillas y eficaces para trabajar con todo tipo de datos. En lugar de enviar una consulta a
una base de datos para que se procese o trabajar con distintas sintaxis de consulta para cada tipo de datos
que busque, LINQ presenta las consultas como parte del lenguaje de Visual Basic. Utiliza una sintaxis
unificada independientemente del tipo de datos.
LINQ permite consultar datos desde una base de datos de SQL Server, XML, matrices y colecciones en
memoria, conjuntos de datos ADO.NET o cualquier otro origen de datos remoto o local que admita LINQ.
Puede hacer todo esto con elementos comunes del lenguaje Visual Basic. Puesto que las consultas se
escriben en el lenguaje Visual Basic, sus resultados se devuelven como objetos con establecimiento
inflexible de tipos. Estos objetos admiten IntelliSense; por tanto, se puede escribir cdigo ms rpidamente
y detectar los errores de las consultas en tiempo de compilacin en vez de en tiempo de ejecucin. Las
consultas LINQ se pueden usar como el origen de consultas adicionales para refinar los resultados. Tambin
se pueden enlazar a los controles para que los usuarios puedan ver y modificar con facilidad los resultados
de la consulta.
Por ejemplo, el ejemplo de cdigo siguiente muestra una consulta LINQ que devuelve una lista de clientes
de una coleccin y los agrupa basndose en su ubicacin.

Dim customers As List(Of Customer) = GetCustomerList()

Dim customersByCountry = From cust In customers _
Order By cust.Country, cust.City _
Group By CountryName = cust.Country _
Into RegionalCustomers = Group, Count() _
Order By CountryName

For Each country In customersByCountry
Console.WriteLine(country.CountryName & _
" (" & country.Count & ")" & vbCrLf)

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 290 | P g i n a

For Each customer In country.RegionalCustomers
Console.WriteLine(vbTab & customer.CompanyName & _
" (" & customer.City & ")")
Next
Next

Proveedores LINQ
Un proveedor LINQ asigna las consultas LINQ de Visual Basic al origen de datos que se consulta. Al escribir
una consulta LINQ, el proveedor toma la consulta y la traduce a los comandos que podr ejecutar el origen
de datos. Adems, convierte los datos del origen en los objetos que constituyen el resultado de la consulta.
Finalmente, convierte los objetos en datos cuando enve actualizaciones al origen de datos.

Visual Basic incluye los siguientes proveedores LINQ.

LINQ to Objects
El proveedor LINQ to Objects permite consultar colecciones y matrices en memoria. Si un objeto admite las
interfaces IEnumerable o IEnumerable(T), el proveedor LINQ to Objects permite consultarlo.
Puede habilitar el proveedor LINQ to Objects importando el espacio de nombresSystem.Linq, que se importa
de forma predeterminada para todos los proyectos de Visual Basic.

LINQ to SQL
El proveedor LINQ to SQL permite consultar y modificar los datos de una base de datos de SQL Server. De
esta forma, es fcil asignar el modelo de objetos de una aplicacin a las tablas y los objetos de una base de
datos.
Visual Basic facilita el trabajo con LINQ to SQL incluyendo el Diseador relacional de objetos (Diseador
R/O). Este diseador se utiliza para crear un modelo de objetos en una aplicacin que se asigna a objetos de
una base de datos. El Diseador relacional de objetos tambin proporciona funcionalidad para asignar
procedimientos y funciones almacenados al objeto DataContext, que administra la comunicacin con la base
de datos y almacena el estado de las comprobaciones de simultaneidad optimista.

LINQ to XML
El proveedor LINQ to XML permite consultar y modificar XML. Puede modificar XML en memoria o puede
cargarlo desde un archivo y guardarlo en l.
Adems, el proveedor LINQ to XML habilita literales XML y propiedades de eje XML que permiten escribir
XML directamente el cdigo de Visual Basic.
El proveedor LINQ to DataSet permite consultar y actualizar los datos de un conjunto de datos ADO.NET.
Puede agregar la eficacia de LINQ a las aplicaciones que usen conjuntos de datos para simplificar y ampliar
las funcionalidades de consulta, agregacin y actualizacin de los datos del conjunto.

Estructura de un consulta LINQ
Una consulta LINQ, a la que se suele hacer referencia como una expresin de consulta, est formada por una
combinacin de clusulas de consulta que identifican los orgenes de datos y las variables de iteracin de la
consulta. Una expresin de consulta tambin puede incluir instrucciones para ordenar, filtrar, agrupar y
combinar los clculos que se van a aplicar a los datos de origen. La sintaxis de las expresiones de consulta se
parece a la sintaxis de SQL; por consiguiente, puede que la mayor parte de la sintaxis le resulte familiar.
Una expresin de consulta se inicia con una clusula From. Esta clusula identifica los datos de origen de
una consulta y las variables que se usan para hacer referencia a cada elemento de los datos de origen por
separado. Estas variables se denominan variables de intervalo o variables de iteracin. La clusula From se
requiere para una consulta, salvo para las consultasAggregate, en las que la clusula From es opcional.
Despus de identificar el mbito y el origen de la consulta en las clusulas From o Aggregate, puede incluir
cualquier combinacin de clusulas de consulta con el fin de refinar la consulta.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 291 | P g i n a

Por ejemplo, la siguiente consulta identifica una coleccin de origen de datos de cliente como la
variable customers y una variable de iteracin denominada cust.

Dim queryResults = From cust In customers _
Select cust.CompanyName

Este ejemplo es una consulta vlida en s misma; sin embargo, la consulta es mucho ms eficaz cuando
agrega ms clusulas de consulta para refinar los resultados. Por ejemplo, puede agregar una
clusula Where para filtrar los resultados por uno o ms valores. Las expresiones de consulta son una sola
lnea de cdigo; puede anexar clusulas de consulta adicionales al final de la consulta. Puede dividir una
consulta en varias lneas de texto para mejorar la legibilidad mediante el carcter de subrayado (_)-
continuacin de lnea. El ejemplo de cdigo siguiente muestra un ejemplo de una consulta que incluye una
clusula Where.

Dim queryResults = From cust In customers _
Where cust.Country = "USA"

Otra clusula de consulta eficaz es la clusula Select, que permite obtener slo los campos seleccionados del
origen de datos. Las consultas LINQ devuelven colecciones enumerables de objetos con establecimiento
inflexible de tipos. Una consulta puede devolver una coleccin de tipos annimos o los tipos con nombre.
Puede utilizar la clusula Select para devolver slo un campo nico del origen de datos. De esta forma, el
tipo de la coleccin devuelto es el tipo de ese campo nico. Tambin puede usar la clusula Select para
devolver varios campos del origen de datos. De esta forma, el tipo de la coleccin devuelto es un nuevo tipo
annimo. Adems, puede hacer coincidir los campos devueltos por la consulta con los de un tipo con
nombre especificado. El ejemplo de cdigo siguiente muestra una expresin de consulta que devuelve una
coleccin de tipos annimos con miembros rellenados con datos de los campos seleccionados del origen de
datos.

Dim queryResults = From cust In customers _
Where cust.Country = "USA" _
Select cust.CompanyName, cust.Country

Las consultas LINQ tambin se pueden usar para combinar varios orgenes de datos y devolver un solo
resultado. Esto se puede hacer con una o ms clusulas From o con las clusulas de consulta Join o Group
Join. El siguiente ejemplo de cdigo muestra una expresin de consulta que combina los datos de cliente y
de pedido y devuelve una coleccin de tipos annimos que contienen estos datos.

Dim queryResults = From cust In customers, ord In orders _
Where cust.CustomerID = ord.CustomerID _
Select cust, ord

Puede utilizar la clusula Group Join para crear un resultado de consulta jerrquico que contiene una
coleccin de objetos de cliente. Cada objeto de cliente tiene una propiedad que contiene una coleccin de
todos los pedidos de ese cliente. El siguiente ejemplo de cdigo muestra una expresin de consulta que
combina los datos de cliente y de pedido como resultado jerrquico y devuelve una coleccin de tipos
annimos. La consulta devuelve un tipo que incluye una propiedad CustomerOrders que contiene una
coleccin de datos de pedido del cliente. Tambin incluye una propiedad OrderTotal que contiene la suma
de los totales de todos los pedidos de ese cliente. (Esta consulta es equivalente a LEFT OUTER JOIN.)

Dim queryResults = From cust In customers _
Group Join ord In orders On _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 292 | P g i n a

cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
OrderTotal = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, OrderTotal

Existen varios operadores de consulta LINQ adicionales que puede utilizar para crear expresiones de
consulta eficaces. La seccin siguiente de este tema describe las distintas clusulas de consulta que puede
incluir en una expresin de consulta.

Operadores de consulta de LINQ de Visual Basic
Las clases del espacio de nombres System.Linq y el resto de los espacios de nombres que admiten consultas
LINQ incluyen mtodos a los que puede llamar para crear y refinar consultas basndose en las necesidades
de la aplicacin. Visual Basic incluye palabras clave para las clusulas de consulta ms comunes, como se
describe en la siguiente tabla.

From (Clusula, Visual Basic)
Se necesita una clusula From o Aggregate para iniciar una consulta. Una clusulaFrom especifica una
coleccin de origen y una variable de iteracin de una consulta. Por ejemplo:

' Returns the company name for all customers for whom
' State is equal to "WA".
Dim names = From cust In customers _
Where cust.State = "WA" _
Select cust.CompanyName

Select (Clusula, Visual Basic)
Opcional. Declara un conjunto de variables de iteracin de una consulta. Por ejemplo:

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers _
Select cust.CompanyName, cust.CustomerID

Si no se especifica una clusula Select, las variables de iteracin de la consulta estn formadas por la
clusula From o Aggregate.

Where (Clusula, Visual Basic)
Opcional. Especifica una condicin de filtrado de una consulta. Por ejemplo:

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products _
Where product.Category = "Beverages" _
Select product.Name

Order By (Clusula, Visual Basic)
Opcional. Especifica el criterio de ordenacin de las columnas de una consulta. Por ejemplo:

' Returns a list of books sorted by price in
' ascending order.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 293 | P g i n a

Dim titlesAscendingPrice = From b In books _
Order By b.price

Join (Clusula, Visual Basic)
Opcional. Combina dos colecciones en una sola. Por ejemplo:

' Returns a combined collection of all of the
' processes currently running and a descriptive
' name for the process taken from a list of
' descriptive names.
Dim processes = From proc In Process.GetProcesses _
Join desc In processDescriptions _
On proc.ProcessName Equals desc.ProcessName _
Select proc.ProcessName, proc.Id, desc.Description

Group By (Clusula, Visual Basic)
Opcional. Agrupa los elementos del resultado de una consulta. Se puede utilizar para aplicar funciones de
agregado a cada grupo. Por ejemplo:

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orderList = From order In orders _
Order By order.OrderDate _
Group By OrderDate = order.OrderDate _
Into OrdersByDate = Group

Group Join (Clusula, Visual Basic)
Opcional. Combina dos colecciones en una sola coleccin jerrquica. Por ejemplo:

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers _
Group Join ord In orders On _
cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
TotalOfOrders = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, TotalOfOrders

Aggregate (Clusula, Visual Basic)
Se necesita una clusula From o Aggregate para iniciar una consulta. Una clusulaAggregate aplica una o
ms funciones de agregado a una coleccin. Por ejemplo, puede utilizar la clusula Aggregate para calcular
una suma de todos los elementos devueltos por una consulta.

' Returns the sum of all order totals.
Dim orderTotal = Aggregate order In orders _
Into Sum(order.Total)

Tambin puede usar la clusula Aggregate para modificar una consulta. Por ejemplo, puede usar la
clusula Aggregate para realizar un clculo en una coleccin de consultas relacionada.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 294 | P g i n a

' Returns the customer company name and largest
' order total for each customer.
Dim customerMax = From cust In customers _
Aggregate order In cust.Orders _
Into MaxOrder = Max(order.Total) _
Select cust.CompanyName, MaxOrder

Let (Clusula, Visual Basic)
Opcional. Calcula un valor y lo asigna a una nueva variable de la consulta. Por ejemplo:

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products _
Let Discount = prod.UnitPrice * 0.1 _
Where Discount >= 50 _
Select prod.Name, prod.UnitPrice, Discount

Distinct (Clusula, Visual Basic)
Opcional. Restringe los valores de la variable de iteracin actual para eliminar los valores duplicados de los
resultados de la consulta. Por ejemplo:

' Returns a list of cities with no duplicate entries.
Dim cities = From item In customers _
Select item.City _
Distinct

Skip (Clusula, Visual Basic)
Opcional. Omite un nmero especificado de elementos de una coleccin y, a continuacin, devuelve los
elementos restantes. Por ejemplo:

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers _
Skip 10

Skip While (Clusula, Visual Basic)
Opcional. Omite los elementos de una coleccin en tanto que una condicin especificada sea true y, a
continuacin, devuelva los elementos restantes. Por ejemplo:

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers _
Skip While IsSubscriber(cust)

Take (Clusula, Visual Basic)
Opcional. Devuelve un nmero especificado de elementos contiguos desde el principio de una coleccin. Por
ejemplo:

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 295 | P g i n a

' Returns the first 10 customers.
Dim customerList = From cust In customers _
Take 10

Take While (Clusula, Visual Basic)
Opcional. Incluye los elementos de una coleccin en tanto que una condicin especificada sea true y omita
los elementos restantes. Por ejemplo:

' Returns a list of customers. The query returns
' customers until the first customer for whom
' HasOrders returns false. That customer and all
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers _
Order By cust.Orders.Count Descending _
Take While HasOrders(cust)

Puede usar las caractersticas de consulta LINQ adicionales llamando a los miembros de los tipos que se
pueden enumerar y consultar proporcionados por LINQ. Puede utilizar estas funciones adicionales llamando
a un operador de consulta determinado en el resultado de una expresin de consulta. Por ejemplo, el
siguiente ejemplo de cdigo usa el mtodo Union para combinar los resultados de dos consultas en un
resultado de consulta. Utiliza el mtodo ToList(TSource) para devolver el resultado de la consulta como lista
genrica.

Conexin a una base de datos mediante LINQ to SQL
En Visual Basic, identifique los objetos de base de datos de SQL Server, como las tablas, las vistas y los
procedimientos almacenados, a los que desee obtener acceso mediante un archivo LINQ to SQL. Un archivo
LINQ to SQL tiene una extensin .dbml.
Cuando se dispone de una conexin vlida a una base de datos de SQL Server, puede agregar una plantilla
de elementos Clases de LINQ to SQL al proyecto. De esta forma, se mostrar el Diseador relacional de
objetos (Diseador R/O). Este diseador permite arrastrar los elementos a los que desee obtener acceso en
el cdigo desde el Explorador de servidores o elExplorador de base de datos hasta la superficie del
diseador. El archivo LINQ to SQL agrega un objeto DataContext al proyecto. Este objeto incluye
propiedades y colecciones para las tablas y vistas a las que desee tener acceso, as como mtodos para los
procedimientos almacenados a los que desee llamar. Despus de haber guardado los cambios en el archivo
LINQ to SQL (.dbml), puede tener acceso a estos objetos en el cdigo haciendo referencia al
objetoDataContext que define el Diseador relacional de objetos. Al objeto DataContext del proyecto se le
asigna un nombre basndose en el nombre del archivo LINQ to SQL. Por ejemplo, un archivo LINQ to SQL
que se denomina Northwind.dbml crear un objeto DataContextdenominado NorthwindDataContext.

Caractersticas de Visual Basic que admiten LINQ
Visual Basic incluye otras caractersticas destacables que facilitan el uso de LINQ y reducen la cantidad de
cdigo que debe escribir para realizar consultas LINQ. Se incluyen las siguientes:
Tipos annimos, que permiten crear un nuevo tipo basado en el resultado de una consulta.
Variables con tipo implcito, que permiten aplazar la especificacin de un tipo y dejar que el
compilador infiera el tipo basndose en el resultado de la consulta.
Mtodos de extensin, que permiten ampliar un tipo existente con sus propios mtodos sin
modificar el propio tipo.

Ejecucin de una consulta aplazada e inmediata
La ejecucin de una consulta no tiene nada que ver con su creacin. Despus de crear una consulta, un
mecanismo independiente desencadena su ejecucin. Se puede ejecutar un consulta en cuanto est
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 296 | P g i n a

definida (ejecucin inmediata), o se puede guardar la definicin y ejecutar la consulta ms tarde (ejecucin
aplazada).
De forma predeterminada, al crear una consulta, no se ejecuta inmediatamente. En su lugar, se almacena la
definicin de la consulta en la variable que se usa para hacer referencia a su resultado. Ms tarde cuando se
tiene acceso a la consulta en cdigo, como en un bucle ForNext, se ejecuta. Este proceso se
denomina ejecucin aplazada.
Las consultas tambin se pueden ejecutar cuando estn definidas, a lo que se denominaejecucin inmediata.
Puede desencadenar una ejecucin inmediata aplicando un mtodo que requiere acceso a elementos
individuales del resultado de la consulta. Este puede ser el resultado de incluir una funcin de agregado,
como Count, Sum, Average, Min o Max.
Al usar los mtodos ToList o ToArray, tambin se forzar la ejecucin inmediata. Esto puede ser til si desea
ejecutar la consulta inmediatamente y almacenar en cach los resultados.

XML en Visual Basic
Las caractersticas XML de Visual Basic incluyen literales XML y propiedades de ejes XML, lo que permite
crear, tener acceso, consultar y modificar fcilmente el XML en el cdigo. Los literales XML permiten escribir
XML directamente en el cdigo. El compilador de Visual Basic trata el XML como objeto de datos de primera
clase.
El siguiente ejemplo de cdigo muestra cmo crear un elemento XML, tener acceso a sus subelementos y
atributos, as como consultar el contenido del elemento mediante LINQ.

' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1
Sub SampleTransform()

' Create test by using a global XML namespace prefix.
Dim contact = _
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>

Dim phoneTypes = _
<phoneTypes>
<%= From phone In contact.<ns:phone> _
Select <type><%= phone.@ns:type %></type> _
%>
</phoneTypes>

Console.WriteLine(phoneTypes)
End Sub
End Module

Cmo: Consultar una base de datos usando LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 297 | P g i n a


Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los
elementos de la interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La
edicin de Visual Studio que se tenga y la configuracin que se utilice determinan estos
elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador. Haga clic en la
tabla Orders y arrstrela hasta el panel izquierdo del diseador.
El diseador crea nuevos objetos Customer y Order para el proyecto. Observe que el diseador
detecta automticamente las relaciones entre las tablas y crea propiedades secundarias para los
objetos relacionados. Por ejemplo, IntelliSense mostrar que el objeto Customer tiene una
propiedad Orders para todos los pedidos relacionados con ese cliente.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.
Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo al evento Load del formulario.
3. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objeto DataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se denomina
northwindDataContext.
Puede crear una instancia de DataContext en el cdigo y consultar las tablas especificadas por el
Diseador relacional de objetos.
Agregue el cdigo siguiente al evento Load para consultar las tablas que se exponen como
propiedades del contexto de datos.

Dim db As New northwindDataContext
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 298 | P g i n a

Dim londonCusts = From cust In db.Customers _
Where cust.City = "London" _
Select cust
DataGridView1.DataSource = londonCusts

4. Presione F5 para ejecutar el proyecto y ver los resultados.
5. A continuacin, se proporcionan algunas consultas adicionales que puede probar:

Dim londonCustOrders = From cust In db.Customers, _
ord In cust.Orders _
Where cust.City = "London" _
Order By ord.OrderID _
Select cust.City, ord.OrderID, ord.OrderDate
DataGridView1.DataSource = londonCustOrders
...
Dim custs = From cust In db.Customers _
Where cust.Country = "France" _
And (cust.CompanyName.StartsWith("F") _
Or cust.CompanyName.StartsWith("V")) _
Order By cust.CompanyName _
Select cust.CompanyName, cust.City
DataGridView1.DataSource = custs

Cmo: Llamar a un procedimiento almacenado usando LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos, incluidos los
objetos de base de datos como los procedimientos almacenados.
En el ejemplo siguiente se muestra cmo crear una aplicacin que llama a un procedimiento almacenado en
una base de datos de SQL Server. En el ejemplo se muestra cmo llamar a dos procedimientos almacenados
diferentes en la base de datos. Cada procedimiento devuelve los resultados de una consulta. Uno de los
procedimientos toma parmetros de entrada y el otro no toma ningn parmetro.

Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 299 | P g i n a


Para agregar procedimientos almacenados al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Procedimientos almacenados.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en el procedimiento almacenado Sales by Year y arrstrelo hasta el panel derecho del
diseador. Haga clic en el procedimiento almacenado Ten Most Expensive Products y arrstrelo
hasta el panel derecho del diseador.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo para mostrar los resultados de los procedimientos almacenados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo a su evento Load.
3. Cuando agreg procedimientos almacenados al Diseador relacional de objetos, ste agreg un
objeto DataContext al proyecto. Este objeto contiene el cdigo necesario para obtener acceso a
esos procedimientos. El nombre del objeto DataContext del proyecto se basa en el nombre del
archivo .dbml. En este proyecto, el objeto DataContext se denominanorthwindDataContext.

Puede crear una instancia de DataContext en el cdigo y llamar a los mtodos de procedimiento
almacenado especificados por el Diseador relacional de objetos. Para enlazar al objeto DataGridView,
puede que tenga que forzar la consulta a que se ejecute inmediatamente llamando al
mtodo ToList(TSource) en los resultados del procedimiento almacenado.
Agregue el cdigo siguiente al evento Load para llamar a cualquiera de los procedimientos almacenados
expuestos como mtodos para el contexto de datos.

Dim db As New northwindDataContext

' Display the results of the Sales_by_Year stored procedure.
DataGridView1.DataSource = _
db.Sales_by_Year(#1/1/1996#, #1/1/2007#).ToList()
...
' Display the results of the Ten_Most_Expensive_Products
' stored procedure.

DataGridView1.DataSource = _
db.Ten_Most_Expensive_Products.ToList()

4. Presione F5 para ejecutar el proyecto y ver los resultados.

Cmo: Modificar datos en una base de datos usando LINQ (Visual Basic)
Las consultas Language-Integrated Query (LINQ) simplifican el acceso a la informacin y la modificacin de
los valores de la base de datos.
El ejemplo siguiente muestra cmo crear una nueva aplicacin que recupere y actualice la informacin de
una base de datos de SQL Server.

Para crear una conexin a una base de datos
1. En Visual Studio, abra el Explorador de servidores/Explorador de bases de datos haciendo clic en el
men Ver y, a continuacin, seleccione Explorador de servidores/Explorador de bases de datos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 300 | P g i n a

2. Haga clic con el botn secundario en Conexiones de datos en el Explorador de
servidores/Explorador de bases de datos y haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto con un archivo LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Add. Se abre el Diseador relacional de
objetos (Diseador R/O) para el archivo northwind.dbml.

Para agregar tablas con el fin de consultar y modificar el diseador
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador.
El diseador crea un nuevo objeto Customer para el proyecto.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo con el fin de modificar la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene cdigo que puede utilizar para tener acceso a la tabla Customers.
Tambin contiene cdigo que define un objeto Customer local y una coleccin Customers para la
tabla. El nombre del objeto DataContext del proyecto se basa en el nombre del archivo .dbml. En
este proyecto, el objeto DataContext se denominanorthwindDataContext.

Puede crear una instancia del objeto DataContext en el cdigo, as como para consultar y modificar la
coleccin Customers especificada por el Diseador relacional de objetos. Los cambios que realice en la
coleccin Customers no se reflejan en la base de datos hasta que los enve llamando al
mtodo SubmitChanges del objeto DataContext.
Haga doble clic en el formulario Windows Forms, Form1, para agregar el cdigo al eventoLoad con el fin de
consultar la tabla Customers que se expone como propiedad deDataContext. Agregue el cdigo siguiente:

Private db As northwindDataContext

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
db = New northwindDataContext()

RefreshData()
End Sub

Private Sub RefreshData()
Dim customers = From cust In db.Customers _
Where cust.City(0) = "W" _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 301 | P g i n a

Select cust

DataGridView1.DataSource = customers
End Sub

3. Desde el Cuadro de herramientas, arrastre tres controles Button hasta el formulario. Seleccione el
primer control Button. En la ventana Propiedades, establezca el valor deName del
control Button en AddButton y Text en Add. Seleccione el segundo botn y establezca la
propiedad Name en UpdateButton y la propiedad Text en Update. Seleccione el tercer botn y
establezca la propiedad Name en DeleteButton y la propiedad Text en Delete.
4. Haga doble clic en el botn Agregar para agregar el cdigo al evento Click. Agregue el cdigo
siguiente:

Private Sub AddButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles AddButton.Click
Dim cust As New Customer With { _
.City = "Wellington", _
.CompanyName = "Blue Yonder Airlines", _
.ContactName = "Jill Frank", _
.Country = "New Zealand", _
.CustomerID = "JILLF"}

db.Customers.InsertOnSubmit(cust)

Try
db.SubmitChanges()
Catch
' Handle exception.
End Try

RefreshData()
End Sub

5. Haga doble clic en el botn Actualizar para agregar el cdigo al evento Click. Agregue el cdigo
siguiente:

Private Sub UpdateButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles UpdateButton.Click
Dim updateCust = (From cust In db.Customers _
Where cust.CustomerID = "JILLF").ToList()(0)

updateCust.ContactName = "Jill Shrader"

Try
db.SubmitChanges()
Catch
' Handle exception.
End Try

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 302 | P g i n a

RefreshData()
End Sub

6. Haga doble clic en el botn Eliminar para agregar el cdigo al evento Click. Agregue el cdigo
siguiente:

Private Sub DeleteButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles DeleteButton.Click
Dim deleteCust = (From cust In db.Customers _
Where cust.CustomerID = "JILLF").ToList()(0)

db.Customers.DeleteOnSubmit(deleteCust)

Try
db.SubmitChanges()
Catch
' Handle exception.
End Try

RefreshData()
End Sub

7. Presione F5 para ejecutar el proyecto. Haga clic en Agregar para agregar un nuevo registro. Haga
clic en Actualizar para modificar el nuevo registro. Haga clic en Eliminar para eliminar el nuevo
registro.

Cmo: Combinar datos con LINQ usando clusulas Join (Visual Basic)
Visual Basic proporciona las clusulas de consulta Group Join y Join para permitir combinar el contenido de
varias colecciones basndose en valores comunes entre colecciones. Estos valores se conocen como valores
de clave. Los programadores familiarizados con conceptos de bases de datos relacionales reconocern la
clusula Join como INNER JOIN y la clusula Group Join como LEFT OUTER JOIN.
Los ejemplos de este tema muestran una cuantas formas de combinar datos utilizando las clusulas de
consulta Group Join y Join.

Crear un proyecto y agregar datos de ejemplo

Para crear un proyecto que contiene datos y tipos de ejemplo
1. Para ejecutar los ejemplos de este tema, abra Visual Studio y agregue un nuevo proyecto de
aplicacin de consola de Visual Basic. Haga doble clic en el archivo Module1.vb creado por Visual
Basic.
2. Los ejemplos de este tema usan los tipos Person y Pet, as como los datos del siguiente ejemplo de
cdigo. Copie este cdigo en el mdulo Module1 predeterminado creado por Visual Basic.

Private _people As List(Of Person)
Private _pets As List(Of Pet)

Function GetPeople() As List(Of Person)
If _people Is Nothing Then CreateLists()
Return _people
End Function
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 303 | P g i n a


Function GetPets(ByVal people As List(Of Person)) As List(Of Pet)
If _pets Is Nothing Then CreateLists()
Return _pets
End Function

Private Sub CreateLists()
Dim pers As Person

_people = New List(Of Person)
_pets = New List(Of Pet)

pers = New Person With {.FirstName = "Magnus", .LastName = "Hedlund"}
_people.Add(pers)
_pets.Add(New Pet With {.Name = "Daisy", .Owner = pers})

pers = New Person With {.FirstName = "Terry", .LastName = "Adams"}
_people.Add(pers)
_pets.Add(New Pet With {.Name = "Barley", .Owner = pers})
_pets.Add(New Pet With {.Name = "Boots", .Owner = pers})
_pets.Add(New Pet With {.Name = "Blue Moon", .Owner = pers})

pers = New Person With {.FirstName = "Charlotte", .LastName = "Weiss"}
_people.Add(pers)
_pets.Add(New Pet With {.Name = "Whiskers", .Owner = pers})

' Add a person with no pets for the sake of Join examples.
_people.Add(New Person With {.FirstName = "Arlene", .LastName = "Huff"})

pers = New Person With {.FirstName = "Don", .LastName = "Hall"}
' Do not add person to people list for the sake of Join examples.
_pets.Add(New Pet With {.Name = "Spot", .Owner = pers})

' Add a pet with no owner for the sake of Join examples.
_pets.Add(New Pet With {.Name = "Unknown", _
.Owner = New Person With {.FirstName = String.Empty, _
.LastName = String.Empty}})
End Sub

...

Class Person
Public _firstName As String
Public _lastName As String

Public Property FirstName() As String
Get
Return _firstName
End Get
Set(ByVal value As String)
_firstName = value
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 304 | P g i n a

End Set
End Property

Public Property LastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
End Class

Class Pet
Public _name As String
Public _owner As Person

Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property

Public Property Owner() As Person
Get
Return _owner
End Get
Set(ByVal value As Person)
_owner = value
End Set
End Property
End Class

Realizar una combinacin interna mediante la clusula Join
Una combinacin INNER JOIN combina los datos de dos colecciones. Los elementos para los que se incluye la
coincidencia de los valores clave especificados. Se excluye cualquier elemento de cualquier coleccin que no
tenga ningn elemento coincidente en la otra coleccin.
En Visual Basic, LINQ proporciona dos opciones para realizar una combinacin INNER JOIN: una combinacin
implcita y una explcita.
Una combinacin implcita especifica las colecciones que se van a combinar en una clusulaFrom e identifica
los campos clave coincidentes de una clusula Where. Visual Basic combina implcitamente las dos
colecciones basndose en los campos clave especificados.
Puede especificar una combinacin explcita utilizando la clusula Join cuando desee ser concreto sobre los
campos clave que se van a usar en la combinacin. En este caso, una clusula Where se puede seguir usando
para filtrar los resultados de la consulta.

Para realizar una combinacin interna mediante la clusula Join
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 305 | P g i n a

Agregue el cdigo siguiente al mdulo Module1 del proyecto para ver ejemplos de una
combinacin interna tanto implcita como explcita.

Sub InnerJoinExample()
' Create two lists.
Dim people = GetPeople()
Dim pets = GetPets(people)

' Implicit Join.
Dim petOwners = From pers In people, pet In pets _
Where pet.Owner Is pers _
Select pers.FirstName, PetName = pet.Name

' Display grouped results.
Dim output As New System.Text.StringBuilder
For Each pers In petOwners
output.AppendFormat( _
pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf)
Next

Console.WriteLine(output)

' Explicit Join.
Dim petOwnersJoin = From pers In people _
Join pet In pets _
On pet.Owner Equals pers _
Select pers.FirstName, PetName = pet.Name

' Display grouped results.
output = New System.Text.StringBuilder()
For Each pers In petOwnersJoin
output.AppendFormat( _
pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf)
Next

Console.WriteLine(output)

' Both queries produce the following output:
'
' Magnus: Daisy
' Terry: Barley
' Terry: Boots
' Terry: Blue Moon
' Charlotte: Whiskers
End Sub

Realizar una combinacin externa izquierda mediante la clusula Group Join
Una combinacin LEFT OUTER JOIN incluye todos los elementos de la coleccin de la izquierda de la
combinacin y slo los valores coincidentes de la coleccin de la derecha de la combinacin. Cualquier
elemento de la coleccin de la derecha de la combinacin que no tiene ningn elemento coincidente en la
coleccin de la izquierda se excluye del resultado de la consulta.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 306 | P g i n a

La clusula Group Join realiza, de hecho, una combinacin LEFT OUTER JOIN. La diferencia entre lo que
normalmente se conoce como LEFT OUTER JOIN y lo que devuelve la clusulaGroup Join es que la
clusula Group Join agrupa los resultados de la coleccin de la derecha de la combinacin de cada elemento
de la coleccin de la izquierda. En una base de datos relacional, una combinacin LEFT OUTER JOIN devuelve
un resultado desagrupado en el que cada elemento del resultado de la consulta contiene los elementos
coincidentes de ambas colecciones de la combinacin. En este caso, los elementos de la coleccin de la
izquierda de la combinacin se repiten por cada elemento coincidente de la coleccin de la derecha. Ver el
aspecto cuando complete el procedimiento siguiente.
Puede recuperar los resultados de una consulta Group Join como resultado desagrupado ampliando la
consulta para devolver un elemento por cada resultado de la consulta agrupado. Para ello, debe asegurarse
de que realiza la consulta en el mtodo DefaultIfEmpty de la coleccin agrupada. De esta forma, se asegura
de que los elementos de la coleccin de la izquierda de la combinacin siguen estando incluidos en el
resultado de la consulta aunque no tengan ningn resultado coincidente en la coleccin de la derecha.
Puede agregar cdigo a la consulta para proporcionar un valor de resultado predeterminado cuando no haya
ningn valor coincidente en la coleccin de la derecha de la combinacin.

Para realizar una combinacin externa izquierda mediante la clusula Group Join
Agregue el cdigo siguiente al mdulo Module1 del proyecto para ver ejemplos tanto de una
combinacin externa izquierda agrupada como de una combinacin externa izquierda
desagrupada.

Sub LeftOuterJoinExample()
' Create two lists.
Dim people = GetPeople()
Dim pets = GetPets(people)

' Grouped results.
Dim petOwnersGrouped = From pers In people _
Group Join pet In pets _
On pers Equals pet.Owner _
Into PetList = Group _
Select pers.FirstName, pers.LastName, _
PetList

' Display grouped results.
Dim output As New System.Text.StringBuilder
For Each pers In petOwnersGrouped
output.AppendFormat(pers.FirstName & ":" & vbCrLf)
For Each pt In pers.PetList
output.AppendFormat(vbTab & pt.Name & vbCrLf)
Next
Next

Console.WriteLine(output)

' "Flat" results.
Dim petOwners = From pers In people _
Group Join pet In pets On pers Equals pet.Owner _
Into PetList = Group _
From pet In PetList.DefaultIfEmpty() _
Select pers.FirstName, pers.LastName, _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 307 | P g i n a

PetName = _
If(pet Is Nothing, String.Empty, pet.Name)
' This code produces the following output:
'
' Magnus:
' Daisy
' Terry:
' Barley
' Boots
' Blue Moon
' Charlotte:
' Whiskers
' Arlene:


' Display "flat" results.
output = New System.Text.StringBuilder()
For Each pers In petOwners
output.AppendFormat( _
pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf)
Next

Console.WriteLine(output.ToString())
End Sub

' This code produces the following output:
'
' Magnus: Daisy
' Terry: Barley
' Terry: Boots
' Terry: Blue Moon
' Charlotte: Whiskers
' Arlene:

Realizar una combinacin mediante una clave compuesta
Puede utilizar la palabra clave And en la clusula Join o Group Join para identificar varios campos clave que
se van a usar cuando se combinen los valores coincidentes de las colecciones. La palabra
clave And especifica que todos los campos clave especificados deben coincidir con los elementos que se van
a combinar.

Para realizar una combinacin mediante una clave compuesta
Agregue el cdigo siguiente al mdulo Module1 del proyecto para ver ejemplos de una
combinacin que usa una clave compuesta.

Sub CompositeKeyJoinExample()
' Create two lists.
Dim people = GetPeople()
Dim pets = GetPets(people)

' Implicit Join.
Dim petOwners = From pers In people _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 308 | P g i n a

Join pet In pets On _
pet.Owner.FirstName Equals pers.FirstName _
And pet.Owner.LastName Equals pers.LastName _
Select pers.FirstName, PetName = pet.Name

' Display grouped results.
Dim output As New System.Text.StringBuilder
For Each pers In petOwners
output.AppendFormat( _
pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf)
Next

Console.WriteLine(output)
End Sub

Ejecutar el cdigo
Para agregar cdigo con el fin de ejecutar los ejemplos
1. Reemplace Sub Main en el mdulo Module1 del proyecto por el cdigo siguiente para ejecutar los
ejemplos de este tema.

Sub Main()
InnerJoinExample()
LeftOuterJoinExample()
CompositeKeyJoinExample()

Console.ReadLine()
End Sub

2. Presione F5 para ejecutar los ejemplos.

Cmo: Ordenar una coleccin usando LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server y ordena los resultados por varios campos mediante la clusulaOrder By. El criterio de
ordenacin para cada campo puede ser ascendente o descendente.

Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 309 | P g i n a

1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador. Haga clic en la
tabla Orders y arrstrela hasta el panel izquierdo del diseador.
El diseador crea nuevos objetos Customer y Order para el proyecto. Observe que el diseador
detecta automticamente las relaciones entre las tablas y crea propiedades secundarias para los
objetos relacionados. Por ejemplo, IntelliSense mostrar que el objeto Customer tiene una
propiedad Orders para todos los pedidos relacionados con ese cliente.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.
Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo al evento Load del formulario.
3. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objeto DataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se denomina
northwindDataContext.

Puede crear una instancia de DataContext en el cdigo y consultar las tablas especificadas por el Diseador
relacional de objetos.
Agregue el cdigo siguiente al evento Load para consultar las tablas que se exponen como propiedades del
contexto de datos y ordenar los resultados. La consulta ordena los resultados por el nmero de pedidos de
los clientes, en orden descendente. Los clientes con el mismo nmero de pedidos se ordenan por el nombre
de la compaa en orden ascendente (valor predeterminado).

Dim db As New northwindDataContext

Dim q = From cust In db.Customers _
Where cust.Orders.Count > 0 _
Select cust.CustomerID, cust.CompanyName, _
OrderCount = cust.Orders.Count, cust.Country _
Order By OrderCount Descending, CompanyName

DataGridView1.DataSource = q

4. Presione F5 para ejecutar el proyecto y ver los resultados.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 310 | P g i n a

Cmo: Filtrar los resultados de consultas usando LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server y filtra los resultados por un valor concreto mediante la clusulaWhere.

Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador. Haga clic en la
tabla Orders y arrstrela hasta el panel izquierdo del diseador.
El diseador crea nuevos objetos Customer y Order para el proyecto. Observe que el diseador
detecta automticamente las relaciones entre las tablas y crea propiedades secundarias para los
objetos relacionados. Por ejemplo, IntelliSense mostrar que el objeto Customer tiene una
propiedad Orders para todos los pedidos relacionados con ese cliente.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo al evento Load del formulario.
3. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objetoDataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se denomina
northwindDataContext.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 311 | P g i n a

Puede crear una instancia de DataContext en el cdigo y consultar las tablas especificadas por el Diseador
relacional de objetos.
Agregue el cdigo siguiente al evento Load para consultar las tablas que se exponen como propiedades del
contexto de datos. La consulta filtra los resultados y devuelve solamente los clientes que se encuentran
en London.

Dim db As New northwindDataContext

Dim customers_London = From cust In db.Customers _
Where cust.City = "London" _
Select cust.CustomerID, cust.CompanyName, _
OrderCount = cust.Orders.Count, _
cust.City, cust.Country

DataGridView1.DataSource = customers_London

4. Presione F5 para ejecutar el proyecto y ver los resultados.
5. A continuacin, se proporcionan algunos otros filtros que puede probar.

Dim companies_H = From cust In db.Customers _
Where cust.Orders.Count > 0 _
And cust.CompanyName.StartsWith("H") _
Select cust.CustomerID, cust.CompanyName, _
OrderCount = cust.Orders.Count, _
cust.Country

Dim customers_USA = From cust In db.Customers _
Where cust.Orders.Count > 15 _
And cust.Country = "USA" _
Select cust.CustomerID, cust.CompanyName, _
OrderCount = cust.Orders.Count, _
cust.Country

Cmo: Hacer el recuento, la suma o el promedio de datos usando LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server. En el ejemplo se realizan recuentos, sumas y se calcula el promedio de los resultados
mediante las clusulas Aggregate y Group By.

Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 312 | P g i n a

3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador. Haga clic en la
tabla Orders y arrstrela hasta el panel izquierdo del diseador.
El diseador crea nuevos objetos Customer y Order para el proyecto. Observe que el diseador
detecta automticamente las relaciones entre las tablas y crea propiedades secundarias para los
objetos relacionados. Por ejemplo, IntelliSense mostrar que el objeto Customer tiene una
propiedad Orders para todos los pedidos relacionados con ese cliente.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo al evento Load del formulario.
3. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objetoDataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se
denomina northwindDataContext.

Puede crear una instancia de DataContext en el cdigo y consultar las tablas especificadas por el Diseador
relacional de objetos.
Agregue el cdigo siguiente al evento Load para consultar las tablas que se exponen como propiedades
de DataContext y contar, sumar y calcular el promedio de los resultados. En el ejemplo se usa la
clusula Aggregate para consultar un solo resultado y la clusulaGroup By para mostrar una media de los
resultados agrupados.

Dim db As New northwindDataContext
Dim msg = ""

Dim londonCustomerCount = Aggregate cust In db.Customers _
Where cust.City = "London" _
Into Count()
msg &= "Count of London Customers: " & londonCustomerCount & vbCrLf

Dim averageOrderCount = Aggregate cust In db.Customers _
Where cust.City = "London" _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 313 | P g i n a

Into Average(cust.Orders.Count)
msg &= "Average number of Orders per customer: " & _
averageOrderCount & vbCrLf

Dim venezuelaTotalOrders = Aggregate cust In db.Customers _
Where cust.Country = "Venezuela" _
Into Sum(cust.Orders.Count)
msg &= "Total number of orders from Customers in Venezuela: " & _
venezuelaTotalOrders & vbCrLf

MsgBox(msg)

Dim averageCustomersByCity = From cust In db.Customers _
Group By cust.City _
Into Average(cust.Orders.Count) _
Order By Average

DataGridView1.DataSource = averageCustomersByCity

4. Presione F5 para ejecutar el proyecto y ver los resultados.

Cmo: Buscar los valores mximo y mnimo en el resultado de una consulta usando
LINQ (Visual Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server. En el ejemplo se determinan los valores mximo y mnimo de los resultados mediante
las clusulas Aggregate y Group By.
.
Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 314 | P g i n a

1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador. Haga clic en la
tabla Orders y arrstrela hasta el panel izquierdo del diseador.
El diseador crea nuevos objetos Customer y Order para el proyecto. Observe que el diseador
detecta automticamente las relaciones entre las tablas y crea propiedades secundarias para los
objetos relacionados. Por ejemplo, IntelliSense mostrar que el objeto Customer tiene una
propiedad Orders para todos los pedidos relacionados con ese cliente.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para agregar cdigo al evento Load del formulario.
3. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objetoDataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objetoDataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se
denomina northwindDataContext.

Puede crear una instancia de DataContext en el cdigo y consultar las tablas que especifica el Diseador
relacional de objetos.
Agregue el cdigo siguiente al evento Load. Este cdigo realiza una consulta en las tablas expuestas como
propiedades del contexto de datos y determina los valores mximo y mnimo de los resultados. En el
ejemplo se usa la clusula Aggregate para consultar un solo resultado y la clusula Group By para mostrar
una media de los resultados agrupados.

Dim db As New northwindDataContext

Dim minimumOrders = Aggregate cust In db.Customers _
Where cust.City = "London" _
Into Min(cust.Orders.Count)

MsgBox("Minimum Orders from a London Customer: " & minimumOrders)

Dim maximumOrdersByCountry = From cust In db.Customers _
Group By cust.Country _
Into MaxOrders = Max(cust.Orders.Count)

DataGridView1.DataSource = maximumOrdersByCountry

4. Presione F5 para ejecutar el proyecto y ver los resultados.

Cmo: Devolver el resultado de una consulta con LINQ como tipo especfico (Visual
Basic)
Language-Integrated Query (LINQ) simplifica el acceso a la informacin de las bases de datos y la ejecucin
de consultas. De forma predeterminada, las consultas LINQ devuelven una lista de objetos como un tipo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 315 | P g i n a

annimo. Tambin se puede especificar que una consulta devuelva una lista de un tipo determinado
mediante la clusula Select.
En el ejemplo siguiente se muestra cmo crear una nueva aplicacin que realiza consultas en una base de
datos de SQL Server y proyecta los resultados como un tipo con nombre especfico.

Nota:
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la
interfaz de usuario de Visual Studio incluidos en las instrucciones siguientes. La edicin de Visual Studio
que se tenga y la configuracin que se utilice determinan estos elementos.

Para crear una conexin a una base de datos
1. En Visual Studio, haga clic en Explorador de servidores/Explorador de bases de datos en el
men Ver para abrir el Explorador de servidores/Explorador de bases de datos.
2. En el Explorador de servidores/Explorador de bases de datos, haga clic con el botn secundario del
mouse en Conexiones de datos y, a continuacin, haga clic en Agregar conexin.
3. Especifique una conexin vlida a la base de datos de ejemplo Northwind.

Para agregar un proyecto que contiene un archivo de LINQ to SQL
1. En el men Archivo de Visual Studio, elija Nuevo y, a continuacin, haga clic en Proyecto.
Seleccione Aplicacin de Windows Forms de Visual Basic como tipo de proyecto.
2. En el men Proyecto, haga clic en Agregar nuevo elemento. Seleccione la plantilla de
elementos Clases de LINQ to SQL.
3. Asigne al archivo el nombre northwind.dbml. Haga clic en Agregar. Se abre el Diseador relacional
de objetos para el archivo northwind.dbml.

Para agregar tablas al Diseador relacional de objetos
1. En el Explorador de servidores/Explorador de bases de datos, expanda la conexin a la base de
datos Northwind. Expanda la carpeta Tablas.
Si ha cerrado el Diseador relacional de objetos, puede volver a abrirlo haciendo doble clic en el
archivo northwind.dbml que agreg anteriormente.
2. Haga clic en la tabla Customers y arrstrela hasta el panel izquierdo del diseador.
El diseador crea un nuevo objeto Customer para el proyecto. Se puede proyectar el resultado de
una consulta como el tipo Customer o como un tipo creado por el usuario. En este ejemplo se crea
un nuevo tipo en un procedimiento posterior y se proyecta un resultado de consulta como ese tipo.
3. Guarde los cambios y cierre el diseador.
4. Guarde el proyecto.

Para agregar cdigo de consulta a la base de datos y mostrar los resultados
1. Desde el Cuadro de herramientas, arrastre un control DataGridView hasta el formulario Windows
Forms predeterminado del proyecto, Form1.
2. Haga doble clic en Form1 para modificar la clase Form1.
3. Despus de la instruccin End Class de la clase Form1, agregue el cdigo siguiente para crear un
tipo CustomerInfo que contenga los resultados de consulta de este ejemplo.

Public Class CustomerInfo
Private _CompanyName As String
Private _ContactName As String

Public Property CompanyName() As String
Get
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 316 | P g i n a

Return _CompanyName
End Get
Set(ByVal value As String)
_CompanyName = value
End Set
End Property

Public Property ContactName() As String
Get
Return _ContactName
End Get
Set(ByVal value As String)
_ContactName = value
End Set
End Property
End Class

4. Cuando agreg tablas al Diseador relacional de objetos, ste agreg un objeto DataContext al
proyecto. Este objeto contiene el cdigo necesario para obtener acceso a esas tablas y a los objetos
individuales y colecciones de cada tabla. El nombre del objeto DataContext del proyecto se basa en
el nombre del archivo .dbml. En este proyecto, el objeto DataContext se
denomina northwindDataContext.

Puede crear una instancia de DataContext en el cdigo y consultar las tablas que especifica el Diseador
relacional de objetos.
En el evento Load de la clase Form1, agregue el cdigo siguiente para consultar las tablas que se exponen
como propiedades del contexto de datos. La clusula Select de la consulta crear un nuevo
tipo CustomerInfo en lugar de un tipo annimo para cada elemento del resultado de la consulta.

Dim db As New northwindDataContext

Dim customerList = _
From cust In db.Customers _
Where cust.CompanyName.StartsWith("L") _
Select New CustomerInfo With {.CompanyName = cust.CompanyName, _
.ContactName = cust.ContactName}

DataGridView1.DataSource = customerList

5. Presione F5 para ejecutar el proyecto y ver los resultados.

LINQ to DataSet
LINQ to DataSet facilita y acelera las consultas en datos almacenados en cach en un objeto DataSet. En
concreto, LINQ to DataSet simplifica la consulta permitiendo a los desarrolladores escribir consultas a partir
del lenguaje de programacin mismo, en lugar de utilizar un lenguaje de consulta diferente. Esto resulta
especialmente til para desarrolladores de Visual Studio, que ahora pueden aprovechar la comprobacin de
sintaxis en tiempo de compilacin, los tipos estticos y la compatibilidad con IntelliSense que proporciona
Visual Studio en las consultas.
LINQ to DataSet tambin se puede utilizar para consultar en datos que se han consolidado de uno o ms
orgenes de datos. Esto permite muchos casos que requieren flexibilidad en la forma de representar y
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 317 | P g i n a

controlar los datos, como consultar datos agregados localmente y almacenar en cach en el nivel medio en
aplicaciones web. En concreto, las aplicaciones de Business Intelligence, anlisis e informes genricos
requieren este mtodo de manipulacin.
La funcionalidad LINQ to DataSet se expone principalmente mediante mtodos de extensin en las
clasesDataRowExtensions y DataTableExtensions. LINQ to DataSet se basa y utiliza la arquitectura existente
ADO.NET 2.0, y no est destinada a reemplazar ADO.NET 2.0 en el cdigo de aplicacin. El cdigo de
ADO.NET 2.0 existente continuar funcionando en una aplicacin LINQ to DataSet. La relacin de LINQ to
DataSet con ADO.NET 2.0 y los datos almacenados se muestran en el diagrama siguiente.



Informacin general de LINQ to DataSet
DataSet es uno de los componentes ms ampliamente utilizados de ADO.NET. Es un elemento fundamental
del modelo de programacin desconectado en el que se basa ADO.NET y permite almacenar explcitamente
en cach datos de diferentes orgenes de datos. Para el nivel de presentacin, DataSet est estrechamente
integrado en los controles de GUI para el enlace de datos. Para el nivel medio, proporciona una cach que
conserva la forma relacional de los datos e incluye servicios de exploracin de jerarquas y consultas rpidos
y sencillos. Una tcnica comn que se usa para reducir el nmero de solicitudes de una bases de datos
consiste en utilizar DataSet para el almacenamiento en cach en el nivel medio. Por ejemplo, piense en una
aplicacin web de ASP.NET controlada por datos. A menudo una parte importante de los datos de aplicacin
no cambia frecuentemente y es comn entre sesiones o usuarios. Estos datos se pueden conservar en
memoria o en un servidor web, lo que reduce el nmero de solicitudes en la base de datos y acelera las
interacciones del usuario. Otro aspecto til de DataSet es que permite que una aplicacin lleve subconjuntos
de datos de uno o ms orgenes de datos al espacio de la aplicacin. La aplicacin puede manipular los datos
en memoria mientras retiene su forma relacional.
A pesar de su importancia, DataSet tiene capacidades de consulta limitadas. El mtodo Select se puede usar
para filtrar y ordenar y los mtodos GetChildRows y GetParentRow se pueden usar para la exploracin de
jerarquas. Sin embargo, para cualquier tarea ms compleja, el programador debe escribir una consulta
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 318 | P g i n a

personalizada. Esto puede tener como resultado aplicaciones con un bajo rendimiento y con un
mantenimiento difcil.
LINQ to DataSet facilita y acelera las consultas en datos almacenados en cach en un objeto DataSet. Esas
consultas se expresan en el lenguaje de programacin mismo, en lugar de como literales de cadena
incrustados en el cdigo de la aplicacin. Esto significa que los desarrolladores no tienen que aprender un
lenguaje de consultas diferente. Adicionalmente, LINQ to DataSet permite a los desarrolladores de Visual
Studio trabajar de forma ms productiva, ya que la IDE de Visual Studio proporciona comprobacin de
sintaxis en tiempo de compilacin, tipos estticos y compatibilidad de IntelliSense con LINQ. LINQ to DataSet
tambin se puede usar para consultar los datos que se han consolidado de uno o ms orgenes de datos.
Esto permite muchos casos que requieren flexibilidad en la forma de representar y controlar los datos. En
concreto, las aplicaciones de inteligencia empresaria, anlisis e informes genricos requieren este mtodo
de manipulacin.

Consultar conjuntos de datos usando LINQ to DataSet
Antes de poder empezar a consultar un objeto DataSet usando LINQ to DataSet, se debe rellenar elDataSet.
Existen varias formas de cargar datos en un DataSet, como usar la clase DataAdapter o LINQ to SQL. Cuando
se han cargado los datos en un objeto DataSet, se puede empezar a realizar consultas en l. La formulacin
de consultas usando LINQ to DataSet es similar a usar Language-Integrated Query (LINQ) en otros orgenes
de datos habilitados para LINQ. se pueden realizar consultas de LINQ en tablas nicas en un DataSet o en
ms de una tabla usando los operadores de consulta estndar Join y GroupJoin.
Se admiten consultas de LINQ en objetos DataSet con tipo y sin tipo. Si el esquema de DataSet es
desconocido en tiempo de diseo, se recomienda un DataSet con tipo. En un DataSet con tipo, las tablas y
las filas tienen miembros con tipo para cada una de las columnas, lo que hace que las consultas sean ms
sencillas y legibles.
Adems de los operadores de consulta estndar implementados en System.Core.dll, LINQ to DataSet agrega
varias extensiones especficas de DataSet que hacen que realizar consultas en un conjunto de
objetos DataRow sea sencillo. Estas extensiones especficas de DataSet incluyen operadores para comparar
secuencias de filas, as como mtodos que proporcionan acceso a los valores de columna de un DataRow.

Aplicaciones con n niveles y LINQ to DataSet
Las aplicaciones de datos con n niveles son aplicaciones centradas en datos separadas en varias capas
lgicas (o niveles). Una aplicacin con n niveles tpica incluye un nivel de presentacin, un nivel medio y un
nivel de datos. Al separar los componentes de la aplicacin en diferentes niveles, se aumenta el
mantenimiento y la escalabilidad de la aplicacin.
En las aplicaciones con n niveles, a menudo se utiliza DataSet en el nivel medio para almacenar en cach
informacin para una aplicacin web. La funcionalidad de consulta de LINQ to DataSet se implementa
mediante los mtodos de extensin y DataSet de ADO.NET 2.0 existente.
En el siguiente diagrama se muestra cmo se relaciona LINQ to DataSet con el DataSet y cmo encaja en una
aplicacin de nivel n:


ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 319 | P g i n a

Cargar datos en DataSet
Un objeto DataSet se debe rellenar primero antes de poderlo consultar con LINQ to DataSet. Existen varias
formas de rellenar DataSet. Por ejemplo, se puede utilizar LINQ to SQL para consultar la base de datos y
cargar los resultados en DataSet.
Otra forma habitual de cargar datos en DataSet es utilizar la clase DataAdapter para recuperar datos desde
la base de datos. Esto se muestra en el ejemplo siguiente.

Ejemplo
En este ejemplo se utiliza DataAdapter para consultar en la base de datos AdventureWorks la informacin
de ventas del ao 2002, y cargar los resultados en un DataSet. Una vez que se ha rellenadoDataSet, se
pueden escribir consultas en l mediante LINQ to DataSet. En este ejemplo, se utiliza el
mtodo FillDataSet en las consultas de ejemplo en Ejemplos de LINQ to DataSet.

Visual Basic
Try
Dim connectionString As String

connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;" & _
"Integrated Security=true;"

' Create a new adapter and give it a query to fetch sales order, contact,
' address, and product information for sales in the year 2002. Point connection
' information to the configuration setting "AdventureWorks".
Dim da = New SqlDataAdapter( _
"SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " & _
"TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " & _
"FROM Sales.SalesOrderHeader " & _
"WHERE DATEPART(YEAR, OrderDate) = @year; " & _
"SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " & _
"d.ProductID, d.UnitPrice " & _
"FROM Sales.SalesOrderDetail d " & _
"INNER JOIN Sales.SalesOrderHeader h " & _
"ON d.SalesOrderID = h.SalesOrderID " & _
"WHERE DATEPART(YEAR, OrderDate) = @year; " & _
"SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " & _
"p.Color, p.ListPrice, p.Size, p.Class, p.Style " & _
"FROM Production.Product p; " & _
"SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " & _
"a.City, a.StateProvinceID, a.PostalCode " & _
"FROM Person.Address a " & _
"INNER JOIN Sales.SalesOrderHeader h " & _
"ON a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " & _
"WHERE DATEPART(YEAR, OrderDate) = @year; " & _
"SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " & _
"c.LastName, c.EmailAddress, c.Phone " & _
"FROM Person.Contact c " & _
"INNER JOIN Sales.SalesOrderHeader h " & _
"ON c.ContactID = h.ContactID " & _
"WHERE DATEPART(YEAR, OrderDate) = @year;", _
connectionString)

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 320 | P g i n a

' Add table mappings.
da.SelectCommand.Parameters.AddWithValue("@year", 2002)
da.TableMappings.Add("Table", "SalesOrderHeader")
da.TableMappings.Add("Table1", "SalesOrderDetail")
da.TableMappings.Add("Table2", "Product")
da.TableMappings.Add("Table3", "Address")
da.TableMappings.Add("Table4", "Contact")

da.Fill(ds)

' Add data relations.
Dim orderHeader As DataTable = ds.Tables("SalesOrderHeader")
Dim orderDetail As DataTable = ds.Tables("SalesOrderDetail")
Dim co As DataRelation = New DataRelation("SalesOrderHeaderDetail", _
orderHeader.Columns("SalesOrderID"), _
orderDetail.Columns("SalesOrderID"), True)
ds.Relations.Add(co)

Dim contact As DataTable = ds.Tables("Contact")
Dim orderContact As DataRelation = New DataRelation("SalesOrderContact", _
contact.Columns("ContactID"), _
orderHeader.Columns("ContactID"), True)
ds.Relations.Add(orderContact)
Catch ex As SqlException
Console.WriteLine("SQL exception occurred: " & ex.Message)
End Try

Cmo: Crear un proyecto LINQ to DataSet en Visual Studio
Los distintos tipos de proyecto LINQ requieren determinados espacios de nombres importados (Visual Basic)
o directivas using (C#) y referencias. El requisito mnimo es una referencia a System.Core.dll y una
directiva using para System.Linq. De manera predeterminada, estos requisitos se proporcionan al crear un
proyecto Visual C# 2008 nuevo. LINQ to DataSet tambin requiere una referencia a System.Data.dll y
System.Data.DataSetExtensions.dll y una directiva Imports (Visual Basic) o using(C#).
Si est actualizando a un proyecto desde una versin anterior de Visual Studio, es posible que tenga que
proporcionar estas referencias relacionadas con LINQ de forma manual. Tambin es posible que tenga que
configurar de forma manual el proyecto para establecer como destino la versin 3.5 de .NET Framework.

Nota:
Si est generando el proyecto desde el smbolo del sistema, debe hacer referencia manualmente a las DLL
relacionadas con LINQ en:
drive:\Archivos de programa\Reference Assemblies\Microsoft\Framework\v3.5.

Para establecer como destino .NET Framework
1. En Visual Studio 2008, cree un proyecto Visual Basic o C# nuevo. Como alternativa, tambin puede
abrir un proyecto Visual Basic o C# creado en Visual Studio 2005 y seguir las indicaciones para
convertirlo en un proyecto Visual Studio 2008.
2. Para un proyecto, haga clic en el men Proyecto y, a continuacin, haga clic en Propiedades.
a. En la pgina de propiedades Aplicacin, seleccione .NET Framework 3.5 en la lista
desplegable Marco de trabajo de destino.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 321 | P g i n a

3. Para un proyecto Visual Basic, haga clic en el men Proyecto y, a continuacin, haga clic en
Propiedades.
a. En la pgina de propiedades Compilacin, haga clic en Opciones de compilacin
avanzadas y, a continuacin, seleccione .NET Framework 3.5 en la lista desplegable Marco
de trabajo de destino (todas las configuraciones).
4. En el men Proyecto, haga clic en Agregar referencia, haga clic en la ficha .NET, desplcese
hastaSystem.Core, haga clic en l y, a continuacin, haga clic en Aceptar.
5. Agregue una directiva using o un espacio de nombres importado para System.Linq en el archivo de
cdigo origen o proyecto.
.
Para habilitar la funcionalidad LINQ to DataSet
1. Si es necesario, siga las instrucciones descritas anteriormente para agregar una referencia a
System.Core.dll y una directiva using o un espacio de nombres importado para System.Linq.
2. En C# o Visual Basic, haga clic en el men Proyecto y, a continuacin, haga clic en Agregar
referencia.
3. En el cuadro de dilogo Agregar referencia, haga clic en la ficha .NET si no est en la parte superior.
Desplcese hasta System.Data y System.Data.DataSetExtensions y haga clic en ellos. Haga clic en
el botn Aceptar.
4. Agregue una directiva using o un espacio de nombres importado para System.Data en el archivo de
cdigo origen o proyecto.
5. Agregue una referencia a System.Data.DataSetExtensions.dll para la funcionalidad LINQ to Dataset.
Agregue una referencia a System.Data.dll si sta no existe an.
6. Si lo desea, agregue una directiva using o un espacio de nombres importado
paraSystem.Data.Common o System.Data.SqlClient, segn cmo se conecte a la base de datos.

Consultas en LINQ to DataSet
Una consulta es una expresin que recupera datos de un origen de datos. Las consultas se suelen expresar
en un lenguaje de consulta especializado, como SQL para bases de datos relacionales y XQuery para XML. As
pues, los desarrolladores han tenido que aprender un nuevo lenguaje de consulta para cada tipo de origen
de datos o formato de datos que consultan. Language-Integrated Query (LINQ) ofrece un modelo ms
sencillo y coherente para trabajar con datos en varios tipos de orgenes y formatos de datos. En una
consulta de LINQ siempre se trabaja con objetos de programacin.
Una operacin de consulta de LINQ consta de tres acciones: obtener el origen o los orgenes de datos, crear
la consulta y ejecutar la consulta.
Los orgenes de datos que implementan la interfaz genrica IEnumerable(T) se pueden consultar a travs de
LINQ. La llamada a AsEnumerable en DataTable devuelve un objeto que implementa la interfaz
IEnumerable(T) genrica, que acta como origen de datos para las consultas de LINQ to DataSet.
En la consulta se especifica exactamente la informacin que se desea recuperar del origen de datos. Una
consulta tambin puede especificar cmo se debe ordenar, agrupar y qu forma debe tener esa informacin
antes de que se devuelva. En LINQ, una consulta se almacena en una variable. Si la consulta est diseada
para devolver una secuencia de valores, la variable misma de la consulta debe ser de tipo enumerable. Esta
variable de consulta no realiza ninguna accin y no devuelve datos; solamente almacena la informacin de la
consulta. Tras crear una consulta debe ejecutarla para recuperar los datos.
En una consulta que devuelve una secuencia de valores, la variable de consulta por s misma nunca conserva
los resultados de la consulta y slo almacena los comandos de la misma. La ejecucin de la consulta se
aplaza hasta que la variable de consulta se recorre en iteracin en un bucle foreach o For Each. Esto se
denomina ejecucin aplazada; es decir, la ejecucin de la consulta se produce despus de que se cree la
consulta. Esto significa que se puede ejecutar una consulta con la frecuencia que se desee. Esto es til
cuando, por ejemplo, se tiene una base de datos que otras aplicaciones estn actualizando. En su aplicacin
puede crear una consulta para recuperar la informacin ms reciente y ejecutar de forma repetida la
consulta, devolviendo cada vez la informacin actualizada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 322 | P g i n a

A diferencia de las consultas aplazadas, que devuelven una secuencia de valores, las consultas que
devuelven un valor singleton se ejecutan inmediatamente. Algunos ejemplos de consultas singleton
sonCount, Max, Average y First. Se ejecutan inmediatamente porque se necesitan los resultados de la
consulta para calcular el resultado singleton. Por ejemplo, para buscar la media de los resultados de
consultas, debe ejecutarse la consulta para que la funcin de clculo de media tenga datos de entrada con
los que trabajar. Tambin puede usar los mtodos ToList(TSource) o ToArray(TSource) en una consulta para
forzar la ejecucin inmediata de una consulta que no crea un valor singleton. Esas tcnicas para forzar la
ejecucin inmediata pueden ser tiles si desea almacenar en cach los resultados de una consulta.

Consultas
Las consultas de LINQ to DataSet se pueden formular en dos sintaxis diferentes: sintaxis de expresiones de
consulta y sintaxis de consultas basadas en mtodos.
Sintaxis de expresiones de consulta
Las expresiones de consulta son una sintaxis de consulta declarativa. Esta sintaxis permite a un desarrollador
escribir consultas en C# o Visual Basic en un formato similar a SQL. Si se utiliza la sintaxis de expresiones de
consulta, se pueden realizar incluso operaciones complejas de filtrado, ordenacin y agrupamiento en
orgenes de datos con cdigo mnimo.
La sintaxis de expresiones de consulta es nueva en C# 3.0 y en Visual Basic 2008. No obstante, Common
Language Runtime (CLR) de .NET Framework no puede leer la sintaxis de expresiones de consulta en s. Por
lo tanto, en tiempo de compilacin, las expresiones de consulta se traducen a algo que CLR no comprende:
las llamadas a mtodos. Esos mtodos se conocen como operadores de consulta estndar. Como
desarrollador, tiene la opcin de llamarlos directamente utilizando la sintaxis de mtodo en lugar de la
sintaxis de consulta.

El siguiente ejemplo usa Select para devolver todas las filas de la tabla Product y mostrar los nombres de
producto.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = From product In products.AsEnumerable() _
Select product
Console.WriteLine("Product Names:")
For Each p In query
Console.WriteLine(p.Field(Of String)("Name"))
Next

Sintaxis de consultas basadas en mtodos
La otra forma de formular consultas de LINQ to DataSet es usar las consultas basadas en mtodos. La
sintaxis de consultas basadas en mtodos es una secuencia de llamadas a mtodos directas a los mtodos
de operador de LINQ, pasando expresiones lambda como parmetros.
Este ejemplo usa Select para devolver todas las filas de Product y mostrar los nombres de producto.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 323 | P g i n a

' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = products.AsEnumerable() _
.Select(Function(product As DataRow) New With _
{ _
.ProductName = product.Field(Of String)("Name"), _
.ProductNumber = product.Field(Of String)("ProductNumber"), _
.Price = product.Field(Of Decimal)("ListPrice") _
})

Console.WriteLine("Product Info:")
For Each product In query
Console.Write("Product name: " & product.ProductName)
Console.Write("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $ " & product.Price)
Next

Crear consultas
Tal y como se ha mencionado anteriormente en este tema, la variable de consulta slo almacena los
comandos de la consulta cuando sta se disea para devolver una secuencia de valores. Si la consulta no
contiene un mtodo que cause una ejecucin inmediata, la ejecucin real de la consulta se aplaza hasta que
la variable de consulta se recorra en iteracin en un bucle foreach o For Each. La ejecucin aplazada permite
combinar varias consultas o ampliar una consulta. Cuando se ampla una consulta, se modifica para incluir
las nuevas operaciones. La ejecucin eventual reflejar los cambios. En el siguiente ejemplo, la primera
consulta devuelve todos los productos. La segunda consulta ampla la primera usando Where para devolver
todos los productos del tamao "L":

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim productsQuery = From product In products.AsEnumerable() _
Select product

Dim largeProducts = _
productsQuery.Where(Function(p) p.Field(Of String)("Size") = "L")

Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
Console.WriteLine(product.Field(Of String)("Name"))
Next

Tras ejecutar una consulta no se pueden crear consultas adicionales y todas las consultas posteriores usarn
los operadores de LINQ en memoria. La ejecucin de la consulta se producir cuando se recorra en iteracin
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 324 | P g i n a

la variable de consulta en una instruccin foreach o For Each, o mediante una llamada a uno de los
operadores de conversin de LINQ que provocar una ejecucin inmediata. Entre estos operadores se
incluyen los siguientes: ToList(TSource), ToArray(TSource), ToLookup y ToDictionary.
En el siguiente ejemplo, la primera consulta devuelve todos los productos ordenados por el precio de la lista.
El mtodo ToArray(TSource) se usa para forzar la ejecucin inmediata de la consulta:

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice") Descending _
Select product

' Force immediate execution of the query.
Dim productsArray = query.ToArray()

Console.WriteLine("Every price From highest to lowest:")
For Each prod In productsArray
Console.WriteLine(prod.Field(Of Decimal)("ListPrice"))
Next

Consultar DataSets (LINQ to DataSet)
Despus de rellenar un objeto DataSet con datos se puede empezar a realizar consultas sobre l. Formular
consultas con LINQ to DataSet es similar a usar Language-Integrated Query (LINQ) contra otros orgenes de
datos habilitados para LINQ. No obstante, recuerde que cuando use las consultas de LINQ en un
objeto DataSet estar consultando una enumeracin de objetos DataRow en lugar de una enumeracin de
un tipo personalizado. Esto significa que puede usar cualquier de los miembros de la clase DataRow en sus
consultas de LINQ. Esto permite crear consultas amplias y complejas.
Al igual que con otras implementaciones de LINQ, puede crear consultas de LINQ to DataSet de dos formas
diferentes: sintaxis de expresin de consulta y sintaxis de consulta basada en mtodos. Puede usar la
sintaxis de expresin de consulta o la sintaxis de consulta basada en mtodos para realizar consultas en
tablas nicas en un DataSet, en tablas mltiples en un DataSet o en tablas en un DataSet con tipo.

Consultas de tabla nica (LINQ to DataSet)
Las consultas Language-Integrated Query (LINQ) operan en orgenes de datos que implementan la
interfaz IEnumerable(T) o la interfaz IQueryable. La clase DataTable no se implementa en ninguna de estas
interfaces, por lo que se debe llamar al mtodo AsEnumerable si desea utilizar DataTable como un origen en
la clusula From de una consulta LINQ.
En el ejemplo siguiente se obtienen todos los pedidos en lnea desde la tabla SalesOrderHeader y se envan
los resultados de id., fecha y nmero de pedido a la consola.

Visual Basic
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 325 | P g i n a

' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Select New With { _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
}

For Each onlineOrder In query
Console.Write("Order ID: " & onlineOrder.SalesOrderID)
Console.Write(" Order date: " & onlineOrder.OrderDate)
Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next

La consulta variable local se inicializa con una expresin de consulta, la cual opera en una o varias fuentes de
informacin aplicando uno o varios operadores de consulta desde el operador estndar de consulta o, en el
caso de LINQ to DataSet, desde el operador especfico de la clase DataSet. La expresin de consulta del
ejemplo anterior utiliza dos de los operadores estndar de consulta: Where y Select.
La clusula Where filtra la secuencia basndose en una condicin, en este caso que OnlineOrderFlag se
establezca en true. El operador Select asigna y devuelve un objeto enumerable que captura los argumentos
pasados al operador. En el ejemplo anterior, se crea un tipo annimo con tres
propiedades:SalesOrderID, OrderDate y SalesOrderNumber. Los valores de estas tres propiedades se
establecen en los valores de las columnas SalesOrderID, OrderDate y SalesOrderNumber a partir de la
tabla SalesOrderHeader.
A continuacin, el bucle foreach enumera el objeto enumerable devuelto por Select y produce los
resultados de la consulta. Dado que una consulta es un tipo Enumerable, que implementa IEnumerable(T), la
evaluacin de la consulta se aplaza hasta que se procesa una iteracin en la variable de la consulta mediante
el bucle foreach. El aplazamiento de la evaluacin de consultas permite que stas se mantengan como
valores que se pueden evaluar varias veces, y cada vez produciendo resultados potencialmente diferentes.
El mtodo Field proporciona acceso a los valores de columna de DataRow y SetField (que no se mostraba en
el ejemplo anterior) establece los valores de columna en DataRow. Tanto el mtodo Field como el
mtodo SetField controlan tipos que admiten valores null, por lo que no es necesario comprobar
explcitamente si hay valores null. Adems, ambos son mtodos genricos, lo que significa que no es
necesario convertir el tipo de valor devuelto. Puede utilizar el descriptor de acceso de columna preexistente
en DataRow (por ejemplo, o["OrderDate"]), pero hacerlo le exigira convertir el objeto de valor devuelto al
tipo apropiado. Si la columna admite valores null, debe comprobar si el valor es null utilizando el
mtodo IsNull.
Observe que el tipo de datos especificado en el parmetro T genrico de los mtodos Field y SetFielddeben
coincidir con el tipo del valor subyacente; en caso contrario, se producir unaInvalidCastException. El
nombre de columna especificado debe tambin coincidir con el nombre de una columna en DataSet, en caso
contrario, se producir una ArgumentException. En ambos casos, la excepcin se produce en tiempo de
ejecucin de enumeracin de datos, cuando se ejecuta la consulta.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 326 | P g i n a

Consultas entre tablas (LINQ to DataSet)
Adems de realizar consultas a una tabla nica, en LINQ to DataSet se pueden efectuar consultas entre
tablas. Esto se consigue mediante una combinacin. Una combinacin es la asociacin de objetos en un
origen de datos con objetos que comparten un atributo comn en otro origen de datos, como un id. de
contacto o de producto. En la programacin orientada a objetos, las relaciones entre dichos objetos son
relativamente fciles de navegar debido a que cada uno de ellos tiene un miembro que hace referencia a
otro. Sin embargo, en tablas de bases de datos externas, navegar por relaciones no es tan sencillo. Las tablas
de bases de datos no contienen relaciones integradas. En estos casos, la operacin de combinacin se puede
utilizar para hacer coincidir elementos de cada origen. Por ejemplo, con dos tablas que contienen
informacin de producto y de ventas, se puede utilizar una operacin de combinacin para hacer coincidir
informacin de ventas y producto del mismo pedido de ventas.
El marco de trabajo Language-Integrated Query (LINQ) proporciona dos operadores de combinacin, Join
y GroupJoin. Estos operadores efectan combinaciones de igualdad, es decir, combinaciones que hacen
coincidir dos orgenes de datos nicamente cuando sus claves son iguales (por el contrario, Transact-SQL
admite operadores de combinacin distintos de equals, como el operador less than).
En cuanto a las bases de datos relacionales, Join implementa una combinacin interna. Una combinacin
interna es un tipo de combinacin en la que solamente se devuelven los objetos que tienen una
correspondencia en el conjunto de datos opuesto.
Los operadores GroupJoin no tienen equivalente directo en trminos de bases de datos relacionales;
implementan un superconjunto de combinaciones internas y combinaciones externas izquierdas. Una
combinacin externa izquierda es una combinacin que devuelve cada elemento de la primera coleccin
(izquierda), aunque ste no tenga elementos correlacionados en la segunda coleccin.
Ejemplo
El ejemplo siguiente realiza una combinacin tradicional de las tablas SalesOrderHeader y SalesOrderDetail
de la base de datos de ejemplo AdventureWorks para obtener pedidos en lnea del mes de agosto.

Visual Basic
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
From order In orders.AsEnumerable() _
Join detail In details.AsEnumerable() _
On order.Field(Of Integer)("SalesOrderID") Equals _
detail.Field(Of Integer)("SalesOrderID") _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
order.Field(Of DateTime)("OrderDate").Month = 8 _
Select New With _
{ _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.ProductID = detail.Field(Of Integer)("ProductID") _
}
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 327 | P g i n a


For Each order In query
Console.WriteLine(order.SalesOrderID & vbTab & _
order.SalesOrderDetailID & vbTab & _
order.OrderDate & vbTab & _
order.ProductID)
Next

Consultar DataSets con establecimiento de tipos
Si el esquema de DataSet se conoce en tiempo de diseo de la aplicacin, se recomienda usar un DataSetcon
tipo al utilizar LINQ to DataSet. Un DataSet con tipo es una clase que se deriva de un DataSet. Como tal,
hereda todos los mtodos, eventos y propiedades de un DataSet. Adems, un DataSet con tipo proporciona
mtodos, eventos y propiedades con establecimiento inflexible de tipos. Esto significa que se puede tener
acceso a tablas y columnas por su nombre, en lugar de utilizar mtodos de una coleccin. Esto hace que las
consultas sean ms sencillas y ms legibles
LINQ to DataSet tambin admite las consultas en un DataSet con tipo. Con un DataSet con tipo no hay que
usar el mtodo Field genrico o el mtodo SetField para tener acceso a los datos de la columna. Los
nombres de propiedad estn disponibles en el tiempo de compilacin porque la informacin de tipo se
incluye en DataSet. LINQ to DataSet proporciona acceso a valores de columna como tipo correcto para que
los errores de no coincidencia de tipos se detecten cuando se compile el cdigo en lugar de en tiempo de
ejecucin.
Antes de poder empezar a consultar un DataSet con tipo se debe generar la clase usando el Diseador de
DataSet de Visual Studio 2008.

Ejemplo
En el siguiente ejemplo se muestra una consulta sobre un DataSet con tipo:

Dim orders = ds.Tables("SalesOrderHeader")

Dim query = _
From o In orders _
Where o.OnlineOrderFlag = True _
Select New {SalesOrderID := o.SalesOrderID, _
OrderDate := o.OrderDate, _
SalesOrderNumber := o.SalesOrderNumber}

For Each Dim onlineOrder In query
Console.WriteLine("{0}\t{1:d}\t{2}", _
onlineOrder.SalesOrderID, _
onlineOrder.OrderDate, _
onlineOrder.SalesOrderNumber)
Next

Comparar DataRows (LINQ to DataSet)
Language-Integrated Query (LINQ) define varios operadores de conjuntos para comparar elementos de
origen y ver si son iguales. LINQ proporciona los siguientes operadores de conjuntos:
Distinct
Union
Intersect
Except
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 328 | P g i n a

Estos operadores comparan elementos origen llamando a los mtodos GetHashCode y Equals de cada
coleccin de elementos. En el caso de DataRow, estos operadores realizan una comparacin de referencia,
lo que en general no constituye un comportamiento ideal para operaciones de conjunto en datos tabulares.
Para las operaciones de conjuntos, por lo general desear determinar si los valores del elemento son iguales
o no a las referencias del elemento. Por ello, se ha agregado la claseDataRowComparer a LINQ to DataSet.
Esta clase se puede utilizar para comparar valores de fila.
La clase DataRowComparer contiene una implementacin de comparacin del valor para DataRow, de modo
que esta clase se puede utilizar para operaciones de conjuntos como Distinct. No se puede crear una
instancia directamente de esta clase. En su lugar, debe utilizarse la propiedad Default para devolver una
instancia de DataRowComparer. Entonces, se llama al mtodo Equals(DataRow, DataRow) y los dos
objetos DataRow que se van a comparar se pasan como parmetros de entrada. El mtodoEquals(DataRow,
DataRow) devuelve true si los conjuntos ordenados de valores de columna de ambos objetos DataRow son
iguales; de lo contrario, devuelve false.

Ejemplo
Este ejemplo usa Intersect para devolver contactos que aparecen en ambas tablas.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim contactTable As DataTable = ds.Tables("Contact")

Dim query1 = _
From contact In contactTable.AsEnumerable() _
Where contact.Field(Of String)("Title") = "Ms." _
Select contact

Dim query2 = _
From contact In contactTable.AsEnumerable() _
Where contact.Field(Of String)("FirstName") = "Sandra" _
Select contact

Dim contacts1 = query1.CopyToDataTable()
Dim contacts2 = query2.CopyToDataTable()

Dim contacts = contacts1.AsEnumerable() _
.Intersect(contacts2.AsEnumerable(), DataRowComparer.Default)

Console.WriteLine("Intersect of employees tables")

For Each row In contacts
Console.WriteLine("Id: {0} {1} {2} {3}", _
row("ContactID"), row("Title"), row("FirstName"), row("LastName"))
Next

Ejemplo
El ejemplo siguiente compara dos filas y obtiene sus cdigos hash.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 329 | P g i n a

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

' Get two rows from the SalesOrderHeader table.
Dim table As DataTable = ds.Tables("SalesOrderHeader")
Dim left = table.Rows(0)
Dim right = table.Rows(1)

' Compare the two different rows.
Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
Dim bEqual = comparer.Equals(left, right)

If (bEqual = True) Then
Console.WriteLine("Two rows are equal")
Else
Console.WriteLine("Two rows are not equal")
End If

' Output the hash codes of the two rows.
Console.WriteLine("The hashcodes for the two rows are {0}, {1}", _
comparer.GetHashCode(left), _
comparer.GetHashCode(right))

Crear DataTable desde una consulta (LINQ to DataSet)
El enlace de datos es una utilizacin muy frecuente del objeto DataTable. El mtodo CopyToDataTabletoma
los resultados de una consulta y los copia en DataTable, para as poder ser utilizados para el enlace de datos.
Cuando las operaciones de datos se han realizado, el DataTable nuevo se vuelve a combinar en
el DataTable de origen.
El mtodo CopyToDataTable utiliza el siguiente proceso para crear un DataTable a partir de una consulta:
1. El mtodo CopyToDataTable clona un DataTable a partir de la tabla origen (un objeto DataTableque
implementa la interfaz IQueryable(T)). El origen de IEnumerable se ha originado de una expresin
LINQ to DataSet o una consulta de mtodo.
2. El esquema del DataTable clonado se genera a partir de las columnas del primer
objeto DataRowenumerado en la tabla origen; el nombre de la tabla clonada es el nombre de la
tabla origen con la palabra "query" anexada.
3. En cada fila de la tabla origen, el contenido de la fila se copia en un objetoDataRow nuevo, el cual, a
continuacin, se inserta en la tabla clonada. Las propiedades RowState y RowError se mantienen en
toda la operacin de copia. Si los objetos DataRow de origen pertenecen a tablas diferentes, se
produce unaArgumentException.
4. Cuando todos los objetos DataRow de la tabla de entrada que se puede consultar se han copiado,
se devuelve el DataTable clonado. Si la secuencia origen no contiene objetos DataRow, el mtodo
devuelve un DataTable vaco.
Observe que, si se llama al mtodo CopyToDataTable, la consulta se enlaza a la tabla origen para ejecutarse.
Cuando el mtodo CopyToDataTable encuentra una referencia NULL o un tipo de valor que admite valores
NULL en una fila de la tabla origen, reemplaza el valor con Value. De este modo, los valores NULL se
controlan correctamente en el DataTable devuelto.
Nota: el mtodo CopyToDataTable acepta como entrada una consulta que pueda devolver filas de varios
objetos DataTable o DataSet. El mtodo CopyToDataTable copiar los datos pero no las propiedades desde
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 330 | P g i n a

los objetos DataTable o DataSet de origen en el elemento DataTable que se va a devolver. Necesitar
establecer explcitamente las propiedades de los elementos DataTable devueltos, como Localey TableName.
En el ejemplo siguiente se consultan en la tabla SalesOrderHeader los pedidos posteriores al 8 de agosto de
2001 y se utiliza el mtodo CopyToDataTable para crear un DataTable a partir de esa consulta. A
continuacin, se enlaza DataTable a un BindingSource, que acta como proxy para un objetoDataGridView.

' Bind the System.Windows.Forms.DataGridView object
' to the System.Windows.Forms.BindingSource object.
dataGridView.DataSource = bindingSource

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")

' Query the SalesOrderHeader table for orders placed
' after August 8, 2001.
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of DateTime)("OrderDate") > New DateTime(2001, 8, 1) _
Select order

' Create a table from the query.
Dim boundTable As DataTable = query.CopyToDataTable()

' Bind the table to a System.Windows.Forms.BindingSource object,
' which acts as a proxy for a System.Windows.Forms.DataGridView object.
bindingSource.DataSource = boundTable

Crear un mtodo CopyToDataTable personalizado
Los mtodos CopyToDataTable existentes solo funcionan en un origen IEnumerable(T) en el que el
parmetro genrico T es de tipo DataRow. Aunque esto es til, no permite la creacin de tablas a partir de
una secuencia de tipos escalares, a partir de consultas que devuelven tipos annimos, o a partir de consultas
que realizan combinaciones de tablas. Para obtener un ejemplo de cmo se implementan dos
mtodos CopyToDataTable personalizados que cargan una tabla a partir de una secuencia de tipos
annimos o escalares.
Los ejemplos de esta seccin utilizan los tipos personalizados siguientes:

Public Class Item
Private _Id As Int32
Private _Price As Double
Private _Genre As String

Public Property Id() As Int32
Get
Return Id
End Get
Set(ByVal value As Int32)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 331 | P g i n a

_Id = value
End Set
End Property

Public Property Price() As Double
Get
Return _Price
End Get
Set(ByVal value As Double)
_Price = value
End Set
End Property

Public Property Genre() As String
Get
Return _Genre
End Get
Set(ByVal value As String)
_Genre = value
End Set
End Property

End Class
Public Class Book
Inherits Item
Private _Author As String
Public Property Author() As String
Get
Return _Author
End Get
Set(ByVal value As String)
_Author = value
End Set
End Property
End Class

Public Class Movie
Inherits Item
Private _Director As String
Public Property Director() As String
Get
Return _Director
End Get
Set(ByVal value As String)
_Director = value
End Set
End Property

End Class

Ejemplo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 332 | P g i n a

En este ejemplo se realiza una combinacin en las tablas SalesOrderHeader y SalesOrderDetail para obtener
pedidos en lnea del mes de agosto y se crea una tabla a partir de la consulta.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
From order In orders.AsEnumerable() _
Join detail In details.AsEnumerable() _
On order.Field(Of Integer)("SalesOrderID") Equals _
detail.Field(Of Integer)("SalesOrderID") _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
order.Field(Of DateTime)("OrderDate").Month = 8 _
Select New With _
{ _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.ProductID = detail.Field(Of Integer)("ProductID") _
}

Dim table As DataTable = query.CopyToDataTable()
DataTable orderTable = query.CopyToDataTable();

Ejemplo
En el ejemplo siguiente se consulta una coleccin de elementos cuyo precio es superior a $ 9,99 y se crea
una tabla a partir de los resultados de la consulta.

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 333 | P g i n a

movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

' Query for items with price greater than 9.99.
Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

Dim table As DataTable
table = query.CopyToDataTable()

Ejemplo
En el ejemplo siguiente se consulta una coleccin de elementos cuyo precio es superior a $ 9,99 y se
proyectan los resultados. La secuencia de tipos annimos devuelta se carga en una tabla existente.

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 334 | P g i n a

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

' Create a table with a schema that matches that of the query results.
Dim table As DataTable = New DataTable()
table.Columns.Add("Price", GetType(Integer))
table.Columns.Add("Genre", GetType(String))

' Query for items with price greater than 9.99.
Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

query.CopyToDataTable(table, LoadOption.PreserveChanges)

Ejemplo
En el ejemplo siguiente se consulta una coleccin de elementos cuyo precio es superior a $ 9,99 y se
proyectan los resultados. La secuencia de tipos annimos devuelta se carga en una tabla existente. El
esquema de la tabla se ampla automticamente porque los tipos Book y Movies se derivan del tipoItem.

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 335 | P g i n a

items(2) = movie1
items(3) = movie2

' Load into an existing DataTable, expand the schema and
' autogenerate a new Id.
Dim table As DataTable = New DataTable()
Dim dc As DataColumn = table.Columns.Add("NewId", GetType(Integer))
dc.AutoIncrement = True
table.Columns.Add("ExtraColumn", GetType(String))

Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

query.CopyToDataTable(table, LoadOption.PreserveChanges)

Ejemplo
En el ejemplo siguiente se consulta una coleccin de elementos cuyo precio es superior a $ 9,99 y se
devuelve una secuencia de Double, que se carga en una tabla nueva.

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 336 | P g i n a

Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select i.Price

Dim table As DataTable
table = query.CopyToDataTable()

Mtodos genricos Field y SetField (LINQ to DataSet)
LINQ to DataSet proporciona mtodos de extensin a la clase DataRow para obtener acceso a los valores de
columna: el mtodo Field y el mtodo SetField. Estos mtodos facilitan el acceso a los valores de columna a
los desarrolladores, sobre todo en lo relativo a valores NULL. DataSet utiliza Value para representar valores
NULL, en tanto que LINQ utiliza la compatibilidad con tipos que admiten valores NULL introducida en .NET
Framework 2.0. Utilizar el descriptor de acceso de columna preexistente en DataRowexige convertir el
objeto de valor devuelto al tipo apropiado. Si un campo determinado de DataRow puede ser NULL, se debe
comprobar de manera explcita si hay un valor NULL porque la devolucin de Value y su conversin implcita
a otro tipo produce una InvalidCastException. En el ejemplo siguiente, si no se utilizara el mtodo IsNull para
comprobar si hay un valor NULL, se producira una excepcin si el indizador devolviera Value e intentara
convertirlo en String.

Visual Basic
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = _
From product In products.AsEnumerable() _
Where product!Color IsNot DBNull.Value AndAlso product!Color = "Red" _
Select New With _
{ _
.Name = product!Name, _
.ProductNumber = product!ProductNumber, _
.ListPrice = product!ListPrice _
}

For Each product In query
Console.WriteLine("Name: " & product.Name)
Console.WriteLine("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $" & product.ListPrice & vbNewLine)
Next

El mtodo Field proporciona acceso a los valores de columna de DataRow y SetField establece los valores de
columna en DataRow. Tanto el mtodo Field como el mtodo SetField controlan tipos que admiten valores
NULL, por lo que no es necesario comprobar explcitamente si hay valores NULL, como en el ejemplo
anterior. Adems, ambos son mtodos genricos, lo que significa que no es necesario convertir el tipo de
valor devuelto.
El siguiente ejemplo utiliza el mtodo Field.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 337 | P g i n a


' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = _
From product In products.AsEnumerable() _
Where product.Field(Of String)("Color") = "Red" _
Select New With _
{ _
.Name = product.Field(Of String)("Name"), _
.ProductNumber = product.Field(Of String)("ProductNumber"), _
.ListPrice = product.Field(Of Decimal)("ListPrice") _
}

For Each product In query
Console.WriteLine("Name: " & product.Name)
Console.WriteLine("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $ " & product.ListPrice & vbNewLine)
Next

Observe que el tipo de datos especificado en el parmetro T genrico de los mtodos Field y SetFielddeben
coincidir con el tipo del valor subyacente. De lo contrario, se producir una excepcinInvalidCastException.
El nombre de columna especificado debe tambin coincidir con el nombre de una columna en DataSet; en
caso contrario, se producir una ArgumentException. En ambos casos, la excepcin se produce en tiempo de
ejecucin durante la enumeracin de datos cuando se ejecuta la consulta.
El mtodo SetField en s no realiza ninguna conversin de tipos. Sin embargo, esto no significa que no se
realizar una conversin de tipos. El mtodo SetField expone el comportamiento ADO.NET 2.0 de la
claseDataRow. El objeto DataRow consigui realizar una conversin de tipos y el valor convertido se
guardar en el objeto DataRow.

Enlace de datos y LINQ to DataSet
Enlace de datos es el proceso que establece una conexin entre la interfaz de usuario de la aplicacin y la
lgica de negocios. Si el enlace est configurado correctamente y los datos proporcionan la notificaciones
adecuadas, al cambiar los valores de los datos, los elementos enlazados a los mismos reflejarn de manera
automtica dichos cambios. DataSet es una representacin de datos residente en memoria que proporciona
un modelo de programacin relacional coherente independientemente del origen de datos que
contiene. DataView de ADO.NET 2.0 permite ordenar y filtrar los datos almacenados en DataTable. Esta
funcionalidad se utiliza con frecuencia en aplicaciones de enlace de datos. Mediante DataView puede
exponer los datos de una tabla con distintos criterios de ordenacin y filtrar los datos por el estado de fila o
basndose en una expresin de filtro.
LINQ to DataSet permite a los programadores crear consultas complejas y eficaces en DataSet utilizando
Language-Integrated Query (LINQ). No obstante, una consulta LINQ to DataSet devuelve una enumeracin
de objetos DataRow, que no se utiliza con facilidad en un caso de enlace. Para facilitar el proceso de enlace,
se puede crear un objeto DataView a partir de una consulta LINQ to DataSet. Este objeto DataView usa el
filtrado y la ordenacin especificados en la consulta, pero es ms adecuado para el enlace de datos. LINQ to
DataSet ampla la funcionalidad del objeto DataView proporcionando filtrado y ordenacin basados en
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 338 | P g i n a

expresiones de LINQ, lo que permite operaciones de filtrado y ordenacin mucho ms complejas y eficaces
que las basadas en cadenas.
Observe que DataView representa la propia consulta y no es una vista encima de la consulta. DataView se
enlaza a un control de la interfaz de usuario, como DataGrid o DataGridView, proporcionando un modelo de
enlace de datos simple. DataView se puede crear tambin a partir de DataTable, proporcionando una vista
predeterminada de esa tabla.

Crear un objeto DataView (LINQ to DataSet)
Existen dos maneras de crear DataView en el contexto de LINQ to DataSet . Se puede crear DataView a partir
de una consulta LINQ to DataSet en DataTable o a partir de DataTable con o sin tipo. En ambos casos, se
crea DataView utilizando uno de los mtodos de extensin AsDataView; DataView no se puede construir
directamente en el contexto de LINQ to DataSet.
Cuando se ha creado DataView, puede enlazarlo con un control de la interfaz de usuario en una aplicacin
de formularios Windows o en una aplicacin ASP.NET, o cambiar la configuracin de filtro y ordenacin.
DataView construye un ndice, que mejora considerablemente el rendimiento de las operaciones que
pueden utilizarlo, como filtro y ordenacin. El ndice de DataView se genera cuando se crea DataView y
cuando se modifica cualquier informacin de filtro u ordenacin. La creacin de DataView y el posterior
establecimiento de informacin de filtro y ordenacin hace que el ndice se genere al menos dos veces: una
cuando se crea DataView y la otra cuando se modifica cualquiera de las propiedades de ordenacin y
filtrado.

Crear DataView desde una consulta LINQ to DataSet
Un objeto DataView puede crearse a partir de los resultados de una consulta LINQ to DataSet, en la que los
resultados son una proyeccin de objetos DataRow. El objeto DataView que se acaba de crear hereda la
informacin de filtrado y ordenacin de la consulta a partir de la cual se cre.

Nota:
En la mayor parte de los casos, las expresiones utilizadas en el filtrado y la ordenacin no deben tener
efectos secundarios y deben ser deterministas. Adems, las expresiones no deben tener ninguna lgica que
dependa de un nmero de conjunto de ejecuciones, ya que las operaciones de filtrado y ordenacin se
pueden ejecutar un nmero ilimitado de veces.

No se admite la creacin de DataView a partir de una consulta que devuelve tipos annimos o consultas que
realizan operaciones de combinacin.
Slo se admiten los siguientes operadores de consulta en una consulta utilizada para crear DataView:
Cast(TResult)
OrderBy
OrderByDescending
Select(TRow, S)
ThenBy
ThenByDescending
Where(TRow)
Tenga en cuenta que, cuando se crea un objeto DataView a partir de una consulta LINQ to DataSet, el
mtodo Select(TRow, S) deber ser el mtodo final que se invoca en la consulta. Esto se muestra en el
ejemplo siguiente, en el que se crea un objeto DataView de pedidos en lnea ordenados por el total a pagar:

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 339 | P g i n a

Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Order By order.Field(Of Decimal)("TotalDue") _
Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Tambin se pueden utilizar las propiedades basadas en cadena RowFilter y Sort para filtrar y
ordenarDataView despus de haber sido creado a partir de una consulta. Observe que con esto se borrar la
informacin de ordenacin y filtro heredada de la consulta. El ejemplo siguiente crea DataView a partir de
una consulta LINQ to DataSet que filtra por apellidos que empiezan por "S". La propiedad basada en
cadena Sort se establece para ordenar por apellidos en orden ascendente y despus por nombres en orden
descendente:

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName").StartsWith("S") _
Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Crear DataView a partir de DataTable
Adems de poderse crear a partir de una consulta LINQ to DataSet, un objeto DataView se puede crear a
partir de DataTable utilizando el mtodo AsDataView.
En el ejemplo siguiente, se crea DataView a partir de la tabla SalesOrderDetail y se establece ese objeto
como origen de datos de un objeto BindingSource: Este objeto acta como proxy para un control
DataGridView.

Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

El filtro y la ordenacin pueden establecerse en DataView despus de que se haya creado a partir de
DataTable. El ejemplo siguiente crea DataView a partir de la tabla Contact y establece la propiedad Sortpara
ordenar por apellidos en orden ascendente y luego por nombres en orden descendente:

Visual Basic
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc, FirstName asc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

No obstante, se produce una prdida de rendimiento cuando se establece la
propiedad RowFilter o Sortdespus de haberse creado DataView a partir de una consulta, debido a
que DataView construye un ndice para admitir operaciones de filtro y ordenacin. El establecimiento de la
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 340 | P g i n a

propiedad RowFilter oSort hace que se vuelva a generar el ndice de los datos, lo que agrega sobrecarga a la
aplicacin y reduce el rendimiento. Siempre que sea posible, se recomienda especificar la informacin sobre
filtro y ordenacin cuando se cree por primera vez DataView y evitar modificaciones posteriores.

Filtrar con DataView (LINQ to DataSet)
La capacidad de filtrar datos utilizando criterios especficos y despus presentarlos a un cliente mediante un
control de IU es un aspecto importante del enlace de datos. DataView proporciona varias maneras de filtrar
datos y devolver subconjuntos de filas de datos que renan determinados criterios. Adems de capacidades
de filtro basado en cadena, DataView tambin proporciona la capacidad de utilizar expresiones LINQ para
los criterios de filtro. Las expresiones LINQ permiten operaciones de filtro ms complejas y eficaces que el
filtro basado en cadena.
Existen dos maneras de filtrar datos utilizando DataView:
Crear un DataView a partir de una consulta LINQ to DataSet con una clusula WHERE.
Utilizar las capacidades de filtro basado en cadena de DataView existentes.

Crear DataView desde una consulta con informacin de filtro
Se puede crear un objeto DataView desde una consulta LINQ to DataSet. Si dicha consulta tiene una
clusula Where, DataView se crea con informacin de filtro desde la consulta. La expresin de la
clusula Where se utiliza para determinar qu filas de datos se incluirn en DataView, y constituye la base
para el filtro.
Los filtros basados en expresin son ms eficaces y complejos que los sencillos filtros basados en cadena.
Los filtros basados en cadena y los basados en expresin se excluyen mutuamente. Cuando el RowFilter
basado en cadena se establece despus de haber creado DataView desde una consulta, se borra el filtro
basado en expresin inferido a partir de la consulta.

Nota:
En la mayor parte de los casos, las expresiones utilizadas en el filtro no deben tener efectos secundarios y
deben ser deterministas. Adems, las expresiones no deben tener ninguna lgica que dependa de un
nmero de conjunto de ejecuciones, porque las operaciones de filtrado se pueden ejecutar un nmero
ilimitado de veces.

Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderDetail los pedidos con una cantidad superior a 2 e
inferior a 6; crea un DataView desde una consulta y enlaza DataView a un BindingSource:

Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Int16)("OrderQty") > 2 And _
order.Field(Of Int16)("OrderQty") < 6 _
Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Ejemplo
El siguiente ejemplo crea un DataView desde una consulta de pedidos efectuados con posterioridad al 6 de
junio de 2001:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 341 | P g i n a


Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of DateTime)("OrderDate") > New DateTime(2002, 6, 1) _
Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Ejemplo
El filtro se puede combinar tambin con la ordenacin. El siguiente ejemplo crea un DataView desde una
consulta de contactos cuyos apellidos empiezan por la letra "S", y los ordena primero por el apellido y
despus por el nombre:

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName").StartsWith("S") _
Order By contact.Field(Of String)("LastName"), contact.Field(Of String)("FirstName") _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Ejemplo
El siguiente ejemplo utiliza el algoritmo SoundEx para encontrar contactos cuyo apellido es similar a "Zhu".
El algoritmo SoundEx se implementa en el mtodo SoundEx.

Visual Basic
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim soundExCode As String = SoundEx("Zhu")
Dim query = _
From contact In contacts.AsEnumerable() _
Where SoundEx(contact.Field(Of String)("LastName")) = soundExCode _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

SoundEx es un algoritmo fontico utilizado para indizar nombres segn el sonido, tal como se pronuncian en
ingls, que fue desarrollado originalmente por la Oficina del Censo de Estados Unidos. El mtodo SoundEx
devuelve un cdigo de cuatro caracteres para un nombre que consiste en una letra inglesa seguida de tres
nmeros. La letra es la primera letra del nombre y los nmeros codifican el resto de las consonantes del
mismo. Los nombres que suenan parecidos comparten el mismo cdigo SoundEx. A continuacin se muestra
la implementacin del SoundEx utilizado en el mtodo SoundEx del ejemplo anterior:

Private Function SoundEx(ByVal word As String) As String

Dim length As Integer = 4
' Value to return
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 342 | P g i n a

Dim value As String = ""
' Size of the word to process
Dim size As Integer = word.Length
' Make sure the word is at least two characters in length
If (size > 1) Then
' Convert the word to all uppercase
word = word.ToUpper(System.Globalization.CultureInfo.InvariantCulture)
' Convert the word to character array for faster processing
Dim chars As Char() = word.ToCharArray()
' Buffer to build up with character codes
Dim buffer As StringBuilder = New StringBuilder()
' The current and previous character codes
Dim prevCode As Integer = 0
Dim currCode As Integer = 0
' Append the first character to the buffer
buffer.Append(chars(0))
' Loop through all the characters and convert them to the proper character code
For i As Integer = 1 To size - 1
Select Case chars(i)
Case "A", "E", "I", "O", "U", "H", "W", "Y"
currCode = 0
Case "B", "F", "P", "V"
currCode = 1
Case "C", "G", "J", "K", "Q", "S", "X", "Z"
currCode = 2
Case "D", "T"
currCode = 3
Case "L"
currCode = 4
Case "M", "N"
currCode = 5
Case "R"
currCode = 6
End Select
' Check to see if the current code is the same as the last one
If (currCode <> prevCode) Then
' Check to see if the current code is 0 (a vowel); do not process vowels
If (currCode <> 0) Then
buffer.Append(currCode)
End If
End If
' Set the new previous character code
prevCode = currCode
' If the buffer size meets the length limit, then exit the loop
If (buffer.Length = length) Then
Exit For
End If
Next
' Pad the buffer, if required
size = buffer.Length
If (size < length) Then
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 343 | P g i n a

buffer.Append("0", (length - size))
End If
' Set the value to return
value = buffer.ToString()
End If
' Return the value
Return value
End Function

Utilizar la propiedad RowFilter
La funcionalidad de filtro basado en cadena DataView existente funciona tambin en el contexto de LINQ to
DataSet.
El siguiente ejemplo crea un DataView desde la tabla Contact y, a continuacin, establece la propiedad
RowFilter para que devuelva filas cuando el apellido del contacto sea "Zhu":

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.RowFilter = "LastName='Zhu'"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Despus de haberse creado un DataView desde una consulta DataTable o LINQ to DataSet, se puede utilizar
la propiedad RowFilter para especificar subconjuntos de filas basados en sus valores de columna. Los filtros
basados en cadena y los basados en expresin se excluyen mutuamente. Al establecer la
propiedad RowFilter se borrar la expresin de filtro inferida a partir de la consulta LINQ to DataSet, y la
expresin de filtro no se podr volver a restablecer.

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName") = "Hernandez" _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
view.RowFilter = "LastName='Zhu'"

Si desea devolver los resultados de una consulta determinada en los datos, en lugar de proporcionar una
vista dinmica de un subconjunto de los datos, para conseguir el mximo rendimiento puede utilizar los
mtodos Find o FindRows de la DataView, en lugar de establecer la propiedad RowFilter. La propiedad
RowFilter es ms idnea en una aplicacin enlazada a datos donde un control enlazado muestra resultados
filtrados. El establecimiento de la propiedad RowFilter hace que se vuelva a generar el ndice de los datos, lo
que agrega sobrecarga a la aplicacin y reduce el rendimiento. Los mtodosFind y FindRows utilizan el ndice
actual, sin necesidad de volver a generarlo. Si va a llamar a Find o aFindRows una nica vez, entonces
debera utilizar el DataView existente. Si va a llamar a Find o aFindRows varias veces, debera crear un
nuevo DataView para volver a generar el ndice en la columna en la que desea buscar y, a continuacin,
llamar a los mtodos Find o FindRows.

Borrar el filtro
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 344 | P g i n a

Despus de haber configurado el filtro de DataView, ste se puede borrar mediante la propiedadRowFilter.
El filtro de DataView se pude borrar de dos maneras:
Establecer la propiedad RowFilter en null.
Establecer la propiedad RowFilter en una cadena vaca.
Ejemplo
El siguiente ejemplo crea un DataView desde una consulta y, a continuacin, borra el filtro estableciendo la
propiedad RowFilter en null:

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of DateTime)("OrderDate") > New DateTime(2002, 11, 20) _
And order.Field(Of Decimal)("TotalDue") < New Decimal(60.0) _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.RowFilter = Nothing

Ejemplo
El siguiente ejemplo crea un DataView desde una tabla, establece la propiedad RowFilter y, a continuacin,
borra el filtro estableciendo la propiedad RowFilter en una cadena vaca:

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.RowFilter = "LastName='Zhu'"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
' Clear the row filter.
view.RowFilter = ""

Ordenar con DataView (LINQ to DataSet)
La capacidad de ordenar datos basndose en criterios especficos y despus presentarlos a un cliente
mediante un control de interfaz de usuario es un aspecto importante del enlace de
datos. DataViewproporciona varias maneras de ordenar datos y devolver filas de datos ordenados segn
criterios de ordenacin especficos. Adems de capacidades de ordenacin basada en
cadena, DataView tambin permite utilizar expresiones Language-Integrated Query (LINQ) para los criterios
de ordenacin. Las expresiones LINQ permiten operaciones de ordenacin ms complejas y eficaces que la
ordenacin basada en cadena. En este tema se describen ambos enfoques de ordenacin
utilizando DataView.
Crear DataView desde una consulta con informacin de ordenacin
Se puede crear un objeto DataView desde una consulta LINQ to DataSet. Si dicha consulta contiene una
clusula OrderBy, OrderByDescending, ThenBy o ThenByDescending las expresiones de dicha clusula se
utilizan como base para la ordenacin de los datos en DataView. Por ejemplo, si la consulta contiene las
clusulas Order By y Then By, el DataView resultante ordenar los datos por ambas columnas
especificadas.
La ordenacin basada en expresin es ms eficaz y compleja que la simple ordenacin basada en cadena.
Observe que la ordenacin basada en cadena y expresin se excluyen mutuamente. Cuando elSort basado
en cadena se establece despus de haber creado DataView desde una consulta, el filtro basado en expresin
inferido a partir de la consulta se borra y no se puede volver a restablecer.
El ndice de DataView se genera cuando se crea DataView y cuando se modifica cualquier informacin de
filtro u ordenacin. Obtendr un rendimiento ptimo si suministra criterios de ordenacin en la consulta
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 345 | P g i n a

LINQ to DataSet a partir de la cual se crea DataView y no modifica posteriormente la informacin de
ordenacin.

Nota:
En la mayor parte de los casos, las expresiones utilizadas en la ordenacin no deben tener efectos
secundarios y deben ser deterministas. Adems, las expresiones no deben tener ninguna lgica que
dependa de un nmero de conjunto de ejecuciones, porque las operaciones de ordenacin se pueden
ejecutar un nmero ilimitado de veces.

Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderHeader y ordena las filas devueltas por fecha de pedido;
crea un DataView desde una consulta y enlaza DataView a un BindingSource:

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of DateTime)("OrderDate") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderHeader y ordena la fila devuelta por el importe total a
pagar; crea un DataView desde una consulta y enlaza DataView a un BindingSource:

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Decimal)("TotalDue") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Ejemplo
El siguiente ejemplo consulta en la tabla SalesOrderDetail y ordena las filas devueltas por cantidad de pedido
y, a continuacin, por id. del pedido de ventas; crea un DataView desde una consulta y enlazaDataView a
un BindingSource:

Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Utilizar la propiedad Sort basada en cadena
La funcionalidad de ordenacin basada en cadena DataView funciona tambin con LINQ to DataSet. Despus
de haberse creado DataView desde una consulta LINQ to DataSet, se puede utilizar la propiedad Sort para
establecer la ordenacin en DataView.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 346 | P g i n a

Las funcionalidades de ordenacin basada en cadena y expresin se excluyen mutuamente. Al establecer la
propiedad Sort se borrar la ordenacin basada en expresin heredada de la consulta a partir de la que se
ha creado DataView.
Ejemplo
El ejemplo siguiente crea DataView a partir de la tabla Contact y ordena las filas por apellido en orden
descendente y luego por nombres en orden ascendente:

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc, FirstName asc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Ejemplo
En el siguiente ejemplo se consultan en la tabla Contact los apellidos que empiezan por la letra S. Se
crea DataView a partir de dicha consulta y se enlaza a un objeto BindingSource.

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Where contact.Field(Of String)("LastName").StartsWith("S") _
Select contact
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Borrar la ordenacin
Se puede borrar la informacin de ordenacin de DataView despus de haberla establecido mediante la
propiedad Sort. Hay dos formas de borrar informacin de ordenacin en DataView:
Establecer la propiedad Sort en null.
Establecer la propiedad Sort en una cadena vaca.

Ejemplo
El siguiente ejemplo crea un DataView desde una consulta y borra la ordenacin mediante el
establecimiento de la propiedad Sort en una cadena vaca:

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Order By order.Field(Of Decimal)("TotalDue") _
Select order
Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = ""

Ejemplo
El siguiente ejemplo crea un DataView desde la tabla Contact y establece la propiedad Sort para ordenar por
apellidos en orden descendente. A continuacin, la informacin de ordenacin se borra estableciendo la
propiedad Sort en null:

Dim contacts As DataTable = dataSet.Tables("Contact")
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 347 | P g i n a

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
'Clear the sort.
view.Sort = Nothing

Consultar la coleccin DataRowView en un objeto DataView
El objeto DataView expone una coleccin enumerable de objetos DataRowView. DataRowView representa
una vista personalizada de un objeto DataRow y muestra una versin concreta de dicho objeto DataRowen
un control. Slo se puede mostrar una versin de un objeto DataRow mediante un control, como por
ejemplo, DataGridView. Se puede tener acceso al objeto DataRow que est expuesto
por DataRowViewmediante la propiedad Row de DataRowView. Cuando se ven valores mediante el uso
de DataRowView, la propiedad RowStateFilter determina qu versin de fila del objeto DataRow subyacente
est expuesta. Dado que la coleccin de objetos DataRowView expuestos porDataView es enumerable, se
puede usar LINQ to DataSet para realizar consultas en ella.

En el ejemplo siguiente se realiza una consulta en la tabla Product para los productos de color rojo y se crea
una tabla a partir de dicha consulta. Se crea un objeto DataView a partir de la tabla y se establece la
propiedad RowStateFilter para filtrar por filas modificadas o eliminadas. DataView se utiliza despus como
origen en una consulta LINQ, y los objetos DataRowView que se han modificado y eliminado se enlazan a un
control DataGridView.

Dim products As DataTable = dataSet.Tables("Product")

' Query for red colored products.
Dim redProductsQuery = _
From product In products.AsEnumerable() _
Where product.Field(Of String)("Color") = "Red" _
Order By product.Field(Of Decimal)("ListPrice") _
Select product
' Create a table and view from the query.
Dim redProducts As DataTable = redProductsQuery.CopyToDataTable()
Dim view As DataView = New DataView(redProducts)

' Mark a row as deleted.
redProducts.Rows(0).Delete()

' Modify product price.
redProducts.Rows(1)("ListPrice") = 20.0
redProducts.Rows(2)("ListPrice") = 30.0

view.RowStateFilter = DataViewRowState.ModifiedCurrent Or DataViewRowState.Deleted

' Query for the modified and deleted rows.
Dim modifiedDeletedQuery = From rowView As DataRowView In view _
Select rowView

dataGridView2.DataSource = modifiedDeletedQuery.ToList()

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 348 | P g i n a

En el ejemplo siguiente se crea una tabla de productos a partir de una vista que se enlaza a un
controlDataGridView. Se realiza una consulta en DataView para los productos de color rojo y los resultados
ordenados se enlazan a un control DataGridView.

' Create a table from the bound view representing a query of
' available products.
Dim view As DataView = CType(bindingSource1.DataSource, DataView)
Dim productsTable As DataTable = CType(view.Table, DataTable)

' Set RowStateFilter to display the current rows.
view.RowStateFilter = DataViewRowState.CurrentRows

' Query the DataView for red colored products ordered by list price.
Dim productQuery = From rowView As DataRowView In view _
Where rowView.Row.Field(Of String)("Color") = "Red" _
Order By rowView.Row.Field(Of Decimal)("ListPrice") _
Select New With {.Name = rowView.Row.Field(Of String)("Name"), _
.Color = rowView.Row.Field(Of String)("Color"), _
.Price = rowView.Row.Field(Of Decimal)("ListPrice")}

' Bind the query results to another DataGridView.
dataGridView2.DataSource = productQuery.ToList()

Rendimiento DataView
En este tema se abordan las ventajas del uso de los mtodos Find y FindRows de la clase DataView, y del
almacenamiento en memoria cach de DataView en una aplicacin web.

Find y FindRows
DataView construye un ndice. Un ndice contiene claves generadas a partir de una o varias columnas de la
tabla o la vista. Dichas claves estn almacenadas en una estructura que permite que DataViewbusque de
forma rpida y eficiente la fila o filas asociadas a los valores de cada clave. Las operaciones que utilizan el
ndice, como las de filtro y ordenacin, ven aumentar significativamente el rendimiento. El ndice
de DataView se genera cuando se crea DataView y cuando se modifica cualquier informacin de filtro u
ordenacin. La creacin de DataView y el posterior establecimiento de informacin de filtro y ordenacin
hace que el ndice se genere al menos dos veces: una cuando se crea DataView y la otra cuando se modifica
cualquiera de las propiedades de ordenacin y filtrado.
Si desea devolver los resultados de una consulta determinada en los datos, en lugar de proporcionar una
vista dinmica de un subconjunto de los datos, para conseguir el mximo rendimiento puede utilizar los
mtodos Find o FindRows de la DataView, en lugar de establecer la propiedad RowFilter. La
propiedad RowFilter es ms idnea en una aplicacin enlazada a datos donde un control enlazado muestra
resultados filtrados. El establecimiento de la propiedad RowFilter hace que se vuelva a generar el ndice de
los datos, lo que agrega sobrecarga a la aplicacin y reduce el rendimiento. Los mtodos Find y FindRows
utilizan el ndice actual, sin necesidad de volver a generarlo. Si va a llamar a Find o aFindRows una nica vez,
entonces debera utilizar el DataView existente. Si va a llamar a Find o aFindRows varias veces, debera crear
un nuevo DataView para volver a generar el ndice en la columna en la que desea buscar y, a continuacin,
llamar a los mtodos Find o FindRows.
El ejemplo siguiente utiliza el mtodo Find para buscar un contacto con el apellido "Zhu".

Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 349 | P g i n a

Order By contact.Field(Of String)("LastName") _
Select contact
Dim view As DataView = query.AsDataView()
Dim found As Integer = view.Find("Zhu")

En el ejemplo siguiente se usa el mtodo FindRows para buscar todos los productos de color rojo.

Dim products As DataTable = dataSet.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice"), product.Field(Of String)("Color") _
Select product
Dim view As DataView = query.AsDataView()
view.Sort = "Color"
Dim criteria As Object() = New Object() {"Red"}
Dim foundRowsView As DataRowView() = view.FindRows(criteria)

ADO.NET Entity Framework
ADO.NET Entity Framework est diseado para permitir a los programadores crear aplicaciones de acceso a
datos programando con un modelo de la aplicacin conceptual en lugar de programar directamente con un
esquema de almacenamiento relacional. El objetivo es reducir la cantidad de cdigo y mantenimiento que se
necesita para las aplicaciones orientadas a datos. Las aplicaciones de Entity Framework ofrecen las
siguientes ventajas:
Las aplicaciones pueden funcionar en trminos de un modelo conceptual ms centrado en la
aplicacin, que incluye tipos con herencia, miembros complejos y relaciones.
Las aplicaciones estn libres de dependencias de codificacin rgida de un motor de datos o de un
esquema de almacenamiento.
Las asignaciones entre el modelo conceptual y el esquema especfico de almacenamiento pueden
cambiar sin tener que cambiar el cdigo de la aplicacin.
Los programadores pueden trabajar con un modelo de objeto de aplicacin coherente que se
puede asignar a diversos esquemas de almacenamiento, posiblemente implementados en sistemas
de administracin de base de datos diferentes.
Se pueden asignar varios modelos conceptuales a un nico esquema de almacenamiento.
La compatibilidad con Language-Integrated Query proporciona validacin de la sintaxis en el
momento de la compilacin para consultas en un modelo conceptual.

Introduccin a Entity Framework
Entity Framework es un conjunto de tecnologas de ADO.NET que permiten el desarrollo de aplicaciones de
software orientadas a datos. Los arquitectos y programadores de aplicaciones orientadas a datos se han
enfrentado a la necesidad de lograr dos objetivos muy diferentes. Deben modelar las entidades, las
relaciones y la lgica de los problemas empresariales que resuelven, y tambin deben trabajar con los
motores de datos que se usan para almacenar y recuperar los datos. Los datos pueden abarcar varios
sistemas de almacenamiento, cada uno con sus propios protocolos; incluso las aplicaciones que funcionan
con un nico sistema de almacenamiento deben equilibrar los requisitos del sistema de almacenamiento
con respecto a los requisitos de escribir un cdigo de aplicacin eficaz y fcil de mantener.
Entity Framework permite a los programadores trabajar con datos en forma de objetos y propiedades
especficos del dominio, por ejemplo, con clientes y direcciones, sin tener que pensar en las tablas de las
bases de datos subyacentes y en las columnas en las que se almacenan estos datos. Para ello, se eleva el
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 350 | P g i n a

nivel de abstraccin en la que los programadores pueden trabajar al tratar con datos y se reduce el cdigo
requerido para crear y mantener las aplicaciones orientadas a datos. Dado que Entity Framework es un
componente de .NET Framework, las aplicaciones de Entity Framework se pueden ejecutar en cualquier
equipo en que est instalado .NET Framework 3.5 Service Pack 1 (SP1).
Dar la vida a los modelos conceptuales
Un patrn de diseo antiguo y comn para el modelado de datos es la divisin del modelo en tres partes: un
modelo conceptual, un modelo lgico y un modelo fsico. El modelo conceptual define las entidades y
relaciones del sistema que se est modelando. El modelo lgico de una base de datos relacional normaliza
las entidades y relaciones en tablas con restricciones de claves externas. El modelo fsico abarca las
capacidades de un motor de datos determinado especificando los detalles del almacenamiento en forma de
particiones e ndices.
Los administradores de bases de datos refinan el modelo fsico para mejorar el rendimiento, pero los
programadores que escriben el cdigo de la aplicacin principalmente se limitan a trabajar con el modelo
lgico escribiendo consultas SQL y llamando a procedimientos almacenados. Los modelos conceptuales se
suelen usar como una herramienta para capturar y comunicar los requisitos de una aplicacin, con
frecuencia como diagramas inertes que se ven y se explican en las primeras etapas de un proyecto, y a
continuacin se abandonan. Muchos equipos de desarrolladores omiten la creacin de un modelo
conceptual y comienzan especificando las tablas, columnas y claves en una base de datos relacional.
Entity Framework da vida a los modelos conceptuales permitiendo a los programadores consultar las
entidades y relaciones en el modelo conceptual al tiempo que se basan en Entity Framework para traducir
esas operaciones en los comandos especficos del origen de datos. Esto libera a las aplicaciones de las
dependencias codificadas de forma rgida en un origen de datos determinado. El modelo conceptual, el
modelo de almacenamiento y la asignacin entre los dos se expresan en una especificacin externa,
conocida como el Entity Data Model (EDM). El modelo de almacenamiento y las asignaciones pueden
cambiar segn sea necesario sin necesidad de cambiar el modelo conceptual, las clases de datos o el cdigo
de la aplicacin. Dado que los modelos de almacenamiento son especficos del proveedor, puede trabajar
con un modelo conceptual coherente a travs de varios orgenes de datos.
Un EDM se define con los tres modelos y archivos de asignacin siguientes que tienen las extensiones de
nombre de archivo correspondientes:
Archivo de lenguaje de definicin de esquemas conceptuales (.csdl): define el modelo conceptual.
Archivo de lenguaje de definicin de esquemas de almacenamiento (.ssdl): define el modelo de
almacenamiento, que tambin se denomina modelo lgico.
Archivo de lenguaje de especificacin de asignaciones (.msl): define la asignacin entre los modelos
conceptual y de almacenamiento.
Entity Framework utiliza estos modelos y archivos de asignacin basados en XML para transformar las
operaciones de creacin, lectura, actualizacin y eliminacin de las entidades y relaciones del modelo
conceptual en las operaciones equivalentes en el origen de datos. El EDM incluso permite asignar las
entidades del modelo conceptual a los procedimientos almacenados en el origen de datos.
Asignar objetos a datos
La programacin orientada a objetos supone un desafo al interactuar con sistemas de almacenamiento de
datos. Aunque la organizacin de clases suele reflejar la organizacin de las tablas de bases de datos
relacionales minuciosamente, el ajuste no es perfecto. Varias tablas normalizadas suelen corresponder a una
sola clase y las relaciones entre las clases se representan de forma diferente a las relaciones entre tablas.
Por ejemplo, para representar el cliente de un pedido de ventas, una clase Order utiliza una propiedad que
contiene una referencia a una instancia de una clase Customer, pero una fila de la tablaOrder en una base
de datos contiene una columna de clave externa con un valor que corresponde a un valor de clave principal
en la tabla Customer (o conjunto de columnas). Una clase Customer podra tener una propiedad
denominada Orders que contuviera una coleccin de instancias de la clase Order, pero la tabla Customer en
una base de datos no tiene ninguna columna comparable.
Las soluciones existentes han intentado cubrir este hueco, que se suele denominar "desigualdad de
impedancia", asignando nicamente clases y propiedades orientadas a objetos a las tablas y columnas
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 351 | P g i n a

relacionales. En lugar de seguir este enfoque tradicional, Entity Framework asigna las tablas relacionales,
columnas y restricciones FOREIGN KEY de los modelos lgicos a las entidades y relaciones de los modelos
conceptuales. Esto permite una mayor flexibilidad al definir los objetos y optimizar el modelo lgico. Las
herramientas de Entity Data Model generan clases de datos extensibles segn el modelo conceptual. Se
trata de clases parciales que se pueden extender con miembros adicionales que el programador agrega. Las
clases que se generan para un modelo conceptual determinado derivan de las clases base que proporcionan
Servicios de objeto para materializar las entidades como objetos y para realizar un seguimiento de los
cambios y guardarlos. Los programadores pueden utilizar estas clases para trabajar con las entidades y
relaciones como objetos relacionados mediante propiedades de navegacin.
Obtener acceso a los datos de entidad y cambiarlos
Como algo ms que otra solucin de asignacin objeto-relacional, Entity Framework trata
fundamentalmente de permitir que las aplicaciones obtengan acceso y cambien los datos que estn
representados como entidades y relaciones en el modelo conceptual. Servicios de objeto usa el EDM para
traducir las consultas de objeto con los tipos de entidad que se representan en el modelo conceptual en
consultas especficas del origen de datos. Los resultados de la consulta se materializan en los objetos que
Servicios de objeto administra. Entity Framework proporciona las maneras siguientes de consultar un EDM y
devolver objetos:
LINQ to Entities: proporciona compatibilidad con Language-Integrated Query (LINQ) para consultar
los tipos de entidad que se definen en un modelo conceptual.
Entity SQL: dialecto independiente del almacenamiento de SQL que funciona directamente con las
entidades del modelo conceptual y que admite caractersticas del EDM como la herencia y las
relaciones. Entity SQL se utiliza con las consultas de objeto y con las consultas que se ejecutan con
el proveedor de EntityClient.
Mtodos del generador de consultas: permite construir consultas de Entity SQL utilizando los
mtodos de consulta del estilo de LINQ.
El Entity Framework incluye el proveedor de datos de EntityClient. Este proveedor administra las
conexiones, traduce las consultas de entidad en consultas especficas del origen de datos y devuelve un
lector de datos que Servicios de objeto usa para materializar los datos de la entidad en los objetos. Cuando
no se requiere la materializacin de los objetos, el proveedor de EntityClient tambin se puede utilizar como
un proveedor de datos ADO.NET estndar habilitando las aplicaciones para ejecutar las consultas de Entity
SQL y usar el lector de datos de solo lectura devuelto.
El diagrama siguiente muestra la arquitectura de Entity Framework para el acceso a datos:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 352 | P g i n a


El Entity Framework genera una clase derivada de ObjectContext que representa el contenedor de entidades
definido en el modelo conceptual. Este contexto del objeto proporciona los medios para realizar el
seguimiento de los cambios y administrar las identidades, la simultaneidad y las relaciones. Esta clase
tambin expone un mtodo SaveChanges que escribe las inserciones, actualizaciones y eliminaciones en el
origen de datos. Al igual que las consultas, estas modificaciones son realizadas bien por los comandos que el
sistema genera automticamente o bien por los procedimientos almacenados que el programador
especifica.
Herramientas de Entity Data Model
Junto con el motor de tiempo de ejecucin de Entity Framework, .NET Framework 3.5 SP1 incluye el
generador de EDM (EdmGen.exe). Esta utilidad de smbolo del sistema se conecta a un origen de datos y
genera un EDM basado en una asignacin unvoca entre las entidades y las tablas. Tambin usa un archivo
de modelo conceptual (.csdl) para generar un archivo de nivel de objeto que contiene clases que
representan tipos de entidad y ObjectContext.
Visual Studio 2008 incluye una variada compatibilidad con las herramientas que permiten generar y
mantener un EDM en una aplicacin de Visual Studio. El Entity Data Model Designer permite crear
escenarios de asignacin avanzados, por ejemplo de la herencia de tabla por tipo y de tabla por jerarqua, y
entidades de divisin que se asignan a varias tablas.

Generar un modelo Entity Data Model
Las aplicaciones y servicios de Entity Framework se basan en el modelo Entity Data Model (EDM). Este
modelo representa los datos de la aplicacin como un conjunto de entidades y relaciones que estn
asignadas a un origen de datos definido. Un modelo EDM est compuesto de un modelo conceptual
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 353 | P g i n a

expresado como entidades y relaciones, un modelo de almacenamiento que representa el esquema del
modelo lgico, y una asignacin entre los dos. La fase de desarrollo de un proyecto se suele iniciar con el
modelo conceptual y, posteriormente, el modelo lgico se deriva del modelo conceptual.
Para satisfacer las necesidades de los programadores que desean derivar un modelo Entity Data Model de
una base de datos existente, Entity Framework proporciona un conjunto de herramientas que generan y
validan un modelo EDM, y crean clases programables basadas en el modelo conceptual. La utilidad del
smbolo del sistema Generador de EDM (EdmGen.exe) permite un modelo simple con una asignacin
unvoca entre entidades y tablas de un origen de datos. Tambin se puede utilizar EdmGen.exe para generar
las clases de datos que se basan en tipos de entidad y validar un modelo EDM. EdmGen.exe forma parte de
los componentes del motor en tiempo de ejecucin de Entity Framework en .NET Framework 3.5 Service
Pack 1 (SP1).
Visual Studio 2008 SP1 incluye un conjunto integrado de herramientas de Entity Data Model que genera un
modelo que incluye los objetos seleccionados de un origen de datos. Posteriormente, se puede modificar el
modelo conceptual y la asignacin utilizando Entity Data Model Designer para lograr el modelo conceptual
requerido por la aplicacin.
Consideraciones
Se deben tener en cuenta las consideraciones siguientes cuando se genera un modelo EDM:
Es necesario que todas las entidades tengan claves. Si la base de datos tiene una tabla sin una clave
principal, las herramientas de EDM intentan deducir una clave para la entidad correspondiente.
Adems, las herramientas de EDM generan un elemento DefiningQuery en el esquema de
almacenamiento que convierte los datos para esta entidad en datos de slo lectura. Para que los
datos de la entidad se puedan actualizar, se debe comprobar que la clave generada es una clave
vlida y, a continuacin, quitar el elemento DefiningQuery.
Una tabla que representa una relacin de varios a varios entre dos tablas de la base de datos puede
que no tenga una entidad equivalente en el esquema conceptual. Cuando las herramientas de EDM
encuentran una tabla de este tipo con solo las dos columnas que constituyen las claves externas, la
tabla de asignacin se representa en el esquema conceptual como una asociacin de varios a varios
en lugar de una entidad. La asociacin CourseInstructor en el modelo School es un ejemplo de este
comportamiento.
En esta versin, las herramientas de Entity Data Model slo admiten la generacin automtica de
un modelo EDM basado en un origen de datos existente. No se puede generar automticamente un
origen de datos, como una base de datos relacional, basndose en el modelo conceptual.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 354 | P g i n a



Trabajar con datos de entidad
Entity Framework compila un conjunto de esquemas conceptual y de almacenamiento, junto con las
asignaciones entre ellos, en pares bidireccionales de instrucciones de Entity SQL con la denominacinvistas
de cliente. Estas vistas controlan el procesamiento de consultas y actualizaciones en el motor en tiempo de
ejecucin. El compilador de asignaciones que genera las vistas se puede invocar en tiempo de diseo o en
tiempo de ejecucin cuando la primera consulta se ejecuta en un esquema de Entity Data Model (EDM).
Entity Framework se basa en proveedores de datos ADO.NET especficos del almacenamiento
proporcionando un objeto EntityConnection a un proveedor de datos subyacente y una base de datos
relacional.
Cuando se ejecuta una consulta, se analiza y se convierte en un rbol de comandos cannico, que es una
representacin del modelo de objetos de la consulta. Los rboles de comandos cannicos representan
comandos SELECT, UPDATE, INSERT y DELETE. La totalidad del procesamiento subsiguiente se realiza en el
rbol de comandos, que es el medio de comunicacin entre el proveedor de System.Data.EntityClient y el
proveedor de datos de .NET Framework subyacente, como System.Data.SqlClient.
El diagrama siguiente muestra la arquitectura de Entity Framework para el acceso a datos:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 355 | P g i n a



Consultar objetos
Las herramientas de Entity Framework generan una clase derivada de ObjectContext que representa el
contenedor de entidades definido en el modelo conceptual. La clase ObjectContext admite consultas en un
modelo EDM que devuelve entidades como objetos, as como la creacin, actualizacin y eliminacin de
objetos entidad. Entity Framework admite consultas de objeto en un modelo EDM. Las consultas se pueden
crear utilizando mtodos del generador de consultas de objeto, Language-Integrated Query (LINQ) y Entity
SQL.
En un modelo conceptual, las entidades se relacionan entre s mediante asociaciones. En la capa de objeto,
estas asociaciones estn representadas por propiedades que exponen colecciones de objetos relacionados
de acuerdo con una referencia de entidad. Por ejemplo, en el modelo School,Department.Course obtiene
una coleccin de entidad de objetos Course basada en la asociacin entreCourse y Department. Dado que
los objetos a los que se hace referencia no se cargan automticamente, se debe llamar al mtodo Load en la
referencia de entidad para cargar los datos de objetos relacionados en el contexto del objeto. Tambin
puede especificar la ruta de una consulta que defina qu objetos relacionados se han de cargar con los
objetos devueltos.
En el ejemplo siguiente del tutorial rpido se muestra una consulta que, cuando se ejecuta, recupera todos
los objetos Department. Una definicin de la ruta de una consulta garantiza que tambin se devuelvan los
objetos Course relacionados con los objetos Department. Una clusula WHERE de Entity SQL ordena los
objetos devueltos por Name.

' Define a query that returns all Department objects and related
' Course objects, ordered by name.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 356 | P g i n a

Dim departmentQuery As ObjectQuery(Of Department) = _
schoolContext.Department.Include("Course").OrderBy("it.Name")

Puede definir un modelo EDM que utilice procedimientos almacenados para ejecutar consultas en el origen
de datos. Los conjuntos de resultados de estos procedimientos almacenados se asignan a entidades en el
modelo conceptual.
Trabajar con objetos
Un objeto en un contexto del objeto es una representacin de tipo de entidad de datos en el origen de
datos. Puede modificar, crear y eliminar objetos en un contexto del objeto. El contexto del objeto administra
las identidades y relaciones entre objetos. Tambin puede serializar objetos y enlazarlos a controles.
En el ejemplo siguiente del tutorial rpido se obtiene una coleccin de objetos Course relacionados con un
objeto Department y se enlaza la coleccin a un control DataGridView.

' Get the object for the selected department.
Dim department As Department = _
CType(Me.departmentList.SelectedItem, Department)

' Bind the grid view to the collection of Course objects
' that are related to the selected Department object.
courseGridView.DataSource = department.Course

Entity Framework realiza el seguimiento de los cambios en los datos de entidad y permite conservar los
cambios en el origen de datos.

' Save object changes to the database, display a message,
' and refresh the form.
numChanges = schoolContext.SaveChanges()

Puede definir un modelo EDM que utilice procedimientos almacenados para insertar, actualizar y eliminar
datos en el origen de datos. Estos procedimientos almacenados se asignan a entidades en el modelo
conceptual.

Informacin general de Servicios de objeto (Entity Framework)
Servicios de objeto es un componente de Entity Framework que permite consultar, insertar, actualizar y
eliminar datos, expresados como objetos CLR con establecimiento inflexible de tipos que son instancias de
tipos de entidad. Servicios de objeto admite tanto consultas LINQ (Language-Integrated Query) como
consultas Entity SQL con los tipos que se definen en un modelo Entity Data Model (EDM). Servicios de objeto
materializa los datos devueltos como objetos y propaga los cambios de los objetos de vuelta al origen de
datos. Tambin proporciona medios para realizar el seguimiento de los cambios, enlazar los objetos a los
controles y controlar la simultaneidad. Servicios de objeto es implementado por clases de los espacios de
nombres System.Data.Objects y System.Data.Objects.DataClasses.

Contexto del objeto
La clase ObjectContext es la clase principal para interactuar con datos en forma de objetos que son
instancias de los tipos de entidad que se definen en un modelo EDM. Una instancia de la
claseObjectContext encapsula lo siguiente:
Una conexin con la base de datos, en forma de un objeto EntityConnection.
Los metadatos que describen el modelo, en forma de un objeto MetadataWorkspace.
Un objeto ObjectStateManager que realiza el seguimiento de los objetos durante las operaciones
de creacin, actualizacin y eliminacin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 357 | P g i n a

Las herramientas de Entity Framework usan un archivo de lenguaje de definicin de esquemas conceptuales
(CSDL) y generan el cdigo del nivel de objeto. Este cdigo se utiliza para trabajar con los datos de entidad
como objetos y aprovecharse de la funcionalidad de Servicios de objeto. Este cdigo generado incluye las
clases de datos siguientes:
Clase ObjectContext con tipo. Esta clase representa el elemento EntityContainer para el modelo y
se deriva de ObjectContext.
Las clases que representan tipos de entidad y heredan de la clase EntityObject.
Las clases que representan tipos complejos y heredan de la clase ComplexObject.

Nota
La clase ObjectContext no es segura para la ejecucin de subprocesos. La integridad de los objetos de
datos en ObjectContext no se puede asegurar en situaciones de varios subprocesos.

Usar Servicios de objeto
Servicios de objeto admite el comportamiento siguiente para programar con Entity Framework.

Consultar datos como objetos
Servicios de objeto permite utilizar mtodos del generador de consultas, LINQ o Entity SQL para ejecutar las
consultas con Entity Data Model y devolver los datos como objetos.

Dar forma a los resultados de la consulta
De forma predeterminada, Servicios de objeto slo devuelve los objetos solicitados especficamente en la
consulta. Cuando existen relaciones entre los objetos, puede especificar si una consulta devuelve los objetos
relacionados. Tambin puede cargar los objetos relacionados en una solicitud posterior.

Redactar consultas utilizando los mtodos de generador
Servicios de objeto proporciona mtodos de ObjectQuery que se utilizan para crear consultas que son
equivalentes a las consultas Entity SQL y LINQ to Entities.

Agregar, cambiar y eliminar objetos
Servicios de objeto conserva los objetos de datos en memoria y permite agregar, modificar y eliminar
objetos dentro de un contexto del objeto. Los cambios realizados en objetos son sometidos a seguimiento
por el contexto del objeto.

Guardar cambios en el origen de datos
Servicios de objeto almacena en cach los cambios de los objetos del contexto del objeto. Cuando se solicita
explcitamente, Servicios de objeto guarda esos cambios de nuevo en el origen de datos.

Enlazar objetos a controles
Servicios de objeto permite el enlace de objetos a controles que admiten el enlace de datos, como el
control DataGridView.

Asociar objetos
Servicios de objeto permite asociar directamente los objetos existentes a un contexto del objeto. Esto
posibilita asociar los objetos que han sido almacenados en el estado de vista de una aplicacin ASP.NET o
que se han devuelto en una llamada a un mtodo remoto o en un servicio web.

Desasociar objetos
Puede que una instancia del contexto del objeto tenga que conservarse durante la ejecucin de una
aplicacin, como cuando los objetos se enlazan a los controles de formularios Windows Forms. Servicios de
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 358 | P g i n a

objeto permite administrar el tamao del contexto del objeto desasociando objetos para liberar recursos
cuando ya no se necesitan.

Serializar objetos
Servicios de objeto admite la serializacin de contrato de datos de Windows Communication Foundation
(WCF), la serializacin binaria y la serializacin XML para objetos. La serializacin de contrato de datos es til
en situaciones de servicios web. La serializacin binaria es especialmente til cuando se usa el estado de
vista para conservar objetos en una aplicacin ASP.NET.

Administrar identidades de objeto y realizar el seguimiento de los cambios
Servicios de objeto usa los valores de las identidades para realizar el seguimiento de los cambios de los
objetos, controlar los conflictos y decidir cundo se han de recuperar datos del origen de datos.

Administrar la simultaneidad
Servicios de objeto puede realizar el seguimiento de la simultaneidad cuando el
atributoConcurrencyMode de una o varias propiedades se establece en "fixed". En este caso, Servicios de
objeto producir excepciones concretas cuando se detecten infracciones de la simultaneidad.

Administrar conexiones
Servicios de objeto permite administrar explcitamente la conexin utilizada por un contexto del objeto y
proporcionar una conexin propia para el contexto del objeto.

Administrar transacciones
Servicios de objeto admite transacciones de .NET Framework para coordinar operaciones con el origen de
datos y dar de alta en transacciones distribuidas.

Usar objetos personalizados con Entity Data Model
Servicios de objeto permite definir manualmente objetos propios o utilizar los objetos existentes con Entity
Data Model.

Consultar datos como objetos (Entity Framework)
Servicios de objeto permite utilizar Language-Integrated Query (LINQ), Entity SQL, o mtodos del generador
de consultas para ejecutar las consultas en Entity Data Model (EDM) y devolver los datos como objetos. En
los temas de esta seccin se describe cmo utilizar la clase ObjectQuery para realizar una consulta a un
modelo EDM.

Consultas de objeto [Entity Framework]
La clase ObjectQuery genrica representa una consulta que devuelve una coleccin de cero o ms objetos
entidad con tipo. Una consulta de objeto siempre pertenece al contexto de un objeto existente. Este
contexto proporciona la informacin de metadatos y de conexin necesaria para crear y ejecutar la consulta.
Un ObjectContext con tipo incluye un conjunto de propiedades que devuelven las
instanciasObjectQuery con tipo. Hay una de estas propiedades para cada tipo de entidad en el modelo.
Estas propiedades facilitan la creacin de una instancia de un ObjectQuery con tipo. Una consulta de objeto
se ejecuta en los escenarios siguientes:
Cuando se acta sobre ella; por ejemplo, durante una enumeracin foreach (C#) o For Each(Visual
Basic).
Cuando se asigna para rellenar una coleccin List.
Cuando se llama explcitamente al mtodo Execute.
Cuando se llama a un operador de ejecucin de consultas LINQ, como First o Any.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 359 | P g i n a

La consulta siguiente devuelve un objeto Contact en el que los parmetros pasados especifican el nombre y
el apellido:

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
context.Contact _
.Where("it.LastName = @ln AND it.FirstName = @fn", _
New ObjectParameter("ln", lastName), _
New ObjectParameter("fn", firstName))

Proyeccin de consultas
Aunque las consultas de objeto se usan para devolver datos de Entity Data Model (EDM) como objetos
entidad, tambin admiten proyecciones que devuelven datos que no se pueden materializar con facilidad en
tipos de entidad. ObjectQuery usa el tipo DbDataRecord para las proyecciones que devuelven tipos sin
entidad y que pueden ser resultados anidados o tipos annimos. Los tipos simples, como Int32 oString, se
usan con proyecciones que devuelven valores de propiedad nicos.
El mtodo del generador de consultas Select devuelve una ObjectQuery que, cuando se ejecuta, devuelve
una coleccin de objetos DbDataRecord. Tanto LINQ to Entities como Entity SQL admiten la proyeccin de
consultas.
Las consideraciones siguientes se aplican a las proyecciones de consultas:
Se puede inicializar ObjectQuery para que represente un nico resultado escalar y no una coleccin
de resultados escalares. Algunos mtodos de extensin requieren el uso de los resultados de la
coleccin como entrada. En este caso, cuando se llama a uno de estos mtodos, se inicia una
instancia de ArgumentException, como en el ejemplo siguiente.

' Define a query projection that returns
' a single scalar value rather than a collection.
Dim scalarQuery As ObjectQuery(Of Int32) = _
New ObjectQuery(Of Int32)("100", advWorksContext)

' Calling an extension method that requires a collection
' will result in an exception.
Dim hasValues As Boolean = scalarQuery.Any()

Si ObjectQuery puede devolver un valor null cuando se proyecta a un tipo primitivo, se debe
utilizar la versin que acepta valores NULL del tipo. La consulta siguiente utiliza un
elementoDateTime que acepta valores NULL porque la propiedad ShipDate del
objeto SalesOrderHeaderpuede devolver un valor null.

Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
advWorksContext.SalesOrderHeader _
.Where("it.CustomerID = @contactId", _
New ObjectParameter("contactId", contactId)) _
.SelectValue(Of Nullable(Of Date))("it.ShipDate")

Establecer el tiempo de espera del comando
El proveedor de conexiones subyacente define el tiempo de espera predeterminado para las consultas de
objeto y la operacin SaveChanges. Sin embargo, puede invalidar este valor de tiempo de espera
predeterminado con la propiedad CommandTimeout de ObjectContext, tal y como se muestra en el ejemplo
siguiente.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 360 | P g i n a

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120

Haga esto cuando tenga una consulta compleja o cuando otros problemas de rendimiento sean la causa de
que, con frecuencia, se agote el tiempo de espera de las consultas o de las llamadas a SaveChanges.

Ver comandos de almacenamiento
Cuando se consulta un modelo EDM, Entity Framework transforma la consulta LINQ to Entities y Entity SQL
basada en EDM en una consulta equivalente que se realiza en el origen de datos. Los Servicios de objeto
proporcionan el mtodo ToTraceString, que permite ver estos comandos de almacenamiento para
una ObjectQuery en tiempo de ejecucin sin necesidad de realizar un seguimiento en el origen de datos. El
proveedor de EntityClient tambin proporciona un mtodo ToTraceString en EntityCommand.

Recuperar un objeto por su EntityKey
Si conoce el valor de clave de una entidad, puede recuperarlo del origen de datos sin necesidad de crear ni
ejecutar explcitamente una consulta de objeto. Los mtodos GetObjectByKey y TryGetObjectByKey de
ObjectContext devolvern un objeto con la EntityKey especificada en el contexto del objeto. Si usa
GetObjectByKey, deber controlar una ObjectNotFoundException cuando la EntityKey proporcionada no
corresponda a ninguna entidad existente.

Dar forma a los resultados de la consulta (Entity Framework)
Al ejecutar una consulta, slo se devuelven los objetos que se solicitan especficamente en la consulta. Por
ejemplo, cuando una consulta con el modelo Adventure Works Sales devuelve objetos Customer, no se
devuelven de forma predeterminada los objetos SalesOrderHeader relacionados, aunque haya una relacin
entre Customer y SalesOrderHeader. Este comportamiento garantiza que la aplicacin conozca siempre el
mbito de los datos que se devuelven de una consulta de objeto. De forma predeterminada, siempre se
devuelven los objetos de relacin que representan asociaciones entre tipos de entidad. Cuando los objetos
se generan en funcin del esquema conceptual del modelo EDM, se generan propiedades de navegacin
para objetos entidad en ambos extremos de una asociacin. Estas propiedades de navegacin
devuelven EntityReference en el extremo "uno" de una relacin de uno a uno o de una relacin de varios a
uno, o EntityCollection en el extremo "varios" de una relacin de uno a varios o de una relacin de varios a
varios.
Puede crear una consulta Entity SQL o LINQ to Entities que navegue explcitamente en estas relaciones
utilizando propiedades de navegacin. Sin embargo, no necesita navegar explcitamente en relaciones en la
consulta para dar forma a los resultados de la misma. Hay otras dos maneras de extender los resultados de
una consulta para cargar tambin los objetos a que se hace referencia: se pueden especificar las rutas de la
consulta o se pueden cargar explcitamente los objetos relacionados mediante propiedades de navegacin.
Para ejercer un control todava mayor sobre los resultados, se puede definir una ruta de la consulta y, a
continuacin, cargar explcitamente slo los objetos relacionados seleccionados.
Al considerar que opcin se debe utilizar, sea consciente de que hay un intercambio entre el nmero de
solicitudes con la base de datos y la cantidad de datos devueltas en una consulta nica. Las rutas de la
consulta definen el grfico de los objetos devueltos por una consulta. Al definir la ruta de una consulta, slo
se requiere una solicitud nica con la base de datos para que se devuelvan todos los objetos definidos por la
ruta en un conjunto de resultados nico. La carga explcita de objetos requiere varios viajes de ida y vuelta
(round trips) a la base de datos y puede que requiera varios conjuntos de resultados activos, pero la
cantidad de datos devueltos se limita slo a los objetos que se han cargado.

Definir la ruta de una consulta para dar forma a los resultados de la consulta
Para especificar la ruta de una consulta, pase una representacin de cadena del grfico de objetos al
mtodo Include en ObjectQuery. Esta ruta especifica qu objetos relacionados se han de devolver cuando se
ejecuta una consulta de objeto. Por ejemplo, la ruta de una consulta definida en una consulta para
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 361 | P g i n a

objetos Contact garantiza la devolucin de cada SalesOrderHeader y SalesOrderDetailrelacionado. Esto se
muestra en las consultas siguientes que utilizan LINQ to Entities, Entity SQL y mtodos del generador de
consultas.

LINQ to Entities
' Define a LINQ query with a path that returns
' orders and items for a contact.
Dim contacts = (From contact In context.Contact _
.Include("SalesOrderHeader.SalesOrderDetail") _
Select contact).FirstOrDefault()

Entity SQL
' Define an object query with a path that returns
' orders and items for a specific contact.
Dim queryString As String = _
"SELECT VALUE TOP(1) Contact FROM " + _
"AdventureWorksEntities.Contact AS Contact"

' Define the object query with the query string.
Dim contactQuery As New ObjectQuery(Of Contact)(queryString, _
context, MergeOption.NoTracking)

Dim contact As Contact = _
contactQuery.Include("SalesOrderHeader.SalesOrderDetail") _
.FirstOrDefault()

Mtodos del generador de consultas
' Create an object query with a path that returns orders and items for a contact.
Dim contact As Contact = _
context.Contact.Include("SalesOrderHeader.SalesOrderDetail") _
.FirstOrDefault()

Las consideraciones siguientes se aplican al definir las rutas de consultas:
Se pueden usar rutas de consultas con mtodos del generador de consultas y con consultas LINQ.
Cuando se llama al mtodo Include, la ruta de la consulta solo es vlida en la instancia devuelta
de ObjectQuery. Otras instancias de ObjectQuery y el contexto del objeto en s no se ven
afectados.
Dado que el mtodo Include devuelve el objeto de consulta, puede llamar varias veces a este
mtodo en una ObjectQuery para incluir objetos de varias relaciones, como en el ejemplo
siguiente:

' Create a SalesOrderHeader query with two query paths,
' one that returns order items and a second that returns the
' billing and shipping addresses for each order.
Dim query As ObjectQuery(Of SalesOrderHeader) = _
context.SalesOrderHeader.Include("SalesOrderDetail").Include("Address")

El uso de rutas de consultas puede dar lugar a la ejecucin de comandos complejos que se ejecutan
con el origen de datos en consultas de objeto aparentemente simples. Esto se produce porque se
requieren una o ms combinaciones para la devolucin de objetos relacionados en una consulta
nica. Esta complejidad es mayor en consultas con un modelo EDM complejo, como una entidad
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 362 | P g i n a

con herencia o una ruta que incluye relaciones de varios a varios. Use el mtodoToTraceString para
ver el comando que se generar mediante una ObjectQuery. Cuando la ruta de una consulta
incluye demasiados objetos relacionados o cuando los objetos contienen demasiados datos de fila,
es posible que el origen de datos no pueda completar la consulta. Esto se produce si la consulta
requiere un almacenamiento temporal intermedio que supera las capacidades del origen de datos.
Cuando esto se produce, se puede reducir la complejidad de la consulta del origen de datos
cargando explcitamente los objetos relacionados.

Cargar explcitamente los objetos relacionados
Para cargar explcitamente los objetos relacionados, se debe llamar al mtodo Load en el extremo
relacionado devuelto por la propiedad de navegacin. En una relacin de uno a varios, llame al
mtodoLoad en EntityCollection, y para una relacin uno a uno, llame al mtodo Load en EntityReference.
Esto carga los datos de objetos relacionados en el contexto del objeto. Cuando una consulta devuelve una
coleccin de objetos, puede enumerarlos en la coleccin y llamar al mtodo Load para cargar los objetos
relacionados de cada objeto en la coleccin, como cada objeto SalesOrderDetail que pertenece a un
objeto SalesOrderHeader. En el ejemplo siguiente, los objetos SalesOrderDetail se cargan explcitamente
para el objeto SalesOrderHeader especificado:

' Load the items for the order if not already loaded.
If Not order.SalesOrderDetail.IsLoaded Then
order.SalesOrderDetail.Load()
End If

Nota
Cuando se llama al mtodo Load durante una enumeracin foreach (C#) o For Each (Visual Basic),
Servicios de objeto intenta abrir un nuevo lector de datos. Si no ha
especificadomultipleactiveresultsets=true en la cadena de conexin para habilitar varios conjuntos de
resultados activos, se producir un error durante esta operacin. Tambin puede cargar el resultado de
la consulta en una coleccin List, lo que cierra el lector de datos y permite realizar la enumeracin en la
coleccin para cargar los objetos a los que se hace referencia.

Consultar los objetos relacionados
Dado que la clase EntityCollection implementa la interfaz IEnumerable, puede utilizar LINQ para consultar la
coleccin de objetos cargados en la EntityCollection devuelta por una propiedad de navegacin. Esto
funciona si los objetos se cargan implcitamente en el contexto del objeto especificando la ruta de una
consulta o se cargan explcitamente llamando al mtodo Load.
Llamar al mtodo CreateSourceQuery en una EntityCollection permite consultar los objetos relacionados sin
cargar primero los objetos en la coleccin. CreateSourceQuery devuelve unaObjectQuery que, cuando se
ejecuta, devuelve el mismo conjunto de objetos que si se llama al mtodoLoad. Los mtodos del generador
de consultas se pueden aplicar a esta consulta de objeto para filtrar todava ms los objetos cargados en la
coleccin.
ObjectQuery devuelve los datos del modelo EDM como objetos entidad. Sin embargo, cuando una
propiedad de navegacin est incluida en la proyeccin de consultas, ObjectQuery devuelve un
DbDataRecord anidado que contiene los objetos relacionados.

Mtodos del generador de consultas (Entity Framework)
La clase ObjectQuery admite el uso de consultas de LINQ to Entities y Entity SQL en Entity Data Model
(EDM). ObjectQuery tambin implementa un conjunto de mtodos del generador de consultas que se
pueden usar para construir secuencialmente comandos de consulta equivalentes a Entity SQL. Estos son los
mtodos del generador de consultas de ObjectQuery junto con las instrucciones de Entity SQL equivalentes:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 363 | P g i n a


Mtodo de ObjectQuery Instruccin de Entity SQL
Distinct DISTINCT
Except EXCEPT
GroupBy GROUP BY
Intersect INTERSECT
OfType OFTYPE
OrderBy ORDER BY
Select SELECT
SelectValue SELECT VALUE
Skip SKIP
Top TOP y LIMIT
Union UNION
UnionAll UNION ALL
Where WHERE

Cada mtodo del generador de consultas devuelve una nueva instancia de ObjectQuery. Esto le permite
construir una consulta cuyo conjunto de resultados se basa en las operaciones de la secuencia de instancias
de ObjectQuery anteriores. En el ejemplo siguiente se muestra cmo usar el mtodoWhere para filtrar los
objetos Product devueltos por ProductID.

' Return Product objects with the specified ID.
Dim query As ObjectQuery(Of Product) = _
advWorksContext.Product _
.Where("it.ProductID = @product", _
New ObjectParameter("product", productId))

Dado que ObjectQuery implementa IQueryable y IEnumerable, se pueden combinar los mtodos del
generador de consultas implementados por ObjectQuery con los mtodos de operador de consultas
estndar especficos de LINQ, como First o Count. A diferencia de los mtodos del generador de consultas,
los operadores de LINQ no devuelven una ObjectQuery.

Seleccionar datos
De forma predeterminada, una ObjectQuery devuelve cero o ms objetos entidad de un tipo especfico.
Llamar a mtodos de consulta posteriores, como Where y OrderBy, afecta a la coleccin de objetos devuelta
por la ObjectQuery original. Algunos mtodos, como Select y GroupBy, devuelven una proyeccin de los
datos como un DbDataRecord en lugar de un tipo de entidad.

En el ejemplo siguiente se devuelve una coleccin de objetos DbDataRecord que contienen tipos de
entidad SalesOrderHeader anidados.

' Define a query that returns a nested
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 364 | P g i n a

' DbDataRecord for the projection.
Dim query As ObjectQuery(Of DbDataRecord) = _
advWorksContext.Contact.Select("it.FirstName, " _
+ "it.LastName, it.SalesOrderHeader") _
.Where("it.LastName = 'Zhou'")

Aunque los mtodos del generador de consultas se aplican secuencialmente, se puede construir el mismo
tipo de subconsultas anidadas que las admitidas por Entity SQL. Para ello, debe incluir la subconsulta como
subconsulta de Entity SQL en el mtodo. En el ejemplo siguiente, se usa una subconsulta SELECTde Entity
SQL dentro del mtodo Select para incluir registros LastName; dichos registros aparecen anidados en un
conjunto de resultados y ordenados alfabticamente por la primera letra del apellido:

' Define the query with a GROUP BY clause that returns
' a set of nested LastName records grouped by first letter.
Dim query As ObjectQuery(Of DbDataRecord) = _
advWorksContext.Contact _
.GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln") _
.Select("it.ln AS ln, (SELECT c1.LastName " + _
"FROM AdventureWorksEntities.Contact AS c1 " + _
"WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT") _
.OrderBy("it.ln")

Nota
Use el mtodo ToTraceString para ver el comando de origen de datos que se generar mediante
una ObjectQuery.

Alias
Los mtodos del generador de consultas se aplican secuencialmente para construir un comando de consulta
acumulativo. Esto significa que el comando de ObjectQuery actual se trata como una subconsulta a la que se
aplica el mtodo actual.

Nota
La propiedad CommandText devuelve el comando para la instancia de ObjectQuery.

En un mtodo del generador de consultas, deber hacer referencia al comando de ObjectQuery actual
mediante un alias. De forma predeterminada, la cadena "it" es el alias que representa el comando actual, tal
y como se muestra en el ejemplo siguiente:

' Return Product objects with a standard cost
' above $10.
Dim productQuery As ObjectQuery(Of Product) = _
advWorksContext.Product _
.Where("it.StandardCost > 10")

Cuando se establece la propiedad Name de una ObjectQuery, ese valor se convierte en el alias para los
mtodos posteriores. El ejemplo siguiente es una continuacin del anterior; en l se establece el nombre de
la ObjectQuery en "product" y, a continuacin, se usa este alias en el mtodo OrderByposterior:

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 365 | P g i n a

' Return Product objects with a standard cost
' above $10.
Dim productQuery As ObjectQuery(Of Product) = _
advWorksContext.Product _
.Where("it.StandardCost > 10")

'Set the Name property for the query and then
' use that name as the alias in the subsequent
' OrderBy method.
productQuery.Name = "product"
Dim filteredProduct As ObjectQuery(Of Product) = _
productQuery.OrderBy("product.ProductID")

Parmetros
Todos los mtodos del generador de consultas que toman una entrada de cadena de Entity SQL tambin
admiten consultas con parmetros. Los nombres de los parmetros de Entity SQL se definen en expresiones
de consulta con el smbolo (@) como prefijo. Los parmetros se pasan a los mtodos del generador de
consultas como una matriz de instancias de ObjectParameter. En el siguiente ejemplo, se pasan dos
parmetros al mtodo Where:

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
context.Contact _
.Where("it.LastName = @ln AND it.FirstName = @fn", _
New ObjectParameter("ln", lastName), _
New ObjectParameter("fn", firstName))

Consideraciones sobre el uso de los parmetros
Las consideraciones siguientes se aplican cuando se usan parmetros con los mtodos del generador de
consultas:
Los parmetros que se pasan a los mtodos del generador de consultas se agregan mediante las
instancias de ObjectQuery posteriores en la secuencia. Se puede obtener acceso directamente a
ellos con la propiedad Parameters. Una vez agregados, los parmetros se pueden quitar de la
coleccin y sta, a su vez, se puede borrar, siempre y cuando no se haya compilado ni ejecutado la
consulta. No se pueden cambiar los nombres de los parmetros, pero s se pueden cambiar sus
valores en cualquier momento.
Los parmetros deben ser nicos en ObjectParameterCollection. No puede haber dos parmetros
en la coleccin con el mismo nombre.
Cuando se usan mtodos de composicin, como Union, UnionAll, Intersect y Except, las
colecciones de parmetros se combinan. Cuando los conjuntos de parmetros son incompatibles,
incompletos, o cuando existe el mismo nombre en las colecciones de parmetros de ambas
consultas, se inicia una excepcin.

Trabajar con objetos (Entity Framework)
En los temas de esta seccin se describe cmo utilizar Servicios de objeto para crear, cambiar y eliminar
objetos en un contexto del objeto, cmo administrar la simultaneidad en el origen de datos, y cmo enlazar
objetos a controles.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 366 | P g i n a

Agregar, modificar y eliminar objetos (Entity Framework)
Los objetos de un contexto del objeto son instancias de tipos de entidad que representan los datos en el
origen de datos. Puede modificar, crear y eliminar los objetos en un contexto del objeto y Servicios de
objeto realiza el seguimiento de los cambios realizados en estos objetos. Cuando se llama al mtodo
SaveChanges, Servicios de objeto genera y ejecuta comandos que llevan a cabo instrucciones equivalentes
de insercin, actualizacin o eliminacin con el origen de datos.
Por ejemplo, suponga que ejecuta una consulta que devuelve un objeto SalesOrderHeader y una coleccin
de objetos SalesOrderDetail relacionados. Podra enumerar mediante la coleccin y realizar las operaciones
siguientes:
Cambiar la propiedad ShipDate de un pedido.
Elimine un elemento especfico llamando al mtodo DeleteObject.
Agregar un artculo al pedido llamando al mtodo Add.
Llamar al mtodo SaveChanges en el contexto del objeto cuando desea guardar los cambios del
objeto de nuevo en el origen de datos.
En el ejemplo siguiente, se muestran varios cambios en los objetos en un contexto del objeto:

Dim order As SalesOrderHeader = _
context.SalesOrderHeader.Where( _
"it.SalesOrderID = @id", New ObjectParameter( _
"id", orderId)).First()

' Change the status and ship date of an existing order.
order.Status = 1
order.ShipDate = DateAndTime.Today

' Load items for the order, if not already loaded.
If Not order.SalesOrderDetail.IsLoaded Then
order.SalesOrderDetail.Load()
End If

' Delete the first item in the order.
context.DeleteObject(order.SalesOrderDetail.First())

' Create a new item using the static Create method
' and add it to the order.
order.SalesOrderDetail.Add( _
SalesOrderDetail.CreateSalesOrderDetail( _
1, 0, 2, 750, 1, CDec(2171.2942), 0, 0, Guid.NewGuid(), _
DateAndTime.Today))

' Save changes in the object context to the database.
Dim changes As Integer = context.SaveChanges()

Agregar objetos
Si desea insertar datos en el origen de datos, debe crear una instancia de un tipo de entidad y agregar el
objeto a un contexto del objeto. Para poder agregar un objeto nuevo, primero debe establecer todas las
propiedades que no admitan los valores null. Considere usar el mtodo esttico CreatenombreDeObjeto del
tipo de entidad para crear una instancia nueva de un tipo de entidad. Las herramientas de Entity Data Model
incluyen este mtodo en cada clase cuando generan los tipos de entidad. Este mtodo de creacin se usa
para crear una instancia de un objeto y establecer las propiedades de la clase que no pueden ser null. El
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 367 | P g i n a

mtodo incluye un parmetro para cada propiedad que tenga aplicado el atributo Nullable="false" en el
archivo de CSDL.
En el ejemplo siguiente se utiliza el mtodo CreateSalesOrderHeader esttico para crear una instancia
nueva de la clase SalesOrderHeader.

' Create a new SalesOrderHeader using the static
' CreateSalesOrderHeader method.
Dim order As SalesOrderHeader = _
SalesOrderHeader.CreateSalesOrderHeader( _
1, Convert.ToByte(1), DateTime.Now, DateTime.Today.AddMonths(2), _
Convert.ToByte(1), False, String.Empty, customer.ContactID, shipMethod, _
0, 0, 0, 0, Guid.NewGuid(), DateTime.Now)

Puede agregar objetos nuevos a un contexto del objeto llamando al mtodo AddObject o a uno de los
mtodos AddTonombreDeConjuntoDeEntidades en el ObjectContext con tipo. Tambin puede agregar un
objeto a un contexto del objeto agregndolo a una EntityCollection existente. Al llamar al
mtodo Add enEntityCollection que est asociado a un contexto del objeto, el objeto que est agregando se
agrega al mismo ObjectContext. De forma similar, puede agregar un objeto estableciendo la nueva instancia
de objeto en Value de EntityReference.
Las propiedades de navegacin definen las relaciones entre los objetos. Recomendamos que establezca
estas propiedades cuando el objeto est relacionado con otros objetos en el contexto del objeto. Por
ejemplo, establezca la propiedad de la relacin SalesOrderHeader de un nuevo objetoSalesOrderDetail en
la instancia del pedido al que pertenece el elemento de lnea. Al crear un nuevo objeto relacionado con otro
objeto del contexto del objeto, agregue el objeto con uno de los mtodos siguientes:
En una relacin de uno a varios o de varios a varios, llame al mtodo Add en EntityCollection y
especifique el objeto relacionado.
En una relacin de uno a uno o de varios a uno, establezca la propiedad Value del EntityReference
en el objeto relacionado.
Llame al mtodo AddObject para agregar el nuevo objeto al contexto del objeto y, a continuacin,
defina la relacin utilizando uno de dos mtodos los anteriores.
Al agregar objetos nuevos deben tenerse en cuenta las consideraciones siguientes:
Antes de llamar a SaveChanges, Servicios de objeto genera un valor de clave temporal para cada
nuevo objeto que se agrega con el mtodo AddObject. Una vez que se ha llamado aSaveChanges,
el valor de identidad que el origen de datos asigna reemplaza el valor de clave cuando se inserta
una nueva fila.
Si el origen de datos no genera el valor de clave de una entidad, tendr que asignar un valor nico.
Si dos objetos tienen el mismo valor de clave especificado por el usuario, se produce una
InvalidOperationException cuando se llama a SaveChanges. Si esto se produce, tendr que asignar
valores nicos y reintentar la operacin.
Entity Framework establece automticamente los valores de clave externa en el origen de datos al
definir una relacin entre los objetos y llamar a SaveChanges. Sin embargo, cuando una entidad se
asigna a los procedimientos almacenados que realizan las inserciones, actualizaciones y
eliminaciones, los valores de clave externa no se establecen automticamente. En este caso, debe
establecer los valores correctos a las propiedades que correspondan a la clave externa para el
objeto relacionado.

Modificar objetos
Al cambiar una propiedad de navegacin, escalar o compleja de un objeto, y llamar a SaveChanges, las
actualizaciones se envan al origen de datos. Las relaciones entre los objetos se cambian al cambiar las
propiedades de navegacin, por ejemplo al cambiar el valor de EntityReference o quitar un objeto
de EntityCollection.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 368 | P g i n a

Servicios de objeto realiza el seguimiento de los cambios en los objetos que estn asociados aObjectContext
utilizando una instancia deI EntityChangeTracker. Hay una instancia deI EntityChangeTracker para cada
objeto sometido a seguimiento. Las consultas devuelven los objetos en un estado Unchanged, a menos que
la consulta use un elemento MergeOption establecido enNoTracking. Las herramientas de Entity Data Model
generan las llamadas a los mtodos de seguimiento de cambios en el establecedor de cada propiedad de un
tipo de entidad, como en el ejemplo siguiente del establecedor de la propiedad Status en la
clase SalesOrderHeader.

Set(ByVal value As Byte)
Me.OnStatusChanging(value)
Me.ReportPropertyChanging("Status")
Me._Status = Global.System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value)
Me.ReportPropertyChanged("Status")
Me.OnStatusChanged()
End Set

El mtodo ReportPropertyChanging y el mtodo ReportPropertyChanged notifican los cambios de propiedad
al IEntityChangeTracker. Si est utilizando clases de datos personalizadas con un Entity Data Model (EDM),
tambin debera notificar los cambios de propiedad para habilitar el seguimiento a travs de Servicios de
objeto.
El estado de un objeto se cambia de Unchanged a Modified cada vez que se llama a un establecedor de
propiedad. Esto ocurre incluso cuando el valor que se establece es igual que el valor actual. Una vez llamado
al mtodo AcceptAllChanges, el estado vuelve a Unchanged. De forma predeterminada, se llama
a AcceptAllChanges durante la operacin SaveChanges.
Las herramientas de Entity Data Model tambin generan un par de mtodos parciales
denominadosOnPropiedadChanging y OnPropiedadChanged. Se llama a estos mtodos en el establecedor
de propiedad. Extienda estos mtodos en clases parciales para insertar una lgica de negocios personalizada
durante los cambios de propiedad.
Al modificar objetos deben tenerse en cuenta las consideraciones siguientes:
Cuando se cambia cualquier propiedad escalar o compleja de un objeto complejo, el estado del
objeto de entidad de nivel superior se cambia a Modified.
No se realiza el seguimiento de los cambios cuando los objetos estn en el estado Detached. Los
objetos estn en este estado cuando los devuelve una consulta que utiliza la opcin de
mezclaNoTracking o despus de desasociarse de ObjectContext al llamar a Detach.
Puede cambiar una relacin entre dos objetos asignando el valor EntityReference a un nuevo
objeto. En este caso, el Entity Framework actualiza automticamente los valores de clave externa
en el origen de datos al llamar a SaveChanges. Sin embargo, cuando una entidad se asigna a los
procedimientos almacenados que realizan las inserciones, actualizaciones y eliminaciones, los
valores de clave externa no se actualizan automticamente. En este caso, debe establecer los
valores correctos para el objeto relacionado a las propiedades que correspondan a la nueva
relacin.
Eliminar objetos
Al llamar al mtodo DeleteObject en ObjectContext, se marca el objeto especificado para la eliminacin. La
fila no se elimina del origen de datos hasta que se llama a SaveChanges.
Al eliminar objetos deben tenerse en cuenta las consideraciones siguientes:
Cuando se elimina un objeto, tambin se elimina cualquier relacin con otros objetos.
Cuando dos objetos tienen una relacin restringida, al eliminar el objeto primario tambin se
eliminan todos los objetos secundarios. Este resultado es el mismo que el de habilitar la
propiedadCascadeDelete en la asociacin para la relacin.
Cuando un objeto que devuelve una consulta est relacionado con uno o varios objetos diferentes,
la consulta siempre devuelve informacin sobre esos objetos relacionados para que resulte ms
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 369 | P g i n a

fcil eliminarlos. En algunos casos, esta informacin existente puede hacer que un
UpdateException se produzca al intentar eliminar un objeto. Por ejemplo, recibir esta excepcin
cuando la asociacin que define la relacin tenga el elemento <OnDelete Action="Cascade"
/>especificado en el extremo primario de la asociacin. Cuando ocurre esto, cargue explcitamente
el objeto relacionado antes de llamar al mtodo DeleteObject.
Puede llamar de nuevo al mtodo DeleteObject para un objeto que ya se ha eliminado.

Crear objetos en un EntitySet concreto
Pueden darse casos en los que un tipo de entidad pertenece a varios conjuntos de entidades. Por ejemplo,
en el caso en el que una base de datos tiene dos tablas con esquemas idnticos. ste puede ser el caso si
desea dividir los datos para generar un proceso de copia de seguridad ms eficaz. Por ejemplo, podra tener
los datos del cliente divididos entre las tablas Customer y CustomerArchive, donde CustomerArchive tiene
el mismo esquema que Customer pero se utiliza para los clientes que no han realizado pedidos en ms de
seis meses. Se puede realizar una copia de seguridad nocturna deCustomer, mientras que slo puede
realizarse una copia de CustomerArchive semanal. De una perspectiva de asignacin, Customer y
CustomerArchive deben pertenecer a diferentes conjuntos de entidades. El Entity Framework admite este
escenario permitiendo a un tipo de entidad existir en uno o ms conjuntos de entidades.
Cuando un tipo de entidad existe en varios conjuntos de entidades, los servicios de objeto le permiten
agregar nuevas instancias del tipo a un conjunto especfico de entidades. Para ello, debe especificar el valor
de entitySetName al llamar al mtodo AddObject para agregar el objeto al contexto del objeto.
Las herramientas de Entity Data Model tambin generan mtodos AddTonombreDeConjuntoDeEntidadesen
ObjectContext, con un mtodo para cada conjunto de entidades que se define en el modelo conceptual.
Estos mtodos llaman a AddObject y pasan el valor EntitySetName del mtodo concreto. Utilice estos
mtodos para agregar objetos en conjuntos de entidades concretos.

Guardar los cambios y administrar la simultaneidad (Entity Framework)
Entity Framework implementa un modelo de simultaneidad optimista. Esto significa que los bloqueos no se
mantienen en los datos en el origen de datos. Sin embargo, Servicios de objeto guarda los cambios en la
base de datos sin comprobar la simultaneidad de forma predeterminada. Para las propiedades que podran
experimentar un alto grado de simultaneidad, recomendamos que la propiedad de entidad se defina en el
nivel conceptual con un atributo ConcurrencyMode="fixed", como se muestra en el ejemplo siguiente:
<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />
Cuando se utiliza este atributo, Servicios de objeto comprueba si hay cambios en la base de datos antes de
guardarlos en ella. Cualquier cambio en conflicto ocasionar una OptimisticConcurrencyException. Tambin
puede producirse una excepcinOptimisticConcurrencyException cuando se define un modelo Entity Data
Model que utiliza procedimientos almacenados para realizar actualizaciones en el origen de datos. En este
caso, la excepcin se produce cuando el procedimiento almacenado que se utiliza para realizar
actualizaciones notifica que se actualizaron cero filas..
Cuando se realizan actualizaciones en escenarios de este tipo con una gran simultaneidad, ser recomienda
llamar a Refresh con frecuencia. Al llamar a Refresh, el RefreshMode controla cmo se propagan los
cambios. La opcin StoreWins har que Servicios de objeto sobrescriba todos los datos en la memoria cach
de objetos con los valores correspondientes de la base de datos. A la inversa, la
opcin ClientWins reemplaza los valores originales en la memoria cach por los valores ms recientes del
origen de datos. De este modo se garantiza que todos datos modificados en la memoria cach de objetos
pueden volverse a guardar correctamente en el origen de datos, eliminando los conflictos entre los cambios
que se realizaron en los datos en la memoria cach y los cambios que se efectuaron en los mismos datos en
el origen de datos.
Llame al mtodo Refresh despus de llamar al mtodo SaveChanges si las actualizaciones en el origen de
datos pueden modificar los datos que pertenecen a otros objetos en el contexto del objeto. Por ejemplo, en
el modelo AdventureWorks Sales, cuando se agrega un nuevo SalesOrderDetail, se desencadena la
actualizacin de la columna SubTotal para reflejar el subtotal con el nuevo elemento. En este caso, llame al
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 370 | P g i n a

mtodo Refresh y pase el objeto SalesOrderHeader para el pedido. De este modo se garantiza que los
valores generados por el desencadenador se devuelven al objetoSalesOrderHeader en el contexto del
objeto.
Servicios de objeto realiza el seguimiento de los cambios que se han efectuado en los objetos de la memoria
cach. Cuando se llama al mtodo SaveChanges, Servicios de objeto intenta combinar de nuevo los cambios
en el origen de datos. Se puede generar un error en SaveChanges y producirse una
excepcin OptimisticConcurrencyException cuando los cambios en los datos de la memoria cach de
objetos entran en conflicto con los cambios que se realizaron en el origen de datos despus de agregarse
objetos a la memoria cach o actualizarse en ella. Esto hace que toda la transaccin se revierta. Cuando se
produce una excepcin OptimisticConcurrencyException, se debe controlar llamando a Refresh y
especificando si el conflicto se debe resolver conservando los datos en los datos de objeto (StoreWins) o
actualizando la memoria cach de objetos con los datos del origen de datos (ClientWins), como en el
ejemplo siguiente:

Try
' Try to save changes, which may cause a conflict.
Dim num As Integer = context.SaveChanges()
Console.WriteLine("No conflicts. " + _
num.ToString() + " updates saved.")
Catch ex As OptimisticConcurrencyException
' Resolve the concurrency conflict by refreshing the
' object context before re-saving changes.
context.Refresh(RefreshMode.ClientWins, orders)

' Save changes.
context.SaveChanges()
Console.WriteLine("OptimisticConcurrencyException " _
+ "handled and changes saved.")
End Try

SaveChanges puede generar una excepcin UpdateException cuando un objeto agregado aObjectContext no
se puede crear correctamente en el origen de datos. Esto puede suceder si ya existe una fila con la clave
externa especificada por la relacin. Cuando esto sucede, no se puede utilizarRefresh para actualizar el
objeto agregado en el contexto del objeto. En su lugar, hay que volver a cargar el objeto con un valor
de OverwriteChanges para MergeOption.

Servicios de objeto tambin observa las transacciones que se definen utilizando el espacio de
nombresSystem.Transactions.

Restricciones referenciales (Entity Framework)
En un modelo Entity Data Model (EDM), pueden existir restricciones referenciales entre objetos
relacionados, por ejemplo entre los objetosSalesOrderDetail y SalesOrderHeader. Estas restricciones se
especifican en el archivo de lenguaje de definicin de esquemas conceptuales (CSDL).

Nota
Servicios de objeto no aplica todas las restricciones que se pueden expresar en un EDM. Por ejemplo, no
aplica las restricciones de cardinalidad en las relaciones y esto puede producir resultados incoherentes al
guardar los cambios en los objetos relacionados con el origen de datos. Asegrese de que el origen de
datos aplica todas las restricciones de modelo esenciales.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 371 | P g i n a

Cuando se trabaja con objetos que tienen relaciones restringidas, se han de tomar en consideracin las
cuestiones siguientes:
Los objetos dependientes (elementos secundarios) no pueden existir sin una relacin definida con
el objeto primario.
Cuando se crea un nuevo objeto secundario, el objeto primario debe existir en el contexto del
objeto o en el origen de datos antes de llamar a SaveChanges. De lo contrario, se producir una
excepcinInvalidOperationException.
Use el mtodo Add para agregar objetos secundarios al elemento EntityCollection del objeto
primario. El acceso a la coleccin de objetos secundarios se realiza desde una propiedad de
navegacin que se haya definido para la relacin, o desde los mtodos GetRelatedCollection
o GetRelatedEnd de la propiedad RelationshipManager del objeto primario.
Al eliminar el objeto primario tambin se eliminan todos los objetos secundarios de la relacin
restringida. Este resultado es el mismo que el de habilitar la propiedad CascadeDelete en la
asociacin para la relacin.
Al quitar la relacin se elimina el objeto secundario. Esto significa que, al llamar
a Remove en EntityCollection, se marcan tanto la relacin como el objeto secundario para su
eliminacin.
Una vez creada una relacin, slo se puede cambiar mediante el proceso siguiente:
1. Quite la relacin existente.
2. Llame a SaveChanges.
3. Agregue el objeto secundario persistente al elementoEntityCollection del nuevo objeto
primario.

Administrar el contexto del objeto (Entity Framework)
En los temas de esta seccin, se describe el modo de administrar un contexto del objeto; esto incluye la
administracin de las conexiones y las transacciones, la asociacin de objetos, el uso de las relaciones, y la
administracin del seguimiento de los cambios y la resolucin de identidades.

Asociar objetos (Entity Framework)
Cuando una consulta se ejecuta dentro de un contexto del objeto en Entity Framework, los objetos
devueltos se asocian automticamente al contexto del objeto. Tambin puede asociar a un contexto del
objeto los objetos que se obtengan de un origen que no sea una consulta. Puede asociar los objetos que se
han desasociado previamente, los objetos devueltos por una consulta NoTracking o los objetos obtenidos
fuera del contexto del objeto. Igualmente, puede asociar los objetos que han sido almacenados en el estado
de vista de una aplicacin ASP.NET o que se han devuelto en una llamada a un mtodo remoto o en un
servicio web.
Utilice uno de los mtodos siguientes para asociar el objeto a un contexto del objeto:
Llame a AddObject en ObjectContext para agregar el objeto al contexto del objeto. Haga esto
cuando el objeto sea nuevo y no exista todava en el origen de datos.
Llame a Attach en ObjectContext para asociar el objeto al contexto del objeto. Hgalo cuando el
objeto ya exista en el origen de datos, pero no est todava asociado al contexto.
Llame a AttachTo en ObjectContext para asociar el objeto a un conjunto de entidades concreto en
el contexto del objeto. Haga esto tambin si el objeto tiene un valor null (Nothing en Visual Basic)
enEntityKey.
Llame a ApplyPropertyChanges en ObjectContext. Haga esto cuando el objeto ya exista en el origen
de datos y el objeto desasociado tenga actualizaciones de propiedades que desee conservar. Si
simplemente asocia el objeto, los cambios de las propiedades se pierden.
Las consideraciones siguientes son vlidas al asociar objetos al contexto del objeto:
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 372 | P g i n a

Si el objeto que se asocia tiene objetos relacionados, esos objetos tambin se asocian al contexto
del objeto.
Para utilizar Attach para asociar un objeto, el objeto debe implementar IEntityWithKey y tener una
clave vlida.
Los objetos se asocian al contexto del objeto en un estadoUnchanged.
Si el objeto asociado no existe en el origen de datos, no se agrega durante SaveChanges. En este
caso, cuando se realizan cambios en las propiedades, se produce una excepcin en el servidor
duranteSaveChanges. Para agregar un objeto, utilice AddObject en lugar de Attach.
Si el objeto que se asocia est relacionado con otros objetos, debe definir explcitamente las
relaciones de alguna de las maneras siguientes:
Asocie ambos objetos al contexto del objeto y, a continuacin, llame
a Attach en EntityCollection oEntityReference para definir la relacin.
Si no hay asociado ningn objeto, llame a Add enEntityCollection y especifique el objeto
relacionado o establezca la propiedad Value de EntityReference en el objeto relacionado.
Luego, asocie la raz del grfico de objetos al contexto del objeto. Puede utilizar este
mtodo para crear un grfico de objetos a partir de los objetos desasociados y, a
continuacin, asociar el grfico al contexto del objeto.
Estos mtodos se usan al asociar los objetos relacionados que se serializaron utilizando la
serializacin XML.
Si el objeto que se va a asociar tiene valores de propiedades actualizados, utilice
ApplyPropertyChanges para aplicar las actualizaciones en el objeto existente.
El objeto que se pasa al mtodo Attach debe tener un valor de EntityKey vlido. Si el objeto no
tiene un valor de EntityKey vlido, use el mtodo AttachTo para especificar el nombre del conjunto
de entidades.
Se produce una excepcin InvalidOperationException cuando el objeto que se va a asociar tiene la
misma EntityKey que un objeto diferente ya presente en el contexto del objeto. Este error no se
produce cuando la misma instancia del objeto est ya en el contexto del objeto; se puede llamar
a Attach varias veces en la misma instancia del objeto mientras el objeto est en
estado Unchanged.
Utilice el mtodo AttachTo para asociar objetos a un conjunto de entidades concreto.
Cuando el objeto que se va a asociar utilizando el mtodo AttachToya tiene definida su clave de
entidad, se produce una excepcin InvalidOperationException si el valor del parmetro
entitySetNameno coincide con el nombre del conjunto de entidades en la clave existente.

Administrar conexiones en Servicios de objeto (Entity Framework)
De forma predeterminada, Servicios de objeto administra la conexin con la base de datos. Abre las
conexiones slo cuando se requieren, por ejemplo para ejecutar una consulta o llamar a SaveChanges. A
continuacin, Servicios de objeto cierra la conexin cuando la operacin se ha completado.
Al llamar a cualquiera de los mtodos siguientes, se abre la conexin:
SaveChanges o Refresh en ObjectContext.
FirstOrDefault o First en ObjectQuery.
Load en EntityCollection.
Load en EntityReference.
Cualquier mtodo de Language-Integrated Query (LINQ) del generador de consultas ObjectQuery,
como Where, OrderBy oSelect.

Nota
Cuando se llama a un mtodo de consulta, se abre la conexin y sigue estando abierta hasta
que ObjectResult se haya consumido completamente o eliminado.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 373 | P g i n a


Servicios de objeto expone el elemento EntityConnection por medio de la propiedad Connection. Esto le
permite administrar la conexin y las transacciones, o proporcionar su propia EntityConnection. Resulta til
si desea mantener abierta una conexin dentro de un contexto del objeto de corta duracin para mejorar el
rendimiento o controlar las transacciones explcitamente. La misma conexin de proveedor utilizada por
Entity Framework se puede compartir con otras partes de una aplicacin.
Al administrar las conexiones deben tenerse en cuenta las consideraciones siguientes:
El contexto del objeto abrir la conexin si no est ya abierta antes de una operacin. Si el contexto
del objeto abre la conexin durante una operacin, siempre la cerrar cuando la operacin se
complete.
Si abre la conexin manualmente, el contexto del objeto no la cerrar. Al llamar a Close o Dispose,
se cerrar la conexin.
Si el contexto del objeto crea la conexin, siempre se eliminar cuando se elimine el contexto.
En un contexto del objeto de ejecucin prolongada, debe asegurarse de que se elimine el contexto
cuando ya no se requiera.
Si proporciona la EntityConnection para el contexto del objeto, debe asegurarse de que se elimina.
En el ejemplo siguiente, se muestra cmo abrir explcitamente una conexin:

' Explicitly open the connection.
advWorksContext.Connection.Open()

Cuando abre manualmente la conexin en un contexto del objeto de ejecucin prolongada, debe llamar
a Dispose para asegurarse de que la conexin se cierre cuando el contexto ya no se necesite. Tambin
puede llamar a Close en la EntityConnection para cerrar explcitamente la conexin.
Servicios de objeto tambin permite crear una EntityConnection y proporcionar esta conexin al contexto
del objeto. En este caso, puede abrir la conexin manualmente o permitir que el contexto del objeto la abra
cuando lo necesite. Cuando proporcione EntityConnection el contexto del objeto, debe asegurarse de que el
contexto y la EntityConnection se eliminan cuando ya no se requieren. En el ejemplo siguiente se crea una
conexin y se pasa al contexto del objeto:

' Create an EntityConnection.
Dim conn As New EntityConnection("name=AdventureWorksEntities")

' Create a long-running context with the connection.
Dim advWorksContext As New AdventureWorksEntities(conn)

Administrar transacciones en Servicios de objeto (Entity Framework)
Servicios de objeto admite la inscripcin automtica en transacciones. Esto significa que las actividades
realizadas dentro de un contexto del objeto, como ejecutar consultas y guardar los cambios de los datos en
el origen de datos, se pueden aislar en dicho origen de datos ejecutando la operacin dentro de una
transaccin System.Transactions. Las transacciones se utilizan con Servicios de objeto para lo siguiente:
Ejecutar varias operaciones en el origen de datos; estas deben ser coherentes, como realizar
consultas que dependan de la realizacin correcta de cambios en los objetos.
Coordinar los cambios en el contexto del objeto con otras operaciones distribuidas, como enviar
una notificacin de correo electrnico o escribir en una cola de mensajes.
Las transacciones que requieren la inscripcin de administradores de recursos adicionales se
denominan transacciones distribuidas. Las transacciones distribuidas utilizan un coordinador de
transacciones distribuidas (DTC) para administrar los recursos que se necesitan para completar la
transaccin. La promocin de una transaccin a un DTC puede ser un proceso relativamente difcil de
establecer y completar. Algunos administradores de recursos, como SQL Server 2005, admiten el protocolo
de transacciones PSPE (Promotable Single Phase Enlistment). Esto permite a un administrador de recursos
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 374 | P g i n a

hospedar una transaccin que se pueda escalar posteriormente para ser administrada por el coordinador de
transacciones distribuidas (DTC), si es necesario.

Las consideraciones siguientes son aplicables cuando se utilizan transacciones con Servicios de objeto:
Slo las operaciones con el origen de datos son susceptibles de transaccin. Los cambios realizados
en los objetos del contexto del objeto no son susceptibles de transaccin. Los cambios efectuados
en objetos del contexto estn visibles fuera del mbito de la transaccin.
Al llamar a SaveChanges, si existe una transaccin actual, Servicios de objeto utiliza esta transaccin
para las operaciones realizadas con el origen de datos. De lo contrario, crea una transaccin nueva
para la operacin. Puede definir transacciones utilizando EntityTransaction,Transaction o
TransactionScope.

Nota
Para dar de alta una transaccin existente, Servicios de objeto puede cerrar y volver a abrir la conexin.

Cuando Servicios de objeto crea una transaccin nueva para una operacin SaveChanges, los
cambios efectuados en los objetos del contexto del objeto no se aceptan hasta que se complete la
transaccin. De este modo, se garantiza que el estado del contexto del objeto y el origen de datos
son coherentes.
Si tiene previsto volver a intentar operaciones en una transaccin, debe asegurarse de que el
estado de los objetos del contexto no se establezca de nuevo antes de completarse la transaccin.
Para ello, debe llamar a SaveChanges con el valor false para el parmetroacceptChangesDuringSave
y, a continuacin, llamar a AcceptAllChanges nicamente despus de que otras operaciones de la
transaccin se hayan completado de forma correcta.
Como parte de una operacin de reintento con transacciones coordinadas, puede llamar
a SaveChanges una segunda vez sin llamar primero a AcceptAllChanges. En este caso, Servicios de
objeto intentar volver a aplicar los mismos cambios en el origen de datos.

Desasociar objetos (Entity Framework)
Entity Framework admite escenarios que requieren un contexto del objeto de ejecucin prolongada. Por
ejemplo, podra encontrar este escenario en una aplicacin para Windows en la que los objetos de datos se
enlazan a un control visual y se deben conservar mientras los datos se muestran en el control. Cuando una
consulta se ejecuta dentro de un contexto del objeto, los objetos devueltos se asocian automticamente al
contexto del objeto. Esto significa que al ejecutar consultas repetidas en el mismo contexto del objeto,
aumentar la necesidad de memoria del contexto del objeto. La excepcin se da cuando una consulta se
ejecuta con un valor MergeOption de NoTracking. En este caso, los objetos no se asocian al contexto del
objeto.
Servicios de objeto le permite desasociar los objetos de un contexto del objeto. Cuando los objetos ya no se
requieren, se pueden desasociar. El contexto del objeto no hace referencia a los objetos desasociados y .NET
Framework puede reclamar sus recursos.
Para desasociar los objetos, se llama al mtodo Detach y se pasa una referencia al objeto que se va a
desasociar, como en el ejemplo siguiente:

' Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetail.First())

Al desasociar objetos deben tenerse en cuenta las consideraciones siguientes:
Detach slo afecta al objeto especfico que se pasa al mtodo. Si el objeto que se desasocia tiene
objetos relacionados en el contexto del objeto, esos objetos no se desasocian.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 375 | P g i n a

La informacin de las relaciones no se mantiene para un objeto desasociado.
La informacin del estado de los objetos no se mantiene cuando un objeto se desasocia. Esto
incluye los cambios sometidos a seguimiento y los valores de las claves temporales.
La desasociacin de objetos no afecta a los datos del origen de datos.
Durante una operacin de desasociar no se exigen directivas de eliminacin en cascada ni
restricciones referenciales.
Las ventajas de desasociar objetos se deberan considerar teniendo en cuenta el procesamiento
adicional que precisa la operacin. Cuando el mbito de los datos de usuario haya cambiado, por
ejemplo al mostrar un formulario nuevo con un conjunto de datos diferente, debera considerar
crear una nueva instancia deObjectContext, en lugar de simplemente desasociar los objetos de
unObjectContext existente.

LINQ to Entities
La mayor parte de las aplicaciones se escriben actualmente utilizando bases de datos relacionales. En algn
momento, estas aplicaciones tienen que interactuar con los datos representados en un formato relacional.
Los esquemas de bases de datos no son siempre adecuados para crear aplicaciones, y los modelos
conceptuales de las aplicaciones difieren de los modelos lgicos de las bases de datos. El Entity Data Model
(EDM) es un modelo de datos conceptual que se puede usar para modelar los datos de un dominio especial
de forma que las aplicaciones puedan interactuar con ellos como entidades u objetos.
A travs del EDM, ADO.NET expone las entidades como objetos en el entorno .NET. Esto hace que la capa de
objetos sea un objetivo ideal para la compatibilidad con Language-Integrated Query (LINQ). Por lo tanto,
LINQ to ADO.NET incluye LINQ to Entities. LINQ to Entities permite a los programadores escribir consultas
con la base de datos desde el mismo lenguaje que se usa para crear la lgica empresarial. En el diagrama
siguiente se ilustra la relacin entre LINQ to Entities y Entity Framework, ADO.NET 2.0 y el origen de datos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 376 | P g i n a



Informacin general de LINQ to Entities
Actualmente, la mayor parte de las aplicaciones empresariales se escriben para tener acceso a datos de
bases de datos relacionales. En algn momento, estas aplicaciones tienen que interactuar con los datos
representados en un formato relacional. El modelo relacional est optimizado para conseguir un
almacenamiento y recuperacin eficientes, no para el modelado conceptual que se usa en la programacin
orientada a objetos. Varias tablas normalizadas suelen corresponder a una sola clase, y las relaciones entre
las clases no se representan del mismo modo que las relaciones entre tablas. Los programadores de
aplicaciones empresariales a menudo deben usar dos o ms lenguajes de programacin: un lenguaje de alto
nivel para los niveles de presentacin y lgica empresarial (como Visual C# o Visual Basic) y un lenguaje de
consulta para interactuar con la base de datos (como Transact-SQL). Esto requiere que el programador tenga
conocimientos de varios idiomas para ser efectivo y tambin causa discrepancias de idiomas en el entorno
de desarrollo. Por ejemplo, una aplicacin que utiliza API de acceso a datos para ejecutar una consulta en
una base de datos especifica la consulta como un literal de cadena usando comillas. Esta cadena de consulta
es opaca para el compilador y no se comprueba si contiene errores, tales como una sintaxis no vlida o si
existen las columnas o las filas a las que hace referencia. No se realiza ninguna comprobacin de los tipos de
los parmetros de la consulta y tampoco hay compatibilidad con IntelliSense.
Entity Framework permite a los programadores trabajar con datos en forma de objetos y propiedades
especficos del dominio, por ejemplo, con clientes y direcciones, sin tener que pensar en las tablas de las
bases de datos subyacentes y en las columnas en las que se almacenan estos datos. LINQ permite a los
programadores formular consultas basadas en conjuntos en el cdigo de las aplicaciones, sin tener que usar
un lenguaje de consulta independiente. A travs de la infraestructura de Servicios de objeto de Entity
Framework, ADO.NET expone una vista conceptual comn de los datos, incluidos los datos relacionales,
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 377 | P g i n a

como objetos del entorno .NET. Esto hace que la capa de objetos sea un objetivo ideal para la
compatibilidad con LINQ. Esta tecnologa LINQ, LINQ to Entities, permite a los programadores crear
consultas flexibles, pero con establecimiento inflexible de tipos, en el contexto del objeto de Entity
Framework mediante el uso de expresiones y de operadores de consulta estndar de LINQ directamente
desde el entorno de desarrollo. Las consultas se expresan en el propio lenguaje de programacin y no como
literales de consulta incrustados en el cdigo de programacin, como suele ser el caso en las aplicaciones
escritas en Microsoft .NET Framework versin 2.0. El compilador detectar los errores de sintaxis y los
errores en los nombres de miembros y los tipos de datos, y los notificar en tiempo de compilacin, con lo
que se reduce la posibilidad de que se produzcan problemas con los tipos entre Entity Data Model y la
aplicacin.
Las consultas de LINQ to Entities usan la infraestructura de Servicios de objeto. La clase ObjectContext es la
clase primaria para interactuar con un Entity Data Model como objetos de CLR. El programador crea una
instancia de ObjectQuery genrica a travs del ObjectContext. La clase deObjectQuery genrica representa
una consulta que devuelve una instancia o coleccin de entidades con tipo. Los objetos entidad devueltos se
pueden actualizar y se encuentran en el contexto del objeto. Esto tambin es as en el caso de los objetos
entidad que se devuelven en forma de miembros de tipos annimos.

LINQ y el Entity Data Model
LINQ to Entities permite a los programadores crear consultas flexibles, pero con establecimiento inflexible
de tipos, en el contexto del objeto del Entity Data Model (EDM) mediante el uso de expresiones y de
operadores de consulta estndar de LINQ Esto permite a los usuarios escribir consultas compuestas con
establecimiento inflexible de tipos en una sintaxis del estilo de Transact-SQL, directamente en el entorno de
desarrollo. Las consultas se expresan en el propio lenguaje de programacin y no como literales de consulta
incrustados en el cdigo de programacin, como suele ser el caso en las aplicaciones escritas en Microsoft
.NET Framework versin 2.0. El compilador detectar los errores de sintaxis y los errores en los nombres de
miembros y los tipos de datos, y los notificar en tiempo de compilacin, con lo que se reduce la posibilidad
de que se produzcan problemas entre el modelo del EDM y la aplicacin.
Cuando una aplicacin usa el modelo EDM, la asignacin entre el modelo de datos conceptual y el origen de
datos subyacente se controla de forma automtica. Un programador puede crear una aplicacin de LINQ to
Entities sin conocer nada del origen de datos subyacente ni de los mtodos concretos que se usan para
consultar el origen de datos. Esto tambin permite cambiar el origen de datos back end sin necesidad de
realizar cambios en la aplicacin cliente, ya que la mayor parte de las caractersticas especficas de las bases
de datos se controlan a travs de Servicios de objeto.
Las consultas de LINQ to Entities usan la infraestructura de Servicios de objeto. La clase ObjectContext es la
clase primaria para interactuar con un EDM en forma de objetos de CLR. El programador crea una instancia
de ObjectQuery a travs del ObjectContext. La clase de ObjectQuerygenrica representa una consulta que
devuelve una instancia o coleccin de entidades con tipo. El contexto del objeto realiza el seguimiento de los
objetos entidad que devuelve ObjectQuery, y stos se pueden actualizar mediante el mtodo SaveChanges.

Cmo crear un proyecto de LINQ to Entities en Visual Studio
Los distintos tipos de proyecto de Language-Integrated Query (LINQ) requieren determinados espacios de
nombres importados (Visual Basic) o directivas using (C#) y referencias. El requisito mnimo es una
referencia a System.Core.dll y System.Data.Entity.dll, y una directiva using para los espacios de
nombres System.Linq y System.Data.Objects. LINQ to Entities tambin requiere una referencia al modelo
Entity Data Model (EDM) que se va a consultar. En el ejemplo de la seccin LINQ to Entities se utiliza Modelo
AdventureWorks Sales (EDM).
Si est actualizando un proyecto desde una versin anterior de Visual Studio, es posible que tenga que
proporcionar estas referencias relacionadas con LINQ de forma manual. Tambin puede que tenga que
configurar de forma manual el proyecto para establecer como destino la versin 3.5 de .NET Framework.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 378 | P g i n a

Nota
Si est generando el proyecto desde el smbolo del sistema, debe hacer referencia manualmente a las DLL
relacionadas con LINQ endrive:\Archivos de programa\Reference Assemblies\Microsoft\Framework\v3.5.

Para establecer como destino .NET Framework
1. En Visual Studio 2008, cree un proyecto nuevo de Visual Basic o C#. Tambin puede abrir un
proyecto de Visual Basic o C# creado en Visual Studio 2005 y convertirlo en un proyecto de Visual
Studio 2008.
2. En el men Proyecto, haga clic en Propiedades.
En un proyecto de C#, en la pgina de propiedadesAplicacin, seleccione .NET Framework
3.5 en el cuadroVersin de .NET Framework de destino.
En un proyecto de Visual Basic, en la pgina de propiedadesCompilacin, haga clic
en Opciones de compilacin avanzadas y, a continuacin, seleccione .NET Framework 3.5
en el cuadro Versin de .NET Framework de destino (todas las configuraciones).
3. En el men Proyecto, haga clic en Agregar referencia.
4. En el cuadro de dilogo Agregar referencia, haga clic en la ficha.NET, seleccione System.Core en la
lista Nombre de componentey, a continuacin, haga clic en Aceptar.
5. En un proyecto de C#, agregue una directiva using para los espacios de
nombres System.Linq y System.Data.Objects al archivo del cdigo fuente o al proyecto.
En un proyecto de Visual Basic, agregue una directiva Imports para los espacios de
nombres System.Linq y System.Data.Objects al archivo del cdigo fuente o al proyecto.

Para crear el modelo AdventureWorks Sales y hacer referencia al mismo
1. En el men Proyecto, haga clic en Agregar nuevo elemento.
2. En el panel Plantillas, seleccione ADO.NET Entity Data Model.
3. Escriba AdvWorksModel.edmx en el cuadro Nombre y, a continuacin, haga clic en Agregar.
4. Seleccione Generar desde la base de datos y, a continuacin, haga clic en Siguiente.
5. En la ventana Elegir la conexin de datos, seleccione una conexin de AdventureWorks existente
en la lista, o cree una conexin nueva a una instancia de SQL Server que tenga la base de datos de
ejemplo AdventureWorks.
6. Guarde la configuracin de la conexin de entidad en el archivo App.Config
como AdventureWorksEntities y haga clic enSiguiente.
7. En el cuadro de dilogo Elija los objetos de base de datos, borre todos los objetos,
expanda Tablas y seleccione los objetos de tabla siguientes:
Address (Person)
Contact (Person)
Product (Production)
SalesOrderDetail (Sales)
SalesOrderHeader (Sales)
8. Asigne el nombre AdventureWorksModel al espacio de nombres del modelo y haga clic
en Finalizar.
9. En un proyecto de C#, agregue una instruccin using para AdventureWorksEntities al archivo del
cdigo fuente.

En un proyecto de Visual Basic, agregue una instruccin Importspara AdventureWorksEntities al archivo del
cdigo fuente.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 379 | P g i n a

Flujo de ejecucin de LINQ to Entities
Las consultas con Entity Framework se representan mediante consultas de rboles de comandos, que se
ejecutan en el contexto del objeto. LINQ to Entities convierte las consultas de Language-Integrated Queries
(LINQ) en consultas de rboles de comandos, ejecuta las consultas en Entity Framework y devuelve objetos
que se pueden usar tanto en Entity Framework como en LINQ. A continuacin se muestra el proceso para
crear y ejecutar una consulta de LINQ to Entities.
1. Cree una instancia de ObjectQuery en ObjectContext.
2. Cree una consulta de LINQ to Entities en C# o Visual Basic con la instancia de ObjectQuery.
3. Convierta los operadores y expresiones de consulta estndar de LINQ en rboles de comandos.
4. Ejecute la consulta, con representacin de un rbol de comandos, en el origen de datos. Las
excepciones producidas en el origen de datos durante la ejecucin se pasan directamente al cliente.
5. Devuelva los resultados de la consulta al cliente.

Crear una instancia de ObjectQuery
La clase ObjectQuery genrica representa una consulta que devuelve una coleccin de cero o ms entidades
con tipo. Una consulta de objetos se suele crear a partir de un contexto del objeto existente, en lugar de
crearse de forma manual, y siempre pertenece a dicho contexto. Este contexto proporciona la informacin
de metadatos y de la conexin necesaria para crear y ejecutar la consulta. La clase
genrica ObjectQuery implementa la interfaz genrica IQueryable, cuyos mtodos de generador permiten
que las consultas de LINQ se generen de forma gradual.

Crear la consulta
Las instancias de la clase genrica ObjectQuery, que implementa la interfaz genrica IQueryable, actan
como origen de datos para las consultas de LINQ to Entities. En una consulta se especifica exactamente la
informacin que se desea recuperar del origen de datos. Una consulta tambin puede especificar cmo se
debe ordenar, agrupar y conformar esa informacin antes de que se devuelva. En LINQ, una consulta se
almacena en una variable. Esta variable de consulta no realiza ninguna accin y no devuelve datos;
solamente almacena la informacin de la consulta. Tras crear una consulta debe ejecutarla para recuperar
los datos.

Las consultas de LINQ to Entities se pueden formular en dos sintaxis diferentes: sintaxis de expresiones de
consulta y sintaxis de consultas basadas en mtodos. La sintaxis de expresiones de consulta y la sintaxis de
consultas basadas en mtodos son una novedad de C# 3.0 y Visual Basic 9.0.

En el ejemplo siguiente de sintaxis de expresiones de consulta se crea una instancia de ObjectQuery del
contexto del objeto de AdventureWorks y se usa Select para devolver todas las filas de Product.

Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product

Dim productNames = _
From p In products _
Select p

End Using

En el ejemplo siguiente de sintaxis de consultas basadas en mtodos se crea una instancia
de ObjectQuery del contexto del objeto de AdventureWorks y se usa Select para devolver todas las filas
de Product.

Using AWEntities As New AdventureWorksEntities
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 380 | P g i n a



Dim productNames = AWEntities.Product.Select(Function(p) p.Name)

End Using

Conversin de las consultas
Para ejecutar una consulta de LINQ to Entities en Entity Framework, se debe convertir a una representacin
de rbol de comandos que se pueda ejecutar en Entity Framework.
Las consultas de LINQ to Entities estn compuestas de operadores de consulta estndar de LINQ
(como Select, Where y GroupBy) y expresiones (x > 10, Contact.LastName, etctera). Los operadores de
LINQ no se definen en una clase, sino que son los mtodos de una clase. En LINQ, las expresiones pueden
contener todo lo que permitan los tipos dentro del espacio de nombres System.Linq.Expressions y, por
extensin, todo lo que se pueda representar en una funcin lambda. Se trata de un superconjunto de las
expresiones permitidas por Entity Framework, que, por definicin, estn restringidas a las operaciones
admitidas tanto en la base de datos como por ObjectQuery.
En Entity Framework, tanto los operadores como las expresiones se representan mediante una jerarqua de
tipos simple, que despus se coloca en un rbol de comandos. Entity Framework usa el rbol de comandos
para ejecutar la consulta. Si la consulta de LINQ no se puede expresar como un rbol de comandos, se
producir una excepcin cuando se convierta la consulta. La conversin de las consultas de LINQ to Entities
implica dos conversiones ms: la de los operadores de consulta estndar y la de las expresiones.
Hay varios operadores de consulta estndar de LINQ que no tienen una conversin vlida en LINQ to
Entities. Si se intenta usar estos operadores, se producir una excepcin al convertir la consulta.

En general, las expresiones de LINQ to Entities se evalan en el servidor, de modo que es previsible que el
comportamiento de la expresin no siga la semntica de CLR.

Ejecucin de la consulta
Una vez que el usuario crea una consulta de LINQ, esta se convierte en una representacin compatible con
Entity Framework (en forma de rboles de comandos), que despus se ejecuta en el origen de datos. En el
momento de ejecutar la consulta, todas las expresiones de consulta (o sus componentes) se evalan en el
cliente o en el servidor. Esto incluye las expresiones que se usan en la materializacin resultante o en las
proyecciones de entidades.
El momento en que se ejecuta una expresin de una consulta puede variar. Las consultas de LINQ se
ejecutan siempre que se recorre en iteracin la variable de la consulta, no cuando se crea la citada variable;
esto se conoce como ejecucin aplazada. Tambin se puede obligar a que la consulta se ejecute
inmediatamente, lo que es til para almacenar en cach los resultados de la consulta. En el ejemplo
siguiente se usa Select para devolver todas las filas de Product y mostrar los nombres de producto. Al
recorrer en iteracin la variable de la consulta en un bucle foreach/For Each, se provoca la ejecucin de la
consulta.

Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product

Dim productNames = _
From p In products _
Select p.Name

Console.WriteLine("Product Names:")
For Each productName In productNames
Console.WriteLine(productName)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 381 | P g i n a

Next
End Using

Cuando se ejecuta una consulta de LINQ to Entities, algunas de sus expresiones podran ejecutarse en el
servidor y ciertas partes podran ejecutarse de forma local en el cliente. La evaluacin en el cliente de una
expresin se lleva a cabo antes de ejecutar la consulta en el servidor. Si una expresin se evala en el
cliente, el resultado de esa evaluacin se sustituye por la expresin en la consulta, y sta se ejecuta
entonces en el servidor. Dado que las consultas se ejecutan en el origen de datos, la configuracin de este
invalida el comportamiento especificado en el cliente. Algunos ejemplos de esto son el tratamiento de los
valores Null y la precisin numrica. Cualquier excepcin que se produzca durante la ejecucin de la
consulta en el servidor se pasa directamente al cliente.

Materializacin
La materializacin es el proceso por el que se devuelven los resultados de la consulta al cliente en forma de
tipos de CLR. En LINQ to Entities, los registros de datos de los resultados de las consultas no se devuelven
nunca; siempre hay un tipo de CLR correspondiente, definido por el usuario o por Entity Framework, o
generado por el compilador (tipos annimos). Entity Framework realiza la materializacin de todos los
objetos. Los errores derivados de la incapacidad de encontrar una correspondencia entre Entity Framework
y CLR har que se produzcan excepciones durante la materializacin de los objetos.
Los resultados de las consultas se suelen devolver en forma de alguno de los elementos siguientes.
Una coleccin con cero o ms objetos de entidad con tipo o una proyeccin de tipos complejos en
el EDM.
Tipos de CRL admitidos por el EDM.
Colecciones insertadas.
Tipos annimos.

Consultas en LINQ to Entities
Una consulta es una expresin que recupera datos de un origen de datos. Las consultas se suelen expresar
en un lenguaje de consulta especializado, como SQL para bases de datos relacionales y XQuery para XML.
Por lo tanto, los programadores han tenido que aprender un lenguaje de consultas nuevo para cada tipo de
origen de datos o formato de datos que consultan. Language-Integrated Query (LINQ) ofrece un modelo
coherente y ms sencillo para trabajar con los datos de varios formatos y orgenes de datos. En una consulta
de LINQ siempre se trabaja con objetos de programacin.
Una operacin de consulta de LINQ consta de tres acciones: obtener el origen o los orgenes de datos, crear
la consulta y ejecutar la consulta.
Los orgenes de datos que implementan las interfaces genricas IEnumerable o IQueryable pueden
consultarse a travs de LINQ. Las instancias de la clase ObjectQuery, que implementa la interfaz genricaI
Queryable, actan como origen de datos para las consultas LINQ to Entities. La clase ObjectQuery genrica
representa una consulta que devuelve una instancia o coleccin de entidades con tipo. El programador crea
una instancia de ObjectContext, que es la clase principal para interactuar con un Entity Data Model (EDM)
como objetos de CLR.
En la consulta se especifica exactamente la informacin que se desea recuperar del origen de datos. Una
consulta tambin puede especificar cmo se debe ordenar, agrupar y conformar esa informacin antes de
que se devuelva. En LINQ, una consulta se almacena en una variable. Si la consulta devuelve una secuencia
de valores, la propia variable de la consulta debe ser de un tipo que se pueda consultar. Esta variable de
consulta no realiza ninguna accin y no devuelve datos; solamente almacena la informacin de la consulta.
Tras crear una consulta debe ejecutarla para recuperar los datos.
En una consulta que devuelve una secuencia de valores, la variable de consulta por s misma nunca conserva
los resultados de la consulta y slo almacena sus comandos. La ejecucin de la consulta se aplaza hasta que
la variable de consulta se recorre en iteracin en un bucle foreach o For Each. Esto se denomina ejecucin
aplazada; es decir, la ejecucin de la consulta se produce despus de que se cree la consulta. Esto significa
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 382 | P g i n a

que se puede ejecutar una consulta con la frecuencia que se desee. Esto es til cuando, por ejemplo, se
tiene una base de datos que otras aplicaciones estn actualizando. En su aplicacin puede crear una
consulta para recuperar la informacin ms reciente y ejecutar de forma repetida la consulta, devolviendo
cada vez la informacin actualizada.
A diferencia de las consultas aplazadas, que devuelven una secuencia de valores, las consultas que
devuelven un valor singleton se ejecutan inmediatamente. Algunos ejemplos de consultas singleton
son Count, Max,Average y First. Se ejecutan inmediatamente porque se necesitan los resultados de la
consulta para calcular el resultado singleton. Tambin puede usar los mtodos ToList o ToArray en una
consulta para forzar la ejecucin inmediata de una consulta que no crea un valor singleton. Esas tcnicas
para forzar la ejecucin inmediata pueden ser tiles si desea almacenar en memoria cach los resultados de
una consulta.

Consultas
Las consultas de LINQ to Entities se pueden formular en dos sintaxis diferentes: sintaxis de expresiones de
consulta y sintaxis de consultas basadas en mtodos. La sintaxis de expresiones de consulta es nueva en C#
3.0 y Visual Basic 9.0, y consta de un conjunto de clusulas escritas en una sintaxis declarativa similar a
Transact-SQL o XQuery. No obstante, Common Language Runtime (CLR) de .NET Framework no puede leer la
sintaxis de expresiones de consulta por s mismo. Por lo tanto, en tiempo de compilacin, las expresiones de
consulta se convierten en algo que CLR no comprende: las llamadas a mtodos. Esos mtodos se conocen
comooperadores de consulta estndar. Como programador, tiene la opcin de llamarlos directamente
utilizando la sintaxis de mtodo en lugar de la sintaxis de consulta.

Sintaxis de expresiones de consulta
Las expresiones de consulta son una sintaxis de consulta declarativa. Esta sintaxis permite a un programador
escribir consultas en un lenguaje de alto nivel que tenga un formato similar al de Transact-SQL. Si se utiliza la
sintaxis de expresiones de consulta, se pueden realizar incluso operaciones complejas de filtrado,
ordenacin y agrupamiento en orgenes de datos con cdigo mnimo.
En el ejemplo siguiente se usa Select para devolver todas las filas de Producty mostrar los nombres de
producto.

Using AWEntities As New AdventureWorksEntities
Dim products As ObjectQuery(Of Product) = AWEntities.Product

Dim productNames = _
From p In products _
Select p.Name

Console.WriteLine("Product Names:")
For Each productName In productNames
Console.WriteLine(productName)
Next
End Using

Sintaxis de consultas basadas en mtodos
Otra forma de formular consultas de LINQ to Entities es usar las consultas basadas en mtodos. La sintaxis
de consultas basadas en mtodos es una secuencia de llamadas directas a los mtodos de operador de LINQ
que pasan expresiones lambda como parmetros.
En este ejemplo se usa Select para devolver todas las filas de Product y mostrar los nombres de producto.

Using AWEntities As New AdventureWorksEntities
Dim productNames = AWEntities.Product.Select(Function(p) p.Name)
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 383 | P g i n a

Console.WriteLine("Product Names:")
For Each productName In productNames
Console.WriteLine(productName)
Next
End Using

Crear consultas
Tal y como se ha mencionado anteriormente en este tema, la variable de consulta slo almacena los
comandos de la consulta cuando sta se disea para devolver una secuencia de valores. Si la consulta no
contiene un mtodo que origine una ejecucin inmediata, la ejecucin real de la consulta se aplazar hasta
que la variable de consulta se recorra en iteracin en un bucle foreach o For Each. La ejecucin aplazada
permite combinar varias consultas o ampliar una consulta. Cuando se ampla una consulta, se modifica para
incluir las nuevas operaciones. La ejecucin final reflejar los cambios. En el siguiente ejemplo, la primera
consulta devuelve todos los productos. La segunda consulta ampla la primera usando Where para devolver
todos los productos de tamao "L":

Using AWEntities As New AdventureWorksEntities()
Dim products As ObjectQuery(Of Product) = AWEntities.Product

Dim productsQuery = _
From p In products _
Select p

Dim largeProducts = _
productsQuery.Where(Function(p) p.Size = "L")

Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
Console.WriteLine(product.Name)
Next
End Using

Una vez ejecutada una consulta, todas las consultas sucesivas utilizarn los operadores de LINQ en memoria.
Si se recorre en iteracin la variable de la consulta utilizando una instruccin foreach o For Each o llamando
a uno de los operadores de conversin de LINQ, se producir la ejecucin inmediata. Entre estos operadores
de conversin se incluyen los siguientes:ToList, ToArray, ToLookup y ToDictionary.
En el siguiente ejemplo, la primera consulta devuelve todos los productos. La segunda consulta ampla la
primera una vez que esta se haya ejecutado para devolver los productos de color rojo.

Using AWEntities As New AdventureWorksEntities()
Dim products As ObjectQuery(Of Product) = AWEntities.Product

Dim productsQuery = _
From p In products _
Select p

Console.WriteLine("The list of products:")
For Each Product As Product In productsQuery
Console.WriteLine(Product.Name)
Next

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 384 | P g i n a

Dim redProducts = productsQuery _
.Where(Function(p) p.Color = "Red") _
.Select(Function(p) p)

Console.WriteLine("")
Console.WriteLine("The list of red products:")
For Each redProduct As Product In redProducts
Console.WriteLine(redProduct.Name)
Next
End Using

Operadores de consulta estndar en las consultas de LINQ to Entities
En una consulta, se especifica la informacin que se desea recuperar del origen de datos. Una consulta
tambin puede especificar cmo se debe ordenar, agrupar y dar forma a esa informacin antes de ser
devuelta. LINQ proporciona un conjunto de mtodos de consulta estndar que se puede utilizar en una
consulta. La mayora de estos mtodos funciona en secuencias; en este contexto, una secuencia es un
objeto cuyo tipo implementa la interfaz IEnumerable o la interfaz IQueryable. La funcionalidad de consulta
de los operadores de consulta estndar incluye las operaciones de filtrado, proyeccin, agregacin,
ordenacin, agrupamiento y paginacin, entre otras. Algunos de los operadores de consulta estndar que se
usan con ms frecuencia tienen una sintaxis de palabras clave especial para que se puedan invocar
utilizando la sintaxis de las expresiones de consulta. Una expresin de consulta constituye una forma
diferente de expresar una consulta, ms legible que su equivalente basada en mtodos. Las clusulas de las
expresiones de consulta se convierten en llamadas a los mtodos de consulta en tiempo de compilacin.
No todos los operadores de consulta estndar se admiten en las consultas de LINQ to Entities.

Mtodos de proyeccin y filtrado
La proyeccin hace referencia a la transformacin de los elementos de un conjunto de resultados en un
formato deseado. Por ejemplo, se puede proyectar un subconjunto de las propiedades que se necesitan de
cada objeto del conjunto de resultados, se puede proyectar una propiedad y realizar un clculo matemtico
con ella, o se puede proyectar el objeto completo del conjunto de resultados. Los mtodos de proyeccin
son Selecty SelectMany.
El filtradohace referencia a la operacin de restringir el conjunto de resultados de manera que slo
contenga los elementos que cumplen una condicin especificada. El mtodo de filtrado es Where.
La mayora de las sobrecargas de los mtodos de proyeccin y filtrado se admiten en LINQ to Entities, con la
excepcin de las que aceptan un argumento de posicin.

Mtodos de combinacin
La combinacin es una operacin importante de las consultas dirigidas a orgenes de datos que no tienen
relaciones navegables entre s. Una combinacin de dos orgenes de datos es la asociacin de objetos en un
origen de datos con objetos de otro origen de datos que comparten un atributo o propiedad comunes. Los
mtodos de combinacin son Join yGroupJoin.
Se admiten la mayora de las sobrecargas de los mtodos de combinacin, a excepcin de las que
usan IEqualityComparer. Esto se debe a que el comparador no se puede convertir en el origen de datos.

Mtodos Set
Las operaciones Set de LINQ son operaciones de consulta que basan sus conjuntos de resultados en la
presencia o ausencia de elementos equivalentes dentro de la misma o de otra coleccin (o conjunto). Los
mtodos Set son All, Any, Concat, Contains, DefaultIfEmpty, Distinct,EqualAll, Except, Intersect y Union.
La mayor parte de las sobrecargas de los mtodos Set se admiten en LINQ to Entities, aunque hay algunas
diferencias en el comportamiento en comparacin con LINQ to Objects. Sin embargo, no se admiten los
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 385 | P g i n a

mtodos Set que utilizan IEqualityComparer porque el comparador no se puede convertir en el origen de
datos.

Mtodos de ordenacin
La ordenacin hace referencia a la forma de ordenar los elementos de un conjunto de resultados segn uno
o varios atributos. Si se especifica ms de un criterio de ordenacin, se pueden romper los enlaces dentro de
un grupo.
Se admiten la mayora de las sobrecargas de los mtodos de ordenacin, a excepcin de las que
usan IComparer. Esto se debe a que el comparador no se puede convertir en el origen de datos. Los
mtodos de ordenacin sonOrderBy, OrderByDescending, ThenBy, ThenByDescending yReverse.
Dado que la consulta se ejecuta en el origen de datos, el comportamiento de la ordenacin puede diferir de
las consultas ejecutadas en CLR. Esto se debe a que las opciones de ordenacin, como la ordenacin por
maysculas y minsculas, la ordenacin kanji y la ordenacin por NULL, se pueden establecer en el origen de
datos. Dependiendo del origen de datos, estas opciones de ordenacin pueden generar resultados
diferentes a los obtenidos en CLR.
Si se especifica el mismo selector de claves en ms de una operacin de ordenacin, se generar una
ordenacin duplicada. Esto no es vlido y se producir una excepcin.

Mtodos de agrupamiento
El agrupamiento hace referencia a la operacin de colocar los datos en grupos de manera que los elementos
de cada grupo compartan un atributo comn. El mtodo de agrupamiento es GroupBy.
Se admiten la mayora de las sobrecargas de los mtodos de agrupamiento, a excepcin de las que
usan IEqualityComparer. Esto se debe a que el comparador no se puede convertir en el origen de datos.
Los mtodos de agrupamiento se asignan al origen de datos utilizando una subconsulta distinta para el
selector de claves. La subconsulta de comparacin del selector de claves se ejecuta utilizando la semntica
del origen de datos, incluidos los problemas relacionados con la comparacin de valores null.

Mtodos de agregacin
Una operacin de agregacin calcula un valor nico a partir de una coleccin de valores. Por ejemplo, el
clculo de la temperatura media diaria a partir de los valores de la temperatura diaria de un mes es una
operacin de agregacin. Los mtodos de agregacin
son Aggregate, Average,Count, LongCount, Max, Min y Sum.
Se admite la mayor parte de las sobrecargas de los mtodos de agregacin. Para el comportamiento
relacionado con valores NULL, los mtodos de agregacin utilizan la semntica del origen de datos. El
comportamiento de los mtodos de agregacin cuando hay valores NULL implicados puede ser diferente, en
funcin de qu origen de datos back-end se est utilizando. El comportamiento de los mtodos de
agregacin que usa la semntica del origen de datos tambin puede ser diferente de lo que cabe esperar de
los mtodos CLR. Por ejemplo, el comportamiento predeterminado para el mtodo Sum en SQL Server es
omitir cualquier valor NULL en lugar de producir una excepcin.
Las excepciones derivadas de la agregacin, como un desbordamiento de la funcin Sum, se producen como
excepciones del origen de datos o como excepciones de Entity Framework durante la materializacin de los
resultados de la consulta.
En el caso de los mtodos que implican un clculo sobre una secuencia, como Sum o Average, el clculo real
se realiza en el servidor. Como consecuencia, pueden producirse en el servidor conversiones de tipos y
prdida de precisin, y los resultados pueden diferir de lo que se espera al usar la semntica de CLR.
El comportamiento predeterminado de los mtodos de agregacin para valores NULL y NO NULL se muestra
en la tabla siguiente:

Mtodo
Ningn
dato
Todos los valores
NULL Algunos valores NULL Valores NO NULL
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 386 | P g i n a

Average Devuelve
NULL.
Devuelve NULL. Devuelve el promedio de
todos los valores NO NULL
de una secuencia.
Calcula el promedio de una
secuencia de valores numricos.
Count Devuelve
0.
Devuelve el
nmero de valores
NULL de la
secuencia.
Devuelve el nmero de
valores NULL y NO NULL de
la secuencia.
Devuelve el nmero de
elementos de la secuencia.
Max Devuelve
NULL.
Devuelve NULL. Devuelve el valor NO NULL
mximo de una secuencia.
Devuelve el valor mximo de
una secuencia.
Min Devuelve
NULL.
Devuelve NULL. Devuelve el valor NO NULL
mnimo de una secuencia.
Devuelve el valor mnimo de
una secuencia.
Sum Devuelve
NULL.
Devuelve NULL. Devuelve la suma del valor
NO NULL de una secuencia.
Calcula la suma de una
secuencia de valores numricos.


Mtodos de tipos
Los dos mtodos de LINQ que se encargan de la conversin y prueba de tipos se admiten en el contexto de
Entity Framework. Esto significa que los nicos tipos admitidos son los que se asignan al tipo de Entity
Framework adecuado. Los mtodos de tipos son Convert y OfType.
OfType se admite para los tipos de entidad. Convert se admite para los tipos primitivos de EDM. Los
mtodos de C# is y as tambin se admiten.

Mtodos de paginacin
Las operaciones de paginacin devuelven un nico elemento especfico de una secuencia. Los mtodos de
elementos son ElementAt, First,FirstOrDefault, Last, LastOrDefault, Single, Skip, Take y TakeWhile.
Varios mtodos de paginacin no se admiten debido a la incapacidad de asignar funciones al origen de datos
o a la falta de ordenacin implcita de los conjuntos en el origen de datos. Los mtodos que devuelven un
valor predeterminado estn restringidos a los tipos primitivos de EDM y los tipos de referencia con valores
predeterminados NULL. Los mtodos de paginacin que se ejecuten en una secuencia vaca devolvern
NULL.

Expresiones en consultas de LINQ to Entities
Una expresin es un fragmento de cdigo que se puede evaluar como un valor, objeto, mtodo o espacio de
nombres nico. Las expresiones pueden contener un valor literal, una llamada a un mtodo, un operador y
sus operandos, o un nombre simple. Los nombres simples pueden ser el nombre de una variable, el
miembro de un tipo, el parmetro de un mtodo, un espacio de nombres o un tipo. Las expresiones pueden
utilizar operadores que a su vez utilizan otras expresiones como parmetros, o llamadas a mtodos cuyos
parmetros son a su vez otras llamadas a mtodos. Por consiguiente, las expresiones pueden ser de muy
simples a muy complejas.
En las consultas de LINQ to Entities, las expresiones pueden contener cualquier elemento permitido por los
tipos dentro del espacio de nombres System.Linq.Expressions, incluyndose las expresiones lambda. Las
expresiones que se pueden utilizar en las consultas de LINQ to Entities son un supraconjunto de las
expresiones que se pueden utilizar para consultar Entity Framework.Las expresiones que forman parte de
consultas en Entity Framework estn limitadas por las operaciones admitidas porObjectQuery<T> y el origen
de datos subyacente.
En el ejemplo siguiente, la comparacin en la clusula Where es una expresin:

Using AWEntities As New AdventureWorksEntities()
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 387 | P g i n a

Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 _
Select s.SalesOrderID

Console.WriteLine("Sales order info:")
For Each orderNumber As Integer In salesInfo
Console.WriteLine("Order number: " & orderNumber)
Next
End Using

Nota
Las estructuras de un lenguaje concreto, como uncheckedde C#, no tienen ningn significado en LINQ to
Entities.

Expresiones constantes
Una expresin constante consta de un valor constante. Los valores constantes se convierten directamente
en expresiones constantes de rbol de comandos, sin sufrir ninguna traduccin en el cliente. Esto incluye a
las expresiones que producen un valor constante. Por consiguiente, debe esperarse el comportamiento del
origen de datos para todas las expresiones que impliquen constantes. Esto puede producir un
comportamiento que difiera del comportamiento de CLR.
En el ejemplo siguiente se muestra una expresin constante que se evala en el servidor.

Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 + 3 _
Select s.SalesOrderNumber

Console.WriteLine("Sales order numbers:")
For Each orderNum As String In salesInfo
Console.WriteLine(orderNum)
Next
End Using

LINQ to Entities no permite utilizar una clase de usuario como constante. Sin embargo, una referencia de
propiedad en una clase de usuario se considera una constante, se convertir en una expresin constante de
rbol de comandos y se ejecutar en el origen de datos.

Expresiones de comparacin
Una expresin de comparacin comprueba si un valor constante, el valor de una propiedad o el resultado de
un mtodo es igual, no igual, superior a o inferior a otro valor. Si una comparacin determinada no es vlida
para LINQ to Entities, se produce una excepcin. Todas las comparaciones, tanto implcitas como explcitas,
requieren que todos los componentes sean comparables en el origen de datos. Las expresiones de
comparacin se utilizan frecuentemente en clusulas Where para restringir los resultados de las consultas.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 388 | P g i n a

El ejemplo siguiente en la sintaxis de expresiones de consulta muestra los resultados de una consulta en los
que el nmero de pedido de ventas es igual a "SO43663":

Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.SalesOrderNumber = "SO43663" _
Select s

Console.WriteLine("Sales info-")
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales ID: " & sale.SalesOrderID)
Console.WriteLine("Ship date: " & sale.ShipDate)
Next
End Using

El ejemplo siguiente en la sintaxis de consultas basadas en mtodos muestra los resultados de una consulta
en los que el nmero de pedido de ventas es igual a "SO43663":

Using AWEntities As New AdventureWorksEntities()
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.SalesOrderNumber = "SO43663") _
.Select(Function(s) s)

Console.WriteLine("Sales info-")
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales ID: " & sale.SalesOrderID)
Console.WriteLine("Ship date: " & sale.ShipDate)
Next
End Using

El ejemplo siguiente en la sintaxis de expresiones de consulta muestra los resultados de informacin de
pedidos de ventas en los que la fecha de envo es igual al 8 de julio de 2001:

Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.ShipDate = dt _
Select s

Console.WriteLine("Orders shipped on August 7, 2001:")
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales ID: " & sale.SalesOrderID)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine()
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 389 | P g i n a

Next
End Using

El ejemplo siguiente en la sintaxis de consultas basadas en mtodos muestra los resultados de informacin
de pedidos de ventas en los que la fecha de envo es igual al 8 de julio de 2001:

Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime(2001, 7, 8)

Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.ShipDate = dt) _
.Select(Function(s) s)

Console.WriteLine("Orders shipped on August 7, 2001:")
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales ID: " & sale.SalesOrderID)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine()
Next
End Using

Las expresiones que producen una constante se convierten en el servidor y no se intenta realizar
evaluaciones locales. En el ejemplo siguiente se utiliza una expresin en la clusula Where que produce una
constante.

Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 + 3 _
Select s.SalesOrderNumber

Console.WriteLine("Sales order numbers:")
For Each orderNum As String In salesInfo
Console.WriteLine(orderNum)
Next
End Using

LINQ to Entities no permite utilizar una clase de usuario como constante. Sin embargo, una referencia de
propiedad en una clase de usuario se considera una constante, se convertir en una expresin constante de
rbol de comandos y se ejecutar en el origen de datos.

Class AClass
Public ID As Integer
End Class

Using AWEntities As New AdventureWorksEntities()
Dim aClass As AClass = New aClass()
aClass.ID = 43663
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 390 | P g i n a


Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.SalesOrderID = aClass.ID _
Select s

Console.WriteLine("Order info-")
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales order number: " & sale.SalesOrderNumber)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine()
Next
End Using

No se admiten los mtodos cuyos resultados producen expresiones constantes. El ejemplo siguiente
contiene un mtodo en la clusula Whereque devuelve una constante. Este ejemplo producir una
excepcin en el tiempo de ejecucin.

Using AWEntities As New AdventureWorksEntities()
Dim aClass2 As AClass2 = New aClass2()

Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

' Throws a NotSupportedException.
Dim salesInfo = _
From s In sales _
Where s.SalesOrderID = aClass2.returnInt() _
Select s

Console.WriteLine("Order info-")
Try
For Each sale As SalesOrderHeader In salesInfo
Console.WriteLine("Sales order number: " & sale.SalesOrderNumber)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine()
Next
Catch ex As NotSupportedException
Console.WriteLine("Exception: {0}", ex.Message)
End Try
End Using

Comparaciones de NULL
Un valor null en el origen de datos indica que el valor es desconocido. En las consultas de LINQ to Entities,
puede comprobar si ha valores NULL para que ciertos clculos o comparaciones slo se realicen en las filas
que tengan datos vlidos, que no sean NULL. Sin embargo, la semntica de NULL de CLR puede diferir de la
del origen de datos. La mayora de las bases de datos utilizan una versin de lgica con tres valores para
tratar las comparaciones de NULL. Es decir, una comparacin con un valor NULL no se evala
como true o false, se evala como unknown. A menudo sta es una implementacin de los valores NULL
ANSI, pero este no es siempre el caso.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 391 | P g i n a

De forma predeterminada en SQL Server, al comparar si un valor NULL es igual a un valor NULL, se devuelve
un valor NULL. En el ejemplo siguiente, las filas donde Region es NULL se excluyen del conjunto de
resultados y la instruccin Transact-SQL devolvera 0 filas.

-- Find orders and customers with no regions.
SELECT a.[CustomerID]
FROM [Northwind].[dbo].[Customers] a
JOIN [Northwind].[dbo].[Orders] b ON a.Region = b.ShipRegion
WHERE a.Region IS Null

Esto es muy diferente de la semntica de NULL de CLR, donde la comparacin de igualdad entre valores
NULL devuelve true.
La consulta de LINQ siguiente se expresa en el CLR, pero se ejecuta en el origen de datos. Dado que no hay
ninguna garanta de que la semntica de CLR se vaya a cumplir en el origen de datos, el comportamiento
esperado es indeterminado.

Using NwEntities As New NorthwindEntities()
Dim customers As ObjectQuery(Of Customers) = NwEntities.Customers
Dim orders As ObjectQuery(Of Orders) = NwEntities.Orders

Dim query = _
From c In customers _
Join o In orders On c.Region Equals o.ShipRegion _
Where c.Region = Nothing _
Select c.CustomerID

For Each customerID In query
Console.WriteLine("Customer ID: ", customerID)
Next
End Using

Selectores de clave
Un selector de clave es una funcin utilizada en los operadores de consulta estndar para extraer una clave
de un elemento. En la funcin de selector de clave, una expresin se puede comparar con una constante. La
semntica de NULL del CLR se exhibe si una expresin se compara con una constante NULL o si se comparan
dos constantes NULL. La semntica de NULL del almacn se exhibe si se comparan dos columnas con valores
NULL del origen de datos. Los selectores de clave se encuentran en muchos de los operadores de consulta
estndar de agrupamiento y ordenacin, comoGroupBy, y se utilizan para seleccionar las claves por las que
ordenar o agrupar los resultados de una consulta.

Propiedad NULL en un objeto NULL
En el Entity Framework, las propiedades de un objeto NULL son NULL. Al intentar hacer referencia a una
propiedad de un objeto NULL en el CLR, recibir NullReferenceException. Cuando una consulta de LINQ
implica una propiedad de un objeto NULL, puede provocarse un comportamiento incoherente.
Por ejemplo, en la consulta siguiente, la conversin a NewProduct se efecta en el nivel de rbol de
comandos, que podra hacer que la propiedadIntroduced sea NULL. Si la base de datos defini las
comparaciones de NULL de modo que la comparacin de DateTime se evale como true, la fila se incluir.

Using AWEntities As New AdventureWorksEntities()
Dim dt As DateTime = New DateTime()
Dim query = AWEntities.Product _
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 392 | P g i n a

.Where(Function(p) _
((DirectCast(p, NewProduct)).Introduced > dt)) _
.Select(Function(x) x)
End Using

Expresiones de inicializacin
Una expresin de inicializacin inicializa un objeto nuevo. Se admiten la mayora de las expresiones de
inicializacin, incluso las de Visual Basic 9.0 y C# 3.0. Los tipos siguientes pueden ser inicializados y devueltos
por una consulta de LINQ to Entities:
Una coleccin de cero o ms objetos entidad con tipo o una proyeccin de tipos complejos en el
modelo EDM.
Tipos de CRL admitidos por el modelo EDM.
Colecciones insertadas.
Tipos annimos.
En el ejemplo siguiente se muestra la inicializacin de tipos annimos en sintaxis de expresiones de consulta:

Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 _
Select New With {s.SalesOrderNumber, s.TotalDue}

Console.WriteLine("Sales order numbers:")
For Each sale In salesInfo
Console.WriteLine("Order number: " & sale.SalesOrderNumber)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine("")
Next
End Using

El ejemplo siguiente de sintaxis de la consulta basada en mtodos muestra la inicializacin de los tipos
annimos:

Using AWEntities As New AdventureWorksEntities()

Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.TotalDue >= 200) _
.Select(Function(s) New With {s.SalesOrderNumber, s.TotalDue})

Console.WriteLine("Sales order numbers:")
For Each sale In salesInfo
Console.WriteLine("Order number: " & sale.SalesOrderNumber)
Console.WriteLine("Total due: " & sale.TotalDue)
Console.WriteLine("")
Next
End Using

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 393 | P g i n a

Tambin se admite la inicializacin de clases definidas por el usuario. Se admite el modelo de inicializacin
de C# 3.0 y Visual Basic 9.0, y se supone que el captador y el establecedor de la propiedad son simtricos. El
ejemplo siguiente de la sintaxis de las expresiones de consulta muestra una clase personalizada que se
inicializa en la consulta:

Class MyOrder
Public SalesOrderNumber As String
Public ShipDate As DateTime?
End Class

Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader

Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 _
Select New MyOrder With _
{ _
.SalesOrderNumber = s.SalesOrderNumber, _
.ShipDate = s.ShipDate _
}

Console.WriteLine("Sales order info:")
For Each order As MyOrder In salesInfo
Console.WriteLine("Order number: " & order.SalesOrderNumber)
Console.WriteLine("Ship date: " & order.ShipDate)
Console.WriteLine("")
Next
End Using

El ejemplo siguiente de la sintaxis de las consultas basadas en mtodos muestra una clase personalizada que
se inicializa en la consulta:

Using AWEntities As New AdventureWorksEntities()

Dim salesInfo As IQueryable(Of MyOrder) = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.TotalDue >= 200) _
.Select(Function(s) New MyOrder With _
{ _
.SalesOrderNumber = s.SalesOrderNumber, _
.ShipDate = s.ShipDate _
})

Console.WriteLine("Sales order info:")
For Each order As MyOrder In salesInfo
Console.WriteLine("Order number: " & order.SalesOrderNumber)
Console.WriteLine("Ship date: " & order.ShipDate)
Console.WriteLine("")
Next
End Using
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 394 | P g i n a


Propiedades de navegacin
Las propiedades de navegacin de Entity Data Model son propiedades de acceso directo que se emplean
para localizar las entidades en los extremos de una asociacin. Las propiedades de navegacin permiten
navegar de una entidad a otra, o de una entidad a entidades relacionadas a travs de un conjunto de
asociaciones. Las propiedades de navegacin se pueden utilizar en las consultas de Entity SQL y en las
consultas de LINQ to Entities. Permiten el acceso a las entidades relacionadas sin necesidad de realizar una
operacin JOIN.
En el ejemplo siguiente de la sintaxis de consulta basada en mtodos se usa el mtodo SelectMany para
obtener todos los pedidos de los contactos cuyo apellido es "Zhou". La propiedad de
navegacinContact.SalesOrderHeader se utiliza para obtener la coleccin de objetosSalesOrderHeader para
cada contacto.

Using AWEntities As New AdventureWorksEntities
Dim ordersQuery = AWEntities.Contact _
.Where(Function(c) c.LastName = "Zhou") _
.SelectMany(Function(o) o.SalesOrderHeader)

For Each order In ordersQuery
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
order.SalesOrderID, order.OrderDate, order.TotalDue)
Next
End Using

Las propiedades de navegacin tambin aparecen en las instancias de las entidades en el CLR, lo que
permite cargar las entidades relacionadas llamando al mtodo Load. Al cargar una entidad en el CLR, debera
cargar explcitamente las propiedades de navegacin antes de tener acceso a los miembros de la entidad.
Cargar estas propiedades evita viajes de ida y vuelta (round trip) inesperados al origen de datos. Sin
embargo, las consultas de LINQ to Entities se evalan en el origen de datos, por lo que no son necesarios
viajes de ida y vuelta adicionales y la propiedad acta como marcador de posicin para una expresin de
navegacin ms compleja.
Puede cargar explcitamente las propiedades de navegacin dentro de un bucle foreach/For
Each si MultipleActiveResultSets=True se establece en la cadena de conexin. Si la cadena de conexin
contieneMultipleActiveResultSets=False, la llamada al mtodo Load en el ejemplo siguiente generar
una EntityCommandExecutionException.

Using AWEntities As New AdventureWorksEntities()
Dim contacts = _
AWEntities.Contact _
.Where(Function(c) c.LastName = "Johnson") _
.Select(Function(c) c)

Try
For Each contact As Contact In contacts

Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName)

' Throws a EntityCommandExecutionException if
' MultipleActiveResultSets is set to False in the
' connection string.
contact.SalesOrderHeader.Load()
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 395 | P g i n a


For Each order As SalesOrderHeader In contact.SalesOrderHeader
Console.WriteLine("Order ID: {0}", order.SalesOrderID)
Next

Next
Catch ex As EntityCommandExecutionException

Console.WriteLine(ex.InnerException)
End Try
End Using

Asignacin de funciones y llamadas a mtodos de CLR
Entity Framework proporciona un conjunto de funciones cannicas que implementan funcionalidad que es
comn en muchos sistemas de base de datos, como la manipulacin de cadenas y las funciones
matemticas. Esto permite a los programadores dirigir sus conocimientos a un amplio intervalo de sistemas
de base de datos. Cuando se invocan desde una tecnologa de creacin de consultas, como LINQ to Entities,
estas funciones cannicas se convierten en la correspondiente funcin de almacenamiento correcta para ser
utilizada por el proveedor. Esto permite que las llamadas a funciones se expresen de forma comn en los
orgenes de datos, proporcionando una experiencia de consultas coherente en los citados orgenes de datos.
Los operadores bit a bit AND, OR, NOT y XOR tambin se asignan a funciones cannicas cuando el operando
es un tipo numrico. En el caso de operandos booleanos, los operadores bit a bit AND, OR, NOT y XOR
calculan las operaciones lgicas AND, OR, NOT y XOR de sus operandos.
En los escenarios LINQ, las consultas en Entity Framework implican la asignacin de ciertos mtodos de CLR
a mtodos en el origen de datos subyacente a travs de funciones cannicas. Las llamadas a mtodos en una
consulta en LINQ to Entities no asignadas explcitamente a una funcin cannica harn que se lance una
excepcin NotSupportedException en tiempo de ejecucin..
En el ejemplo siguiente se consultan direcciones ubicadas en Algiers Drive. La llamada al
mtodo Contains en la consulta se asigna a la funcin cannica IndexOf.

Using AWEntities As New AdventureWorksEntities()
Dim addresses As ObjectQuery(Of Address) = AWEntities.Address

Dim query = _
From address In addresses _
Where address.AddressLine1.Contains("Algiers Dr.") _
Select address

For Each algiersAddress As Address In query
Console.WriteLine("Address 1: " + algiersAddress.AddressLine1)
Next

End Using

Terminologa de Entity Framework
En este tema se definen los trminos a los que se suele hacer referencia en la documentacin de Entity
Framework. Se proporcionan vnculos a temas importantes donde hay informacin adicional.

Trmino Definicin
alias Atributo del elemento Schema en los esquemas de SSDL y CSDL que se puede sustituir
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 396 | P g i n a

Trmino Definicin
para el espacio de nombres completo con el fin de acortar las referencias a elementos
en el esquema.
asociacin Definicin de una relacin entre tipos de entidad.
conjunto de
asociaciones
Contenedor lgico para instancias de asociaciones del mismo tipo.
tipo base Tipo en Entity Data Model del que uno o varios tipos derivados heredan algunas
propiedades.
rbol de
comandos
Representacin comn de programacin de todas las consultas de Entity Framework
compuestas por una o varias expresiones.
tipo complejo Clase de .NET Framework que representa una propiedad compleja tal y como se
define en el modelo conceptual. Los tipos complejos permiten que las propiedades
escalares se organicen dentro de entidades. Los objetos complejos son instancias de
los tipos complejos.
ComplexType Especificacin de un tipo de datos que representa una propiedad no escalar de un
tipo de entidad que no tiene una propiedad clave.
modelo
conceptual
Especificacin abstracta de los tipos de entidad, tipos complejos, asociaciones,
contenedores de entidad, conjuntos de entidades y conjuntos de asociaciones en el
dominio de una aplicacin integrado en un Entity Data Model. El modelo conceptual
se define en CSDL en el archivo del modelo conceptual.
archivo de
modelo
conceptual
Archivo XML que constituye el modelo conceptual, expresado en el CSDL. Este archivo
tiene la extensin .csdl.
lenguaje de
definicin de
esquemas
conceptuales
(CSDL)
Lenguaje basado en XML que se utiliza para definir los tipos de entidad, asociaciones,
contenedores de entidad, conjuntos de entidades y conjuntos de asociaciones de un
modelo conceptual.
restriccin Restringe los valores posibles de una propiedad y permite asegurarse de que un valor
es vlido.
contenedor Agrupacin lgica de conjuntos de entidades y de asociaciones.
simultaneidad Proceso que permite a varios usuarios tener acceso y cambiar los mismos datos al
mismo tiempo. Entity Framework implementa un modelo de simultaneidad optimista.
enlace de datos Proceso o mtodo para configurar los controles en un formulario o pgina web con el
objeto de obtener datos de los objetos de entidad o escribir datos en ellos.
direccin Hace referencia a la naturaleza asimtrica de algunas asociaciones. La direccin se
especifica con los atributos ToRoley FromRole de un elemento ReferentialConstraint
o NavigationProperty en un esquema.
extremo Entidad participante en una asociacin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 397 | P g i n a

Trmino Definicin
entidad Concepto en el dominio de una aplicacin partir del que se define un tipo de datos.
EntityClient System.Data.EntityClient es un proveedor de datos de ADO.NET independiente del
almacenamiento que contiene clases
comoEntityConnection, EntityCommand y EntityDataReader. Se usa con Entity SQL y
conecta el almacenamiento con proveedores de datos ADO.NET concretos,
como SqlClient.
contenedor de
entidades
Especifica los conjuntos de entidades y los conjuntos de asociaciones que se
implementarn en un espacio de nombres especificado.
Entity Data Model
(EDM)
Modelo que permite representar los datos de una aplicacin como un conjunto de
entidades y relaciones que estn asignadas a un origen de datos definido.
Archivo de Entity
Data Model
Designer
Archivo XML que encapsula el modelo conceptual, el modelo de almacenamiento y la
asignacin que componen un EDM. Este archivo tambin contiene informacin que
usa el Entity Data Model Designer. Este archivo tiene la extensin .edmx.
Entity Framework Conjunto de tecnologas que admite el desarrollo de aplicaciones de software
orientadas a datos permitiendo a los programadores trabajar con modelos
conceptuales que se asignan a los esquemas lgicos en los orgenes de datos.
conjunto de
entidades
Contenedor lgico de entidades de un tipo determinado y sus subtipos. Los conjuntos
de entidades se asignan a las tablas en una base de datos.
Entity SQL Dialecto de SQL independiente del almacenamiento que trabaja directamente con
esquemas de entidades conceptuales y admite caractersticas de Entity Data Model,
como la herencia y las relaciones.
tipo de entidad Clase de .NET Framework que representa una entidad segn se define en el modelo
conceptual. Los tipos de entidad pueden tener propiedades de navegacin, escalares
y complejas. Los objetos son instancias de tipos de entidad.
EntityType Especificacin de un tipo de datos que incluye una clave y un conjunto con nombre de
propiedades y representa un elemento de nivel superior en un modelo conceptual o
modelo de almacenamiento.
key Atributo de un tipo de entidad que especifica qu propiedad o conjunto de
propiedades se utiliza para identificar instancias nicas del tipo de entidad. Se
representa en el nivel de objetos mediante la clase EntityKey.
LINQ to Entities Sintaxis de consulta que define un conjunto de operadores de consulta que permiten
expresar las operaciones de proyeccin, filtro y exploracin transversal de una
manera directa y declarativa en Visual C# y Visual Basic.
asignacin Especificacin de las correspondencias entre los elementos de un modelo conceptual
y los elementos de un modelo de almacenamiento.
archivo de
asignacin
Archivo XML que corresponde a la asignacin entre el modelo conceptual y el modelo
de almacenamiento, expresado en MSL. Este archivo tiene la extensin .msl.
lenguaje de
especificacin de
Lenguaje basado en XML que se utiliza para asignar los elementos definidos en un
modelo conceptual a los elementos de un modelo de almacenamiento.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 398 | P g i n a

Trmino Definicin
asignaciones
(MSL)
jerarqua de tipos
de metadatos
Conjunto de clases que permiten interactuar con los metadatos del EDM. Esta
jerarqua de tipos proporciona funciones de programacin para representar los
mismos conceptos que se explican en Especificaciones del EDM.
rea de trabajo
de metadatos
Clase que representa el componente del servicio de tiempo de ejecucin de
metadatos que permite recuperar los metadatos.
funciones de
modificacin
Procedimientos almacenados que se utilizan para insertar, actualizar y eliminar los
datos que estn en el origen de datos. Estas funciones se utilizan en lugar de los
comandos generados por Entity Framework. El elemento Function define las
funciones de modificacin en el modelo de almacenamiento. El
elementoModificationFunctionMapping asigna estas funciones de modificacin a las
operaciones de eliminacin, insercin y actualizacin con las entidades que se definen
en el modelo conceptual.
multiplicidad Nmero de entidades que pueden existir en cada lado de una relacin, tal y como
define una asociacin. Se conoce tambin como cardinalidad.
multiple entity
sets per type
Capacidad de definir un tipo de entidad en ms de un conjunto de entidades.
propiedad de
navegacin
Propiedad de un tipo de entidad que representa una relacin con otro tipo de
entidad, tal y como se define mediante una asociacin. Las propiedades de
navegacin se utilizan para devolver los objetos relacionados
como EntityCollection oEntityReference, dependiendo de la multiplicidad en el otro
extremo de la asociacin.

ruta de consulta Representacin de cadena de una ruta de acceso que especifica qu objetos
relacionados devolver cuando se ejecuta una consulta de objeto. Una ruta de
consulta se define llamando al mtodo Include en ObjectQuery.
contexto del
objeto
Representa el contenedor de la entidad definido en el modelo conceptual. Contiene
una conexin al origen de datos subyacente y proporciona servicios como el
seguimiento de cambios y la resolucin de identidad. Una instancia de la
clase ObjectContextrepresenta un contexto del objeto..
consulta de
objeto
Consulta ejecutada con un EDM dentro de un contexto del objeto que devuelve los
datos en forma de objetos..
asignacin objeto
relacional
Tcnica para transformar los datos de una base de datos relacional en tipos de datos
que se pueden utilizar en aplicaciones de software orientadas a objetos.
Servicios de objeto usa el EDM para proporcionar dicho comportamiento objeto
relacional exponiendo las entidades en el modelo conceptual como tipos de entidad
en una aplicacin de Entity Framework..
Servicios de
objeto
Servicios que proporciona el Entity Framework y que permiten al cdigo de la
aplicacin funcionar en entidades como los objetos de .NET Framework.
restriccin Restriccin que se define en un EDM y que indica que una entidad tiene una relacin
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 399 | P g i n a

Trmino Definicin
referencial dependiente con otra entidad. Esta restriccin significa que una instancia de una
entidad dependiente no puede existir sin una instancia correspondiente de la entidad
principal.
relacin Conexin lgica entre entidades.
rol Nombre dado a cada End de una asociacin para clarificar la semntica de la relacin.
propiedad escalar Propiedad de una entidad que se asigna a un nico campo en el modelo de
almacenamiento.
ipo simple Tipo primitivo que se utiliza para definir las propiedades en el modelo conceptual.
entidad dividida Tipo de entidad que est asignada a dos tipos independientes en el modelo de
almacenamiento.
modelo de
almacenamiento
Definicin del modelo lgico de datos en un origen de datos admitido, como una base
de datos relacional. El modelo de almacenamiento se define en el SSDL en el archivo
de modelo de almacenamiento.
archivo de
modelo de
almacenamiento
Archivo XML que constituye el modelo de almacenamiento, expresado en SSDL. Este
archivo tiene la extensin .ssdl.
lenguaje de
definicin de
esquemas de
almacenamiento
(SSDL)
Lenguaje basado en XML que se utiliza para definir los tipos de entidad, asociaciones,
contenedores de entidad, conjuntos de entidades y conjuntos de asociaciones de un
modelo de almacenamiento que, con frecuencia, corresponden a un esquema de
base de datos.
tabla por
jerarqua
Mtodo para modelar una jerarqua de tipos en una base de datos que incluye los
atributos de todos los tipos de la jerarqua en una tabla.
tabla por tipo Mtodo para modelar una jerarqua de tipos en una base de datos que utiliza varias
tablas con relaciones uno a uno para modelar los diversos tipos.

Crystal Reports
Crystal Reports para Visual Studio proporciona una forma muy productiva de crear e integrar informes
interactivos con calidad de presentacin en las aplicaciones para Windows, Web o servicios Web XML. El
diseador grfico incrustado permite crear fcilmente informes desde el IDE y minimiza la codificacin
intensiva asociada al desarrollo de informes.
Esta ayuda proporciona informacin que va desde los conceptos bsicos hasta las instrucciones detalladas
acerca de cmo crear aplicaciones Web o para Windows en Crystal Reports Basic para Visual Studio 2008.

Nuevas caractersticas en Crystal Reports Basic para Visual Studio 2008
Crystal Reports Basic para Visual Studio 2008 es una actualizacin de Crystal Reports para Visual Studio
2005. En esta versin se han agregado varias caractersticas nuevas.
La implementacin ClickOnce admite el atributo HomeSite y ahora est disponible para equipos de
64 bits.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 400 | P g i n a

Crystal Reports Basic para Visual Studio 2008 admite Windows Vista y Windows Server 2008.
Compatibilidad con .NET 3.5 Framework.

Por qu se utiliza una herramienta de creacin de informes?
No es difcil recuperar datos. Podra escribir cdigo para recorrer los conjuntos de registros e imprimirlos en
la aplicacin para Windows o Web. En .NET Framework, podra ir ms lejos y enlazar esos datos a un control
como Repeater, DataList o DataGrid.
Pero de momento, estos datos en el formato de un informe real son bastante ms complejos. Las funciones
de los informes, como consolidaciones, totales de varios niveles, grficos y formatos condicionales son
complejas y lentas de programar.
Crystal Reports facilita la creacin y distribucin de informes complejos.

Qu es Crystal Reports?
Crystal Reports ha formado parte de Visual Studio desde 1993, y ahora es el estndar de elaboracin de
informes de Visual Studio. Se incluye en todas las copias de Visual Studio Professional y se integra
directamente en el entorno de desarrollo.
Crystal Reports para Visual Studio incorpora la posibilidad de crear contenido interactivo con calidad de
presentacin al entorno de Windows. Con Crystal Reports para Visual Studio, puede crear informes
complejos y profesionales en un programa basado en GUI. Despus puede conectar el informe a casi todos
los orgenes de base de datos, as como a datos proxy, como un conjunto de resultados (por ejemplo, un
ADO.NET DataSet). Los asistentes del diseador de GUI le permiten establecer fcilmente los criterios de
formato, agrupamiento y grficos, etc.
Puede almacenar el informe en una aplicacin Web o para Windows, con uno de los controles de visores de
Crystal Reports para Visual Studio. La presentacin de informes, tanto en clientes Windows como en HTML
3.2 4.0, es muy interactiva y proporciona funciones como la profundizacin en grficos, la exploracin de
informes y la bsqueda de texto.
Crystal Reports para Visual Studio incluye un SDK extenso. Puede utilizarlo para interactuar con el informe
mediante programacin en tiempo de ejecucin, usando uno de los cuatro modelos de objetos posibles:
CrystalReportViewer, el modelo de objetos ms sencillo.
ReportDocument, el modelo de objetos ms completo.
ReportClientDocument, el modelo de objetos ms completo. Este modelo de objetos est
disponibles con Crystal Reports 2008 o con un servidor RAS.
InfoObject, un modelo de objetos muy eficaz para la programacin y configuracin de informes en
el marco de Crystal Reports Server o BusinessObjects Enterprise.

Nota
Los modelos de objetos CrystalReportViewer y ReportDocument estn disponibles con todas las versiones
de Crystal Reports para Visual Studio. Los modelos de objetos ReportClientDocument e InfoObject
requieren una licencia actualizada.

Los informes se pueden relacionar con el proyecto de Visual Studio de muchas formas:
Incruste los informes directamente en el proyecto.
Obtenga acceso a ellos externamente, desde un directorio de archivos.
Obtenga acceso a ellos como servicio Web de informes desde un servidor remoto.
Conctelos como Crystal Services.
Mediante la actualizacin a Crystal Reports Server puede tener acceso a ellos a travs del servidor
RAS.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 401 | P g i n a

Mediante la actualizacin a BusinessObjects Enterprise, puede tener acceso a ellos a travs de Page
Server o del servidor RAS incluidos en el marco de BusinessObjects Enterprise.
A continuacin se describe un ejemplo de cmo deben funcionar los informes en un proyecto de Visual
Studio:
Crystal Reports se utiliza para disear un informe que permita a los usuarios profundizar en un grfico y
filtrar informacin, en funcin de las necesidades. Ese informe se ha incluido en un proyecto ASP.NET y
despus se ha mostrado en un formulario Web con un controlCrystalReportViewer que est enlazado a ese
informe. Se puede interactuar con el informe mediante el uso del modelo de objetos ReportDocument.

Qu es Crystal Reports para Visual Studio?
Crystal Reports para Visual Studio es la versin personalizada de Crystal Reports disponible como parte de la
instalacin predeterminada en la mayora de las versiones de Microsoft Visual Studio.
Esta edicin especial de Crystal Reports, que se incluye de serie en Visual Studio 2002 y posterior, permite a
los desarrolladores crear informes interactivos para sitios Web y aplicaciones de cliente inteligente que se
pueden escalar para adaptarse a las necesidades de los usuarios finales.
Crystal Reports para Visual Studio proporciona a los desarrolladores una forma rpida y productiva de crear
e integrar informes con calidad de presentacin en las aplicaciones, sin salir del entorno de desarrollo de
Visual Studio conocido.
Si hace una actualizacin a la versin completa de Crystal Reports, tendr acceso a funciones adicionales y
un componente actualizado de creacin de informes dentro de Visual Studio.
Crystal Reports para Visual Studio incluye muchas de las funciones de Crystal Reports Developer. Estas
incluyen la posibilidad de crear informes, conectarlos a un control CrystalReportViewer e interactuar
mediante programacin con estos informes utilizando el SDK de Crystal Reports.

Crystal Reports Designer incrustado
Crystal Reports Designer incrustado crea o modifica informes. Est formado por una interfaz grfica para el
usuario para el diseo de informes WYSIWYG, y una serie de asistentes que simplifican la conectividad, la
ordenacin, el agrupamiento de los datos y los problemas de diseo de informes complejos adicionales.
Crystal Reports Developer incluye una versin mejorada de Designer incrustado que permite crear potentes
informes y aplicaciones de elaboracin de informes. El diseador incrustado que se incluye con Crystal
Reports para Visual Studio contiene muchas de las funciones de Crystal Reports Developer.

Funcin de Crystal Reports Designer incrustado en la arquitectura
Crystal Reports Designer incrustado se incluye en la descripcin de la arquitectura porque su funcin es
fundamental para Crystal Reports para Visual Studio: crea los archivos de informe que se mostrarn. Sin
embargo, la funcin de Crystal Reports incrustado es una funcin en tiempo de diseo. La funcin que
implica la presentacin e interaccin con los informes, que se produce en tiempo de ejecucin, pertenece al
SDK de Crystal Reports. Por lo tanto, aunque el diseador incrustado crea los informes que se utilizan en la
arquitectura, no forma parte de la propia arquitectura.

Controles de visores de informes
Crystal Reports para Visual Studio incluye controles de formulario para la presentacin de informes. Cada
control encapsula compleja informacin de diseo de informe en un objeto GUI dentro del cuadro de
herramientas.
Se incluyen dos controles:

El control CrystalReportViewer. Este control muestra el informe con un diseo basado en pginas,
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 402 | P g i n a

con la posibilidad de moverse entre ellas.
Control CrystalReportPartsViewer. El control muestra informacin de resumen de informe en una
pequea ventana al estilo de un portal, con la posibilidad de
profundizar en el informe a travs de una serie de partes vinculadas.

Cada control se usa para mostrar un informe arrastrando y soltando el control desde el Cuadro de
herramientas en el formulario Web o para Windows y, a continuacin, asignando la propiedad ReportSource
de dicho control a un informe.

Modelo de objetos CrystalReportViewer
La clase CrystalReportViewer tiene dos funciones:
En el formulario Web Forms o Windows Forms, CrystalReportViewer se expone como control .NET
que se puede agregar al formulario para mostrar el informe.
En el cdigo subyacente del formulario Web Forms o Windows Forms, la clase CrystalReportViewer
proporciona el modelo de objetos ms sencillo del SDK. Exploraremos ese modelo de objeto ms
adelante en esta seccin.
La forma ms sencilla de colocar un informe en un formulario Web Forms o Windows Forms es agregar el
control CrystalReportViewer al formulario y, a continuacin, en la clase de cdigo subyacente, asignar la ruta
del informe como cadena a la propiedad ReportSource de la clase CrystalReportViewer.
Si asigna la ruta del informe directamente al control (en vez de colocar el informe dentro de un modelo de
objetos ms complejo, como ReportDocument o ReportClientDocument), restringe la interfaz a slo el
modelo de objetos ms sencillo: CrystalReportView

Diagrama del modelo de objetos CrystalReportViewer
Estos diagramas muestran las relaciones dentro del modelo de objetos CrystalReportViewer.
CrystalReportViewer tiene dos diagramas de modelo de objetos, ya que se vuelve a utilizar el mismo nombre
de control y de clase (y, por tanto, su modelo de objetos subyacente) en aplicaciones para Windows y Web.
Por consiguiente, el modelo de objetos CrystalReportViewer se repite (con variaciones mnimas) en dos
espacios de nombres distintos.
La versin de Windows de CrystalReportViewer incluye las clases y los eventos principales compartidos por
las versiones de Windows y Web del modelo de objetos.

La versin Web del modelo de objetos CrystalReportViewer incluye las mismas clases y eventos que la
versin de Windows, pero, adems, tiene eventos relacionados con la forma en que se carga la pgina ASPX.

Modelo de objetos ReportDocument
La clase ReportDocument proporciona un modelo de objetos ms completo para el SDK que el modelo de
objetos CrystalReportViewer.
La clase ReportDocument forma parte del espacio de nombresCrystalDecisions.CrystalReports.Engine.
Funciona como puerta de enlace a un conjunto de clases del espacio de nombres Engine, que proporciona
ms herramientas para la manipulacin de un informe mediante programacin.
El modelo de objetos ReportDocument
En la seccin anterior, aprendi a trabajar con el modelo de objetos CrystalReportViewerbsico asignando la
cadena de la ruta de un informe directamente al controlCrystalReportViewer.
En el siguiente nivel del modelo de objetos, utilice el modelo de objetos ReportDocumentpara encapsular el
informe dentro de una instancia de ReportDocument, antes de que se asigne al control. De esta forma, se
proporciona acceso al modelo de objetos ms complejo y eficaz de ReportDocument.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 403 | P g i n a


Nota
Puesto que ambos modelos de objetos estn implicados en este proceso (CrystalReportViewer para
cargar y mostrar el informe, ReportDocument para encapsularlo y manipularlo), es fcil confundir las
funciones de ambos modelos de objetos. Una vez que el modelo de objetos ReportDocument se ha
utilizado para encapsular el informe, se debe restringir cualquier manipulacin del informe a ese modelo.
Si trata de utilizar las propiedades y los mtodos de CrystalReportViewerpara manipular el informe, los
dos modelos de objetos entran en conflicto y genera un comportamiento inesperado.
Una vez que ha introducido un modelo de objetos adicional, restrinja el uso del cdigo
de CrystalReportViewer slo para establecer propiedades de presentacin.

ReportDocument y ReportClientDocument (RAS)
En Crystal Reports 9, ambos modelos de objetos eran totalmente independientes. En Crystal Reports 10 y
versiones posteriores, se ha eliminado la separacin bsica entre los modelos de objetos. El modelo de
objetos ReportDocument ahora funciona como proxy para (un subconjunto de) funcionalidad desde el
modelo de objetos ReportClientDocument.
Crystal Reports 2008 permite acceder a una version limitada del modelo de
objetosReportClientDocument mediante la propiedad ReportDocument.ReportClientDocument.

Creacin de Informes
Acceder al Crystal Reports Designer incrustado
Si hace doble clic en un objeto de informe Crystal existente en el proyecto o aade un nuevo objeto de
informe a dicho proyecto, el Crystal Reports Designer incrustado se inicia automticamente.
Para crear un nuevo informe
1. En Explorador de soluciones, haga clic con el botn derecho en el nombre de proyecto en negrita
para mostrar el men contextual.
2. Seleccione Agregar y haga clic en Agregar nuevo elemento.
3. En el cuadro de dilogo Agregar nuevo elemento, seleccione Crystal Report en el rea Plantillas.
Haga clic en Agregar.
4. En la Galera de Crystal Reports, seleccione una de las siguientes opciones:
Usar asistente de informes: gua al usuario a travs del proceso de creacin de informes y
aade las selecciones que realice al Crystal Reports Designer incrustado.
Como informe en blanco: abre el Crystal Reports Designer incrustado.
A partir de un informe existente: crea un nuevo informe con el mismo diseo que otro
especificado por el usuario.
Nota La Galera contiene varios asistentes que guan al usuario en la creacin de tipos especficos de
informes. Puede que desee crear los primeros informes mediante los asistentes para poder decidir el
mtodo de creacin de informes que se adapte mejor a sus necesidades.
5. Haga clic en Aceptar.
Si decide utilizar el asistente de Informes, aparecer el cuadro de dilogo Asistente para la creacin de
informes estndar con la pantalla Datos activa. Seleccione los datos necesarios para cada carpeta, trabaje
con la interfaz en pantalla del Asistente para la creacin de informes y haga clic en Finalizar para obtener
acceso al Crystal Reports Designer incrustado y al informe.
Guardar el informe
En el men Archivo, haga clic en Guardar.

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 404 | P g i n a

Diseo del Crystal Report Designer incrustado
Al crear un informe, la mayor parte del trabajo de diseo del informe se realiza en el Crystal Reports
Designer incrustado. El diseador se divide en dos secciones de informe etiquetadas. Puede colocar objetos
de informe, como campos de base de datos, de frmula, de parmetro y de totales acumulados, en la
seccin en que desee que aparezcan.
El Crystal Reports Designer incrustado proporciona un entorno eficaz para el diseo de informes ya que,
aunque se trabaja con los datos de una base de datos, se trabaja en un entorno de diseo en el que no es
necesario actualizar los datos al modificar el informe. Al incluir un campo en el informe, el Crystal Reports
Designer incrustado utiliza un marco para identificarlo en la ficha en lugar de recuperar los datos. De este
modo, puede aadir y eliminar campos y otros objetos, moverlos y definir frmulas complejas sin tener que
esperar a que se actualicen los datos.
En el siguiente diagrama, el Crystal Reports Designer incrustado muestra un informe de ventas mundiales
como ejemplo.
El Explorador de campos, y las barras de herramientas de Crystal Reports (los botones de la barra de
herramientas) forman parte de Crystal Reports Designer incrustado. Las secciones de informe de Crystal
Reports Designer incrustado muestran los objetos de informe incluidos en cada seccin.
En el siguiente ejemplo, el "Encabezado del informe a" contiene el logotipo de la compaa y el "Encabezado
del informe c" contiene un grfico que muestra las ventas del ltimo ao por pases. El logotipo y el grfico
son objetos de informe que se han arrastrado a la pgina de diseo y a los que se ha dado formato. Debido a
que el logotipo y el grfico forman parte del encabezado del informe, slo aparecern una vez en el informe
final.
El Explorador de campos muestra todos los campos disponibles para este informe. Las marcas de
verificacin indican los campos que estn insertados actualmente en el informe.

Informacin general de las secciones de los informes
En el caso de un informe nuevo, el Crystal Reports Designer incrustado se divide en cinco secciones de
informe. Puede elegir entre crear secciones adicionales u ocultar algunas secciones.
Encabezado de informe
Encabezado de pgina
Detalles
Pie de informe
Pie de pgina
Secciones de informes adicionales
Los datos que aparecen en el informe finalizado dependen de las opciones de diseo: en particular, los datos
del informe varan segn las secciones en las que desee insertar objetos de informe concretos. Por ejemplo,
si inserta un objeto de grfico en la seccin Encabezado de informe, el grfico slo aparecer una vez al
principio del informe y resumir los datos que contiene el informe. Adems, si un objeto de grfico se aade
a la seccin Encabezado de grupo, aparecer un grfico individual al principio de cada grupo de datos y slo
se resumirn los datos relacionados con dicho grupo.
Encabezado de informe
Los objetos que se colocan en el Encabezado de informe se imprimen una vez, al principio del informe.
Esta seccin normalmente contiene el ttulo del informe y la informacin adicional que desea que aparezca
slo al principio del mismo.
Los grficos y las tablas cruzadas de esta seccin contienen los datos de todo el informe.
Las frmulas de esta seccin se evalan una vez, al principio del informe.

Encabezado de pgina
Los objetos incluidos en la seccin Encabezado de pgina se imprimen al principio de cada nueva pgina.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 405 | P g i n a

Esta seccin suele contener la informacin que desea que aparezca en la parte superior de cada pgina.
Puede incluir campos como el nombre de un captulo, de un documento o informacin similar. Tambin se
puede utilizar para incluir ttulos de campos, que aparecern como etiquetas sobre las columnas con los
datos de los campos del informe.
En esta seccin no se pueden incluir grficos ni tablas cruzadas.
Las frmulas que se colocan en esta seccin se evalan una vez por pgina, al principio de cada
pgina nueva.

Detalles
Los objetos colocados en la seccin Detalles se imprimen con cada registro nuevo.
Esta seccin contiene los datos del cuerpo del informe. Aqu aparece la mayor parte de los datos del
informe. Cuando se ejecuta el informe, la seccin Detalles se vuelve a imprimir para cada registro. Por
ejemplo, si aade un objeto de base de datos con 100 registros a la seccin Detalles, el informe imprimir
100 secciones de detalle individuales en tiempo de ejecucin.
En esta seccin no se pueden incluir grficos ni tablas cruzadas.
Las frmulas incluidas aqu se evalan una vez por cada registro.

Pie de informe
Los objetos que se colocan en el Pie de informe se imprimen una vez, al final del informe.
Esta seccin se utiliza para incluir la informacin que desea que slo aparezca una vez al final del informe,
como los totales generales.
Los grficos y las tablas cruzadas de esta seccin contienen los datos de todo el informe.
Las frmulas de esta seccin se evalan una vez, al final del informe.

Pie de pgina
Los objetos colocados en la seccin Pie de pgina se imprimen en la parte inferior de cada pgina.
Normalmente, esta seccin refleja el nmero de pgina, as como cualquier otra informacin que desee que
aparezca en la parte inferior de las pginas.
En esta seccin no se pueden incluir grficos ni tablas cruzadas.
Las frmulas de esta seccin se evalan una vez por pgina, al final de cada pgina.

Secciones de informes adicionales
Si se aade un grupo, resumen o subtotal al informe, el programa crea dos secciones adicionales: el
Encabezado de grupo y el Pie de pgina de grupo.
Al aadir un grupo, resumen o subtotal, la seccin Encabezado de grupo aparece directamente en la parte
superior de la seccin Detalles y la seccin Pie de pgina de grupo aparece directamente en la parte inferior
de dicha seccin. Al igual que en las secciones de informes originales, cada una de estas secciones aadidas
ms recientemente puede contener una o varias subsecciones. De forma predeterminada, cada una
contiene una sola seccin.

Encabezado de grupo
Los objetos incluidos en la seccin Encabezado de grupo se imprimen al principio de cada nuevo grupo.
Normalmente, esta seccin incluye el campo de nombre del grupo y tambin se puede utilizar para mostrar
grficos y tablas cruzadas que incluyan datos especficos del grupo. La seccin Encabezado de grupo se
imprime una vez al principio de cada grupo.
Los grficos y las tablas cruzadas que se incluyen en esta seccin slo contienen datos del grupo.
Las frmulas de esta seccin se evalan una vez por cada grupo, al principio de cada grupo.

Pie de pgina de grupo
Los objetos incluidos en la seccin Pie de pgina de grupo se imprimen al final de cada grupo.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 406 | P g i n a

Normalmente, esta seccin incluye el valor de resumen, si lo hay, y se puede utilizar para mostrar grficos y
tablas cruzadas. La seccin Pie de pgina de grupo se imprime una vez al final de cada grupo.
Los grficos y las tablas cruzadas que se incluyen en esta seccin slo contienen datos del grupo.
Las frmulas ubicadas en esta seccin se evalan una vez por cada grupo, al final del grupo.

Caractersticas de la seccin de informes
Un informe consiste de varias secciones, incluyendo el Encabezado del informe, el Encabezado de pgina, el
Encabezado de grupo, Detalles, Pie de grupo, Pie de pgina y Pie del informe.
Cada seccin del informe est hecha de un serie de lneas. Cuando un objeto base-texto es ubicado en una
seccin, es ubicado de tal manera que su base se ajuste a una lnea de la seccin. Luego, la altura de la lnea
es ajustada por el controlador de la impresora de tal manera que sea suficiente para albergar el objeto.
En resumen, la altura de una lnea est determinada por el objeto basado en texto con tamao de fuente
ms grande, ubicado en esa lnea.
Si se ubica otro objeto basado en texto en la misma lnea con un tamao de fuente mayor que el
del primer objeto, la altura de la lnea se extiende para albergar el segundo objeto.
Si se ubica otro objeto basado en texto en la misma lnea y con tamao de fuente an mayor, la
altura de la lnea se aumenta nuevamente para albergar el tercer objeto.
A medida que se agregan objetos base-texto al informe, ya sea en la misma o en diferentes secciones, la
altura de la lnea se ajusta para acomodar las diferentes fuentes. Debido a que el espaciado vertical es
determinado por el controlador de la impresora, se hace difcil crear informes diseados para formas
preimpresas cuando stas van a ser reproducidas en diferentes entornos.
Se recomienda que siga esta directrices cuando disee informes:
Mantenga el mismo tamao de fuente.
asegrese de imprimir formularios preimpresos en la misma mquina.

Dar formato a secciones de informe
Para dar formato a una seccin de un informe
Haga clic con el botn secundario en el Crystal Reports Designer incrustado, seleccione Informe y
haga clic enAsistente de Seccin.
Para cambiar los mrgenes de las pginas
Haga clic con el botn secundario en Crystal Reports Designer incrustado, seleccioneDiseo y haga
clic en Configurar pgina.
Para activar o desactivar la regla
Haga clic con el botn secundario en Crystal Reports Designer incrustado, seleccioneDiseo y haga
clic en Regla.
Para activar o desactivar la cuadrcula de diseo
Haga clic con el botn secundario en Crystal Reports Designer incrustado, seleccioneDiseo y haga
clic en Cuadrcula.

Explorador de campos
Utilice el Explorador de campos para insertar, modificar o eliminar campos del informe Crystal.
El Explorador de campos, que forma parte de Crystal Reports Designer incrustado, muestra una vista de
rbol de los Campos de base de datos y de los Campos especiales que se encuentran disponibles para
aadirlos al informe. El Explorador de campos tambin muestra los campos Frmula, Parmetro, Nombre
del grupo, Total acumulado, Enunciado SQL y los Campos no enlazados que haya definido para utilizarlos en
el informe.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 407 | P g i n a

El Explorador de campos muestra marcas de verificacin junto a los campos que se han agregado
directamente al informe y junto a los que se ha hecho referencia o se han utilizado en otros campos y
clculos; como los campos de frmula, grupos, totales acumulados y resmenes.
Para ver el Explorador de campos desde el Crystal Reports Designer incrustado
1. En el men Crystal Reports, haga clic en Explorador de campos.
2. Haga clic con el botn secundario en cualquier campo para ver las opciones de men.
Nota Existe un modo alternativo para acceder al explorador de campos. Haga clic en el men Vista,
elija Otras ventanas y haga clic en Esquema del documento.

Barras de herramientas de Crystal Reports
Al abrir el Crystal Reports Designer incrustado para crear o modificar un informe, aparecen
automticamente dos barras de herramientas de Crystal Reports en la barra de herramientas:

Crystal Reports: barra de herramientas Principal
Esta barra de herramientas contiene accesos directos a los cuadros de dilogo Explorador de campos,
Asistente de Seleccin, Asistente de ordenacin de grupos, Asistente de ordenacin de registros y Editor de
Formato. Esta barra de herramientas tambin contiene opciones bsicas de formato para los objetos de
texto y una lista desplegable Zoom.

Crystal Reports: barra de herramientas Insertar
Esta barra de herramientas contiene accesos directos a los cuadros de dilogo Insertar resumen, Insertar
grupo, Insertar subinforme y Asistente de diagramas. Adems, tambin incluye un acceso directo para
agregar una imagen a un informe.

Para mostrar/ocultar las barras de herramientas de Crystal Reports
En el men Vista, seleccione Barras de herramientas y haga clic en Crystal Reports:
Insertar o Crystal Reports: Principal.

Men Crystal Reports
Al abrir el Crystal Reports Designer incrustado para crear o modificar un informe, aparecen
automticamente dos barras de herramientas de Crystal Reports en la barra de herramientas de Visual
Studio IDE:
El men Crystal Reports tiene las mismas opciones que el men que aparece al hacer clic con el botn
secundario en Crystal Reports Designer incrustado.
Este men contiene los submens Insertar, Base de datos, Informe y Diseo. Adems existen opciones para
cerrar el subinforme, mostrar una vista previa del informe, configurar la clase de la hoja de estilo en cascada
(CSS), ir a la vista anterior o siguiente del informe, buscar actualizaciones y registrar Crystal Reports.
El submen Insertar se usa para insertar objetos en el informe, por ejemplo campos de base de datos,
objetos de texto, resmenes, grupos, secciones, tablas cruzadas, subinformes, grficos e imgenes.
El submen Base de datos tiene las siguientes opciones:
Asistente de base de datos
Establecer ubicacin del origen de datos
Conectar o desconectar servidor (vea Explorador de datos)
Comprobar base de datos
Comprobar en cada impresin
Mostrar consulta SQL
El submen Informe tiene las siguientes opciones:
Asistente de Seleccin
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 408 | P g i n a

Frmula de seleccin (vea Editor de Frmulas)
Taller de frmulas
Asistente de Seccin
Asistente de grupos
Asistente de ordenacin de grupo
Opciones de agrupamiento jerrquico
Asistente de ordenacin de registros
Opciones del informe
Establecer fecha y hora de impresin
Informacin de resumen (vea Propiedades del documento)
El submen Diseo tiene las siguientes opciones:
Configurar impresora
Configurar pgina
Especificaciones predeterminadas
Regla
Cuadrcula
Explorador de campos

Ficha Vista previa
La ficha Vista previa muestra una versin de slo lectura del informe Crystal (archivo .rpt) mediante el uso
del visor de informes ActiveX. El informe no se puede modificar en la ventana de vista previa.
El informe actual se muestra con sus datos predeterminados. Si hay un fallo de conexin a base de datos o si
el informe utiliza datos obtenidos de la aplicacin (por ejemplo, DataSet o colecciones de objetos), se
generan datos temporalmente.
Nota La ficha Vista previa no est disponible en Crystal Reports Designer para Visual Studio .NET 2002 o
2003 incrustado.
La ficha Vista previa se encuentra en la parte inferior de Crystal Reports Designer incrustado, con el nombre,
"Vista previa del informe principal".

Orgenes de datos admitidos
Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se
escribe para controlar un tipo de base de datos especfico o la tecnologa de acceso a bases de datos.
Crystal Reports puede obtener acceso a los siguientes orgenes de datos y generar informes a partir de ellos:
Cualquier base de datos con un controlador ODBC
Cualquier base de datos con un proveedor OLEDB
Bases de datos de Microsoft Access
Libros de Microsoft Excel
ADO.NET (conjuntos de datos)
Tablas de datos ADO.NET
Conjuntos de registros ADO
Conjuntos de registros CDO
IDataReader
Colecciones de objetos
Conjuntos de registros DAO
Conjuntos de registros RDO
XML en SQL Server 2005
Tipos definidos por el usuario en SQL Server 2005
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 409 | P g i n a


Elaboracin de informes a partir de conjuntos de datos ADO.NET
Crystal Reports admite informes que tienen acceso a conjuntos de datos ADO.NET.
Un objeto de conjunto de datos ADO.NET es un grupo de clases de conjuntos de datos creado en memoria.
Puede crear un conjunto de datos de ADO.NET a partir de varios orgenes de datos (entre ellos se incluyen
bases de datos de Access, Oracle y SQL Server) con Visual Studio ADO.NET Dataset Designer. ADO.NET
Dataset Designer proporciona una vista grfica de la base de datos con las tablas, los campos y los tipos
correspondientes. Puede arrastrar tablas desde el Explorador de servidores a un archivo de esquema en la
ficha Esquema del diseador.

Generar ADO.NET Datasets
Un objeto de conjunto de datos ADO.NET proporciona una descripcin de datos partir de la cual puede
agregar tablas al informe Crystal. El Asistente de base de datos se utiliza en Crystal Reports Designer
incrustado para agregar tablas desde el objeto del conjunto de datos ADO.NET.
Puede llamar al Asistente de base de datos cuando vaya acrear un informe nuevo con un Asistente para la
creacin de informes. O bien, para acceder al Asistente de base de datos desde un informe que ya se ha
definido con ADO.NET, haga clic con el botn secundario en el Crystal Reports Designer incrustado,
seleccione Base de datos y, a continuacin, haga clic en Asistente de base de datos.

Ver informes con conjuntos de datos de ADO.NET
Un conjunto de datos creado con ADO.NET Dataset Designer slo contiene la descripcin de los datos y no
los datos reales. As pues, al trabajar con un informe conectado a dicho objeto de conjunto de datos, no
puede examinar datos de campo en el Crystal Reports Designer incrustado en tiempo de diseo.
Para que el informe muestre los datos reales en tiempo de ejecucin, primeramente debe insertar los datos
en el objeto de conjunto de datos mediante el modelo de objetos ADO.NET y, a continuacin, transferir el
conjunto de datos lleno al motor de informes mediante el modelo de objetos Report Engine. Tambin debe
enlazar el informe por el objeto de informe en el archivo de origen correspondiente para el formulario Web
o de Windows.

Seleccionar una base de datos
Para modificar el origen de datos de un informe, haga clic con el botn secundario en Crystal Reports
Designer incrustado, elija Base de datos y seleccione Asistente de base de datos en el men contextual.
A continuacin, puede manipular un origen de datos enlazando las tablas de nuevo, agregando y quitando
una base de datos, configurando una ubicacin para la base de datos, comprobando una base de datos y
convirtindola a un controlador de base de datos distinto.

Para seleccionar una base de datos
1. Haga clic con el botn secundario en Campos de base de datos en el Explorador de campos y, a
continuacin, en Asistente de base de datos.
Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic enExplorador de campos.
1. En el cuadro de dilogo Asistente de base de datos, examine las carpetas para buscar las tablas del
origen de datos.
2. Seleccione las tablas que contienen los datos sobre los que desea realizar el informe y haga clic
en Agregar.
Sugerencia En vez de seleccionar las tablas, haga doble clic en el nodo Agregar comando para
escribir una consulta SQL.
3. En la ficha Vnculos, haga clic en Vincular para vincular automticamente las tablas de base de
datos, o bien haga clic y arrastre el campo de base de datos de una tabla a otra para crear un
vnculo manual.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 410 | P g i n a

4. Si ha vinculado ms de dos tablas, haga clic enOrdenar vnculos para organizar los vnculos en el
orden de procesamiento deseado.
5. Haga clic en Aceptar.
Las tablas de la base de datos seleccionadas aparecen en Campos de base de datos, en el Explorador de
campos.

Definir tablas virtuales basadas en un comando/consulta SQL
Si la base de datos que utiliza admite un lenguaje de consulta como SQL, puede escribir su propio comando
que se representar en Crystal Reports como objeto Table. Esto permite a los usuarios con ms experiencia
en bases de datos obtener un control total sobre el procesamiento de datos que se transmite al servidor de
la base de datos. Un usuario con experiencia puede escribir un comando muy optimizado que puede reducir
considerablemente el tamao del conjunto de datos que se devuelve desde el servidor.
Puede escribir su propio comando utilizando el nodo Agregar comando del Asistente de base de datos para
crear una tabla virtual que represente los resultados del procesamiento del comando.
Cuando se utiliza una tabla virtual creada como un Comando, Crystal Reports no altera la sintaxis del SQL
enviado al servidor (es decir, no agrega automticamente caracteres de escape o comillas). Este
comportamiento tambin se aplica a los parmetros utilizados en Comandos. Por lo tanto, se deben agregar
manualmente los caracteres de escape y comillas necesarios para el controlador de bases de datos.

Para crear su propio objeto de comando
1. Haga clic con el botn secundario en Campos de base de datos en el Explorador de campos y, a
continuacin, en Asistente de base de datos.
Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic en Explorador de campos.
2. En el cuadro de dilogo Asistente de base de datos, examine las carpetas para buscar el origen de
datos.
3. En el origen de datos, haga doble clic en el nodoAgregar comando.
4. En el cuadro de dilogo Agregar comando al informe, escriba una consulta o comando adecuados
para el origen de datos que ha abierto.
Por ejemplo:

SELECT
Customer.`Customer ID`,
Customer.`Customer Name`,
Customer.`Last Year's Sales`,
Customer.`Region`,
Customer.`Country`,
Orders.`Order Amount`,
Orders.`Customer ID`,
Orders.`Order Date`
FROM
Customer Customer INNER JOIN Orders Orders ON
Customer.`Customer ID` = Orders.`Customer ID`
WHERE
(Customer.`Country` = 'USA' OR
Customer.`Country` = 'Canada') AND
Customer.`Last Year's Sales` < 10000.
ORDER BY
Customer.`Country` ASC,
Customer.`Region` ASC

ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 411 | P g i n a

5. Haga clic en Aceptar.
Regresar al Crystal Reports Designer incrustado. En el Explorador de campos, en Campos de base de datos,
aparece una tabla Comando que muestra los campos de base de datos especificados.
Nota De forma predeterminada, el comando se denomina "comando". Puede cambiar el alias
seleccionando y presionando F2.

Para editar un objeto de comando
1. En el rea Tablas seleccionadas del Asistente de base de datos, seleccione el comando que desee
editar.
2. Haga clic con el botn secundario en el comando y seleccione la opcin Editar comando del men
contextual.
3. Efecte los cambios que desee en el cuadro de dilogo Modificar comando y haga clic
en Aceptar cuando finalice.
Puede crear un campo de parmetro mientras est trabajando en el cuadro de dilogo Agregar
comando al informe o en el cuadro de dilogo Modificar comando.

Para crear un parmetro para un objeto de comando
1. En el rea Lista de parmetros del cuadro de dilogo Agregar comando al informe o Modificar
comando, haga clic en Crear.
2. En el cuadro de dilogo Parmetro de comando, especifique la informacin siguiente en los campos
proporcionados:
Nombre del parmetro
Especifique el nombre con el que desee identificar el parmetro.
Texto de confirmacin
Ingrese el texto que desee que aparezca cuando el programa le enve un mensaje.
Tipo de valor
Ingrese el tipo de datos del campo de parmetro.
Valor predeterminado
Ingrese el valor que desea que use el programa si usted no entrega un valor nuevo.
3. Haga clic en Aceptar.
El parmetro se agrega a la Lista de parmetros. Puede modificarlo o eliminarlo volviendo al cuadro de
dilogo Modificar comando.

Para agregar un parmetro a un objeto de comando
1. Coloque el cursor en el texto de la consulta.
2. Haga doble clic en el nombre del parmetro en la Lista de parmetros.
El parmetro se agrega en la posicin del cursor. Debe ser similar a ste:
WHERE
Customer.`Country` = '{?CountryParam}'
Si desea cambiar el campo de parmetro creado, vaya al Explorador de campos y seleccinelo en el nodo
Campos de parmetro.

Cambiar la ubicacin del origen de datos
Utilice el comando Establecer Ubicacin para indicar el nuevo nombre o ubicacin de las tablas que estn
activas en un informe. Este comando es especialmente til en el caso de que alguien le enve un informe que
utilice una base de datos con una ubicacin diferente en el sistema, o bien en el caso de que haya cambiado
el directorio o la ubicacin del disco de una base de datos. Adems, este comando puede ser utilizado para
cambiar la fuente de datos ODBC usada por un informe. Por ejemplo, puede convertir automticamente un
origen de datos de acceso directo a un origen de datos ODBC usando el comando Establecer Ubicacin.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 412 | P g i n a

El procedimiento es el mismo tanto si sustituye todas las tablas de un origen de datos concreto por las tablas
del mismo nombre de otro origen de datos, o bien si sustituye una tabla determinada por otra.

Para cambiar la ubicacin de origen de datos
1. Haga clic con el botn secundario en el Crystal Reports Designer incrustado, seleccione Base de
datos y haga clic en Establecer ubicacin del origen de datos.
2. De la lista de Origen de datos actual, elija la tabla de origen de datos desde la que desea realizar el
cambio.
3. En la lista Reemplazar con, busque el nuevo origen de datos.
4. Seleccione la tabla en la que desea efectuar el cambio.
5. Haga clic en Actualizar.
6. Haga clic en Cerrar una vez haya cambiado todas las tablas que desee modificar; de lo contrario,
repita estos pasos para las tablas o los orgenes de datos que no haya modificado.

Vincular tablas de bases de datos
Usted vincula las tablas de manera que los registros de una de ellas coincidan con los registros relacionados
de otra. Al vincular, se utiliza un campo que es comn a ambas tablas. Crystal Reports usa el vnculo para
hacer coincidir registros de una tabla con los de otra. Por ejemplo, si activa una tabla de Pedidos y una de
Clientes, vincula las tablas para que cada pedido (de la tabla Pedidos) pueda coincidir con el cliente (de la
tabla Clientes) que hizo el pedido. En este ejemplo, el vnculo asegura que los datos en cada fila del informe
se refieran al mismo pedido.
Use la ficha de vnculos del cuadro de dilogo Asistente de base de datos para vincular las tablas de bases de
datos. La forma ms sencilla de vincular tablas es seleccionando Vnculo automtico. La vinculacin
automtica selecciona automticamente los vnculos de las tablas basndose en los campos comunes de las
tablas o en los campos indexados; si su base de datos admite campos indexados.
Asimismo, puede vincular manualmente tablas de bases de datos. No existen limitaciones para la estructura
de vinculacin, siempre y cuando se encuentren dentro de los lmites definidos por el proveedor de base de
datos. Si tiene varios vnculos, puede utilizar la funcin Ordenar vnculos para organizar los vnculos en el
orden de procesamiento deseado.

Para tener acceso al Asistente de base de datos
1. En el Explorador de campos, haga clic con el botn secundario en Campos de base de datos y
seleccioneAsistente de base de datos.
Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic en Explorador de campos.
2. En el cuadro de dilogo Asistente de base de datos, haga clic en la ficha Vnculos.
3. En la ficha mencionada, haga clic en Vincular para vincular automticamente las tablas de base de
datos, o bien haga clic y arrastre el campo de base de datos de una tabla a otra para crear un
vnculo manual.
4. Si tiene ms de dos tablas, haga clic en Ordenar vnculos para organizar los vnculos en el orden de
procesamiento deseado.
5. Haga clic en Aceptar.

Insertar campos de base de datos
Todos los campos de base de datos disponibles aparecen en el Explorador de campos.
Para insertar un campo
1. En el Explorador de campos, expanda Campos de base de datos para ver las tablas de la base de
datos.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 413 | P g i n a

Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic en Explorador de campos.
2. Expanda una tabla de base de datos y seleccione un campo de base de datos.
Sugerencia Una vez seleccionado un nombre de campo, puede revisar los valores de este campo
(as como el tipo y el tamao) si hace clic con el botn secundario y selecciona Examinar datos en el
men contextual. El cuadro de dilogo Examinar muestra un subconjunto de valores de campo
junto con el nombre, el tipo y la longitud del mismo.
3. Arrastre el campo seleccionado a la seccin Detalles o a cualquier otra seccin del informe. No
puede agregar varios campos al informe al mismo tiempo.
Nota Al arrastrar el campo al informe, observe el marco de objeto que se adjunta al puntero
del mouse. Este marco de objeto representa el objeto que acaba de seleccionar para la ubicacin. El
tamao del marco de objeto se aproxima a la longitud de los datos de campo.

Objetos de campo y de texto
El Crystal Reports Designer incrustado utiliza una funcionalidad de arrastrar y colocar parecida a la que se
utiliza en Visual Studio .NET, se arrastra un objeto de informe hasta el diseador (como un campo de base
de datos o un objeto de texto) y se utiliza la ventana Propiedades o el men contextual para dar formato al
objeto.

Insertar y mover campos
Para insertar campos, arrastre el campo deseado del Explorador de campos al informe. Utilice el men
contextual para insertar objetos de campo y otros objetos de informe que no estn disponibles en el
Explorador de campos (como objetos de texto, campos de resumen, grficos, subinformes, imgenes, etc.).

Para insertar campos adicionales y objetos de informe
1. Haga clic con el botn secundario en el Crystal Reports Designer incrustado, seleccione Insertar y, a
continuacin, seleccione un campo u otro objeto del submen.
2. Rellene los cuadros de dilogo necesarios, si se indica as.
3. Arrastre el marco de objeto a la seccin deseada del informe.

Seleccionar objetos de campo
Para trabajar con un campo (cambiar la fuente, moverlo, etc.), debe seleccionarlo antes. Al seleccionar un
campo, el marco de objeto muestra un control en los bordes derecho, izquierdo, superior e inferior del
mismo. Los controles indican que se ha seleccionado el campo y que, por lo tanto, est activo.
Site el puntero dentro del marco de objeto y haga clic. Aparecen los controles de ajuste de
tamao, que indican que ha seleccionado el objeto.
Aleje el puntero del marco de objeto y haga clic en un rea vaca de la ventana. Desaparecen los
controles.

Ajustar el tamao de los campos
Para ajustar el tamao de un campo
1. Seleccione el campo cuyo tamao desea ajustar.
Sugerencia Ajuste el tamao de un campo y de su encabezado al mismo tiempo haciendo clic y
pulsando la tecla CTRL simultneamente para seleccionar ambos objetos.
2. Seleccione uno de los controles de ajuste de tamao de los marcos de objeto.
3. Cuando el puntero se convierta en una flecha de ajuste de tamao, arrastre el control de tamao
para cambiar el tamao del campo.

Eliminar campos
Para eliminar un campo
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 414 | P g i n a

1. Seleccione el campo que desea eliminar.
Sugerencia Elimine un campo y su encabezado al mismo tiempo haciendo clic y pulsando la tecla
CTRL simultneamente para seleccionar ambos objetos.
2. Presione Eliminar.

Mostrar nombres de campo
Al agregar campos al informe, puede elegir el tipo de informacin de campos que desea que aparezca al
disear el informe.

Opciones de campo
Opcin de campo Explicacin Ejemplo
Mostrar nombres de campos Obtiene el nombre del campo. Id. del Cliente
PrintDate
Mostrar nombres de objetos Obtiene el nombre de objeto del
campo.
Campo1
Campo2
Mostrar smbolos de formato Obtiene el formato de salida del
campo.
5,555,555
1:23:45 AM

Para mostrar nombres de campo o cambiar la configuracin de las opciones de campo
1. Haga clic con el botn secundario en Crystal Reports Designer incrustado, seleccione Diseo y haga
clic enEspecificaciones predeterminadas.
2. En la ficha Diseo, active la casilla de verificacinMostrar nombres de campos (o cualquier otra
opcin).
3. Haga clic en Aceptar.

Agregar encabezados de campo
Al agregar un campo de base de datos a un informe, el programa agrega automticamente un encabezado
basado en el nombre de campo de la base de datos.

Para aadir un encabezado de campo
1. Haga clic con el botn secundario en el Crystal Reports Designer incrustado, seleccione Insertar y
haga clic enObjeto de texto.
Nota Tras hacer clic en Objeto de texto y moverse por el informe, aparece un marco de objeto
vaco junto al puntero delmouse.
2. Coloque el objeto de texto en la seccin Encabezado de pgina y alinee el marco de objeto sobre el
objeto de campo deseado.
3. Haga doble clic en el objeto de texto para colocar el punto de insercin en el marco de objeto.
4. Escriba el nombre del encabezado en el objeto de texto.
5. Para dar formato al encabezado, haga clic con el botn secundario en el objeto de texto y haga clic
en Formato de objeto.

Insertar objetos de texto
La funcin principal de un objeto de texto es contener texto para crear ttulos, encabezados, resmenes de
etiquetas, etc.
Sin embargo, los objetos de texto tambin pueden contener campos de base de datos; esta caracterstica
hace que los objetos de texto sean ideales para crear cartas modelo personalizadas.

Para insertar un objeto de texto
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 415 | P g i n a

1. Haga clic con el botn secundario en el Crystal Reports Designer incrustado, seleccione Insertar y
haga clic enObjeto de texto.
2. Ponga el objeto de texto donde quiere que aparezca en el informe.
Seleccione el objeto de texto y arrastre los controles para ajustar su tamao.
Arrstrelo para moverlo.
Haga doble clic dentro del objeto de texto para seleccionarlo con el fin de editar el texto.
Evite disear informes donde el espacio entre los objetos es muy estrecho. Deje espacio
para crecimiento, expandiendo el ancho de los objetos un 5% aproximadamente.
Alternativamente, podra considerar reducir el tamao de la fuente.
Si muestra el informe mediante Web Forms Viewer, utilice espacios en vez de tabulaciones
para mantener la coherencia del espaciado.

Insertar campos de base de datos en objetos de texto
Para insertar un campo de base de datos en un objeto de texto
1. Inserte un objeto de texto en su informe.
2. Haga doble clic en el objeto de texto y escriba el texto que desea que aparezca antes del primer
campo de la base de datos, si lo hay.
3. En el Explorador de campos, busque el campo de la base de datos que desea insertar en el objeto
de texto.
Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic en Explorador de campos.
4. Arrastre el campo de base de datos del Explorador de campos al objeto de texto.
Arrastre el objeto hasta que el punto de insercin se encuentre dentro del objeto de texto, en el lugar en
que desea que el campo de base de datos aparezca; a continuacin, coloque el campo en el objeto de texto.

Rotar texto
En la ficha Comn del Editor de formato, puede usar las opciones de rotacin de texto para alienar
verticalmente los campos y objetos basados en texto en su informe. Puede rotar el texto 90 o 270 grados.
Para rotar texto
1. Haga clic con el botn secundario en el objeto de informe y seleccione Formato de objeto.
2. En la ficha Comn, seleccione el grado de rotacin en el campo Rotacin de texto.
Nota
Cuando se selecciona una rotacin de texto de 90 grados, el texto se mueve 90 grados hacia la
izquierda.
Si la rotacin de texto se deja en 0 grados, a su informe se le da formato horizontalmente.
Para la rotacin de texto de objetos basados en texto, se borra automticamente la opcin Puede
Crecer en impide que se trunque el texto dentro de un objeto.
El texto con formato vertical que sobrepasa el borde de la pgina no se puede mostrar como parte
de su informe.

Insertar campos especiales
Para mostrar informacin especial (Nmero de pgina, Fecha de impresin, Comentarios de informe...)
utilice los campos disponibles en el nodo Campos especiales del Explorador de campos.
Sugerencia Para que aparezca el Explorador de campos, haga clic en el men Crystal Reports y, a
continuacin, haga clic enExplorador de campos.

Para insertar un campo especial
1. En el Explorador de campos, expanda el nodoCampos especiales.
2. Arrastre el campo necesario desde la lista Campos Especiales a la seccin del informe deseada.
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 416 | P g i n a

Nota Para los comandos Campos especiales que imprimen informacin de resumen de informes (como
nombre del autor o comentarios de informe), asegrese de que la informacin importante se introduce en
el cuadro de dilogo Propiedades del documento. Haga clic con el botn secundario en el Crystal Reports
Designer incrustado, seleccioneInforme y haga clic en Informacin de resumen.


Ordenar datos
La primera vez que se agrega un campo de base de datos al informe, aparecen los valores de datos del
campo en el orden original en el que se introdujeron en la base de datos. Al ordenar datos, puede
organizarlos en un orden concreto que le ayude a encontrar y evaluar la informacin.

Para ordenar los datos
1. Haga clic con el botn secundario en el Crystal Reports Designer incrustado para acceder al men
contextual.
2. Seleccione Informe y haga clic en Asistente de ordenacin de registros para acceder al cuadro de
dilogo del mismo nombre.
3. Resalte el campo que desee ordenar en el rea Campos disponibles.
4. Haga clic en la flecha >.
El campo seleccionado se aade a la lista Ordenar campos.
5. En el rea Direccin de ordenamiento del cuadro de dilogo, haga clic
en Ascendente o Descendente.
6. Si desea ordenar ms de un campo, destaque el segundo campo segn el cual desea ordenar los
datos y agrguelo a la lista Campos de ordenamiento.
Sugerencia El orden de los campos que aparecen en la lista Ordenar campos es el mismo en que se
van a ordenar los datos.
7. Haga clic en Aceptar cuando haya finalizado.

Descripcin de las opciones de ordenamiento
Al ordenar, el programa le pide que defina dos cosas:
El campo en el que desea que se base el ordenamiento (el campo de ordenamiento).
La direccin de ordenamiento.

Campo de ordenamiento
El campo de ordenamiento es el que determina el orden en el que aparecen los datos en el informe. Casi
cualquier campo se puede utilizar como campo de ordenamiento, incluidos los campos de frmula. El tipo
de datos de un campo determina el mtodo por el que se ordenan los datos de ese campo.
Nota No puede ordenar en campos memo ni BLOB.
Tipo de campo Ordenar
Campos de cadenas de un solo carcter Espacios en blanco
Puntuacin
Nmeros
Maysculas
Minsculas
Campo de cadenas de varios caracteres Dos letras
Tres letras
Cuatro letras, etc.
Por ejemplo:
"Juan" antecede a "bob"
ILCOMP
INSTITUTO LATINOAMERICANO DE COMPUTACION

MANUAL DE VISUAL BASIC 2008 CON SQL SERVER 2005 417 | P g i n a

Tipo de campo Ordenar
"123" antecede a "124"
" " (espacio en blanco) antecede a "aaa"
Campos de moneda Orden numrico
Campos numricos Orden numrico
Campos de fecha Orden cronolgico
Campos de fecha y hora Orden cronolgico
Valores de una misma fecha ordenados por hora
Campos de hora Orden cronolgico
Campos de comparacin booleana Valores False (0)
Valores True (1)
Valores Null Valores Null
Valores que no son Null
Direccin de ordenamiento
La direccin de ordenamiento es el orden en el que aparecen los valores una vez ordenados.

Ascendente
De menor a mayor (del 1 al 9, de la A a la Z, de False a True). El programa ordena los registros de forma
ascendente segn los valores del campo de ordenamiento seleccionado.

Descendente
De mayor a menor (del 9 al 1, de la Z a la A, de True a False). El programa ordena los registros de forma
descendente segn los valores del campo de ordenamiento seleccionado.

Dar formato a datos
Dar formato se refiere a cambios en la organizacin, presentacin y diseo de un informe, as como tambin
la apariencia de texto, objetos o secciones completas de informes.
Usted utiliza el formato para muchas cosas, incluyendo:
llamar la atencin a ciertos datos,
dar a su informe una apariencia profesional
cambiar la presentacin de fecha, nmeros, valores monetarios, Booleanos y texto (cadenas),

Para dar formato a un objeto
Haga clic con el botn secundario en el objeto y seleccione Formato de objeto.

Para dar formato a un objeto de grfico
Haga clic con el botn secundario del mouse en el grfico y seleccione Asistente de diagramas.

Para dar formato a una seccin del informe
Haga clic con el botn secundario en la seccin del informe y, a continuacin, haga clic en Asistente
de Seccin.

Das könnte Ihnen auch gefallen