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 .
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
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
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
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()
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()
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
' 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
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
' 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
' 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
' 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:
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:
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
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.
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.
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)
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.
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
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
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
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.
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
' 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.
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.
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
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
' 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
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.
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.
' 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}
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}
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()
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
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)
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)
' 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.