Está en la página 1de 57

Beginning VB 2008 Databases \ parte 4 EVENTOS

-1-

CAPITULO 17 TRABAJANDO CON EVENTOS


.
Base de cualquier tipo de aplicacin, otra ventana o web basado, diseado y
desarrollado para ayudar a los usuarios obtener funcionalidad y ejecutan sus negocios.
Los usuarios interactan con las aplicaciones mediante el uso de dispositivos de
entrada como el teclado o el ratn para brindar informacin que estas aplicaciones.
Hacer que los usuarios utilizando dispositivos de entrada se traduce en eventos que
son reconocidos y as causan ciertas acciones que se produzca. Haga clic en con un
ratn es la tarea ms comn que todos los usuarios de computadoras que hacemos, y
cada vez que haga clic, lo que debera suceder es grabado en forma de un evento o
una accin.
En este captulo, analizaremos lo siguiente:
explicacin de los eventos.
Propiedades de eventos. Diseo de eventos.
Eventos comunes planteados por los controles.
Generador de evento y de los consumidores.
Entendiendo eventos
Un evento puede definirse como una accin que un usuario puede responder a o que
pueden ser manejados en forma de cdigo. Normalmente se generan eventos por una
accin del usuario, como hacer clic en el ratn o presionar una tecla.
Eventos estn asociados con los controles que pones en formularios Windows Forms o
de formularios web forms y siempre se cdigo cualquier funcionalidad detrs de
comportamiento de un control, por ejemplo, un clic del mouse, entonces se producir
ese evento asociado y la aplicacin responder a ese evento. Ninguna solicitud puede
escribirse sin eventos. Aplicaciones basadas en eventos ejecutan cdigo en respuesta
a eventos. Cada formulario y control expone un conjunto de eventos que puede
programar predefinidos. Si se produce uno de estos eventos y hay cdigo en el
controlador de eventos asociado, se invoca el cdigo.
Eventos habilitar una clase o para notificar a otras clases o objetos cuando algo de
inters se produce. El sistema de todo evento funciona de la forma del modelo
publicador y el suscriptor. La clase que enva o provoca el evento es conocida como el
editor, y la clase que recibe (o maneja) ese evento es conocida como el suscriptor.
En una aplicacin tpica de Windows Forms de Visual Basic o aplicacin web,
suscribirse a los eventos provocados por controles, como botones, cuadros de lista,
LinkLabels, etctera. El entorno de desarrollo integrado (IDE) de Visual Studio 2008
permite examinar los eventos que publica un control y seleccione los que desea
manejar. El IDE agrega automticamente un mtodo controlador de eventos vaco y el
cdigo para suscribirse al evento.
Propiedades de eventos.
Los eventos asociados con cualquier clase u objeto trabajan de forma predefinida.
Aqu, se describen las propiedades de eventos y la forma de las obras de publicador y
el suscriptor para lograr funcionalidad:
El Editor determina cuando se provoca un evento; el suscriptor determina qu accin
en respuesta al evento.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-2-

Un evento puede tener varios suscriptores. Un suscriptor puede controlar varios


eventos de varios publicadores.
Eventos que no hay ningn suscriptor nunca se llaman.
Eventos suelen utilizarse para sealar las acciones del usuario, como los clics de
botn o selecciones de men en interfaces grficas de usuario.
Cuando un evento tiene varios suscriptores, los controladores de eventos se invoca
de forma sincrnica cuando se provoca un evento.
Pueden utilizarse para sincronizar subprocesos.
En el.Biblioteca de clases de NET Framework, los sucesos se basan en el delegado
EventHandler y la clase base de EventArgs.
Diseo de eventos.
Acontecimientos ocurren antes de su accin asociada (aplicable) o despus de que la
accin produce (post-events). Por ejemplo, cuando un usuario hace clic en un botn de
una ventana, una post-event se produce, permitiendo que los mtodos especficos de
la aplicacin a ejecutar. Un delegado de controlador de eventos se enlaza al mtodo
que se ejecute cuando el sistema provoca un evento. Se agrega el controlador de
eventos para el evento para que pueda invocar su mtodo cuando se provoca el
evento. Eventos pueden tener datos especficos del evento (por ejemplo, un evento de
pulsacin del ratn puede incluir datos sobre la ubicacin del cursor de la pantalla).
La firma del controlador de eventos observa las siguientes convenciones:
el tipo de valor devuelto es Void.
El primer parmetro es el nombre remitente y es de tipo Object. Esto representa el
objeto que provoc el evento.
El segundo parmetro es el nombre e y es de tipo EventArgs o una clase derivada de
EventArgs. Esto representa los datos especficos del evento.
El evento toma slo estos dos parmetros.
Eventos comunes planteados por los controles.
Diversos controles vienen con Visual Studio 2008, y estn construidos para lograr
funcionalidad diferente una de otra. Sin embargo, la industria ha identificado algunos
eventos que son comunes entre muchos controles, y la mayora de las aplicaciones
utilizan slo estos tipos de controles.
Tabla 17-1 describe los eventos comunes entre diversos controles.
Table 17-1. Common Events
Event
Name Description
Click
Usually occurs on left mouse click. This event can also occur with
keyboard input in the situation when the control is selected and
the Enter key is pressed
DoubleClick
Occurs when the left mouse button is clicked twice rapidly.
KeyDown
Occurs when a key is pressed and a control has the focus.
KeyPress
Occurs when a key is pressed and a control has the focus.
KeyUp
Occurs when a key is released and a control has the focus.
Mouse Click
Occurs only when a control is being clicked by the mouse.
MouseDoubleClick Occurs when a control gets double-clicked by the mouse.
MouseDown
Occurs when the mouse pointer is located over a control and the
mouse

Beginning VB 2008 Databases \ parte 4 EVENTOS


MouseUp
MouseEnter
MouseHover
MouseLeave
MouseMove
MouseWheel

-3-

button is being clicked.


Occurs when a mouse button is released over a control.
Occurs when the mouse pointer enters a control.
Occurs when the mouse pointer is positioned over a control.
Occurs when the mouse pointer rests on a control.
Occurs when the mouse rotates or moves over a control
Occurs when the user revolves the mouse wheel and a control
has the focus

Generador de evento y de los consumidores.


Es otra forma de pensar de un evento como un mecanismo que notifica el sistema
operativo Windows o la.NET Framework que algo ha ocurrido en la aplicacin, y por lo
tanto la funcionalidad lleva a cabo una vez lo recibe una respuesta de la.Plataforma
NET Framework o Windows.
La aplicacin, que tiene los controles con la funcionalidad asociada con ellos en forma
de eventos, es conocida como el consumidor y la.Plataforma NET Framework o
Windows, que recibe la solicitud para el evento que tendr lugar, es conocida como el
generador de evento.
Como ustedes saben, controles vienen con diversos tipos de eventos para servir de
funcionalidad en concreto. El segmento de cdigo conocido como el controlador de
eventos notifica a la aplicacin una vez que ha ocurrido un evento para que las
acciones adecuadas pueden implementarse detrs de este controlador de eventos.
Pruebe: Crear un controlador de eventos.
En este ejercicio, ver cmo agregar un controlador de eventos para un control en un
formulario Windows Forms.
1 Abra un nuevo proyecto de aplicacin de Windows Forms y cambiar el nombre de la
solucin y proyecto como Chapter17. Cambiar el nombre de Form1.vb a Events.vb y
tambin modificar la propiedad de texto del formulario para eventos.
2. Abra el cuadro de herramientas y arrastre un control de botn sobre al formulario.
Seleccione el control de botn, vaya a la ventana de propiedades y para el tipo de
propiedad de texto del control haga clic en Me. Pulse el botn de forma de rayo situado
en la barra de herramientas que se muestra en la ventana de propiedades, y ver toda
la lista de eventos que admite el control Button; se pueden escribir controladores de
eventos para todos estos eventos (vase figura 17 - 1). Observe tambin la informacin
sobre herramientas titulado "Eventos" bajo el botn de forma del relmpago.
3.. De forma predeterminada, el evento Click viene preseleccionado, y el rea de texto
al lado del evento est en blanco. Haga doble clic en este campo en blanco, y ver que
se ha creado un controlador de eventos button1_Click el nombre, como se muestra en
la figura 17-2.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-4-

Figure 17-1. The events list in Designer Figure 17-2. Event handler creation in
mode Designer mode
4. . Ya se ha generado el controlador de eventos button1_Click, su plantilla estar
disponible en la vista Cdigo. Cambie a la vista de cdigo del formulario Windows,
llamado Events.cs, para ver el controlador de eventos y prepararse para escribir la
funcionalidad para el evento Click (vase la figura 17-3).

Figure 17-3. Event handler in Code view


5. En el controlador de eventos button1_Click(), escriba la siguiente lnea de cdigo:
MessageBox.Show("Yo he hecho clic en ")
6. Generar y ejecutar la aplicacin, haga clic en button1, y ver un cuadro de dilogo
aparecen debido al evento que se provoca cuando se hace clic en el botn.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-5-

Cmo funciona.
El evento ms comunes que controla un botn, que tambin pasa a ser el
predeterminado, es el evento Click. En este ejemplo, escribe cdigo Flash un cuadro de
mensaje cuando un usuario hace clic en el botn en el formulario:
MessageBox.Show("Yo he hecho clic en ")
Prubelo : trabajar con eventos de movimiento del ratn.
En este ejercicio, ver los eventos asociados con los movimientos del ratn. Para
probarlos, siga estos pasos:
1.vaya al explorador de soluciones y abra el formulario de eventos en la vista Diseo.
2 Arrastre un control TextBox al formulario de Windows slo bajo el control de
button1. Seleccione el control TextBox, y ver una flecha en la frontera de la parte
superior derecha del control; Esta flecha se llama una etiqueta inteligente.
Note La funcin de etiqueta inteligente est disponible con algunos controles. El
objetivo principal de esta funcin es proporcionar a los desarrolladores especificar un
conjunto de acciones para un control en tiempo de diseo una forma generalizada.
Haga clic en el icono de un componente etiqueta inteligente permite seleccionar de una
lista de acciones disponibles desde el panel de etiquetas inteligentes.
3. Haga clic en la etiqueta inteligente, y un pequeo panel aparecer mostrando una
casilla de verificacin Habilitar la propiedad de Multi - lnea (vase la figura 17-4)
.

Figure 17-4. Smart Tag for the TextBox control


4 Haga clic en la casilla de verificacin multilnea que se muestra en la etiqueta
inteligente de emergente, y ver la altura del aumento de cuadro de texto, como se
muestra en la figura 17-5.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-6-

Figure 17-5. Setting the MultiLine property using the Smart Tag of the TextBox control
5 Ahora haga clic fuera del TextBox en el propio formulario para conservar el nuevo
tamao de que la propiedad MultiLine ha dado para el cuadro de texto por defecto. Si lo
desea, tambin puede utilizar los controles (los tres pequeos rectngulos en cada
lnea de frontera) para cambiar el tamao del control TextBox.
Tip Tambin se puede establecer la propiedad MultiLine de un cuadro de texto sin
utilizar la funcin de etiqueta inteligente. Puede establecer directamente la propiedad
MultiLine en True, que se establece en False de forma predeterminada.
6. Arrastre un control de etiqueta de la caja de herramientas para a continuacin el
cuadro de texto y establezca su propiedad AutoSize en False. Tambin, establecer
propiedad de tamao de fuente de la etiqueta a 12 y la propiedad TextAlign para
MiddleCenter. Ahora se ver el formulario de eventos como el que se muestra en la
figura 17-6.

Figure 17-6. The Events Windows Form with controls


7.Seleccione el cuadro de texto, abra la ventana Propiedades y haga clic en el botn
eventos. En la lista de eventos, haga doble clic en el rea de texto de los eventos
MouseEnter y MouseLeave. Simplemente, esto crear los controladores de eventos
para estos eventos de movimiento de ratn de dos.
8. Cambie a la vista Cdigo y agregue el siguiente cdigo para los controladores de
eventos MouseEnter y MouseLeave:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-7-

Private Sub TextBox1_MouseEnter(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles TextBox1.MouseEnter
Label1.Text = "Mouse Entr al TextBox"
End Sub
Private Sub TextBox1_MouseLeave(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles TextBox1.MouseLeave
Label1.Text = "Mouse Salio del TextBox"
End Sub
9. Vaya al men Build y haga clic en generar solucin; recibir un mensaje que indica
una generacin correcta.
10. Presione F5 para ejecutar la aplicacin. Ahora aparecer un mensaje en el control
Label dependiendo de la accin que realizar con el ratn. Mueva el puntero del mouse
sobre el cuadro de texto, y ver el mensaje que se muestra en la figura 17-7
.

Figure 17-7. Demonstrating the MouseEnter event


11. Ahora mueva el puntero fuera del cuadro de texto, y ver el mensaje que se
muestra en el control Label cambiar (ver figura 17-8).
Figure 17-8. Demonstrating the MouseLeave event
Cmo funciona.
El evento MouseEnter ocurrir cuando tome el puntero del ratn en el cuadro de texto
que tenga el foco, y esto ser reconocido por el controlador de eventos MouseEnter,
dando como resultado el mensaje apropiado que se muestra en el control de etiqueta.
Del mismo modo, cuando se mueve el puntero del ratn el foco del cuadro de texto, el
evento MouseLeave obtiene en la accin, y nuevamente se muestra el mensaje
apropiado en el control de etiqueta.
Prubelo: trabajar con el teclado KeyDown y KeyUp eventos.
En este ejercicio, trabajar con los eventos KeyDown y KeyUp, que estn asociados
con los controles que pueden recibir una entrada desde el teclado cuando un usuario
presiona o suelta la tecla Mays, Alt y Ctrl. Para probar estos eventos, siga estos
pasos:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-8-

1 Vaya al explorador de soluciones y abra el formulario Events.vb en la vista Diseo.


2. Seleccione el control de cuadro de texto, abra la ventana Propiedades y haga clic en
el botn eventos. En la lista de eventos, haga doble clic en el rea de texto del evento
KeyDown. Simplemente, esto crear un controlador de eventos para el evento
KeyDown.
3. Cambie a la vista Cdigo y agregue el cdigo siguiente al controlador de eventos
KeyDown:
Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.Alt = True Then
Label1.Text = "The Alt key has been pressed"
Else
If e.Control = True Then
Label1.Text = "The Ctrl key has been pressed"
Else
If e.Shift = True Then
Label1.Text = "The Shift key has been pressed"
End If
End If
End If
End Sub
4. Cambiar otra vez vuelva a la vista de diseo. Seleccione el control de cuadro de
texto, abra la ventana Propiedades y haga clic en el botn eventos. En la lista de
eventos, haga doble clic en el rea de texto del evento KeyUp. Simplemente, esto
crear un controlador de eventos para el evento KeyUp del teclado.
5. Cambie a la vista Cdigo y agregue el cdigo siguiente al controlador de eventos
KeyUp:
Private Sub TextBox1_KeyUp(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
If e.Alt = False Or e.Control = False Or e.Shift = False Then
Label1.Text = "The Key has been released"
End If
End Sub
6. Vaya al men Build y haga clic en generar solucin; ver un mensaje que indica una
generacin correcta.
7. Presione F5 para ejecutar la aplicacin. Mueva el puntero del mouse sobre el cuadro
de texto, haga clic una vez y, a continuacin, pulse y suelte la tecla Alt, Ctrl o tecla
Mays; ver un mensaje que se muestra en el control de etiqueta que indica qu tecla
ha pulsado

Beginning VB 2008 Databases \ parte 4 EVENTOS

-9-

Cmo funciona.
Con el evento KeyDown, reconoce que tecla en un momento determinado en el
tiempo. El condicional si declaracin le ayuda a rastrear qu tecla se ha presionado y
mostrar el mensaje en el control de etiqueta:
If e.Alt = True Then
Label1.Text = "The Alt key has been pressed"
Else
If e.Control = True Then
Label1.Text = "The Ctrl key has been pressed"
Else
If e.Shift = True Then
Label1.Text = "The Shift key has been pressed"
End If
El evento KeyUp reconoce siempre la tecla que se presion ha sido lanzada y como
resultado muestra el mensaje apropiado en el control de etiqueta:
If e.Alt = False Or e.Control = False Or e.Shift = False Then
Label1.Text = "The Key has been released"
End If
Intntelo : trabajar con eventos de pulsacin de tecla del teclado.
En este ejercicio, trabajar con el evento KeyPress. El evento KeyPress obtiene en
accin cuando el control asociado recibe la entrada en el formof una pulsacin de tecla;
Si la clave tiene un valor ASCII, se provoca el evento KeyPress. Para probar este
evento, siga estos pasos:
1. Navigate to Solution Explorer and open the Events.vb form in Design view.
2. Select the TextBox control, open the Properties window, and click the Events button.
In the events list, double-click in the text area of the KeyPress event. This will simply
create an event handler for the KeyPress event.
1. Vaya al explorador de soluciones y abra el formulario Events.vb en la vista
Diseo.
2. 2. Seleccione el control de cuadro de texto, abra la ventana Propiedades y haga
clic en el botn eventos. En la lista de eventos, haga doble clic en el rea de
texto del evento KeyPress. Simplemente, esto crear un controlador de eventos
para el evento KeyPress.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-10-

3. Cambie a la vista Cdigo y agregue el cdigo siguiente al controlador de eventos


KeyPress:
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
If Char.IsDigit(e.KeyChar) = True Then
Label1.Text = "You have pressed a Numeric key"
Else
If Char.IsLetter(e.KeyChar) = True Then
Label1.Text = "You have pressed a Letter key"
End If
End If
End Sub
4. Ahora vaya al men Build y haga clic en generar solucin; ver un mensaje que
indica una generacin correcta.
5. Presione F5 para ejecutar la aplicacin. Haga clic en el cuadro de texto y, a
continuacin, presione una tecla de nmero o letra del teclado. Ver que un
mensaje se muestra en el control de etiqueta que indica el tipo de clave
presionado.
Cmo funciona.
Con el evento KeyPress, reconoce si se ha presionado una tecla alfabtica o numrica
en un momento determinado en el tiempo. El condicional si declaracin le ayuda a
rastrear qu tecla se ha presionado y muestra el mensaje apropiado en el control de
etiqueta:
If Char.IsDigit(e.KeyChar) = True Then
Label1.Text = "You have pressed a Numeric key"
Else
If Char.IsLetter(e.KeyChar) = True Then
Label1.Text = "You have pressed a Letter key"
End If
End If
RESUMEN
En este captulo, vio cmo controlar eventos en relacin con el ratn y el teclado. En
particular, ha aprendido cmo se controlan los eventos cuando un ratn entra y sale de
un control. Tambin aprendi a un evento cada vez que un Alt, Ctrl, o se presiona la
tecla Mays.
En el captulo siguiente, examinaremos cmo trabajar con texto y datos binarios.
CAPITULO 18 TRABAJO CON TEXTOS Y DATOS BINARIOS
Algunos tipos de datos tienen formatos especiales, son muy grandes o varan en
tamao. Aqu, le mostraremos tcnicas para trabajar con texto y datos binarios.
En este captulo, analizaremos los siguientes:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-11-

Comprensin SQL Server texto y binarios tipos de datos.


Almacenamiento de imgenes en una base de datos.
Recuperar imgenes de una base de datos.
Trabajar con datos de texto.
Tambin presentaremos el T-SQL para crear tablas en la base de datos tempdb,
destinado a celebrar cualquier tabla temporal. Comenzaremos por sobre qu tipos de
datos admiten este tipo de datos.
Descripcin de texto SQL Server y tipos de datos binarios
. SQL Server proporciona los tipos CHAR, NCHAR, VARCHAR, NVARCHAR, BINARY y
VARBINARY para trabajar con texto razonablemente pequeo y datos binarios. Puede
utilizar estos datos de texto (caracteres) hasta un mximo de 8.000 bytes (4.000 bytes
para Unicode datos NCHAR y NVARCHAR, que utilice 2 bytes por carcter).
Para ms datos, llama a tipos de datos de gran valor que SQL Server 2005, debe
utilizar los tipos de datos VARCHAR(MAX), NVARCHAR(MAX), and VARBINARY(MAX)
data types. VARCHAR(MAX) paraa texto no Unicode, NVARCHAR(MAX) es de texto
Unicode y VARBINARY(MAX) es para imgenes y otros datos binarios.
Advertencia en SQL Server 2000, datos de gran tamao se almacenan utilizando los
tipos de datos NTEXT, TEXT e IMAGE. Estos tipos de datos estn en desuso y es
probable que se eliminar en el futuro. Si trabaja con aplicaciones heredadas,
considere la posibilidad de convertir a and IMAGE to NVARCHAR(MAX),
VARCHAR(MAX), and
VARBINARY(MAX), respectivamente. Sin embargo, la enumeracin de
System.Data.SqlDbType todava no incluye a miembros de estos tipos de datos, por
eso usamos VARCHAR(MAX) and VARBINARY(MAX)para tipos de datos de la
columna, pero el texto y la imagen al especificar los tipos de datos de parmetros de
comando.
Una alternativa al uso de estos tipos de datos es no almacenar los datos en la base de
datos, pero en su lugar definir una columna que contiene una ruta que apunta a donde
realmente se almacenan los datos. Esto puede ser ms eficaz para tener acceso a
grandes cantidades de datos, y puede ahorrar recursos en el servidor de base de datos
mediante la transferencia de la demanda a un servidor de archivos. Requieren una
coordinacin ms complicado y tiene el potencial para la base de datos y archivos de
datos obtener sincronizados.No utilice esta tcnica en este captulo
Tip Desde bases de datos de SSE no pueden superar los 4 GB, esta tcnica puede ser
la nica alternativa para los datos de imagen y texto muy grande.
Dentro de un programa de Visual Basic, mapa de tipos de datos binarios en una matriz
de bytes (byte[]) y mapa de tipos de datos de caracteres de cadenas o matrices de
caracteres (char[]).
Nota. El estndar SQL, MySQL, Oracle y DB2 llaman estos tipos de datos de objetos
grandes (LOBs); especficamente, son objetos binarios grandes (BLOB) y objetos de
gran tamao de carcter (CLOBs). Pero, como con muchos trminos de base de datos,
es discutible si BLOB fue originalmente un acrnimo de nada. Huelga decir siempre ha

Beginning VB 2008 Databases \ parte 4 EVENTOS

-12-

significado un tipo de datos que puede manejar grandes cantidades de datos (amorfos)
y documentacin de SQL Server utiliza BLOB como un trmino genrico para tipos de
datos y datos de gran tamao.
Almacenamiento de imgenes en una base de datos.
Vamos a empezar creando una tabla de base de datos para almacenar imgenes y, a
continuacin, cargar algunas imgenes en ella. Podr utilizar imgenes pequeas pero
utilice VARBINARY(MAX) para almacenarlos. En los ejemplos, demostraremos
utilizando imgenes en C:\Documents and Settings\Toshiba jose\mis
documentos\Visual Studio 2008\Projects\Chapter18\Image; puede utilizar la ruta de la
ubicacin donde tiene algunas imgenes en su PC.
Pruebe: Cargar datos binarios de imagen de archivos.
En este ejemplo, a escribir un programa que crea una tabla de base de datos y, a
continuacin, almacena las imgenes en ella.
1. Create a new Console Application project named Chapter18. When Solution Explorer
opens, save the solution.
1. Crear un nuevo proyecto de aplicacin de consola denominado Chapter18.
Cuando se abre el explorador de soluciones, guardar la solucin.
2.
3. Cambie el nombre del proyecto de Chapter18 a LoadImages. Cambiar el nombre
de Module1.vb a LoadImages.vb y reemplazar su cdigo con el cdigo en la lista
de 18-1.
4.
Listing 18-1. LoadImages.vb
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
'Namespace LoadImages
Friend Class LoadImages
Private imageFileLocation As String = _
"C:\Documents and Settings\Toshiba User" & _
"\My Documents\Visual Studio 2008\Projects\Chapter18\Image\"
Private imageFilePrefix As String = "painting-almirah"
'Private imageFileLocation As String = "e:\Datos\"
'Private imageFilePrefix As String = "misti"
Private numberImageFiles As Integer = 1
Private imageFileType As String = ".jpg"
Private maxImageSize As Integer = 10000
Private conn As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing
Shared Sub Main()
'Sub Main()
'Dim loader As New LoadImages()
Dim loader As New LoadImages()
Try

Beginning VB 2008 Databases \ parte 4 EVENTOS

-13-

' Open connection


loader.OpenConnection()
' Create command
loader.CreateCommand()
' Create table
loader.CreateImageTable()
' Prepare insert
loader.PrepareInsertImages()
' Insert images
Dim i As Integer
For i = 1 To loader.numberImageFiles
loader.ExecuteInsertImages(i)
Next i
Catch ex As Exception
Console.WriteLine(ex.ToString())
Finally
loader.CloseConnection()
Console.WriteLine("Press any key to continue......")
Console.ReadLine()
End Try
End Sub
Private Sub OpenConnection()
' Create connection
conn = New SqlConnection("Server=.\sqlexpress;" & _
"Integrated Security=True;Database=tempdb")
' Open connection
conn.Open()
End Sub
Private Sub CloseConnection()
' close connection
conn.Close()
Console.WriteLine("Connection Closed.")
End Sub
Private Sub CreateCommand()
cmd = New SqlCommand()
cmd.Connection = conn
End Sub
Private Sub ExecuteCommand(ByVal cmdText As String)
Dim cmdResult As Integer
cmd.CommandText = cmdText
Console.WriteLine("Executing command:")
Console.WriteLine(cmd.CommandText)
cmdResult = cmd.ExecuteNonQuery()
End Sub
Private Sub CreateImageTable()
ExecuteCommand("CREATE Table imagetable" & _
"(imagefile nvarchar(20)," & _
"imagedata varbinary(max))")
End Sub
Private Sub PrepareInsertImages()
cmd.CommandText = "" & ControlChars.CrLf & _
"insert into imagetable" & ControlChars.CrLf & _

Beginning VB 2008 Databases \ parte 4 EVENTOS

-14-

"values (@imagefile, @imagedata)" & ControlChars.CrLf


'""
cmd.Parameters.Add("@imagefile", SqlDbType.NVarChar, 20)
cmd.Parameters.Add("@imagedata", SqlDbType.Image, 1000000)
cmd.Prepare()
End Sub
Private Sub ExecuteInsertImages(ByVal _
imageFileNumber As Integer)
Dim imageFileName As String = Nothing
Dim imageImageData() As Byte = Nothing
imageFileName = imageFilePrefix + _
imageFileNumber.ToString() _
& imageFileType
imageImageData = LoadImageFile _
(imageFileName, imageFileLocation, maxImageSize)
cmd.Parameters("@imagefile").Value = imageFileName
cmd.Parameters("@imagedata").Value = imageImageData
ExecuteCommand(cmd.CommandText)
Console.WriteLine(ControlChars.NewLine)
End Sub
Private Function LoadImageFile(ByVal fileName As String, _
ByVal fileLocation As String, ByVal maxImageSize _
As Integer) As Byte()
Dim imagebytes() As Byte = Nothing
Dim fullpath As String = fileLocation & fileName
Console.WriteLine(ControlChars.NewLine)
Console.WriteLine("Loading File:")
Console.WriteLine(fullpath)
Dim fs As New FileStream(fullpath, _
FileMode.Open, FileAccess.Read)
Dim br As New BinaryReader(fs)
imagebytes = br.ReadBytes(maxImageSize)
Console.WriteLine("Imagebytes has length {0} bytes.", _
imagebytes.GetLength(0))
Console.WriteLine(ControlChars.NewLine)
Return imagebytes
End Function
End Class
'End Namespace
Note si desea volver a ejecutar el programa de LoadImages, debe asegurarse de que
usted colocar o eliminar la imagetable de la base de datos de tempdb de SQL Server;
ya est presente y su programa intentar volver a crearla, que significa que recibir una
excepcin.
3.Ejecute el programa pulsando Ctrl + F5. Debera ver salida similar a la en la figura 181. Muestra la informacin para cargar una imagen que tenemos de nuestro PC en la
ubicacin especificada, las operaciones realizadas y el tamao de cada una de la
imagen

Beginning VB 2008 Databases \ parte 4 EVENTOS

-15-

Figure 18-1. Loading image data


4.Para ver la imagen que ha insertado en la base de datos, abra SQL Server
Management Studio Express (SSMSE) y ejecuta una consulta de seleccin en el
cuadro de imagen que ha creado en la base de datos tempdb (vase la figura 18-2).

Figure 18-2. Viewing image data


Cmo funciona.
En el mtodo Main, que hacer tres cosas importantes. Llamar a un mtodo de instancia
para crear una tabla para guardar imgenes:
' Create table
loader.CreateImageTable()
Llama a un mtodo de instancia para preparar un comando (s, finalmente preparar un
comando, ya que desea ejecutar varias veces) para insertar imgenes:
' Prepare insert
loader.PrepareInsertImages()
Usted entonces bucle a travs de los archivos de imagen e insertarlos:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-16-

' Insert images


Dim i As Integer
For i = 1 To loader.numberImageFiles
loader.ExecuteInsertImages(i)
Next i
Tenga en cuenta que se conecta a tempdb, la base de datos temporal que se vuelve a
crear cuando se inicia SQL Server:
' Create connection
conn = New SqlConnection("Server=.\sqlexpress;" & _
"Integrated Security=True;Database=tempdb")
' Open connection
conn.Open()
Las tablas en esta base de datos son temporales; es decir, siempre est eliminados
cuando SQL Server se detiene. Esto es ideal para estos ejemplos y muchas otras
situaciones, pero no use tempdb de todos los datos que necesita para conservar
permanentemente.
Al crear la tabla, una simple que contiene el nombre de archivo de imagen y la imagen,
utiliza el tipo de datos VARBINARY(MAX) para la columna de imagedata:
Private Sub CreateImageTable()
ExecuteCommand("CREATE Table imagetable" & _
"(imagefile nvarchar(20)," & _
"imagedata varbinary(max))")
End Sub
Pero cuando configure el comando Insertar, utilice a los miembros de la imagen de la
enumeracin SqlDbType, ya que no hay ningn miembro para el tipo de datos
VARBINARY(MAX) . Especifique la longitud para ambos tipos de datos de longitud
variable, porque no se puede preparar un comando a menos que lo.
Private Sub PrepareInsertImages()
cmd.CommandText = "" & ControlChars.CrLf & _
"insert into imagetable" & ControlChars.CrLf & _
"values (@imagefile, @imagedata)" & ControlChars.CrLf
cmd.Parameters.Add("@imagefile", _
SqlDbType.NVarChar, 20)
cmd.Parameters.Add("@imagedata", _
SqlDbType.Image, 1000000)
cmd.Prepare()
End Sub
El mtodo ExecuteInsertImages acepta un entero para utilizar como un sufijo de
nombre de archivo de imagen, llamadas LoadImageFile para obtener una matriz de
bytes que contiene la imagen, asigna el nombre de archivo y la imagen a sus
parmetros de comando correspondiente y, a continuacin, ejecuta el comando para
insertar la imagen:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-17-

Private Sub ExecuteInsertImages(ByVal _


imageFileNumber As Integer)
Dim imageFileName As String = Nothing
Dim imageImageData() As Byte = Nothing
imageFileName = imageFilePrefix + _
imageFileNumber.ToString() _
& imageFileType
imageImageData = LoadImageFile _
(imageFileName, imageFileLocation, maxImageSize)
cmd.Parameters("@imagefile").Value = imageFileName
cmd.Parameters("@imagedata").Value = imageImageData
ExecuteCommand(cmd.CommandText)
Console.WriteLine(ControlChars.NewLine)
End Sub
La funcin LoadImageFile Lee el archivo de imagen, muestra el nombre del archivo y el
nmero de bytes del archivo y devuelve la imagen como una matriz de bytes:
Private Function LoadImageFile(ByVal fileName As String, _
ByVal fileLocation As String, ByVal maxImageSize _
As Integer) As Byte()
Dim imagebytes() As Byte = Nothing
Dim fullpath As String = fileLocation & fileName
Console.WriteLine(ControlChars.NewLine)
Console.WriteLine("Loading File:")
Console.WriteLine(fullpath)
Dim fs As New FileStream(fullpath, _
FileMode.Open, FileAccess.Read)
Dim br As New BinaryReader(fs)
imagebytes = br.ReadBytes(maxImageSize)
Console.WriteLine("Imagebytes has length {0} bytes.", _
imagebytes.GetLength(0))
Console.WriteLine(ControlChars.NewLine)
Return imagebytes
End Function
.
Volver a ejecutar el programa.
Desde siempre, el programa crea la tabla imagetable, deber hacer un ciclo (detener y
reiniciar) SSE antes de volver el programa, para eliminar la tabla por volver a crear una
base de datos tempdb vaca. Ver cmo evitar este problema en "Trabajando con datos
de texto" ms adelante en este captulo
Recuperar imgenes de una base de datos.
Ahora que ha almacenado algunas imgenes, ver cmo recuperar y mostrarlos con
una aplicacin de Windows
Pruebe: Mostrar imgenes almacenados.
Para mostrar sus imgenes almacenadas, siga estos pasos:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-18-

1. Agregar un proyecto de aplicacin de Windows Forms denominado


DisplayImages para su solucin. Cambiar el nombre de Form1.vb a
DisplayImages.vb.
2.Agregar un cuadro de imagen, un cuadro de texto y un botn al formulario y
establezca la propiedad Text del botn para mostrar la imagen y la propiedad de texto
del formulario para mostrar imgenes, como en la figura 18-3.

Figure 18-3. Design view of Display Images form


2. Agregue una nueva clase denominada imgenes a este proyecto de formulario
Windows Forms. Reemplace el cdigo en Images.vb con el cdigo en la lista de
18-2.
3.
Listing 18-2. Images.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Drawing
Imports System.IO
Namespace DisplayImage
Public Class Images
Private imageFilename As String = Nothing
Private imageBytes() As Byte = Nothing
Private imageConnection As SqlConnection = Nothing
Private imageCommand As SqlCommand = Nothing
Private imageReader As SqlDataReader = Nothing
' Constructor
Public Sub New()
imageConnection = New SqlConnection("Server=.\sqlexpress;" & _

Beginning VB 2008 Databases \ parte 4 EVENTOS

-19-

"Integrated Security=True;Database=tempdb")
imageCommand = New SqlCommand("" & ControlChars.CrLf & _
"select" & ControlChars.CrLf & "imagefile," & _
ControlChars.CrLf & "imagedata" & ControlChars.CrLf & _
"from" & ControlChars.CrLf & "imagetable" & _
ControlChars.CrLf & "", imageConnection)
' Open connection and create data reader
imageConnection.Open()
imageReader = imageCommand.ExecuteReader()
End Sub
Public Function GetImage() As Bitmap
Dim ms As New MemoryStream(imageBytes)
Dim bmap As New Bitmap(ms)
Return bmap
End Function
Public Function GetFilename() As String
Return imageFilename
End Function
Public Function GetRow() As Boolean
If imageReader.Read() Then
imageFilename = CStr(imageReader.GetValue(0))
imageBytes = CType(imageReader.GetValue(1), Byte())
Return True
Else
Return False
End If
End Function
Public Sub EndImages()
' Close the reader and the connection.
imageReader.Close()
imageConnection.Close()
End Sub
End Class
End Namespace
4 Insertar el cdigo en la lista de 18-3 en DisplayImages.vb antes de llamar a
InitializeComponent(). DisplayImages.vb se puede acceder haciendo clic en
DisplayImages.vb y seleccione Ver cdigo, que le llevar a la vista Cdigo.
Listing 18-3. Initializing Image Display in the DisplayImages class
images = New DisplayImage.Images()
If images.GetRow() Then
Me.TextBox1.Text = images.GetFilename()
Me.PictureBox1.Image = CType(images.GetImage(), Image)
Else
Me.TextBox1.Text = "DONE"
Me.PictureBox1.Image = Nothing
End If
5. Insertar el cdigo en la lista de 18-3 en el controlador de eventos button1_Click.
Puede acceder al controlador de eventos button1_click, desplcese a la vista de diseo
de la forma de DisplayImages y haga doble clic en el control de botn.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-20-

6 Insertar la lnea siguiente en el mtodo Dispose (por encima de los componentes.


Dispose()) de DisplayImages en DisplayImages.Designer.vb:
images.EndImages();
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
6. Hacer DisplayImages el proyecto de inicio y ejecutarlo pulsando Ctrl + F5.
Debera ver el resultado que se muestra en la figura 18-4.

Figure 18-4. Displaying images


Cmo funciona.
Declara un tipo de imgenes, para acceder a la base de datos y proporcionar mtodos
para los componentes de forma fcil y mostrar imgenes. En su constructor, se conecta
a la base de datos y crea un lector de datos para controlar el conjunto de resultados de
una consulta que recupera todas las imgenes que guard anteriormente:
'
Constructor
Public Sub New()
imageConnection = New SqlConnection("Server=.\sqlexpress;" & _
"Integrated Security=True;Database=tempdb")
imageCommand = New SqlCommand("" & ControlChars.CrLf & _
"select" & ControlChars.CrLf & "imagefile," & _
ControlChars.CrLf & "imagedata" & ControlChars.CrLf & _
"from" & ControlChars.CrLf & "imagetable" & _
ControlChars.CrLf & "", imageConnection)
' Open connection and create data reader
imageConnection.Open()
imageReader = imageCommand.ExecuteReader()
End Sub
Cuando se inicializa el formulario, el nuevo cdigo crea una instancia de imgenes,
busca una imagen con GetRow() y, si encuentra uno, asigna el nombre de archivo y la

Beginning VB 2008 Databases \ parte 4 EVENTOS

-21-

imagen en el cuadro de texto y foto con los mtodos GetFilename y GetImage,


respectivamente:
images = New DisplayImage.Images()
If images.GetRow() Then
Me.TextBox1.Text = images.GetFilename()
Me.PictureBox1.Image = CType(images.GetImage(), Image)
Else
Me.TextBox1.Text = "DONE"
Me.PictureBox1.Image = Nothing
End If
Llamar al mtodo endImages cuando el formulario se termina para cerrar la conexin.
(Fueron usted utilizar un conjunto de datos en lugar de un lector de datos, puede cerrar
la conexin en la instancia de imgenes inmediatamente despus de que se recuperan
las imgenes, lo que sera un buen ejercicio para que intente.)
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
images.EndImages()
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
La imagen se devuelve desde la base de datos como una matriz de bytes. El control
PictureBox propiedad de imagen puede ser un mapa de bits, un icono o un metarchivo
(clases todas derivadas de la imagen). Mapa de bits compatible con una variedad de
formatos, incluyendo BMP, GIF y JPG. La funcin GetImage, que se muestra a
continuacin, devuelve un objeto de mapa de bits:
Public Function GetImage() As Bitmap
Dim ms As New MemoryStream(imageBytes)
Dim bmap As New Bitmap(ms)
Return bmap
End Function
Constructor del mapa de bits no acepta una matriz de bytes, pero aceptar
MemoryStream (que es una representacin en memoria de un archivo) y
MemoryStream tiene un constructor que acepta una matriz de bytes. As, puede crear
una secuencia de memoria desde la matriz de bytes y, a continuacin, crea un mapa de
bits de la secuencia de memoria.
Trabajar con datos de texto.
Manipulacin de texto es similar a la gestin de imgenes excepto para el tipo de datos
utilizado para la columna de base de datos.
Pruebe: Cargar datos de texto desde un archivo.
Para cargar datos de texto desde un archivo, siga estos pasos:

Beginning VB 2008 Databases \ parte 4 EVENTOS

-22-

1. Agregar un proyecto de aplicacin de consola de Visual Basic llamado


LoadText a la solucin.
2. Cambie Module1.vb a LoadText.vb y reemplace el cdigo con el en el listado de
18-4.
Listing 18-4. LoadText.vb
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.IO
'Namespace LoadText
Friend Class LoadText
Private Shared fileName As String = "E:\DATOS\TEXTO1.TXT"
Private conn As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing
Shared Sub Main()
'Sub Main()
Dim loader As New LoadText()
Try
' Get text file
loader.GetTextFile(fileName)
' Open connection
loader.OpenConnection()
' Create command
loader.CreateCommand()
' Create table
loader.CreateTextTable()
' Prepare insert command
loader.PrepareInsertTextFile()
' Load text file
loader.ExecuteInsertTextFile(fileName)
Console.WriteLine("Loaded {0} into texttable.", fileName)
Catch ex As SqlException
Console.WriteLine(ex.ToString())
Finally
loader.CloseConnection()
Console.WriteLine("Press any key to continue........")
Console.ReadLine()
End Try
End Sub
Private Sub CreateTextTable()
ExecuteCommand("IF EXISTS" & ControlChars.CrLf & _
"(" & ControlChars.CrLf & "SELECT" & ControlChars.CrLf & _
"*" & ControlChars.CrLf & "FROM" & ControlChars.CrLf & _
"INFORMATION_SCHEMA.TABLES" & ControlChars.CrLf & _
"WHERE" & ControlChars.CrLf & "TABLE_NAME='TEXTTABLE'" & _
ControlChars.CrLf & ")" & ControlChars.CrLf & _
"DROP TABLE TEXTTABLE")
ExecuteCommand("CREATE TABLE TEXTTABLE" & _
ControlChars.CrLf & "(" & ControlChars.CrLf & _
"textfile varchar(255)," & ControlChars.CrLf & _

Beginning VB 2008 Databases \ parte 4 EVENTOS

-23-

"textdata varchar(max))" & ControlChars.CrLf)


End Sub
Private Sub OpenConnection()
' Create connection
conn = New SqlConnection("Server=.\sqlexpress;" & _
"Integrated Security=True;Database=tempdb")
' Open connection
conn.Open()
End Sub
Private Sub CloseConnection()
' Close connection
conn.Close()
End Sub
Private Sub CreateCommand()
cmd = New SqlCommand()
cmd.Connection = conn
End Sub
Private Sub ExecuteCommand(ByVal commandText As String)
Dim commandResult As Integer
cmd.CommandText = commandText
Console.WriteLine("Executing command:")
Console.WriteLine(cmd.CommandText)
commandResult = cmd.ExecuteNonQuery()
Console.WriteLine("ExecuteNonQuery returns {0}.", commandResult)
End Sub
Private Sub PrepareInsertTextFile()
cmd.CommandText = "" & ControlChars.CrLf & _
"insert into texttable" & ControlChars.CrLf & _
"values (@textfile, @textdata)" & ControlChars.CrLf
cmd.Parameters.Add("@textfile", SqlDbType.NVarChar, 30)
cmd.Parameters.Add("@textdata", SqlDbType.Text, 1000000)
End Sub
Private Sub ExecuteInsertTextFile(ByVal textFile As String)
Dim textData As String = GetTextFile(textFile)
cmd.Parameters("@textfile").Value = textFile
cmd.Parameters("@textdata").Value = textData
ExecuteCommand(cmd.CommandText)
End Sub
Private Function GetTextFile(ByVal textFile As String) As String
Dim textBytes As String = Nothing
Console.WriteLine("Loading File: " & textFile)
Dim fs As New FileStream(textFile, FileMode.Open, FileAccess.Read)
Dim sr As New StreamReader(fs)
textBytes = sr.ReadToEnd()
Console.WriteLine("TextBytes has length {0} bytes.", textBytes.Length)
Return textBytes
End Function
End Class
'End Namespace
3. Hacer LoadText el proyecto de inicio y ejecutarlo pulsando Ctrl + F5. Debera ver los
resultados en la figura 18-5.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-24-

Figure 18-5. Loading a text file into a table


Cmo trabaja
.
Simplemente cargar el cdigo fuente del programa de LoadText:
Private Shared fileName As String = "C:\Documents and Settings" & _
"\Toshiba User\My Documents\Visual Studio 2008" & _
"\Projects\Chapter18\LoadText\LoadText.vb"
into a table:
cmd.CommandText = "" & ControlChars.CrLf & _
"insert into texttable" & ControlChars.CrLf & _
"values (@textfile, @textdata)" & ControlChars.CrLf
cmd.Parameters.Add("@textfile", SqlDbType.NVarChar, 30)
'the image gets stored in the form of of an Image string.
' figure 1000000 specifies the bytes for the amount to
' specify the size of the Image string.
cmd.Parameters.Add("@textdata", SqlDbType.Text, 1000000)
que ha creado en la base de datos temporal:
ExecuteCommand("IF EXISTS" & ControlChars.CrLf & _
"(" & ControlChars.CrLf & "SELECT" & ControlChars.CrLf & _
"*" & ControlChars.CrLf & "FROM" & ControlChars.CrLf & _
"INFORMATION_SCHEMA.TABLES" & ControlChars.CrLf & _
"WHERE" & ControlChars.CrLf & "TABLE_NAME='TEXTTABLE'" & _
ControlChars.CrLf & ")" & ControlChars.CrLf & _
"DROP TABLE TEXTTABLE")
ExecuteCommand("CREATE TABLE TEXTTABLE" & _
ControlChars.CrLf & "(" & ControlChars.CrLf & _
"textfile varchar(255)," & ControlChars.CrLf & _
"textdata varchar(max))" & ControlChars.CrLf)
Tenga en cuenta que primero compruebe si la tabla existe. Si lo hace, lo suelte por lo
que se puede volver a crearla.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-25-

Nota La vista information_schema.tables (una consulta con nombre) es compatible con


la vista SQL de INFORMATION_SCHEMA estndar del mismo nombre. Limita las
tablas que se puede ver a los que puede acceder. Microsoft recomienda utilizar las
nuevas vistas de catlogo para obtener los metadatos de la base de datos en SQL
Server 2005, y el propio SQL Server utiliza internamente. La vista de catlogo para esta
consulta sera sys.tables, y el nombre de columna sera el INFORMATION SCHEMA
usado la vista de esquema de informacin aqu porque todava la pueden ver a
menudo.
En lugar de BinaryReader que se utilizar para imgenes, GetTextFile utiliza una clase
StreamReader (derivada de System.IO.TextReader) para leer el contenido del archivo
en una cadena:
Private Function GetTextFile(ByVal textFile As String) As String
Dim textBytes As String = Nothing
Console.WriteLine("Loading File: " & textFile)
Dim fs As New FileStream(textFile, FileMode.Open, FileAccess.Read)
Dim sr As New StreamReader(fs)
textBytes = sr.ReadToEnd()
Console.WriteLine("TextBytes has length {0} bytes.", textBytes.Length)
Return textBytes
End Function
De lo contrario, la lgica de procesamiento es bsicamente el mismo que ha visto
muchas veces en todo el libro: abrir una conexin, acceso a una base de datos y, a
continuacin, cierre la conexin. Ahora vamos a recuperar el texto solo almacenados.
ReCuperando datos de columnas de texto
Recuperar datos de columnas de texto es igual a recuperarla de los tipos de datos de
carcter. Ahora a escribir un programa de consola simple para ver cmo funciona.
Try It Out: Retrieving Text Data
To retrieve data from text columns, follow these steps:
1. Agregar un proyecto de aplicacin de consola de Visual Basic llamado
RetrieveText a la solucin.
2. 2. Cambie Module1.vb a RetrieveText.vb y reemplace el cdigo con el en el
listado 18-.
3.
Listing 18-5. RetrieveText.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Data
Imports System.Data.SqlClient
''Namespace RetrieveText
Public Class RetrieveText
Private textFile As String = Nothing
Private textChars() As Char = Nothing
Private conn As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing

Beginning VB 2008 Databases \ parte 4 EVENTOS

-26-

Private dr As SqlDataReader = Nothing


Public Sub New()
' Create connection
conn = New SqlConnection("Server=.\sqlexpress;" & _
"Integrated Security=True;Database=tempdb")
' Create command
cmd = New SqlCommand("" & ControlChars.CrLf & _
"select" & ControlChars.CrLf & "textfile," & _
ControlChars.CrLf & "textdata" & _
ControlChars.CrLf & "from" & _
ControlChars.CrLf & "texttable" & _
ControlChars.CrLf & "", conn)
' Open connection
conn.Open()
' Create data reader
dr = cmd.ExecuteReader()
End Sub
Public Function GetRow() As Boolean
Dim textSize As Long
Dim bufferSize As Integer = 100
Dim charsRead As Long
textChars = New Char(bufferSize - 1) {}
If dr.Read() Then
' Get file name
textFile = dr.GetString(0)
Console.WriteLine("------ start of file:")
Console.WriteLine(textFile)
textSize = dr.GetChars(1, 0, Nothing, 0, 0)
Console.WriteLine("--- size of text: {0} characters -----", _
textSize)
Console.WriteLine("--- first 100 characters in text -----")
charsRead = dr.GetChars(1, 0, textChars, 0, 100)
Console.WriteLine(New String(textChars))
Console.WriteLine("--- last 100 characters in text -----")
charsRead = dr.GetChars(1, textSize - 100, textChars, 0, 100)
Console.WriteLine(New String(textChars))
Return True
Else
Return False
End If
End Function
Public Sub endRetrieval()
' Close the reader and the connection.
dr.Close()
conn.Close()
Console.WriteLine("Press Any Key to Continue...........")
Console.ReadLine()
End Sub
Shared Sub Main()
Dim rt As RetrieveText = Nothing
Try
rt = New RetrieveText()

Beginning VB 2008 Databases \ parte 4 EVENTOS

-27-

Do While rt.GetRow() = True


Console.WriteLine("----- end of file:")
Console.WriteLine(rt.textFile)
Console.WriteLine("==========================")
Loop
Catch ex As SqlException
Console.WriteLine(ex.ToString())
Finally
rt.endRetrieval()
End Try
End Sub
End Class
'End Namespace
4. Hacer RetrieveText el proyecto de inicio y ejecutarlo pulsando Ctrl + F5. Debera
ver los resultados en la figura 18-6.
5.

Figure 18-6. Retrieving text from a table


Cmo funciona.
Despus de consultar la base de datos:
' Create command
cmd = New SqlCommand("" & ControlChars.CrLf & _
"select" & ControlChars.CrLf & "textfile," & _
ControlChars.CrLf & "textdata" & _
ControlChars.CrLf & "from" & _
ControlChars.CrLf & "texttable" & _
ControlChars.CrLf & "", conn)
' Open connection
conn.Open()
' Create data reader
dr = cmd.ExecuteReader()

Beginning VB 2008 Databases \ parte 4 EVENTOS

-28-

bucle en el conjunto de resultados (pero aqu hay slo una fila), obtener el nombre del
archivo de la tabla con GetString() e imprimir para mostrar el archivo que se muestra. A
continuacin, se llama GetChars() con una matriz de caracteres null para obtener el
tamao de la columna VARCHAR (Max):
If dr.Read() Then
' Get file name
textFile = dr.GetString(0)
Console.WriteLine("------ start of file:")
Console.WriteLine(textFile)
textSize = dr.GetChars(1, 0, Nothing, 0, 0)
Console.WriteLine("--- size of text: {0} characters -----", _
textSize)
Console.WriteLine("--- first 100 characters in text -----")
charsRead = dr.GetChars(1, 0, textChars, 0, 100)
Console.WriteLine(New String(textChars))
Console.WriteLine("--- last 100 characters in text -----")
charsRead = dr.GetChars(1, textSize - 100, textChars, 0, 100)
Console.WriteLine(New String(textChars))
Return True
Else
Return False
En lugar de imprimir todo el archivo, se mostrarn los primeros 100 bytes mediante
GetChars() para extraer una subcadena. Hacer lo mismo con los ltimos 100
caracteres.
De lo contrario, este programa es como cualquier otro que recupera y muestra los
datos de carcter de base de datos.
RESUMEN
En este captulo, explor texto y tipos de datos binarios de SQL Server. Tambin se
practican almacenar y recuperar datos binarios y de texto utilizando los tipos de datos
de objetos grandes de SQL Server y ADO.NET.
En el siguiente captulo, aprender acerca de la caracterstica ms emocionante
de.NET 3.5: Language Integrated Query (LINQ).
USANDO LINQ
Software de escritura significa que tienes que tener una base de datos en el back-end,
y la mayora del tiempo va a escribir consultas para recuperar y manipular datos. Cada
vez que alguien habla de datos, tendemos a pensar en la informacin contenida en una
base de datos relacional o en un documento XML.
El tipo de acceso a los datos que tenamos antes de que la versin de.NET 3.5 slo fue
destinado o limitada al acceso a los datos que residen en orgenes de datos
tradicionales como los dos que acabo de mencionar. Pero con el lanzamiento de.NET
3.5, que tiene el lenguaje integrado consulta (LINQ) incorporado en l, ahora es posible
tratar los datos que residen fuera de las casas tradicionales de almacenamiento de
informacin. Por ejemplo, puede consultar un tipo genrico de List() que contiene

Beginning VB 2008 Databases \ parte 4 EVENTOS

-29-

valores unos cien entero y escribir una expresin de LINQ para recuperar el
subconjunto que cumple el criterio por ejemplo, par o impar.
La funcin LINQ, como han dado cita, es una de las principales diferencias entre.NET
3.0 y.NET 3.5. LINQ es un conjunto de caractersticas de Visual Studio 2008 que
ampla las capacidades de consulta poderoso en la sintaxis del lenguaje de C# y
VB.NET.
LINQ presenta un enfoque estndar, unificado y fcil de aprender para consultar y
modificar datos y puede ser extendido para admitir potencialmente cualquier tipo de
almacn de datos. Visual Studio 2008 incluye ensamblados de proveedor LINQ que
permiten el uso de las consultas LINQ con diversos tipos de orgenes de datos,
incluidos datos relacionales, XML y estructuras de datos en memoria.
En este captulo, analizaremos los siguientes:
Introduction to LINQ.
Architecture of LINQ.
LINQ project structure.
Using LINQ to Objects.
Using LINQ to SQL.
Using LINQ to XML.
Introduccin a LINQ.
LINQ es una innovacin que Microsoft con el lanzamiento de Visual Studio 2008 y.NET
Framework versin 3.5 que promete revolucionar la forma en que los desarrolladores
han estado trabajando con datos antes del lanzamiento de.NET 3.5. Como
mencionamos anteriormente, LINQ introduce el concepto estndar y unificado de
consultar diversos tipos de orgenes de datos en la gama de bases de datos
relacionales, documentos XML y estructuras de datos incluso en memoria. LINQ
soporta todos estos tipos de almacenes de datos con la ayuda de las expresiones de
consulta LINQ de construcciones de primera clase de lenguaje de Visual Basic 2008.
LINQ ofrece las siguientes ventajas:
LINQ ofrece una sintaxis comn para consultar cualquier tipo de origen de datos; por
ejemplo, se puede consultar un documento XML de la misma manera como consultar
una base de datos SQL, un ADO.Conjunto de datos neto, una coleccin en memoria o
cualquier otro origen de datos remoto o local que ha elegido para conectarse y acceder
mediante LINQ.
Tiempo de desarrollo velocidades LINQ por capturar muchos errores en tiempo de
compilacin, incluyendo IntelliSense y soporte de depuracin.
Expresiones de consulta LINQ (a diferencia de los tradicionales instrucciones SQL)
son inflexible.
Note Expresiones inflexible garantizar el acceso a valores como el tipo correcto en
tiempo de compilacin y as evitar errores de falta de correspondencia de tipo
capturados cuando se compila el cdigo en lugar de en tiempo de ejecucin.
Como se explica en el captulo 2.NET 3.5 ensamblados son poco verde y pueden
encontrarse en la carpeta C:\Program programa\Reference

Beginning VB 2008 Databases \ parte 4 EVENTOS

-30-

Assemblies\Microsoft\Framework\v3.5. Las Asambleas LINQ proporcionan toda la


funcionalidad de acceso a diversos tipos de datos almacena bajo un paraguas. Los
ensamblados LINQ de ncleo se enumeran en la tabla 19-1
Table 19-1. Core LINQ Assemblies
Assembly Name
Description
System.LINQ
Provides classes and interfaces that support LINQ
queries
System.Collections.
Generic Allows users to create strongly typed
collections that provide
better type safety and performance than nongeneric
strongly
typed collections (LINQ to Objects)
System.Data.LINQ
Provides the functionality to use LINQ to access
relational
databases (LINQ to SQL)
System.XML.LINQ
Provides functionality for accessing XML documents
using LINQ
(LINQ to XML)
System.Data.Linq.Mapping
Designates a class as an entity class associated with
a database
Note Aunque se denomina Language Integrated Query, LINQ puede utilizarse para
actualizar los datos de la base de datos.Slo analizaremos consultas simples aqu para
darle que su primer sabor de LINQ, pero LINQ es una instalacin de propsito general
para tener acceso a datos. En muchos aspectos, es el futuro de ADO.NET. Para una
introduccin breve pero exhaustiva a LINQ, consulte LINQ de Fabio Claudio
Ferracchiati para Visual BASIC 2005 (Apress, 2006) o echar un vistazo en el sitio de
proyecto LINQ en http://msdn2.microsoft.com/en-us/netframework/aa904594.aspx.
Architecture de LINQ
LINQ a objetos.
LINQ a ADO.NET, que incluye.
De LINQ to SQL (anteriormente llamado DLinq).
LINQ para conjuntos de datos (anteriormente llamado LINQ sobre conjuntos de
datos)
. LINQ to Entities.
De LINQ to XML (anteriormente llamado XLinq).
Figura 19-1 se muestra la arquitectura LINQ, que muestra claramente los distintos
componentes de LINQ y sus almacenes de datos relacionados.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-31-

Figure 19-1. LINQ architecture


LINQ a objetos se ocupa de datos en memoria. Cualquier clase que implemente la
interfaz IEnumerable (en el espacio de nombres System.Collections.Generic) puede
consultarse con operadores de consulta estndar (SQOs).
Nota SQOs son una coleccin de mtodos que forman el patrn LINQ. Mtodos SQO
operan en secuencias, donde una secuencia representa un objeto cuyo tipo
implementa la interfaz IEnumerable o la interfaz IQueryable(Of T). El SQO proporciona
capacidades de consulta como el filtrado, proyeccin, agregacin, ordenar y as
sucesivamente.
LINQ a ADO.NET (tambin conocido como LINQ con ADO.NET) trata con datos
procedentes de fuentes externas, bsicamente nada ADO.NET puede conectarse.
Cualquier clase que implementa IEnumerable o IQueryable(Of T) (en el espacio de
nombres System.Linq) puede consultarse con SQOs. LINQ a ADO.NET Funcionalidad
de archivos se puede lograr utilizando el espacio de nombres System.Data.Linq.
LINQ to XML es una API completa para la programacin de XML en memoria. Como el
resto de LINQ, incluye SQOs, y tambin se puede utilizar en concierto con LINQ to
ADO.NET, pero su objetivo principal es unificar y simplificar el tipo de cosas diferentes
herramientas XML, como XQuery, XPath y XSLT, normalmente se utilizan para hacer.
LINQ para funcionalidad XML puede lograrse utilizando el espacio de nombres
System.Xml.Linq.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-32-

Nota LINQ sobre el.NET Compact Framework incluye un subconjunto de las funciones
LINQ escritorio. Una de las diferencias entre LINQ en el.NET Framework y LINQ en
el.NET Compact Framework es que en el.NET Compact Framework, SQOs slo son
compatibles. Se admiten LINQ para conjuntos de datos y LINQ to DataTables y LINQ to
XML tambin se admite excepto para extensiones de XPath.
En este captulo, trabajaremos con las tres tcnicas LINQ a objetos de LINQ to SQL y
LINQ para conjuntos de datos, ya que estn estrechamente relacionada con la
programacin de base de datos de Visual Basic 2008 que hemos cubierto en este libro.
Estructura del proyecto LINQ.
Visual Studio 2008 permite utilizar las consultas LINQ y para crear un proyecto LINQ,
siga estos pasos:
1 abrir Visual Studio 2008 y seleccione Archivo nueva proyecto.
2.En el cuadro de dilogo nuevo proyecto que aparece, de forma predeterminada.NET
Framework 3.5 es elegido en la lista de disponibles.Versiones de NET Framework
compatibles con Visual Studio 2008. Seleccione el tipo de proyecto desea que la
funcin LINQ para ser parte de. Por ejemplo, utilizaremos una aplicacin de consola de
proyectos (vase la figura 19-2).
3. Type the name Chapter19 for the chosen project and click OK. The new Console
Application
project named Chapter19 will appear. In a Visual Basic Console Application, the
LINQ namespaces are added under the References folder in Solution Explorer, as
shown in Figure 19-3.
Escriba el nombre de Chapter19 para el proyecto seleccionado y haga clic en Aceptar.
Aparecer el nuevo proyecto de aplicacin de consola denominado Chapter19. En una
aplicacin de consola de Visual Basic, se agregan a los espacios de nombres LINQ
bajo la carpeta de referencias en el explorador de soluciones, como se muestra en la
figura 19-3.
Ahora est listo para trabajar con un proyecto LINQ, y todo lo que necesita hacer es
agregar la funcionalidad de cdigo y los espacios de nombres necesarios para el
proyecto y probar la aplicacin. Vamos a comenzar a usar LINQ.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-33-

Figure 19-2. Choosing a LINQ-enabled Console Application project

Figure 19-3. LINQ references


Mediante LINQ a objetos.
El trmino LINQ a objetos se refiere al uso de las consultas LINQ para tener acceso a
las estructuras de datos en memoria. Puede consultar cualquier tipo que admita
IEnumerable. Esto significa que puede utilizar las consultas LINQ no slo con listas
definidas por el usuario, arreglos de discos, diccionarios, etctera, pero tambin en

Beginning VB 2008 Databases \ parte 4 EVENTOS

-34-

conjuncin con.NET Framework APIs que devuelven colecciones. Por ejemplo, puede
utilizar las clases System.Reflection para obtener informacin acerca de los tipos en un
ensamblado especificado y, a continuacin, filtrar los resultados mediante LINQ. O
bien, puede importar archivos de texto en las estructuras de datos enumerables y
comparar el contenido a otros archivos, extraer lneas o partes de lneas, agrupar
lneas coincidentes de varios archivos en una nueva coleccin y as sucesivamente.
son ms conciso y legible, especialmente cuando varias condiciones de filtrado.
Proporcionan capacidades de agrupacin, pedidos y potente filtrado con un mnimo
de cdigo de la aplicacin
. Que puede ser portados a otras fuentes de datos con poca o ninguna modificacin.
En general, cuanto ms compleja es que la operacin que desea realizar en los datos,
mayor ser el beneficio que se dar cuenta usando LINQ como opuesto a tcnicas
tradicionales de iteracin.
Pruebe: Codificacin un Simple LINQ a objetos de consulta.
En este ejercicio, utilizar LINQ a objetos para recuperar algunos nombres de una
matriz de cadenas.
1. Right-click the Chapter19 project in the Chapter19 solution, select the Rename
option,
and rename the project to LinqToObjects. Rename Module1.vb to LinqToObjects.vb.
Replace the code in LinqToObjects.vb with the code in Listing 19-1.
Haga clic derecho en el proyecto de Chapter19 en la solucin de Chapter19,
seleccione la opcin Cambiar nombre y cambie el nombre del proyecto a
LinqToObjects. Cambiar el nombre de Module1.vb a LinqToObjects.vb. Reemplace el
cdigo en LinqToObjects.vb con el cdigo en el listado de 19-1.
Listing 19-1. LinqToObjects.vb
Imports System
Imports System.Text
Imports System.Linq
Imports System.Collections.Generic
'Namespace Chapter19
Class LinqToObjects
Shared Sub Main(ByVal args As String())
Dim names As String() = {"James Huddleston", "Pearly", _
"Rupali Agarwal", "Fabio Claudio", "Vamika Agarwal", _
"Sofia Merchant", "Vidya Vrat Agarwal"}
'Dim name As String
Dim namesOfPeople As IEnumerable(Of String) = _
From name In names _
Where (name.Length <= 16) _
Select name
For Each name In namesOfPeople
Console.WriteLine(name)
Next
Console.ReadLine()
End Sub

Beginning VB 2008 Databases \ parte 4 EVENTOS

-35-

End Class
'End Namespace
2. Ejecute el programa pulsando Ctrl + F5, y ver los resultados mostrados en la figura
19-4.

Figure 19-4. Retrieving names from a string array using LINQ to Objects
Cmo funciona.
Declarar una matriz de cadena llamada nombres:
Dim names As String() = {"James Huddleston", "Pearly", _
"Rupali Agarwal", "Fabio Claudio", "Vamika Agarwal", _
"Sofia Merchant", "Vidya Vrat Agarwal"}
A fin de recuperar los nombres de la matriz de cadenas, consulta la matriz de cadenas
con IEnumerable (Of String) y tambin recorrer la matriz de nombres con la ayuda de
para cada usando LINQ a sintaxis de consulta de objetos:
Dim namesOfPeople As IEnumerable(Of String) = _
From name In names _
Where (name.Length <= 16) _
Select name
For Each name In namesOfPeople
Console.WriteLine(name)
Next
Mediante LINQ to SQL.
LINQ to SQL es una instalacin para la administracin y acceso a datos relacionales
como objetos. Es lgicamente similar a ADO.NET en algunos aspectos, pero considera
datos desde una perspectiva ms abstracto que simplifica muchas operaciones. Se
conecta a una base de datos, convierte construcciones LINQ en SQL, sostiene el SQL,
transforma los resultados en objetos y an registra los cambios y automticamente las
solicitudes de datos de versiones.
Una simple consulta LINQ requiere tres cosas:
clases de entidad.
Un contexto de datos. Una consulta LINQ.
Pruebe: Codificacin una Simple de LINQ to SQL Query.
En este ejercicio, utilizar de LINQ to SQL para recuperar a todos los clientes de la
tabla Customers de Northwind.
1. Navigate to Solution Explorer, right-click the Chapter19 solution, and select Add
New Project. From the provided list of Visual Studio installed templates, choose

Beginning VB 2008 Databases \ parte 4 EVENTOS

-36-

Console Application and name the newly added project LinqToSql. Click OK.
1. Vaya al explorador de soluciones, haga clic en la solucin de Chapter19 y
seleccione Agregar nuevo proyecto. De la lista de plantillas de Visual Studio
instalado, seleccione aplicacin de consola y el proyecto recin agregado
LinqToSql nombre. Haga clic en OK.
2. Cambiar el nombre de Module1.vb a LinqToSql.vb. Reemplace el cdigo en
LinqToSql.vb con el cdigo en el listado de 19-2.
Listing 19-2. LinqToSql.vb
Imports System
Imports System.Linq
Imports System.Data.|Linq
Imports System.Data.Linq.Mapping
Imports System.Data.Linq.DataContext
Namespace Chapter19
Class LinqToSql
<Table(Name:="Customers")> _
Public Class Customer
<Column()> _
Public customerId As String
<Column()> _
Public companyName As String
<Column()> _
Public city As String
<Column()> _
Public counTry As String
End Class
Shared Sub Main(ByVal args() As String)
' connection string
Dim connString As String = "server = .\sqlexpress;" & _
"Integrated security = True;database = northwind"
'create data context
Dim db As DataContext = New DataContext(connString)
'create typed table
Dim Customers As Table(Of Customer) = _
db.GetTable(Of Customer)()
'query database
Dim custs = From c In Customers _
Select c
'display customers
For Each c In custs
Console.WriteLine("{0}, {1}, {2}, {3}", _
c.customerId, c.companyName, c.city, c.counTry)
Next
End Sub
End Class
End Namespace
NOTA no acepta Imports System.Data.Linq

Beginning VB 2008 Databases \ parte 4 EVENTOS

-37-

3. Haga clic en el proyecto LinqToSql y seleccione el conjunto como opcin de proyecto


de inicio.
4 Ejecute el programa pulsando Ctrl + F5, y ver los resultados mostrados en la figura
19-5.

Figure 19-5. Retrieving customer data with LINQ to SQL


Cmo funciona.
Se define una clase de entidad, cliente:
<Table(Name:="Customers")> _
Public Class Customer
<Column()> _
Public customerId As String
<Column()> _
Public companyName As String
<Column()> _
Public city As String
<Column()> _
Public counTry As String
Clases de entidad proporcionan objetos en que LINQ almacena datos de orgenes de
datos. Son como cualquier otra clase de Visual Basic, pero LINQ define los atributos
que se indican cmo utilizar la clase.
El<table>atributo marca la clase como una clase de entidad y tiene una propiedad de
nombre opcional que puede utilizarse para asignar el nombre de una tabla, que por
defecto es el nombre de clase. Es por eso que usted nombre los clientes de clase en
lugar de cliente. Sera un enfoque ms tpico</table>
<Table(Name:="Customers")> _
Public Class Customer
y, a continuacin, tendra que cambiar la definicin de tabla con tipo a
Dim Customers As Table(Of Customer) = _

Beginning VB 2008 Databases \ parte 4 EVENTOS

-38-

db.GetTable(Of Customer)()
to be consistent.
El atributo <column()> marca un campo como uno que contendr los datos de una
tabla. Puede declarar campos que no se asignan a las columnas de la tabla, en una
clase de entidad y LINQ slo ignora, pero los decorado con el atributo <column()>
deben ser compatible con las columnas de la tabla a que se asignan tipos. (Tenga en
cuenta que desde los nombres de tabla y columna de SQL Server no distingue
maysculas de minsculas, los nombres por defecto no tiene que ser idntico en caso
de que los nombres utilizados en la base de datos.)
Crear un contexto de datos:</column()></column()>
'create data context
Dim db As DataContext = New DataContext(connString
Un contexto de datos hace que una conexin ADO.NET no, sino que tambin hace las
cosas que maneja un proveedor de datos. No slo la conexin a un origen de datos,
pero tambin se traduce las solicitudes LINQ (expresadas en SQO) en SQL, pasa el
SQL en el servidor de base de datos y crea objetos en el conjunto de resultados.
Crear una tabla con typed table
'create typed table
Dim Customers As Table(Of Customer) = _
db.GetTable(Of Customer)()
Una tabla con tipo es una coleccin (de tipo System.Data.Linq.Table (Of T) cuyos
elementos son de un tipo especfico. El mtodo Getable de la clase DataContext indica
el contexto de datos para tener acceso a los resultados e indica dnde ponerlos. Aqu,
usted obtiene todas las filas (pero slo cuatro columnas) de la tabla de clientes, y el
contexto de datos crea un objeto para cada fila de la tabla con tipo de clientes.
Inicializa la variable local con una expresin de consulta:
From c In Customers _
Select c
Una expresin de consulta se compone de una clusula From y un rgano de consulta.
Utilice la forma ms simple del cuerpo clusula y consulta desde aqu. Esta clusula
From declara una iteracin variable, c, que se utiliza para recorrer en iteracin el
resultado de la expresin, los clientes es decir, sobre el tipo tabla anteriormente
creado y cargado. Un rgano de consulta debe incluir una clusula select o groupby
que puede ir precedida de dnde o clusulas orderby.
La clusula select es el ms simple posible:
Select c

Beginning VB 2008 Databases \ parte 4 EVENTOS

-39-

y, like un SQL SELECT *, obtiene todas las columnas, por lo que la custs variable
implcitamente se escribe para administrar una coleccin de objetos que contienen
todos los campos de la clase de los clientes.
Por ltimo, que recorra la coleccin de custs y mostrar a cada cliente. Excepto para el
uso del tipo var, que es un nuevo tipo de datos de Visual Basic 2008, en el de cada
instruccin(for each), esto fue slo Visual Basic 2005.
'display customers
For Each c In custs
Console.WriteLine("{0}, {1}, {2}, {3}", _
c.customerId, c.companyName, c.city, c.counTry)
Next
A pesar de las nuevas caractersticas de Visual Basic 2008 y la terminologa, esto debe
sentirse familiar. Una vez que obtenga el bloqueo de la misma, es una alternativa
atractiva para consultas de codificacin. Bsicamente codifica una expresin de
consulta en lugar de SQL para rellenar una coleccin que se puede recorrer con(for
each) una para cada instruccin. Sin embargo, proporcionan una cadena de conexin,
pero no explcitamente abrir o cerrar una conexin. Adems, es necesario ningn
comando, lector de datos ni indizador. Ni siquiera tiene los espacios de nombres
System.Data o System.Data.SqlClient para tener acceso a SQL Server.
Pretty cool, isnt it?
Prubelo: utilizando el clusula WHERE.
Aqu, podr modificar LinqToSql para recuperar a slo los clientes en los Estados
Unidos.
1. Aadir las siguientes dos lneas en negrita a LinqToSql.vb:
'query database
Dim custs = From c In Customers _
where c.country = "USA"
select c
2. Vuelva a ejecutar el programa pulsando Ctrl + F5, y ver los resultados mostrados en
la figura 19-6.

Figure 19-6. Retrieving only U.S. customers with a where clause

Beginning VB 2008 Databases \ parte 4 EVENTOS

-40-

Cmo funciona.
Simplemente utiliza una clusula Where de Visual Basic 2008 para limitar las filas
seleccionadas:
Where c.country = "USA"
Es como una clusula WHERE de SQL, excepto para el uso de "USA" en lugar de
'Estados Unidos', desde cdigo utilizando Visual Basic 2008 aqu, no de T-SQL.
LINQ to XML
proporciona un XML en memoria programacin API que integra XML consultar
capacidades en Visual Basic 2008 para aprovechar el marco LINQ y Agregar consulta
extensiones especficas a XML. LINQ to XML proporciona la consulta y poder de
transformacin de XQuery y XPath integrado en.NET.
Desde otra perspectiva, se puede tambin pensar de LINQ to XML como una completa
API XML comparable a un modernizado, rediseado System.Xml API adems algunas
de las caractersticas claves de XPath y XSLT. LINQ to XML proporciona instalaciones
para editar documentos XML y rboles de elemento en la memoria, as como
instalaciones de transmisin.
Pruebe: Codificacin una Simple de LINQ to XML Query
. En este ejercicio, utilizar de LINQ to XML para recuperar valores de elemento de un
documento XML.
1. Vaya al explorador de soluciones, haga clic en la solucin de Chapter19 y seleccione
Agregar nuevo proyecto. De la lista de plantillas de Visual Studio instalado,
seleccione aplicacin de consola y el proyecto recin agregado LinqToXml nombre.
Haga clic en OK.
3. Cambiar el nombre de Module1.vb a LinqToXml.vb. Reemplace el cdigo en
LinqToXml.vb con el cdigo en el listado de 19-3.
Listing 19-3. LinqToXml.vb
Imports System
Imports System.Linq
Imports System.Xml.Linq
'Namespace Chapter19
Class LinqToXml
Shared Sub Main(ByVal args() As String)
'load the productstable.xml in memory
Dim doc As XElement = XElement.Load _
("C:\Documents and Settings" & _
"\Toshiba User\My Documents\Visual Studio 2008" & _
"\Projects\Chapter19\productstable.xml")
'Dim prodname As VariantType
'query xml doc
Dim products = From prodname In _
doc.Descendants("products") _
Select prodname.Value
'display details
For Each prodname In products

Beginning VB 2008 Databases \ parte 4 EVENTOS

-41-

Console.WriteLine("Product's Detail = {0}", prodname)


Next
End Sub
End Class
'End Namespace
Note Tenga en cuenta que hemos especificado en el archivo productstable.xml, que se
encuentra en una ubicacin especfica en mi mquina; puede utilizar otra ruta de
archivo XML basado en su mquina y la disponibilidad de archivos XML. El
productstable. XML tambin est disponible con el cdigo fuente de este captulo
3. Haga clic en el proyecto LinqToXml y seleccione el conjunto como opcin de
proyecto de inicio.
4. Ejecute el programa pulsando Ctrl + F5, y ver los resultados mostrados en la figura
19-7.

Figure 19-7. Retrieving product details with LINQ to XML


Cmo funciona.
Especifique la siguiente declaracin mediante XElement de System.Linq.Xml para
cargar al documento XML en memoria:
Dim doc As XElement = XElement.Load _
("C:\Documents and Settings" & _
"\Toshiba User\My Documents\Visual Studio 2008" & _
"\Projects\Chapter19\productstable.xml")
Tambin escribe la siguiente instruccin para consultar al documento XML, donde el
mtodo de descendientes devolver los valores de los elementos descendientes del
elemento especificado del documento XML.
Dim products = From prodname In _
doc.Descendants ("products") _
Select prodname.Value
RESUMEN

Beginning VB 2008 Databases \ parte 4 EVENTOS

-42-

En este captulo, cubrimos los elementos esenciales de mediante LINQ para consultas
simples. Te presentamos a los tres sabores de LINQ, principalmente LINQ a objetos de
LINQ to SQL y LINQ to XML. Discutimos varias caractersticas nuevas de Visual Basic
2008 que admiten el uso de las consultas LINQ. En el siguiente captulo, analizaremos
las caractersticas de LINQ para ADO.NET 3.5.
USANDO ADO.NET 3.5
El mundo pensaba que la base de datos API eran lo suficientemente maduras como
con el lanzamiento de ADO.NET 2.0, pero datos acceder APIrelated innovaciones son
siguen ocurriendo y sigue creciendo. Son razonablemente fcil de usar y permiten
simular los mismos tipos de estructuras de datos y las relaciones que existen en bases
de datos relacionales.
Sin embargo, no interactuar con los datos en tablas de conjuntos de datos o datos de la
misma manera que lo hace con los datos en las tablas de la base de datos. La
diferencia entre el modelo relacional de datos y el modelo de programacin orientada a
objetos es considerable y ADO.NET 2.0 hace relativamente poco para reducir la
impedancia entre los dos modelos.
Con el lanzamiento de.NET Framework 3.5 y la adicin de consulta integrada idioma
(LINQ) para Visual Studio 2008, una nueva versin de ADO.NETTambin se ha
introducido NET: ADO.NET 3.5. Trabajar con ADO. NET 3.5, es necesario tener
ADO.NET Framework 3.5 de entidad (ADO.NET 3.5 EF) y ADO.3.5 Herramientas de
marco de entidad de red. Este captulo le presentar el ADO. 3.5 Modelo de datos de
entidad de 3,5 (EDM) .
En este captulo, analizaremos lo siguiente:
comprensin ADO.NET Framework 3.5 de entidad.
Comprender el modelo de datos de la entidad.
Trabajar con el modelo de datos de la entidad.
Comprensin ADO.NET Framework 3.5 de entidad.
La visin detrs de ADO.NET 3.5, la ltima versin de ADO.NET, es ampliar el nivel de
abstraccin para la programacin de base de datos, que elimina por completo el
desajuste de impedancia entre modelos de datos y lenguajes de desarrollo que utilizar
los programadores escribir aplicaciones de software.
Dos innovaciones revolucionarias han hecho esta misin toda xito: LINQ y ADO.EF
NET 3.5. ADO.NET 3.5 EF existe como una nueva parte de la ADO.NET Familia de
tecnologas.
Con ADO.NET 3.5 EF, los desarrolladores pueden concentrarse en los datos a travs
de un modelo de objetos en lugar de a travs del modelo de datos lgicos y
relacionales tradicionales, ayudando a abstraer el esquema de datos lgicos en un
modelo conceptual para permitir la interaccin con ese modelo a travs de un nuevo
proveedor de datos llamado EntityClient. Abstrae la estructura lgica de base de datos
utilizando una capa conceptual, una capa de asignacin y una capa lgica. En este
captulo, revisamos el propsito de cada una de estas capas.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-43-

ADO.NET 3.5 EF permite a los desarrolladores escribir menos cdigo de acceso a


datos, reduce el mantenimiento y resmenes de la estructura de los datos en una
manera ms favorable a las empresas. Tambin puede ayudar a reducir el nmero de
errores en tiempo de compilacin, ya que genera clases inflexible del modelo
conceptual.
ADO.NET 3.5 EF genera un modelo conceptual que los desarrolladores pueden escribir
cdigo contra el uso de un nuevo proveedor de datos llamado EntityClient, como se
mencion anteriormente. EntityClient sigue un modelo similar a amiliar ADO NET
objecto, utilizando objetos EntityConnection y EntityCommand para devolver un
EntityDataReader.
Note Puede descargar ADO.NET 3.5 EF y ADO.NET 3.5 entidad marco herramientas
de http:// www.microsoft.com/downloads.
Comprender el modelo de datos de la entidad.
El ncleo de ADO.NET 3.5 EF es en su modelo de datos de la entidad. ADO.NET 3.5
EF es compatible con un modelo de almacn lgico que representa el esquema
relacional de una base de datos. Una base de datos relacional a menudo almacena los
datos en un formato diferente de lo que se puede utilizar la aplicacin. Normalmente
esto obliga a los desarrolladores para recuperar los datos en la misma estructura que
figura en la base de datos. Los desarrolladores entonces a menudo alimentan los datos
en las entidades empresariales que son ms adecuadas para la gestin de reglas de
negocio. ADO.NET 3.5 EF puente entre modelos de datos utilizando capas de
asignacin. Hay tres capas activas en el modelo ADO. NET 3.5 EF:
Capa conceptual.
Asignacin de capa.
Capa lgica.
Estas tres capas permiten datos asignar a un modelo de negocio de orientado a
objetos ms de una base de datos relacional. ADO.NET 3.5 EF define estas capas
mediante archivos XML. Estos archivos XML proporcionan un nivel de abstraccin para
que desarrolladores pueden programar el modelo conceptual de OO en lugar del
modelo de datos relacionales tradicionales.
El modelo conceptual se define en un archivo XML mediante el lenguaje de definicin
de esquema conceptuales (CSDL). CSDL define las entidades y las relaciones como
capa de negocio de la aplicacin les sabe. El modelo lgico, que representa el
esquema de base de datos, se define en un archivo XML mediante el lenguaje de
definicin de esquema de tienda (SSDL). La capa de asignacin, que se define
mediante lenguaje de esquema de asignacin (MSL), mapas de las otras dos capas.
Esta asignacin es lo que permite a los desarrolladores de cdigo contra el modelo
conceptual y han asignado las instrucciones en el modelo lgico.
Trabajar con el modelo de datos de la entidad.
La mayora de las aplicaciones utilizando en la actualidad no pueden existir sin tener
una base de datos en el back-end. La aplicacin y la base de datos son altamente
dependientes entre s es decir, se complementa muy bien, por lo que resulta tan
evidente que cualquier cambio realizado en la aplicacin o en la base de datos tendr

Beginning VB 2008 Databases \ parte 4 EVENTOS

-44-

un enorme impacto en el otro extremo; una integracin siempre es bidireccional y


alterar un lado requerir cambios a ser sincronizados con el otro lado. Si los cambios
no se reflejan adecuadamente, la aplicacin no funciona de la manera deseada, y el
sistema se descomponen.
Echemos un vistazo a una integracin teniendo en cuenta el siguiente segmento de
cdigo, que se utiliz en el captulo 11 como parte del listado de 11-3:
'create connection
Dim conn As SqlConnection = New SqlConnection _
("Data Source=.\sqlexpress;" & _
"Integrated Security=True;" & _
"database=northwind")
'create command (with both text and connection)
Dim sql As String = "select firstname,lastname from employees"
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
Console.WriteLine("Command created and connected.")
Try
'Open connection
conn.Open()
'execute query
Dim rdr As SqlDataReader = cmd.ExecuteReader
Asume que se ha implementado el cdigo anterior en produccin junto con la base de
datos, que tiene los nombres de columna como especificado en la consulta select. Ms
tarde, el administrador de base de datos (DBA) decide cambiar los nombres de
columna en todas las tablas para implementar nuevas polticas de base de datos:
modifica la tabla employees y cambia la columna firstname EmployeeFirstName y la
columna Apellidos a EmployeeLastName.
Despus de estos cambios de la base de datos, la nica forma de evitar la aplicacin
de ruptura es mediante la modificacin de todos los segmentos de cdigo en el cdigo
fuente que hace referencia a las columnas nombre y apellido, reconstruir, probar y
desplegar toda la aplicacin una vez ms. El segmento de cdigo modificado en el
cdigo anterior aparecer como sigue:
'create command
Dim sql As String = "select EmployeeFirstName,EmployeeLastName from employees"
Aunque en la superficie no parece difcil de realizar dichos cambios, si usted tener en
cuenta la posibilidad de que exista muchos segmentos de cdigo de base de datos que
requieren la modificacin de los nombres de columna de acuerdo con el nuevo
esquema de nombres de columna, esto puede terminar siendo un enfoque tedioso para
actualizar una aplicacin para que pueda trabajar con la base de datos modificado.
Con ADO.Modelo de datos de entidad de NET 3.5 EF, Microsoft ha modelado de
relacin de entidades ejecutable. Microsoft haba logrado por una combinacin de
archivos de esquema XML y ADO.NET 3.5 EF APIs. Los archivos de esquema se
utilizan para definir una capa conceptual para exponer el esquema del almacn de
datos (por ejemplo, el esquema de una base de datos SQL Server) y para crear un

Beginning VB 2008 Databases \ parte 4 EVENTOS

-45-

mapa entre los dos. ADO.NET 3.5 EF permite escribir sus programas contra las clases
que se generan a partir del esquema conceptual. EDM, a continuacin, se encarga de
todas las traducciones como extraer datos de la base de datos por lo que le permite
interactuar con la base de datos relacional en una objectoriented forma.
EDM hace posible la aplicacin de cliente y el esquema de base de datos evolucionar
independientemente de manera imprecisa sin afectar y rompiendo mutuamente.
EDM de ADO.NET 3.5 EF proporciona una vista conceptual del esquema de base de
datos que utiliza la aplicacin. Este punto de vista conceptual es descrito como un
archivo de asignacin XML en la aplicacin. El archivo de asignacin XML asigna las
propiedades de entidad y relaciones asociadas a las tablas de base de datos.
Esta asignacin es la varita mgica que abstrae la aplicacin de los cambios realizados
en el esquema de base de datos relacional. As que en lugar de modificar todos los
segmentos de cdigo orientado a la base de datos en una aplicacin para adaptarse a
los cambios en el esquema de base de datos, basta con modificar el archivo de
asignacin XML de manera que refleja todos los cambios realizan en el esquema de
base de datos. En otras palabras, la solucin ofrecida por ADO.NET 3.5 EDM es
modificar el archivo de asignacin XML para reflejar el cambio de esquema sin cambiar
el cdigo fuente.
Pruebe: Creacin de un modelo de datos de la entidad.
En este ejercicio, ver cmo crear un EDM.
1. Crear un proyecto de aplicacin de Windows Forms denominado
EntityDataModel
2. . Haga clic en la solucin, elija la opcin Cambiar nombre y, a continuacin,
nombre de la solucin Chapter20.
3. Haga clic en el proyecto y seleccione Agregar nuevo elemento. En las plantillas de
Visual Studio proporcionadas elija ADO.NET Entity Data Model y asgnele el nombre
NorthwindModel; la pantalla debe parecerse a la uno en la figura 20-1. Haga clic en
Agregar.
(funciona en framework 4.0)
4. Se iniciar el Asistente para modelo de datos de entidad, con la pantalla Elija modelo
contenido aparezcan en primer lugar. Seleccione la opcin de generar de base de
datos, como se muestra en la figura 20-2. Haga clic en siguiente
.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-46-

Figure 20-1. Adding an ADO.NET Entity Data Model

Figure 20-2. Entity Data Model WizardChoose Model Contents screen


4. La pantalla elegir la conexin de datos aparece a continuacin, como se muestra
en la figura 20-3. Haga clic en Nueva conexin.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-47-

Figure 20-3. Entity Data Model WizardChoose Your Data Connection screen
6.A continuacin, aparece el cuadro de dilogo Propiedades de conexin. Introduzca.
cuadro de lista de \sqlexpress en el nombre del servidor y asegrese de que est
seleccionado el botn de opcin utilizar autenticacin de Windows. En el cuadro de lista
que se proporciona a continuacin la seleccione o escriba un botn de opcin de
nombre de base de datos, seleccione Northwind. El cuadro de dilogo aparecer como
se muestra en la figura 20-4. Haga clic en Probar conexin.
7. Un cuadro de mensaje debe flash que muestra el mensaje "Probar conexin
sucedido". Haga clic en OK. Ahora haga clic en Aceptar en el cuadro de dilogo
Propiedades de conexin.
8.La ventana de elegir la conexin de datos aparece nuevamente, mostrando todos los
ajustes realizados hasta ahora. Garantizar la opcin de casilla de verificacin que
guardar ajustes de conexin de entidad en App.Config como se comprueba y ha
NorthwindEntities como un valor introducido en l. Cambie el valor a
NorthwindEntitiesConnectionString, como se muestra en la figura 20-5. Haga clic en
siguiente.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-48-

Figure 20-4. Entity Data Model WizardConnection Properties dialog box

Beginning VB 2008 Databases \ parte 4 EVENTOS

-49-

Figure 20-5. Entity Data Model WizardChoose Your Data Connection screen with
settings displayed
9 Aparecer la pantalla elegir sus objetos de base de datos. Expanda el nodo tablas.
De forma predeterminada, todas las tablas de la base de datos Northwind seleccionado
tendr una casilla con una marca de verificacin en ella. Quitar todas las marcas de
verificacin de todas las casillas de verificacin excepto para los que junto a las tablas
de empleados y EmployeeTerritories. Tambin quitar la marca de las casillas de
verificacin junto al nodo vistas y procedimientos almacenados. Aparece la pantalla que
se muestra en la figura 20-6. Haga clic en Finalizar.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-50-

Figure 20-6. Entity Data Model WizardChoose Your Database Objects screen
10. Vaya al explorador de soluciones, y ver que se ha agregado un nuevo objeto de
NorthwindModel.edmx para el proyecto, como se muestra en la figura 20-7.

Figure 20-7. Solution Explorer displaying the generated Entity Data Model
11. Haga doble clic en NorthwindModel.edmx para ver el modelo de datos de entidad
generado en la vista Diseo. Debera aparecer como se muestra en la figura 20-8.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-51-

Figure 20-8. Entity Data Model in Design view


12. El Entity Data Model generado tambin tiene una asignacin XML asociada. Para
ver la asignacin XML, vaya al explorador de soluciones, haga clic en
NorthwindModel.edmx y elija la opcin Abrir con. En el cuadro de dilogo que aparece,
seleccione Editor de XML y haga clic en Aceptar. Debera ver la asignacin XML, como
se muestra en la figura 20-9.
13. Cambie a la vista de diseo de Form1. La propiedad Name del formulario,
escriba a empleados y para la propiedad de texto, escriba los detalles de los
empleados.
14. Arrastre un control de botn al formulario de propiedad para el nombre, tipo
btnEmployees y de la propiedad de texto, escriba a obtener empleados.
15. Arrastre un control ListBox al formulario debajo del control de botn y para su
lstEmployees de tipo de propiedad de nombre. El formulario debe aparecer como se
muestra en la figura 20-10.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-52-

Figure 20-9. XML mapping associated with the Entity Data Model

Figure 20-10. Design view of the form


16. Haga doble clic en el control de botn para ir a la vista Cdigo. Antes de proceder
con agregar el cdigo para el botn, haga clic en evento, agregue el espacio de
nombres siguiente al proyecto:
imports System.Data.EntityClient
Listing 20-1. Creating a Connection Using the Entity Data Model

Beginning VB 2008 Databases \ parte 4 EVENTOS

-53-

Dim connection As EntityConnection = New EntityConnection _


"name=NorthwindEntitiesConnectionString")
connection.Open()
Dim command As EntityCommand = connection.CreateCommand()
command.CommandText = "select E.FirstName,E.LastName " & _
"from NorthwindEntitiesConnectionString.Employees as E"
Dim reader As EntityDataReader = _
command.ExecuteReader(CommandBehavior.SequentialAccess)
lstEmployees.Items.Clear()
While reader.Read()
lstEmployees.Items.Add(reader("FirstName") + _
" " + reader("LastName"))
End While
18. Generar la solucin y ejecutar el proyecto. Cuando aparezca el formulario detallado
de empleados, haga clic en el botn obtener empleados. Debe mostrar la pantalla que
se muestra en la figura 20-11.

Figure 20-11. Displaying the Employees Detail form


Cmo funciona.
Porque se trabaja con un modelo de datos de la entidad, no tienes que tratar de
SqlConnection, SqlCommand y as sucesivamente. Aqu se crea un objeto de conexin
que hace referencia a la EntityConnection, pase la cadena de conexin completa que
se almacena con el nombre NorthwindEntitiesConnectionString en el archivo App.config
y, a continuacin, abra la conexin:
Dim connection As EntityConnection = New EntityConnection _
"name=NorthwindEntitiesConnectionString")
connection.Open()
Despus de especificar la apertura de la conexin, es hora de crear el objeto de
comando mediante EntityCommand y, a continuacin, especifique la consulta a la
propiedad CommandText. Observe que la clusula From de la consulta se compone de
EntityContainer.EntitySet, as como el nombre de la cadena de conexin, lo que

Beginning VB 2008 Databases \ parte 4 EVENTOS

-54-

representa el EntityContainer, el sufijo con el nombre de tabla, que es en realidad un


EntitySet:
Dim command As EntityCommand = connection.CreateCommand()
command.CommandText = "select E.FirstName,E.LastName " & _
"from NorthwindEntitiesConnectionString.Employees as E"
Note Ahora tiene que especificar el objeto del lector, que leer la secuencia de datos
de la base de datos y rellenar el control ListBox. Lo hace mediante el objeto
EntityDataReader y, a continuacin, especifique tambin el mtodo ExecuteReader
para devolver los resultados. El mtodo ExecuteReader tambin requiere un valor de
enumeracin para especificar; para este ejemplo, se utiliza el valor de enumeracin
CommandBehavior.SequentialAccess para contar la ADO.NET 3.5 Tiempo de ejecucin
para recuperar y cargar los datos de forma secuencial y recibirlo en la forma de una
secuencia:
Dim reader As EntityDataReader = _
command.ExecuteReader(CommandBehavior.SequentialAccess)
Next, you specify the code to tell the reader that it has to add the data values in the
ListBox until the reader is able to read the data:
lstEmployees.Items.Clear()
While reader.Read()
lstEmployees.Items.Add(reader("FirstName") + _
" " + reader("LastName"))
End While
Pruebe: Esquema abstraccin mediante un modelo de datos de la entidad.
En el ejercicio anterior, ha creado un modelo de datos de la entidad denominada
NorthwindModel; en este ejercicio, ver cmo este modelo de datos de la entidad
ayudar a los desarrolladores a lograr abstraccin de esquema y modificar la base de
datos sin tocar el cdigo de acceso de datos durante todo el proyecto o en la capa de
acceso de datos (DAL).
1. Iniciar SQL Server Management Studio Express, expanda el nodo de base
de datos, expanda el nodo de base de datos Northwind y, a continuacin,
expanda el nodo tablas. En la lista de tablas, expanda el dbo.Nodo de
empleados y, a continuacin, expanda la carpeta de columnas.
2. Seleccione la columna Apellidos, con el botn derecho y seleccione la opcin
Cambiar nombre. Cambiar el nombre de la columna Apellidos a
EmployeesLastName.
3. Seleccione la columna FirstName, con el botn derecho y seleccione la opcin
Cambiar nombre. Cambiar el nombre de la columna FirstName a EmployeesFirstName.
4. Ahora salir desde SQL Server Management Studio Express seleccionando
Archivo salida.
5. Switch to the Chapter20 solution and then run the EntityModel project. The
Employees
Detail form should load. Click the Get Employees button; this raises an exception
window with the message CommandExecutionException was unhandled. Click View
Detail located under Actions.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-55-

Cambiar a la solucin de Chapter20 y, a continuacin, ejecutar el proyecto de


EntityModel. Debe cargar el formulario detallado de empleados. Haga clic en el botn
obtener empleados; Esto plantea una ventana de excepcin con el mensaje
"CommandExecutionException fue no controlada". Haga clic en ver detalle situado en
acciones.
6. Se abre el cuadro de dilogo Ver detalle. Ampliar la excepcin para ver los detalles
de la excepcin. Si observas InnerException, ver un mensaje que indica la causa de
esta excepcin, y es que slo ha cambiado los nombre y apellido columnas de base de
datos. Los detalles de la excepcin deberan aparecer como se muestra en la figura 2012.

Figure 20-12. Exception details


7. Haga clic en Aceptar para cerrar la ventana de vista Detalles de la excepcin y
elija Debug Detener depuracin.
8. Para corregir esta aplicacin, se debe modificar el archivo de asignacin XML
creado por el modelo de datos de la entidad, el archivo NorthwindModel.edmx
que cre anteriormente en el captulo y se muestra anteriormente en cifras 20-7 y
20-8. Para ver la asignacin XML, vaya al explorador de soluciones, haga clic en
NorthwindModel.edmx y elija la opcin Abrir con. En el cuadro de dilogo
proporcionado, seleccione Editor de XML y haga clic en Aceptar. Se ver la
asignacin XML, como se muestra anteriormente en la figura 20-9.
9. En el archivo de asignacin XML abierto, vaya a la
<!-- SSDL content --> section
and modify LastName in the <Property Name="LastName" Type="nvarchar"
Nullable="false" MaxLength="20" /> XML tag to EmployeesLastName; the tag should
appear as <Property Name="EmployeesLastName" Type="nvarchar" Nullable="false"
MaxLength="20" /> after the modification.
Note El modelo lgico, que representa el esquema de base de datos, se define en un
archivo XML utilizando SSDL. Es por eso que hay que modificar los nombres de
columna para asignar con el esquema de base de datos.
10. Ahora es necesario modificar la <Property Name="FirstName" Type="nvarchar"
Nullable="false" MaxLength="10" /> XML tag to appear as <Property
Name="EmployeesFirstName" Type="nvarchar" Nullable="false" MaxLength="10" />.
La seccin de contenido SSDL modificada con valores FirstName y LastName
aparecer como se muestra en la figura 20-13.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-56-

Figure 20-13.Modifying the SSDL content section


11. Ahora buscar el <!-- C-S mapping content --> section and modify the
<ScalarProperty Name="LastName" ColumnName="LastName" /> tag to appear as
<ScalarProperty Name="LastName" ColumnName="EmployeesLastName" />.
Note El modelo conceptual se define en un archivo XML utilizando CSDL. CSDL define
las entidades y las relaciones como capa de negocio de la aplicacin les sabe. Es por
eso que hay que modificar los nombres de columna para ser legible y fcil de encontrar
por la entidad.
12. Next, modify the <ScalarProperty Name="FirstName" ColumnName="FirstName" />
tag
to appear as <ScalarProperty Name="FirstName"
ColumnName="EmployeesFirstName"
/>. The modified C-S mapping content section having FirstName and LastName values
will appear as shown in Figure 20-14.

Beginning VB 2008 Databases \ parte 4 EVENTOS

-57-

Figure 20-14.Modifying the C-S mapping content section


13. Ahora construir la solucin Chapter20 y ejecute la aplicacin. Cuando se abre el
formulario detallado de empleados, haga clic en el botn obtener empleados. Esto
debe rellenar el cuadro de lista con los valores de nombre y apellidos de los
empleados, como se muestra anteriormente en la figura 20-11.
14.Cambiar a la Form1.vb. Todava debe ver la misma consulta SELECT con nombres
de columna FirstName y LastName, aunque se han modificado los nombres de
columna en la tabla de empleados de la base de datos de Northwind. Pero
aprovechando las ventajas de la funcin de abstraccin del esquema del modelo de
datos de entidad, slo tiene que especificar los nombres de columna actualizada en el
archivo de asignacin XML del contenido SSDL y las secciones de contenido de
asignacin de C-S.
RESUMEN
En este captulo, Mir ADO.NET 3.5 y su funcin de modelo de datos de la entidad.
Tambin estudi los requisitos previos que necesita sacar el mximo provecho de
ADO.NET 3.5.
Tambin aprendi cmo funciona la abstraccin de esquema y cmo le ayudar a
lograr sueltos acoplamiento entre una base de datos y el cdigo de acceso a datos o
DAL.

También podría gustarte