You are on page 1of 218

Programacin Orientada a Objetos II

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

NDICE
Presentacin Red de contenidos Sesiones de aprendizaje Unidad de aprendizaje 1 SEMANA 1 SEMANA 2 SEMANA 3 SEMANA 4 : Arquitectura de ADO .NET, conexin a un base de datos, consulta de datos : Operaciones de consultas y recuperacin de datos utilizando DataAdapter, DataReader y Command : Manejo del TableAdapter, Usando LINQ to SQL. 7 23 39 59 5 6

: Modificacin de datos de una fuente de datos, manejo de transacciones de datos Unidad de aprendizaje 2 SEMANA 5 SEMANA 6 SEMANA 7 SEMANA 8 : Operaciones desconectadas con programacin : Operaciones desconectadas: Manejo del DataView y el DataTableReader desde un DataSet : Semana de exmenes parciales teora : Semana de exmenes parciales laboratorio

83 103

Unidad de aprendizaje 3 SEMANA 9 : Manejo de Crystal Report 115

Unidad de aprendizaje 4 SEMANA 10 : Modelo relacional de objetos: LINQ to SQL SEMANA 11 : Modelo ADO.NET Entity FrameWork, arquitectura SEMANA 12 : Actualizacin de datos utilizando objetos EntityClient Unidad de aprendizaje 5 SEMANA 13 : Operaciones XML en datos desconectados Procesamiento de datos XML utilizando DOM SEMANA 14 : Consulta XML utilizando XPath, SEMANA 15 : Examen final de laboratorio SEMANA 16 : Sustentacin de proyectos SEMANA 17 : Examen final de teora 177 201 131 147 163

CIBERTEC

CARRERAS PROFESIONALES

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

PRESENTACIN

Visual Studio 2008 y su plataforma .NET FrameWork 3.5 es un amplio conjunto de bibliotecas de clases donde se incluye ADO .NET 3.5 que representa las clases en el Acceso de Datos, el cual sufre de avances importantes en el aumento de la productividad. Programacin Orientada a Objetos II pertenece a la lnea de tecnologa y se dicta en las carreras de tecnologa de la institucin. El curso brinda un conjunto de herramientas de programacin para trabajar con un origen de datos que permita al alumno realizar operaciones de consulta y actualizacin de datos en forma eficiente. El manual para este curso ha sido diseado bajo la modalidad de unidades de aprendizaje, las que desarrollamos durante semanas determinadas. En cada una de ellas, hallar los logros que se deber alcanzar al final de la unidad; el tema tratado, el cual ser ampliamente desarrollado; y los contenidos, que debe desarrollar. Por ltimo, encontrar las actividades y trabajos prcticos que deber desarrollar en cada sesin, que le permitirn reforzar lo aprendido en la clase. El curso es eminentemente prctico: consiste en programacin visual Basic con base de datos utilizando ADO .NET. La primera parte de este manual nos ensea a familiarizarnos con los objetos de ADO .NET para realizar las consultas y actualizaciones a la base de datos, sea sta en forma conectada o desconectada a la fuente de datos, mediante ejemplos didcticos. Aprenderemos a utilizar los controles enlazados a los datos que permitan realizar dichos procesos. Luego, vamos a realizar reportes y grficos utilizando el motor del Crystal Report, a continuacin realizamos operaciones de consulta actualizacin a travs del objeto Entity; y por ltimo desarrollamos procesos para manejar XML.

CIBERTEC

CARRERAS PROFESIONALES

RED DE CONTENIDOS

Programacin Orientada a Objetos II

Operaciones de consulta y actualizacin utilizando ADO.NET

Operaciones desconectadas a un origen de datos

Manejo de Reportes

Arquitectu ra de ADO.NET

Operacion de consulta y actualizar datos

Manejo de DataAdapter, DataReader, Command , Table Adapter y LINQ to SQL

Manejo de DataSet, DataTable

Consultas utilizando TableDataRe ader

Diseo de Crystal Report

Manejo de parmetros

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

UNIDAD DE APRENDIZAJE

1
SEMANA

1
ARQUITECTURA DE ADO .NET, CONEXIN A UN ORIGEN DE DATOS Y CONSULTA DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que se conectan a un origen de datos utilizando los objetos de ADO.NET para realizar operaciones de consulta y actualizacin de datos.

TEMARIO
Arquitectura y componentes de ADO.NET. Administracin almacenamiento de una cadena de conexin a un origen datos. Operaciones de consulta sobre un origen de datos. Recuperacin de datos utilizando DataAdapter, DataReader y Command Manejo de TableAdapter, Usando LINQ to SQL Modificacin de datos, manejo de transacciones de datos y excepciones. de

ACTIVIDADES PROPUESTAS
Los alumnos se conectan a un origen de datos. Los alumnos consultan los datos en un origen de datos, utilizando sentencias SQL. Los alumnos consultan los datos por diversos criterios en un origen de datos utilizando sentencias SQL. Los alumnos manejan los controles enlazados a los datos para realizar operaciones de consulta.

CIBERTEC

CARRERAS PROFESIONALES

1. INTRODUCCION AL ADO .NET 3.5


En la plataforma .NET, esos servicios reciben la denominacin genrica de ADO.NET, ha llegado a su versin 3.5 con Visual Studio 2008. Esta nueva iteracin aporta una serie de interfaces y objetos, as como nuevos controles y mejoras en las clases ya existentes, y tambin en el propio motor que se encarga de la manipulacin de los datos en el cliente, incrementando su rendimiento considerablemente. ADO.NET incorpora varios proveedores de datos que permiten conectar con SQL Server y Oracle, as como otros que facilitan el uso de controladores ODBC y OLE DB para acceder a aquellos provenientes de Excel, Access, MySQL, etc. Adems incorpora el nuevo modelo de factoras que hace posible un acceso genrico a orgenes de datos, la obtencin de informacin de esquema, las caractersticas especficas para SQL Server o las nuevas capacidades del objeto Datatable.

2. ARQUITECTURA DE ADO .NET


Tradicionalmente, el procesamiento de datos ha dependido principalmente de un modelo de dos niveles basado en una conexin. A medida que el procesamiento de datos utiliza cada vez ms arquitecturas de varios niveles, los programadores estn pasando a un enfoque sin conexin con el fin de proporcionar una escalabilidad mejor para sus aplicaciones.

ARQUITECTURA ADO.NET 2.0

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

3. PROVEEDOR DE DATOS ADO .NET


Cualquier aplicacin que utiliza ADO.NET accede a un origen de datos mediante un Provider o proveedor de datos. Un proveedor de datos permite conectarse a una base e datos, ejecutar comandos y obtener resultados. Cada proveedor de datos implementa interfaces para sus objetos.

3.1 Implementaciones de los proveedores de datos


Proveedor de Datos de .NET System.Data.SqlClient: Acceso a datos para SQL Server 7.0 o posterior System.Data.OleDb: Origen de datos que se exponen mediante OLE DB System.Data.Odbc: Origen de datos que se exponen mediante ODBC System.Data.OracleClient: Acceso a datos de Oracle 8.1.7 o posterior

3.2 Objetos principales de los proveedores de datos


3.2.1 Connection: Establece una conexin a un origen de datos. 3.2.2 Command: Ejecuta un comando en un origen de datos. Expone Parameters y puede ejecutarse en el mbito de un objeto Transaction. 3.2.3 DataReader: Lee una secuencia de datos de slo avance y slo lectura desde un origen de datos. 3.2.4 DataAdapter: Llena un DataSet y realiza las actualizaciones necesarias en el origen de datos.

CIBERTEC

CARRERAS PROFESIONALES

10

Adems de las clases principales citadas en la tabla anterior, los proveedores de datos de .NET Framework tambin incluyen las que se enumeran en la tabla siguiente.

Objeto
Transaction CommandBuilder

Descripcin
Permite incluir comandos en las transacciones que se realizan en el origen de datos. Objeto que genera, automticamente, las propiedades de comando de un DataAdapter o que obtiene, de un procedimiento almacenado, informacin acerca de parmetros con las que puede rellenar la coleccin Parameters de un objeto Command. Objeto que genera y maneja una cadena de conexin utilizada por el objeto Connection. Define los parmetros de entrada, salida y valores devueltos para los comandos y procedimientos almacenados. Se devuelve cuando se detecta un error en el origen de datos. En el caso de que el error se detecte en el cliente, los proveedores de datos de .NET Framework inician una excepcin de .NET Framework. Expone la informacin relacionada con una advertencia o error devueltos por un origen de datos. Se proporciona para los atributos de seguridad de acceso a cdigo de los proveedores de datos de .NET Framework.

ConnectionStringBuilder Parameter

Exception

Error

ClientPermission

4. CONEXIN A UNA BASE DE DATOS POR ADO .NET


El objeto Connection permite conectarse con un determinado origen de datos mediante una cadena de conexin en la que se proporciona la informacin de autenticacin necesaria. El objeto Connection utilizado depende del tipo de origen de datos. Cada proveedor de datos de .NET Framework, incluido en .NET Framework, cuenta con un objeto Connection: OleDbConnection, proveedor de datos para OLE DB. SqlConnection, proveedor de datos para SQL Server. OdbcConnection, proveedor de datos para ODBC. OracleConnection, proveedor de datos para Oracle.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

11

4.1 Definicin de la cadena de conexin


Para conectarse a una base de datos por ADO .NET, debe proveer de una cadena de conexin para identificar la base de datos. Los valores que se incluyen en una cadena de conexin dependen del origen de datos que utilice. A continuacin describiremos algunos parmetros de la cadena de conexin.

Parmetro
Provider Initial Catalog o DataBase Data Source Integrated Security o Trusted_Connection

Descripcin
Parmetro para conexiones de datos OLE DB El nombre de la base de datos Nombre o direccin de red del origen de datos Si el parmetro es false, debe especificar User ID y Password en la cadena de conexin. Si es true, la cuenta de autenticacin es de Windows. Cuenta de usuario Clave de la cuenta de usuario ingresada SI el parmetro es false el origen de datos (data source) no retorna seguridad sensitiva como el password, por defecto es false.

User ID Password Persist Security Info

4.2 Conexin a SQL Server mediante ADO .NET


El Data Provider del .NET Framework para SQL Server provee la conectividad a SQL Server 7.0 o posterior. Para conectarse a SQL Server utilice la clase SqlConnection desde el namespace System.Data.SqlClient.

4.2.1 Conexin a SQL Server mediante ADO .NET 1. Defina una cadena de conexin que identifique la base de datos a conectar. 2. Cree un objeto SqlConnection, pase la cadena de conexin como argumento al constructor del SqlConnection. 3. Llame al mtodo Open del objeto SqlConnection. 4. Utilice la conexin a la base de datos en su aplicacin. 5. Llame al mtodo Close o el mtodo Dispose para cerrar la conexin. Puede usar una sentencia Using, el cual garantiza que el objeto SqlConnection se libera. El siguiente ejemplo muestra como conectarse a la base de datos BDFactura.
Dim connectionstring As String = _ "Data Source = (local); Initial Catalog = BDFactura; Integrated Security = true" Dim cn As New SqlConnection(connectionstring) o a travs de la Estructura Using Using cn As New SqlConnection(connectionstring) End Using

CIBERTEC

CARRERAS PROFESIONALES

12

Using: Declara el principio de un bloque Using y, opcionalmente, adquiere


los recursos del sistema que controla el bloque. A veces su cdigo requiere un recurso no administrado, como un identificador de archivos, un contenedor COM o una conexin SQL. Un bloque Using garantiza la eliminacin de uno o ms de tales recursos cuando su cdigo termina de usarlos. Esto los pone a disposicin de otro cdigo para que los pueda utilizar.

4.3 Conexin con un origen de datos mediante la Librera OleDB


El Data Provider del .NET Framework para OLE DB provee la conectividad utilizando la clase OleDbConnection desde el namespace System.Data.OleDbConnection. El proveedor de datos .NET de OLE DB, el formato de la cadena de conexin es igual al que utiliza en ADO con la excepcin de la palabra clave Provider. 4.3.1 Conexin a un origen de datos mediante ADO .NET 1. Defina una cadena de conexin que identifique la base de datos a conectar. La cadena de conexin debe incluir un parmetro Provider para especificar cul es el OLE DB Provider para establecer la conexin. 2. Cree un objeto OleDbConnection, pasar la cadena de conexin como argumento al constructor del OleDbConnection. 3. Llame al mtodo Open del objeto OleDbConnection. 4. Utilice la conexin a la base de datos en tu aplicacin 5. Llame el mtodo Close o el mtodo Dispose para cerrar la conexin. Puede usar una sentencia Using, el cual garantiza que el objeto OleDbConnection se libera.
Dim connectionstring As String = _ "Provider=SQLOLEDB; server=(local); DataBase=BDFactura; uid=sa;pwd=sql" Dim cn As New SqlConnection(connectionstring)

4.4 Almacenar una cadena de conexin en un app.config


Almacene una cadena de conexin en un Application Configuration File, sin tener que editar el cdigo de origen y recompilar la aplicacin.

4.4.1 Almacenar una cadena de conexin en un Application Configuration File


1. Abrir un Application Configuration File (app.config). 2. Dentro de la etiqueta <configuration> aadir una elemento llamado <connectionStrings>. 3. Dentro de la etiqueta <connectionStrings> aadir un elemento llamado <add> para cada cadena de conexin. 4. Por cada etiqueta <add> definir un atributo name para especificar el nombre de la cadena de conexin, definir un atributo connectionString para especificar la informacin de la cadena de conexin. El siguiente ejemplo permite definir una cadena de conexin para la base de datos BDFactura, la cual se llamara cnfactura.
<connectionStrings> <add name="cnfactura" connectionString="Data Source=(local); DataBase=BDFactura; integrated Security=true"/> </connectionStrings>

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

13

Para utilizar la cadena de conexin almacenada en el app.config, primero defina el namespace Configuration.ConfigurationManager, que utiliza la propiedad ConnectionStrings definida en el app.config, tal como se muestra.
Imports System.Data.SqlClient Imports System.Configuration.ConfigurationManager Dim cnstring As String= ConnectionStrings("cnfactura").ConnectionString Using cn As New SqlConnection(cnstring) ...... End Using

5. Ejecutar consultas de base de datos


ADO .NET, posee una clase que permite ejecutar consultas sobre la base de datos: sentencias SQL embebidas, procedimientos almacenados, funciones; es la clase SqlCommand. La clase SqlCommand tiene 4 mtodos que permite utilizar para ejecutar sentencias SQL:

SqlCommand
ExecuteScalar ExecuteReader ExecuteNonQuery ExecuteXmlReader

Descripcin
Ejecuta una consulta que retorna un valor. Ejecuta una consulta que retorna un conjunto de datos a un DataReader. Ejecuta una Sentencia para actualizar los datos. Ejecuta una consulta y retorna un conjunto de datos en XML.

5.1 Ejecutar una consulta en la base de datos


1. Crear un objeto Connection, tal como SqlConnection. 2. Crear un objeto Command, tal como SqlCommand. En el constructor especificar la sentencia sql que se va a ejecutar y especificar la conexin. 3. Al ejecutar la sentencia sql, especificar la propiedad CommandType. Si va a ejecutar una sentencia SQL el valor del CommandType es CommandType.Text; si va a ejecutar un procedimiento almacenado el valor del CommandType ser CommandType.StoredProcedure. 4. Llame al mtodo Open del objeto Conexin. 5. Ejecute el mtodo del objeto Command, asignando su resultado a una variable o control. 6. Llame al mtodo Close del objeto conexin. El siguiente ejemplo permite ejecutar una consulta que retorne el nmero de facturas almacenadas en la base de datos BDFactura
Dim cn As New SqlConnection(aConnectionString) Dim cmd as new SqlCommand(Select Count(*) From fac_cabe , cn) cmd.CommandType=CommandType.Text cn.Open() Dim count as Integer=CInt(cmd.ExecuteScalar()) cn.Close()

CIBERTEC

CARRERAS PROFESIONALES

14

6. Connection Pooling en ADO .NET


Cuando una aplicacin se conecta a un servidor de base de datos, lo primero que hace es abrir una conexin con el servidor; lo que resulta ser un proceso costoso: Desde el punto de vista del cliente, hay que abrir una conexin de red con el servidor, enviarle una cadena de conexin y esperar la confirmacin. Desde el punto de vista del servidor, se recibe una solicitud de conexin, se valida el usuario que desea conectar y se enva al cliente el resultado de la solicitud. El objetivo de Connection Pooling es gestionar, en el cliente, un sistema que almacena conexiones abiertas contra el servidor de base de datos. Para ello, crear listas de conexiones, agrupadas por el par dominio de la aplicacin/cadena de conexin. Para habilitarlo usaremos Pooling=true. Al conectarse a un servidor de base de datos, comprueba su pool de conexiones, si existe una que coincida, utilizar la que tiene en el pool; sino crear una nueva conexin. En el siguiente ejemplo, se crean tres objetos SqlConnection, pero solo se necesitan dos grupos de conexin para administrarlos. Using cn As New SqlConnection(Server=. ;DataBase=NorthWind; uid=sa) cn.Open() Pool A es creado End Using Using cn As New SqlConnection(Server=. ;DataBase=Pubs; uid=sa) cn.Open() Pool B es creado End Using Using cn As New SqlConnection(Server=. ;DataBase=NorthWind; uid=sa) cn.Open() La conexin coincide con Pool A End Using

6.1 Adicin de conexiones


Por cada cadena de conexin nica se crea un grupo de conexin; las conexiones se agregan al grupo cuando es necesario, hasta el tamao mximo del grupo especificado en la propiedad Max Pool Size (100 es el valor predeterminado), y se liberan del grupo cuando se cierran o eliminan.

6.2 Eliminacin de conexiones


Si la aplicacin no cierra ni elimina explcitamente sus conexiones, es mejor asegurarse de que llama claramente a Close y Dispose en las conexiones

7. DBFACTORY CON ADO.NET


Ante la necesidad de escribir aplicaciones que puedan trabajar con cualquier tipo de base de datos, siempre se ha recurrido al modelo de n capas donde una de ellas, era el proveedor de acceso a datos y se encargaba de abstraer esta tarea, normalmente encapsulada en una librera .dll que se cambiaba a voluntad sin que ello supusiese ningn problema para la aplicacin. Esta librera, suele contener lo que se denomina un DBFactory, una clase abstracta o conjunto de funciones encargadas de adaptarse a la base de datos que se le indique y obtener datos de forma transparente para su consumidor, esta semana he descubierto como hacerlo con ADO.NET 2.0 sin tener que codificar a penas nada con las clases que habitan en System.Data.Common.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

15

En el siguiente ejemplo, vamos a conectarnos a la base de datos DBVentas, administrados por SQL Server, utilizando la clase DBFactory. 1. Defina la cadena de conexin en el app.config.
<connectionStrings> <add name="cn" connectionString="server=.;database=DBVentas;integrated security=true" providerName="System.Data.SqlClient"/> </connectionStrings>

2. En el formulario, defina las libreras para trabajar con el origen de datos.


Imports System.Data.Common Imports System.Configuration.ConfigurationManager

3. Defina el Proveedor de DBfactory para conectarse a SQL Server.


Private db As DbProviderFactory = DbProviderFactories.GetFactory(ConnectionStrings("cn").ProviderName)

3. Defina la conexin a la base de datos DBVentas.


Dim cn As DbConnection = db.CreateConnection cn.ConnectionString = ConnectionStrings("cn").ConnectionString

LABORATORIO 1.1 ACCESO A DATOS EN UN FORMULARIO WINDOWS FORM, UTILIZANDO EL ASISTENTE


En este Laboratorio, presentamos un formulario Windows Forms sencillo que muestra los datos de la tabla artculos en una cuadrcula de datos (DataGridView). 1. Ingrese a Visual Studio 2005 2. Selecciona Files -> New ->Project 3. Elija las siguientes opciones: - En Project Types elija Visual Basic - En Templates elija WindowsApplication - En name coloque appFacturacion - En Location coloque C:\CursoPOOII

CIBERTEC

CARRERAS PROFESIONALES

16

4. En el Formulario, Agregue un control DataGridView, para realizar la conexin a la base de datos BDFactura, se muestra la lista de tareas tal como se observa en la figura:
Permite visualizar la lista de tareas del control

5. En la lista de tareas del DataGridView1 (nombre del control) debemos asignar un origen de datos (Choose Data Source), tal como se muestra en la figura. Desplegar dicha opcin; si no tenemos origen de datos, entonces lo aadiremos utilizando la opcin Add Project Data Source, tal como se muestra.
Clickea para elegir un origen de datos

Clickea para aadir un origen de datos al proyecto

6. Al seleccionar la opcin Add Project Data Source, se presenta el asistente de configuracin de origen de datos. La primera opcin es elegir el tipo de origen de datos Choose a Data Source Type, seleccione la opcin Database; luego, presione el botn Next

7. En la segunda ventana del Asistente, permite elegir la conexin de datos Choose Your Data Connection, el cual podemos seleccionar una conexin; en caso de que no haya, presione el botn New Connection.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

17

Presione el botn para crear una nueva conexin

8. Seleccione el origen de datos, el cual ser Microsoft SQL Server, tal como se muestra en la figura; luego, presione el botn OK. 9. Al aadir una nueva conexin, se visualiza una ventana para crear la conexin a la base de datos, donde se ingrese el nombre del servidor Server Name, seleccione la autenticacin Log on to the Server y seleccione la base de datos Select o enter a DataBase Name.
Ingrese el servidor, si utiliza SQL Server 2005, su servidor ser: (local)\SQLEXPRESS.

Seleccione la autenticacin, que puede ser por Windows o SQL Server.

Seleccione la base de datos de la lista

10. Al crear la conexin, sta se visualiza en la ventana Choose Your Data Connection, tal como se muestra en la figura, para continuar con el asistente presione el botn Next.

Conexin generada por el asistente.

Presione la opcin ConnectionString para visualizar la cadena de conexin.

CIBERTEC

CARRERAS PROFESIONALES

18

11. Creada la conexin, debemos elegir la tabla artculos para realizar la consulta, tal como se muestra en la figura. Se puede observar que junto a la seleccin de la tabla artculos se crear un DataSet llamado BDFacturaDataSet, para almacenar la estructura de la tabla artculos. Luego, presione el botn Finish.

Seleccione la tabla artculos de la base de datos. Al seleccionar el objeto de base de datos, se crear un DataSet.

12. Al finalizar, se visualiza el formulario con el DataGridView1 configurado con la tabla artculos, luego presione F5 para ejecutar.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

19

LABORATORIO 1.2 ACCESO A DATOS EN UN FORMULARIO WINDOWS FORM, UTILIZANDO CODIGO DE PROGRAMACION
En este laboratorio, poblaremos un DataGridView con la informacin de los clientes de la base de datos DBVentas basada en una cadena select SQL. A continuacin, ejecutaremos los pasos para ejecutar la consulta SQL y mostrar los resultados en la cuadrcula. 1. Agregue un nuevo formulario de windows al proyecto 2. Agregue un control Label y un control DatGridView tal como se muestra en la figura.

Control Label

Control DataGridView

3. En la ventana de cdigo, se definirn el namespace para SQL Server, en la parte superior, tal como se muestra en la figura.
Imports System.Data.SqlClient

4. Defina, a nivel formulario, la cadena de conexin a la base de datos DBVentas.


Dim strcon As String = "server = .; DataBase=DBVentas; Integrated Security=True"

5. Defina, a nivel formulario, el objeto Connection: SqlConnection, donde al inicializar la conexin, pasar la cadena de conexin definida en strcon.
Private cn As New SqlConnection(strcon)

6. Programa las sentencias en el Evento Load del Form1, para listar los clientes: a. Definir la instancia del objeto DataAdapter llamado da, ejecutando la sentencia de consulta de la tabla tb_clientes. b. La sentencia SQL se ejecutar en el mtodo SelectCommand y los registros resultantes se almacenar en el DataAdapter da. c. Definir un DataTable llamado tabla. d. Poblar los registros resultantes de DataAdapter (da) en tabla. e. Asignar al origen de datos del DataGridView1 el objeto tabla. f. Ejecutar la aplicacin.
Dim da As New SqlDataAdapter(Select * From tb_clientes", cn) Dim tabla As New DataTable da.Fill(tabla) Me.DataGridView1.DataSource = tabla

CIBERTEC

CARRERAS PROFESIONALES

20

LABORATORIO 1.3 EJECUTAR UN PROCEDURE EN UN FORMULARIO WINDOWS FORM, UTILIZANDO DBFACTORY PROVIDER
En este laboratorio, poblaremos un DataGridView al ejecutar un procedimiento almacenado en la base de datos DBVentas, que visualiza los registros de los proveedores. Los siguientes pasos permitirn ejecutar un procedimiento almacenado. 1. En el Administrador de la base de Datos, defina el procedimiento almacenado en la base de datos.
Create Procedure usp_Proveedor As Select * From tb_proveedores

2. Agregue un nuevo formulario de windows al proyecto. 3. Agregue un control Label y un control DatGridView. 4. Agregue en el proyecto un app.config para definir una cadena de conexin a la base de datos DBVentas y defina el proveedor del origen de datos: SqlClient.
<connectionStrings> <add name="cn" connectionString="server=.;database=DBVentas;integrated security=true" providerName="System.Data.SqlClient"/> </connectionStrings>

5. En la ventana de cdigo, defina las libreras para trabajar con la cadena de conexin en app.config y con DBFactory.
Imports System.Data.Common Imports System.Configuration.ConfigurationManager

6. Defina al proveedor DBFactory para conectarse a un origen de datos en SQL Server.


Private db As DbProviderFactory = DbProviderFactories.GetFactory(ConnectionStrings("cn").ProviderName)

7. Programe las siguientes sentencias en el evento load del Form1 para ejecutar el procedimiento almacenado: a. Defina un DBConnection llamado cn, asigne en la propiedad ConnectionString el objeto definido en el app.config llamado cn. b. Defina un DBCommand llamado cmd. Asigne: en la propiedad Connection la conexin cn, en la propiedad CommandText el nombre del procedure, en la propiedad CommandType el tipo de comando, el cual ser un procedimiento almacenado. c. Defina un DbDataAdapter llamado da. d. Asigna en la propiedad SelectCommand del DataAdapter, el comando. e. Defina un DataTable llamado tabla. f. Poblar los registros resultantes de DataAdapter (da) en tabla. g. Asigna al origen de datos del DataGridView1 el objeto tabla.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

21

Dim cn As DbConnection = db.CreateConnection cn.ConnectionString = ConnectionStrings("cn").ConnectionString Dim cmd As DbCommand = cn.CreateCommand cmd.Connection = cn cmd.CommandText = "usp_proveedor" cmd.CommandType = CommandType.StoredProcedure Dim da As DbDataAdapter = db.CreateDataAdapter da.SelectCommand = cmd Dim tabla As New DataTable da.Fill(tabla) Me.DataGridView1.DataSource = tabla

8. Ejecute la aplicacin.

Autoevaluacin
1. Cul es la Arquitectura ADO .NET? _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 2. Cules son los proveedores de datos en .NET Framework? _______________________________________________________________ _______________________________________________________________ 3. Defina brevemente los objetos principales de los proveedores de datos _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 4. Defina brevemente los parmetros de una cadena de conexin _______________________________________________________________ _______________________________________________________________ 5. Qu es el Connection Pooling? _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 6. Cules son los objetos para realizar una conexin utilizando DBFactory _______________________________________________________________ _______________________________________________________________ _______________________________________________________________

CIBERTEC

CARRERAS PROFESIONALES

22

Resumen
El proveedor de datos .NET de SQL Server o del proveedor de datos .NET de OLE DB requiere de la instalacin de la versin 2.8 de Microsoft Data Access Components. Existen 4 tipos de proveedores de datos: SqlClient, OleDB, ODBC, OracleClient. El objeto DataAdapter o adaptador de datos permite llenar un DataSet y realizar actualizaciones a la base de datos. El objeto DataReader es un lector de datos; el objeto DataSet almacena un conjunto de datos para realizar operaciones de consulta y actualizacin. La conectarse a una base de datos en SQL Server, se requiere de los siguientes parmetros: Data Source, Inicial Catalog, Integrated Security o User Id. La cadena de conexin es almacenada en un app.config dentro de la etiqueta connectionString. El objeto Command ejecuta sentencias SQL, procedimientos almacenados, funciones, as como sentencias de definicin de datos: crear y eliminar tablas. Cuando se ejecuta un Command de actualizacin, se debe abrir la conexin cn.Open () y al finalizar el proceso cerrar la conexin cn.Close (). La librera DBFactory, es una clase abstracta o conjunto de funciones encargadas de adaptarse a la base de datos que se le indique y obtener datos de forma transparente para su consumidor, esta semana he descubierto como hacerlo con ADO.NET 2.0, codificando mnimamente con las clases que habitan en System.Data.Common.

Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas:
http://msdn2.microsoft.com/es-es/library/e80y5yhx(VS.80).aspx Referencia a ADO.NET 2.0 http://msdn.microsoft.com/es-es/library/27y4ybxw(VS.80).aspx Referencia a la arquitectura de ADO.NET http://sabia.tic.udc.es/docencia/is/old/2006-2007/docs/transparencias/03ADO.NET.pdf Referencia a ADO.NET, arquitectura, diseo e implementacin

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

23

UNIDAD DE APRENDIZAJE

1
SEMANA

2
OPERACIONES DE CONSULTA Y RECUPERACION DE DATOS UTILIZANDO ADO.NET
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que se conectan a un origen de datos utilizando los objetos de ADO.NET para realizar operaciones de consulta y recuperacin de datos.

TEMARIO
Arquitectura y componentes de ADO.NET. Administracin almacenamiento de una cadena de conexin a un origen datos. Operaciones de consulta sobre un origen de datos. Recuperacin de datos utilizando DataAdapter, DataReader y Command. Manejo de TableAdapter, Usando LINQ to SQL. Modificacin de datos, manejo de transacciones de datos y excepciones. de

ACTIVIDADES PROPUESTAS
Los alumnos utilizan los objetos de ADO.NET: DataAdapter, DataReader y Command para realizar las consultas de datos. Los alumnos definen y ejecutan procedimientos almacenados para consultar informacin de un origen de datos.

CIBERTEC

CARRERAS PROFESIONALES

24

CONEXIN CON DATOS Y RECUPERACION EN ADO .NET


La principal funcin de cualquier aplicacin de base de datos es conectarse a un origen de datos y recuperar los datos contenidos. Los proveedores de .NET Framework para ADO.NET sirven como puente entre una aplicacin y un origen de datos, permitindole ejecutar comandos y recuperar datos mediante un DataReader, DataAdapter o un TableAdapter.

2 TRABAJO CON DATAADAPTERS


Un DataAdapter se utiliza para recuperar datos de un origen de datos y llenar tablas con un DataSet. El DataAdapter, tambin, resuelve los cambios realizados en el DataSet de vuelta al origen de datos. Mediante el objeto Connection del proveedor de datos de .NET Framework, DataAdapter se conecta a un origen de datos y utiliza objetos Command para recuperarlos del origen de datos y resolver los cambios a dicho origen. Cada proveedor de datos de .NET Framework incluido en .NET Framework cuenta con un objeto DataAdapter:

Proveedor
OleDataAdapter SqlDataAdapter OdbcDataAdapter OracleDataAdapter

Descripcin
Proveedor de datos para OLE DB Proveedor de datos para SQL Server Proveedor de datos para ODBC Proveedor de datos para Oracle

2.1 Forma de llenar un DataSet desde un DataAdapter


Un DataSet representa un conjunto completo de datos que incluye restricciones y tablas, as como relaciones entre estas ltimas. Dado que DataSet es independiente del origen de datos, puede incluir datos locales de la aplicacin, as como datos de otros muchos orgenes. La interaccin con los orgenes de datos existentes se controla mediante el DataAdapter. La propiedad SelectCommand del DataAdapter es un objeto Command que recupera datos del origen de datos. El mtodo Fill del DataAdapter se usa para llenar un DataSet con los resultados de la propiedad SelectCommand del DataAdapter. El mtodo Fill acepta como argumentos un DataSet que se debe llenar y un objeto DataTable, o su nombre, que se debe llenar con las filas que devuelve SelectCommand. En el siguiente ejemplo de cdigo se muestra cmo crear un objeto SqlDataAdapter para llenar en el DataSet la lista de Clientes (Customers) de la base de datos Northwind de SQL Server.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

25

'cn sera el Objeto SqlConnection para la Base de Datos BDFactura Dim queryString As String = _ "SELECT CustomerID, CompanyName FROM dbo.Clientes" Dim adapter As New SqlDataAdapter(queryString, cn) Dim customers As DataSet = New DataSet 'poblar los datos en el DataSet y defina una Tabla Customers adapter.Fill(customers, "Clientes")

3. TRABAJO CON DATAREADERS


El DataReader de ADO.NET recupera secuencias de datos de slo lectura y slo avance de una base de datos. Los resultados se devuelven a medida que se ejecuta la consulta y se almacenan en el bfer de red del cliente hasta que se solicitan con el mtodo Read del DataReader. Con el DataReader puede aumentar el rendimiento de la aplicacin tanto al recuperar datos en cuanto estn disponibles como al almacenar (de forma predeterminada) una fila cada vez en memoria, lo que reduce la sobrecarga del sistema. Cada proveedor de datos de .NET Framework incluido en .NET Framework cuenta con un objeto DataReader:

Proveedor
OleDataReader SqlDataReader OdbcDataReader OracleDataReader

Descripcin
Proveedor de datos para OLE DB Proveedor de datos para SQL Server Proveedor de datos para ODBC Proveedor de datos para Oracle

3.1 Recuperacin de datos mediante DataReader


La recuperacin de datos mediante DataReader implica crear una instancia del objeto Command y de un DataReader, para lo cual se llama a Command.ExecuteReader a fin de recuperar filas de un origen de datos. En el ejemplo se muestra cmo se utiliza unSqlDataReader, donde command representa un objeto SqlCommand vlido.
'Definir el Objeto CmdReader Dim CmdReader As New SqlCommand 'reader cargara los datos al ejecutar el Metodo ExecuteReader Dim reader As SqlDataReader = CmdReader.ExecuteReader()

El mtodo Read del objeto DataReader permite obtener una fila a partir de los resultados de una consulta. Para tener acceso a cada columna de la fila devuelta, puede pasar a DataReader el nombre o referencia numrica de la columna en cuestin.

CIBERTEC

CARRERAS PROFESIONALES

26

Sin embargo, el mejor rendimiento se logra con los mtodos que ofrece el DataReader y que permiten tener acceso a los valores de las columnas en sus tipos de datos nativos (GetDateTime, GetDouble, GetGuid, GetInt32, etc). En el ejemplo de cdigo siguiente se repite por un objeto DataReader y se devuelven dos columnas de cada fila.
Dim str As String = "" Dim query As String = _ "SELECT CustomerID, CompanyName FROM dbo.Customers" 'Definir el Objeto CmdReader Dim CmdReader As New SqlCommand(query, cn) Dim reader As SqlDataReader = CmdReader.ExecuteReader() 'Preguntamos si el reader tiene filas If reader.HasRows Then 'Bucle que se ejecuta si se puede leer un registro en reader Do While reader.Read str += reader.GetString(0) + vbTab + reader.GetString(1) Loop End If 'Terminado el proceso cerrar el reader reader.Close()

3.2 Cerrar el DataReader


Siempre debe llamar al mtodo Close cuando haya terminado de utilizar el objeto DataReader. Tenga en cuenta que mientras est abierto un DataReader, ste utiliza de forma exclusiva el objeto Connection.

4 TRABAJO CON COMMANDOS


Una vez establecida una conexin a un origen de datos, puede ejecutar: Sentencias SQL, Procedimiento Almacenados, Funciones y devolver resultados desde el mismo mediante un objeto Command. Para crear un comando, puede utilizar el constructor Command, que toma argumentos opcionales de una instruccin SQL para ejecutar en el origen de datos, un objeto Connection y un objeto Transaction. Tambin puede crear un comando para una determinada conexin mediante el mtodo CreateCommand del objeto Connection. La instruccin SQL del objeto Command se puede consultar y modificar mediante el uso de la propiedad CommandText. Cada proveedor de datos de .NET Framework incluido en .NET Framework cuenta con un objeto Command:

Proveedor
OleDbCommand SqlCommand OdbcCommand OracleCommand

Descripcin
Proveedor de datos para OLE DB Proveedor de datos para SQL Server Proveedor de datos para ODBC Proveedor de datos para Oracle

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

27

4.1 Ejecucin de un comando


El objeto Command expone varios mtodos Execute que puede utilizar para llevar a cabo la accin deseada.

Mtodo
ExecuteReader ExecuteScalar ExecuteNonQuery

Descripcin
Los resultados se devuelven en una secuencia de datos para devolver un objeto DataReader. Retorna valor Singleton. Se utiliza para ejecutar comandos que no retornan filas.

En el siguiente ejemplo de cdigo, se muestra cmo crear un objeto SqlCommand para ver una lista de categoras de la base de datos Northwind de SQL Server.
'cn sera el Objeto SqlConnection para la Base de Datos Northwind Dim cmd As New SqlCommand("Select * from dbo.Categories", cn)

4.2 Ejecucin de una consulta que retorne un conjunto de resultados


Los objetos Command de ADO .Net tiene un mtodo ExecuteReader el cual permite ejecutar una consulta que retorna uno o ms conjunto de resultados. Al ejecutar el mtodo ExecuteReader podemos pasar un parmetro al mtodo, el cual representa la enumeracin CommandBehavior, que permite controlar al Command como es ejecutado. A continuacin, mostramos CommandBehavior. la descripcin de los enumerables del

Valor del CommandBehavior


CommandBehavior.CloseConnection

Descripcin
Se utiliza para cerrar la conexin en forma automtica, tan pronto como el DataReader es cerrado. Retorna un nico conjunto de resultados. Retorna una fila.

CommandBehavior.SingleResult CommandBehavior.SingleRow

En el siguiente ejemplo, se muestra cmo ejecutar una sentencia SQL que visualice el nombre y precio de los artculos almacenados en la base de datos BDFactura. 1. La sentencia SQL a Ejecutar en el comando.
Select art_nombre, art_precio From dbo.Articulos

CIBERTEC

CARRERAS PROFESIONALES

28

2. Programe las siguientes sentencias para ejecutar la sentencia sql. Utilice el bloque Using. a. Abra la conexin cn. b. Establecer la estructura Using cmd. c. Defina un DataReader llamado reader. d. Ejecute el Command cmd con el mtodo ExecuteReader e indicar la numeracin CommandBehavior.CloseConnection or CommandBehavior.SingleResult. e. Preguntamos si tiene filas el reader (HasRows), procedemos a leer los datos, despus de la lectura, cerramos el DataReader.
cn.Open() Using cmd As New SqlCommand("Select art_nombre, art_precio From dbo.Articulos", cn) Dim reader As SqlDataReader reader = cmd.ExecuteReader( _ CommandBehavior.CloseConnection Or CommandBehavior.SingleResult) If reader.HasRows Then While reader.Read ListBox1.Items.Add(reader.GetString(0) + vbTab + _ reader.GetDecimal(1).ToString) End While End If reader.Close() End Using

4.3 Ejecucin de procedimientos almacenados utilizando Command


Los procedimientos almacenados ofrecen numerosas ventajas en el caso de aplicaciones que procesan datos. Mediante los procedimientos almacenados, las operaciones de bases de datos se pueden encapsular en un solo comando, se optimizan para lograr el mejor rendimiento y disfrutan de una seguridad adicional.
'El Command ejecutara un Procedimiento Almacenado Dim cmd As New SqlCommand("usp_Vendedor", cn) 'Establecer la Propiedad CommandType cmd.CommandType = CommandType.StoredProcedure

Aunque es cierto que para llamar a un procedimiento almacenado basta con pasar en forma de instruccin SQL su nombre seguido de los argumentos de parmetros, el uso de la coleccin Parameters del objeto Command de ADO.NET permite definir ms explcitamente los parmetros del procedimiento almacenado, as como tener acceso a los parmetros de salida y a los valores devueltos. Un objeto Parameter se puede crear mediante el constructor Parameter o al llamar al mtodo Add de la coleccin Parameters de Command. Parameters.Add acepta como entrada argumentos del constructor o cualquier objeto Parameter ya existente. Al establecer como una referencia nula el valor de Value de un objeto Parameter, debe utilizar DBNull.Value. En el caso de parmetros que no sean de entrada (Input), debe asignar a la propiedad ParameterDirection un valor que especifique cul es el tipo de parmetro: InputOutput, Output o ReturnValue.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

29

Para llamar a un procedimiento almacenado, establezca el CommandType del objeto Command como StoredProcedure. Al asignar el valor StoredProcedure a CommandType, puede utilizar la coleccin Parameters para definir parmetros. 4.3.1 Ejecutar un procedimiento almacenado con parmetro. 1. Ejecute un procedimiento llamado usp_facturas_cliente
CREATE PROCEDURE USP_FACTURAS_CLIENTE @cli char(5) AS Select * from dbo.fac_cabe Where cli_codigo=@cli

2. Defina un objeto SqlCommand llamado cmd el cual ejecutar el procedimiento almacenado usp_facturas_cliente, defina la propiedad CommandType a StoreProcedure. Agregue el valor del parmetro @cli.
Using cn As New SqlConnection(strcon) Dim cmd As New SqlCommand("usp_facturas_cliente", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@cli",SqlDbType.Char).Value="C0002" ...........

3. Para guardar el resultado del Procedure, se crearn los objetos DataAdapter y DataSet. A continuacin, definido el Command, definiremos los objetos que guardarn los registros.
........... Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim ds As New DataSet da.Fill(ds, "Facturas") End Using

CIBERTEC

CARRERAS PROFESIONALES

30

LABORATORIO 2-1 CONSULTA DE DATOS, UTILIZANDO COMMAND


En este escenario, se mostrar los registros almacenados en la tabla clientes de la base de datos BDFactura; para lo cual se har uso del objeto Command, para ejecutar la sentencia SQL, el objeto DataAdapter para recuperar los registros. 1. Ingrese a Visual Studio 2005. 2. Seleccione en el men Files -> New ->Project. 3. Elija las siguientes opciones de la ventana para crear un nuevo proyecto. - En Project Types elija Visual Basic. - En Templates elija WindowsApplication. - En name coloque appFacturacion02. - En Location coloque C:\CursoPOOII. 2 Disee la siguiente interface de usuario como la siguiente figura:

Control Label

Control DataGridView

Objeto Label 1 DataGridView1 3

Propiedad Text

Valor Listado de Clientes

Utilice el Namespace System.Data.SqlClient dentro de la clase Form1; agregar cdigo en el evento load del Form1 para visualizar los clientes al cargar el Form1. Luego, ejecutar el formulario.
Using cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=DBVentas; integrated security=true") Using cmd As New SqlCommand("Select* from tb_Clientes", cn) Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim ds As New DataSet da.Fill(ds, "Clientes") Me.DataGridView1.DataSource = ds.Tables("Clientes") End Using End Using

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

31

LABORATORIO 2-2 CONSULTA DE DATOS, UTILIZANDO COMANDOS PARAMETRIZADOS


En este escenario desarrollaremos una consulta a las facturas por cliente, donde al seleccionar un cliente dentro de un ComboBox, visualizamos las facturas correspondientes al cliente seleccionado.

1. Agregue un nuevo formulario de Windows al proyecto.


Control ComboBox

Control DataGridView

Objeto
Label 1 ComboBox1 DataGridView1

Name
Label1 CboCliente DGFactura

Propiedad
Text

Valor
Seleccione un Cliente

2. Cuando necesitamos mostrar en un control de seleccin: ComboBox o ListBox, una lista de valores provenientes de un campo de una tabla, debemos configurar sus propiedades: Propiedad
DataSource DisplayMember ValueMember

Descripcin
Origen de datos del control. Campo a visualizar. Valor del campo permanecer oculto.

3. Declare e inicialice el objeto Connection, a nivel clase Form2


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

4. En el evento Load Form2, procedemos a cargar el ComboBox CboCliente.


Dim cmd As New SqlCommand( _ "Select cli_codigo, cli_nombre from tb_clientes", cn) Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim tabla As New DataTable da.Fill(tabla) Addhandler direcciona Me.CboCliente.DataSource = tabla el evento Me.CboCliente.DisplayMember = "NombreCia" Me.CboCliente.ValueMember = "ClienteID" SelectedIndexChanged Addhandler CboCliente.SelectedIndexChanged, _ del CboCliente al addressof CboCliente_SelectedIndexChanged mtodo.

CIBERTEC

CARRERAS PROFESIONALES

32

5. Definir el mtodo de evento CboCliente_SelectedIndexChanged que permite desencadenar el evento SelectedIndexChanged del CboCliente, donde al seleccionar un cliente visualice las facturas.
Private Sub CboCliente_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Consulta con Dim cod As String = CboCliente.SelectedValue parmetro @cli Dim cmd As New SqlCommand( _ "Select * from dbo.fac_cabe Where cli_codigo=@cli", cn) cmd.Parameters.Add("@cli", SqlDbType.Char).Value = cod Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim tabla As New DataTable da.Fill(tabla) Me.DGFactura.DataSource = tabla End Sub Agregar el parmetro @cli en el Command Poblar los datos al DataTable tabla

6. Ejecute el formulario y ejecute la seleccin en el ComboBox CboCliente.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

33

LABORATORIO 2-3 CONSULTA DE DATOS, UTILIZANDO PROCEDURES Y PARMETROS


En este escenario, desarrollaremos una consulta a las facturas por vendedor y ao, donde al seleccionar un vendedor dentro de un ComboBox y un ao dentro de un ComboBox, visualizamos las facturas correspondientes al vendedor y ao seleccionado. 1. Agregue un nuevo formulario de Windows al proyecto.
Control ComboBox CboVendedor Control Button BtnConsulta Control ComboBox CboAo

Control DataGridView DGFactura

Objeto
Label1 Label2 ComboBox1 ComboBox2 Button DataGridView1

Name
Label1 Label2 CboVendedor CboAo BtnConsulta DGFactura

Propiedad
Text Text

Valor
Vendedor Ao

Text

Consulta

2. Definimos el procedimiento almacenado a ejecutar, donde, en su definicin agregamos dos parmetros.

CREATE PROCEDURE USP_FACTURA_YEAR_VENDEDOR @ven char(5), @y int As Select * from fac_cabe Where ven_codigo=@ven and year(fac_fecha)=@y

3. Declaracin e inicializacin del objeto Connection, a nivel clase Form.


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

CIBERTEC

CARRERAS PROFESIONALES

34

4. En el evento Load del Form, procedemos a cargar el ComboBox CboVendedor, para lo cual ejecutamos una consulta que recupera los datos de los vendedores.
Dim cmd As New SqlCommand( _ "Select Ven_codigo, Ven_nombre from dbo.Vendedor", cn) Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim tabla As New DataTable da.Fill(tabla) Me.CboVendedor.DataSource = tabla Me.CboVendedor.DisplayMember = "Ven_nombre" Me.CboVendedor.ValueMember = "Ven_codigo"

Enlazar el CboVendedor a tabla, enlazamos los datos en el DisplayMember y ValueMember

5. En el mismo evento Load del Form, procedemos a cargar el ComboBox CboAo, para lo cual ejecutamos una consulta que recupera los datos de los Aos facturados. Observamos que los objetos se instancian para ser reutilizados.
cmd = New SqlCommand("Select distinct + _ Year(fac_fecha) as y from dbo.fac_cabe", cn) da = New SqlDataAdapter da.SelectCommand = cmd tabla = New DataTable da.Fill(tabla) Me.CboAo.DataSource = tabla Me.CboAo.DisplayMember = "y" Me.CboAo.ValueMember = "y"

Enlazar el CboAo a tabla, enlazamos los datos en el DisplayMember y ValueMember

6. En el evento Click del botn BtnConsulta se realiza el proceso de seleccin de las

facturas por ao y vendedor seleccionado. En este proceso se ejecuta el Procedure y se aade sus parmetros.

Dim cmd As New SqlCommand("USP_FACTURA_YEAR_VENDEDOR", cn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@ven", SqlDbType.Char).Value = CboVendedor.SelectedValue cmd.Parameters.Add("@y", SqlDbType.Int).Value = CboAo.SelectedValue Dim da As New SqlDataAdapter da.SelectCommand = cmd Dim tabla As New DataTable da.Fill(tabla) Me.DGFactura.DataSource = tabla

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

35

7. Ejecute el formulario y efectuar la seleccin.

LABORATORIO 2-4 NAVEGACIN DE REGISTROS DE DATOS.


En este escenario vamos a navegar por la filas de una tabla de un DataSet, mediante el empleo de la clase CurrencyManager.

Qu es el objeto CurrencyManager?
El objeto CurrencyManager le permite sincronizar controles enlazados a medida que un usuario examina las filas de una tabla. Por ejemplo, CurrencyManager le permite mostrar las propiedades FirstName y LastName correctas en controles TextBox enlazados diferentes a medida que un usuario examina la tabla clientes. Puede utilizar estos eventos para hacer un seguimiento de cundo un usuario se mueve por las filas y de cundo modifica valores de controles enlazados. En este laboratorio describe qu acciones se van a realizar para navegacin por los registros de clientes utilizando el objeto CurrencyManager. 1. Agregar un nuevo formulario de Windows al proyecto.
Controles TextBox

Controles Button

Objeto
Label1 Label2 Label3 Label4 Textbox1 Textbox2 Textbox3 Textbox4 Button1 Button2 Button3 Button4

Name
Label1 Label2 Label3 Label4 Txtcodigo Txtnombre Txtdireccion Txtruc Btnprimero Btnanterior Btnsiguiente Btnultimo

Propiedad
Text Text Text Text Text Text Text Text Text Text Text Text

Valor
Codigo Nombre Direccion Ruc

|< < > >|

CIBERTEC

CARRERAS PROFESIONALES

36

2. Definimos la sentencia SQL, donde visualiza los datos de los clientes.


Select cli_codigo, cli_nombre, cli_direccion, cli_ruc from dbo.clientes

3. Declaracin e inicializacin del objeto Connection, a nivel clase Form.


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

4. Declarar el objeto CurrencyManager a nivel Form.


Private WithEvents myCurrencyManager As CurrencyManager

5. En el evento Load del Form, cargamos el DataSet ds, que permitir enlazar los datos a los TextBox; luego, especificamos el CurrencyManager de la tabla.
Dim daCust As New SqlDataAdapter( _ "Select * from dbo.clientes", cn) Dim ds As New DataSet() daCust.Fill(ds, "Clientes") txtcodigo.DataBindings.Add( _ "Text", ds.Tables!Clientes, "cli_codigo") txtdireccion.DataBindings.Add( _ "Text", ds.Tables!Clientes, "cli_direccion") txtnombre.DataBindings.Add( _ "Text", ds.Tables!Clientes, "cli_nombre") txtruc.DataBindings.Add( _ "Text", ds.Tables!Clientes, "cli_ruc") 'Especificar el CurrencyManager de la tabla Clientes. myCurrencyManager = CType(Me.BindingContext(ds.Tables!Clientes), CurrencyManager)

6. En el proceso de navegacin, a cada botn se le agregar sentencias de navegacin. En el evento del botn btnprimero, el puntero se ubicar en el primer registro.
myCurrencyManager.Position = 0

7. En el evento del botn btnanterior, el puntero se ubicar al registro anterior.


If myCurrencyManager.Position > 0 Then 'retroceder una fila. myCurrencyManager.Position -= 1 End If

8. En el evento del botn btnsiguiente, el puntero se ubicar en el registro siguiente.


If myCurrencyManager.Position < myCurrencyManager.Count Then 'avanzar una fila. myCurrencyManager.Position += 1 End If

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

37

9. En el evento del botn btnultimo, el puntero se ubicar en el ltimo registro.


myCurrencyManager.Position = myCurrencyManager.Count

Autoevaluacin

1. Sobre la base del siguiente formulario, seleccione un mes y ao desde los controles ComboBox, y al hacer click en el botn consulta, visualice las facturas en el DataGridView que coincidan con el mes y ao seleccionado.

2. Construya un formulario de navegacin que permita desplazarse y mostrar en los textbox los datos de las facturas al seleccionar un determinado ao en un control ComboBox. Debe de enlazar en tiempo de ejecucin.

CIBERTEC

CARRERAS PROFESIONALES

38

Resumen
En cualquier lenguaje de programacin, es necesario una conexin de datos. El DataAdapter tiene 4 metodos: SelectCommand ejecuta operaciones de Consulta, InsertCommand ejecuta operacin de Insercin, UpdateCommand ejecuta operaciones de Actualizacion y DeleteCommand ejecuta operaciones de eliminacin de registros a la base de datos. Despus de configurar el Command, se puede ejecutar. Los Command admiten 4 tipos de mtodos: ExecuteReader ejecuta una instruccin SQL o procedimiento de Consulta retornando un conjunto de registros que sern almacenados en un DataReader, ExecuteNonQuery ejecuta una instruccin SQL o procedimiento de actualizacin retornando el numero de registros afectados, ExecuteScalar ejecuta una instruccin SQL o procedimiento almacenado retornando un valor, ExecuteXMLReader obtiene datos en XML. El DataReader de ADO.NET recupera secuencias de datos de slo lectura y slo avance de una base de datos. Los resultados se devuelven a medida que se ejecuta la consulta y se almacenan en el bfer de red del cliente hasta que se solicitan con el mtodo Read del DataReader. Los comandos parametrizados y procedimientos almacenados con parmetros utilizan el objeto parameter para definir un parmetro y cargarlo al objeto command en el mtodo Command.Parameters.Add. Los controles enlazados a datos utilizan la propiedad DataSource; para los controles de lista de datos, utilizan dos propiedades: DisplayMember, que es el campo a visualizar y el ValueMember, que es el valor del Campo a visualizar

. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas:
http://msdn2.microsoft.com/es-es/library/ms254953(VS.80).aspx Pgina que referencia al tema de Trabajo con comandos http://support.microsoft.com/kb/311543/es Pgina que referencia al objeto Currency Manager

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

39

UNIDAD DE APRENDIZAJE

1
SEMANA

3
MANEJO DEL TABLEADAPTER, USANDO LINQ TO SQL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que se conectan a un origen de datos utilizando los objetos de ADO.NET para realizar operaciones de consulta y actualizacin de datos.

TEMARIO
Arquitectura y componentes de ADO.NET. Administracin almacenamiento de una cadena de conexin a un origen datos. Operaciones de consulta sobre un origen de datos. Recuperacin de datos utilizando DataAdapter, DataReader y Command. Manejo de TableAdapter, Usando LINQ to SQL Modificacin de datos, manejo de transacciones de datos y excepciones. de

ACTIVIDADES PROPUESTAS
Los alumnos utilizan el asistente del Visual Studio 2005 para crear los objetos de datos enlazados a un origen de datos. Los alumnos realizan operaciones de consulta y actualizacin de datos en el TableAdapter. Los alumnos utilizan el Mapeo de datos, LINQ, para conectarse a un origen de datos, para realizar operaciones de consulta y filtro de datos.

CIBERTEC

CARRERAS PROFESIONALES

40

1. TABLEADAPTERS
Los TableAdapters proporcionan comunicacin entre su aplicacin y una base de datos mediante la ejecucin de instrucciones SQL y procedimientos almacenados. Los TableAdapter se crean con el Diseador de DataSet dentro de los conjuntos de datos con establecimiento inflexible de tipos. Se pueden crear con el Asistente para Configuracin de TableAdapter, o arrastrando los objetos de base de datos del Explorador de servidores al Diseador de DataSet. Aunque los objetos TableAdapter se disean con el Diseador de DataSet, las clases TableAdapter generadas no se generan como clases anidadas de DataSet. Se encuentran en un espacio de nombres separado y especfico para cada conjunto de datos. Para tener acceso a un TableAdapter mediante programacin, debe declarar una nueva instancia del TableAdapter.
Dim Ds As New DsFactura Dim ArticuloTableAdapter As New _ DsFacturaTableAdapters.ArticulosTableAdapter() ArticuloTableAdapter.Fill(Ds.Articulos)

A diferencia de los DataAdapters, los TableAdapter pueden contener varias consultas que rellenan las tablas de datos asociadas. Puede definir tantas consultas para un TableAdapter como requiera la aplicacin, con tal de que cada consulta devuelva datos que cumplan el mismo esquema que la tabla de datos asociada. Por ejemplo, si la aplicacin contiene una tabla de artculos, puede crear una consulta para rellenar la tabla con todos los artculos cuyo cdigo sea igual a un parmetro @cod y otra consulta para rellenar la tabla con todos los artculos.

Consulta principal del esquema de la tabla

Consulta adicionales que retornar diferentes vistas

El nombre asignado a un TableAdapter en el momento de su creacin se basa en el nombre de la tabla con la que est trabajando. A continuacin, se muestran los mtodos y propiedades de TableAdapter ms utilizados:

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

41

Miembro
TableAdapter.Fill

Descripcin
Rellena la tabla de datos asociada del TableAdapter con los resultados del comando SELECT del TableAdapter. Devuelve los cambios a la base de datos. Devuelve una nueva DataTable con datos. Crea una nueva fila en la tabla de datos. Determina si se vaca una tabla de datos antes de llamar a uno de los mtodos Fill.

TableAdapter.Update TableAdapter.GetData TableAdapter.Insert TableAdapter.ClearBeforeFill

1.1 UTILIZANDO EL ASISTENTE PARA CONFIGURAR CONSULTAS DENTRO DE UN TABLEADAPTER


El Asistente para la configuracin de consultas de TableAdapter ayuda a crear y editar las consultas adicionales que se pueden agregar a TableAdapters. Una consulta de TableAdapter es cualquier consulta SQL vlida o cualquier procedimiento almacenado que devuelve datos que satisfacen el mismo esquema que la tabla de datos asociada de TableAdapter o un valor escalar. Para iniciar el Asistente. 1. Abra su conjunto de datos en el Diseador de DataSet.

Seleccione el Item DataSet Asignarle un Nombre: DsFactura

2.
o o

Si est creando un nuevo TableAdapter: Se puede Arrastrar del ToolBox al DataSet: DsFactura. Haciendo click derecho en el DataSet DsFactura, seleccione la opcion Add TableAdapter.
Permite agregar un TableAdapter.

CIBERTEC

CARRERAS PROFESIONALES

42

3. En la pgina Elija la conexin de datos, seleccione o cree la conexin que utilizar la consulta, al seleccionar Nueva Conexin, deber indicar el servidor, autenticacin y base de datos, presione el botn OK.
Crear una Nueva Conexin

Establece la conexin: servidor autenticacin y base de datos

4. En la pgina Elija un tipo de comando, seleccione entre los mtodos siguientes para obtener datos de la base de datos: o Usar instrucciones SQL permite escribir una instruccin SQL para seleccionar los datos de la base de datos. o Crear un nuevo procedimiento almacenado - El asistente crea un nuevo procedimiento almacenado (en la base de datos) segn la instruccin SELECT especificada. o Usar procedimientos almacenados existentes - Seleccione esta opcin para ejecutar un procedimiento almacenado existente.

Al seleccionar SQL Statement, en la siguiente ventana definir Select.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

43

5. En la pgina Elegir los metodos que se van a generar, proporciona las opciones para seleccionar mtodos genera el asistente para la consulta. Rellenar un DataTable.- Crea un mtodo para rellenar la tabla de datos. El usuario pasa el nombre de la tabla de datos como un parmetro al llamar a este mtodo para llenar la tabla de datos con los datos devueltos. Tambin, puede cambiar el nombre predeterminado en el cuadro Nombre de mtodo. Devolver un DataTable.- Crea un mtodo para devolver una tabla de datos llena. Tambin puede cambiar el nombre predeterminado en el cuadro Nombre de mtodo.

Mtodo Fill, para llenar los datos.

Funcin GetData, retorna los registros.

6. Al finalizar se crear un TableAdapter, con sus mtodos Fill(), GetData().

ENLACE DE UNA FUENTE DE DATOS EN VISUAL STUDIO


Visual Studio proporciona herramientas en tiempo de diseo para trabajar con objetos personalizados. El nico requisito para que los objetos personalizados trabajen con las herramientas de diseo de datos de Visual Studio es que deben contar al menos con una propiedad pblica. No se precisa ningn constructor ni atributo concreto para que los objetos personalizados trabajen con herramientas como la ventana Orgenes de datos. En este escenario se muestra cmo crear objetos que contengan datos de clientes y facturas, y crear a continuacin un origen de datos de objeto basado en estos objetos.

CIBERTEC

CARRERAS PROFESIONALES

44

2.1 MTODO DE AADIR UN DATASET AL PROJECTO


1. En la opcin Menu Project Add New Item. 2. Selecione la opcin DataSet, asignarle el Nombre Facturacin.xsd, presione el botn Add.

2.2 CREACIN DE UNA CONEXIN A LA BASE DE DATOS BDFACTURA


1. En la opcin Menu View click en Server Explorer 2. En el Server Explorer, cree una conexin a la Base de Datos: click derecho a DataConnections, seleccione Add Connection. 3. Cree la conexin a la base de datos BDFactura de SQL SERVER.

2.3 CREACIN DE LA TABLA CLIENTES


1. Expanda la Data Connection y expanda el Nodo Tables. 2. Arrastre la tabla Clientes del Server Explorer al Diseador del DataSet; una tabla clientes y clientesTableAdapter son aadidos al DataSet.

2.4 CREACIN DE TABLA FACTURAS 1. Arrastre la tabla Fac_ al Diseador del DataSet; la tabla fac_cabe y fac_cabeTableAdapter son aadidos. 2.5 CREACIN DE DATARELATIONS DENTRO DEL DATASET 1. Arrastre un objeto relation desde el ToolBox del DataSet hacia la tabla hija de la relacin (Fac_cabe).

2. Seleccione la tabla Parent (clientes), verifique la tabla Chile (fac_cabe), se visualizan las columnas a relacionar. En tipo de relacin a crear es Relation Only, significa que slo es consulta entre ambas tablas; luego, presione el botn OK.

3. Al presionar el botn OK se crear la relacin, en la cual aparecer en el diseador entre las dos tablas.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

45

2.6 FORMA DE POBLAR UN DATASET CON DATOS UTILIZANDO UN TABLEADAPTER


Para poblar un DataTable utilizando un TableAdapter, ejecute el mtodo Fill del TableAdapter para cargarlo hacia la tabla. En el Load del Form, poblar la tabla clientes del DataSet Facturacin, utilizar el mtodo Fill del TableAdapter a la tabla clientes y muestre los datos en el DataGridView.

Dim ds As New Facturacion Dim cli As New FacturacionTableAdapters.ClientesTableAdapter cli.Fill(ds.Clientes) Me.DataGridView1.DataSource = ds.Clientes

3 LINQ PARA .NET


Se conoce como LINQ a un Lenguaje Integrado de Consultas (Language Integrated Query). Nos va a permitir poder manipular mejor la informacin dentro de nuestras aplicaciones. Se basa en varias funcionalidades, tales como colecciones que pueden incluir arreglos, clases, enumerables, XML y base de datos. El proyecto LINQ usa caractersticas de la versin 2.0 del .NET Framework, nuevos ensamblados relacionados con LINQ, y extensiones para los lenguajes C# y Visual Basic .NET. Microsoft ha distribuido una versin previa del LINQ, consistente de estas bibliotecas y compiladores para C# 3.0 y Visual Basic 9. Otros lenguajes, como F# y Nemerle, han anunciado brindar soporte preliminar. La arquitectura LINQ es el siguiente:

CIBERTEC

CARRERAS PROFESIONALES

46

3.1 LINQ to SQL


LINQ to SQL es una implementacin de O/RM (object relational mapping, mapeador de objetos relacionales) que viene con la versin 2008 del .NET Framework, y permite modelar bases de datos relacionales con clases de .NET. Podemos consultar bases de datos con LINQ, as como actualizar/aadir/borrar datos de ellas. Hay dos herramientas disponibles para generar automticamente un modelo de Visual Basic o C# a partir de los metadatos de una base de datos existente: El Diseador relacional de objetos proporciona una interfaz de usuario completa para ayudarle a generar un modelo de objetos LINQ to SQL. Herramienta de lnea de comandos SQLMetal. 3.1.1 Diseador relacional de objetos El Diseador relacional de objetos proporciona una superficie de diseo visual para crear clases de entidad y asociaciones (relaciones) de LINQ to SQL basadas en los objetos de una base de datos. El Diseador relacional de objetos se usa para crear un modelo de objetos en una aplicacin que se asigna a los objetos de una base de datos. Genera una clase DataContext con establecimiento inflexible de tipos, que se usa para enviar y recibir datos entre las clases de entidad y la base de datos. El Diseador relacional de objetos tambin proporciona la funcionalidad para asignar los procedimientos almacenados y funciones a los mtodos de DataContext con el fin de devolver datos y rellenar las clases de entidad. Por ltimo, el Diseador relacional de objetos permite disear relaciones de herencia entre las clases de entidad.

3.1.2 Entendiendo la clase DataContext Visual Studio genera clases .NET para representar las entidades y las relaciones de la base de datos que hemos modelado.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

47

Por cada archivo aadido a nuestra solucin por el diseador LINQ to SQL tambin se generar una clase DataContext. Esta clase es a travs de la cual realizaremos las consultas a las entidades de nuestra base de datos. Tendr propiedades que representarn a cada tabla que hemos modelado, as como mtodos para cada procedimiento almacenado que aadiremos.

La clase tb_empleados, que representa a la tabla tb_empleados

3.1.3 Consultando datos sobre la base de datos LINQ to SQL, admite toda la funcionalidad clave que puede esperar un programador de SQL. Puede consultar, insertar, actualizar y eliminar informacin en las tablas. En la seleccin, basta con que escriba una consulta LINQ en su propio lenguaje de programacin y, despus, la ejecuta para recuperar los resultados. LINQ to SQL convierte todas las operaciones necesarias en las operaciones SQL con las que est familiarizado. Una vez que hemos modelado nuestra base de datos con el diseador de LINQ to SQL, podemos escribir cdigo fcilmente para trabajar con l. Por ejemplo: listar los clientes y visualizarlos en el DataGridView.
Dim db As New DataDBVentasDataContext Dim cliente = From c In db.tb_clientes Me.DataGridView1.DataSource = cliente

CIBERTEC

CARRERAS PROFESIONALES

48

LABORATORIO 3.1 MANEJO DE CONSULTA EN UN TABLEADAPTER


En este escenario usted crear un TableAdapter, donde crear una consulta sql que permita visualizar los pedidos entre dos fechas, adems visualice la cantidad de facturas resultantes del proceso. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija WindowsApplication. - En Name coloque appFacturacion5. - En Location coloque C:\CursoPOOII . 4. Dentro de la aplicacin aadir un item de tipo DataSet asgnele el nombre DBVentasDataSet. 5. Agregue un TableAdapter de la tabla tb_pedidoscabe. 6. A continuacin, aada un procedimiento almacenado: click derecho en el TableAdapter y seleccione Add Query tal como se muestra en la Figura.

7. En la pgina Elija un tipo de comando seleccione la opcin: Usar instruccin SQL, presione Next.

8. En la pgina Elija un tipo de Consulta seleccione la primera opcin: SELECT which return rows, esta opcin permite retornar un conjunto de filas, presione el botn Next.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

49

9. En la pgina Especifique una instruccin Select de SQL, defina la sintaxis del procedimiento almacenado: Select * From tb_pedidoscabe Where fechapedido between @f1 and @f2. Luego presione el botn Next. 10. Asigne un nombre a la instruccin FillbyFechas, luego presione el boton Finish.

11. A continuacin proceda a disear el formulario:

Objeto Label1 Label2 DateTimePicker1 DateTimePicker2 Button1 DataGridView1

Name Label1 Label2 DtFecha1 DtFecha2 BtnConsulta DGFacturas

Propiedad Text Text Format Format Text

Valor Fecha 1 Fecha 2 Short Shor Consulta

12. A nivel Clase Form, defina el objeto DataSet: ds y el objeto TableAdapter fac_Adapter.
Private Ds As New DBVentaDataSet Private Pedido As New DBVentaDataSet.tb_pedidoscabeTableAdapter

13. Para listar todas las facturas en el evento Load del Formulario se cargar al DataTable fac_cabe a travs del mtodo Fill del TableAdapter y luego visualice los datos.
Pedido.Fill(Ds.Fac_cabe) Me.DGFacturas.DataSource = Ds.tb_pedidoscabe

CIBERTEC

CARRERAS PROFESIONALES

50

14. Para listar las facturas entre dos fechas, en el evento click del botn consulta, se ejecutar el mtodo FillBy con sus dos parmetros de fecha, que representa al Procedure creado: usp_facturas_byfechas, para cargarlo al DataTable y, luego, visualizar los datos.
Dim f1 As Date = Me.DtFecha1.Value.ToShortDateString Dim f2 As Date = Me.DtFecha2.Value.ToShortDateString Pedido.FillByFechas(Ds.tb_pedidoscabe, f1, f2) Me.DGFacturas.DataSource = Ds.tb_pedidoscabe

15. Ejecute y realice las pruebas.

LABORATORIO 3.2 RELACIONES ENTRE TABLEADAPTER


En este escenario, vamos a realizar un consulta entre los clientes y sus pedidos, donde al seleccionar un cliente, visualizamos los pedidos asociada al cliente seleccionado. Para ello creamos un TableAdapter para los clientes y estableceremos la relacin entre las tablas del DataSet. 1. En el DataSet: DBVentasDataSet Agregue un TableAdapter llamado tb_clientes, el cual contenga todos los campos de dicha tabla. 2. Creado el TableAdapter para tb_clientes, establezca la relacin entre las tablas, que solo sea de tipo relacin, el nombre de la relacin ser: Clientes_Ped_cabe.
Relacin: Clientes_Pec_cabe

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

51

3. Disee el Formulario.

Objeto Label1 Label2 DataGridView1 DataGridView2

Name Label1 Label2 DGCliente DGFactura

Propiedad Text Text

Valor Clientes Facturas

4. Declare a nivel Clase Form el DataSet y los TableAdapter de clientes y facturas.


Private Ds As New DBVentasDataSet Dim Cli_TableAdapter As New _ DBVentasDataSetTableAdapters.tb_ClientesTableAdapter - Fac_TableAdapter As New _ Dim DBVentasDataSetTableAdapters.tb_pedidoscabeTableAdapter

5. En el evento Load del Formulario, cargue los Tables de las tablas clientes y fac_cabe con los TableAdapter, muestre los clientes en el DataGridView: DGCliente.
Cli_TableAdapter.Fill(Ds.tb_Clientes) Fac_TableAdapter.Fill(Ds.tb_pedidoscabe) Me.DGCliente.DataSource = Ds.tb_Clientes

6. En el evento CellCllick del DataGridView DGCliente, al seleccionar un cliente, visualice sus facturas; seleccione una fila del cliente y capture el indice de la fila seleccionada: DGCliente.CurrentRow.Index, y utilizando un DataView y un DataRowView cree la vista hija (ChildView).
Dim i As Integer = Me.DGCliente.CurrentRow.Index Dim dv As DataView = Ds.tb_Clientes.DefaultView Dim drv As DataRowView = dv(i) Me.DGFactura.DataSource = _ drv.CreateChildView("Clientes_Ped_cabe")

7. Guarde la aplicacin y ejecute. Pruebe los resultados.

CIBERTEC

CARRERAS PROFESIONALES

52

LABORATORIO 3.3 EJECUTAR UN PROCEDIMIENTO ALMACENADO UTILIZANDO UN TABLAADAPTER


En este escenario, vamos a ejecutar un procedimiento almacenado de consulta que liste los pedidos de un ao seleccionado. 1. Defina el procedimiento almacenado en la base de datos llamado usp_pedidos_year.

2. Arrastre el procedimiento almacenado usp_pedidos_year al DataSet: DBVentasDataSet, tal como se muestra.


Mtodo Fill y GetData que define el parmetro @y

3. Disee el formulario de la consulta.

Objeto Label Label TextBox Button DataGridView

Name Label1 Label2 txtAo BtnConsulta DataGridView1

Propiedad Text Text Text

Valor Consulta de Pedidos por Ao Ao Consulta

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

53

4.

Declare a nivel Clase Form el DataSet y los TableAdapter de clientes y facturas


Private Ds As New DBVentasDataSet Private pedidos As New _ - DBVentasDataSetTableAdapters.usp_pedidos_yearTableAdapter

5.

En el evento Click del Button BtnConsulta, ejecute el mtodo Fill de pedidos donde definimos la tabla usp_pedidos_year y el valor del ao: txtao.text. Visualice los registros de la tabla en el DataGridView1.
pedidos.Fill(Ds.usp_pedidos_year, Val(TXTAO.Text)) Me.DataGridView1.DataSource = Ds.usp_pedidos_year

6.

Guarde la aplicacin y ejecute. Al ingresar un ao desde el control TxtAo, al presionar el botn CONSULTA, se visualiza los pedidos.

LABORATORIO 3.4 MANEJO DE CONSULTAS UTILIZANDO LINQ to SQL


En este escenario, vamos a realizar la consulta de los pedidos por un empleado seleccionado. Para ello vamos a utilizar LINQ to SQL para realizar la consulta de los pedidos. 1. Agregue un nuevo elemento en el proyecto de Windows. 2. Seleccione la plantilla Clases de LINQ to SQL, asigne el nombre DataVentas.dbml Seleccione la plantilla para el manejo de las tablas como clases.

CIBERTEC

CARRERAS PROFESIONALES

54

3. Desde el explorador de
servidor arrastre las tablas hacia el diseador llamado DataVentas.dbml, tal como se muestra.

4. Para establecer la relacin entre las clases, agregue una Asociacin. En el editor de asociaciones seleccione: Clase primaria la tabla tb_empleados y Clase secundaria la tabla tb_pedidoscabe. En la seccin propiedades de la asociacin, elija el campo IdEmpleado para ambas propiedades; luego presione el botn Aceptar para generar la asociacin.

5. A continuacin disee el Formulario de la consulta.

Objeto Label Label ComboBox Button DataGridView

Name Label1 Label2 ComboBox1 BtnConsulta DataGridView1

Propiedad Text Text Text

Valor Consulta de Pedidos por Empleado Empleado Consulta

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

55

6. A continuacin defina la instancia de DataVentasDataContext a nivel Formulario.


Private Data As New DataVentasDataContext

7. En el evento Load del Formulario, declare la variable empleado para definir los empleados desde Data. Cargue los empleados en el ComboBox1.
Dim empleado = From emp In Data.tb_empleados Me.ComboBox1.DataSource = empleado Me.ComboBox1.DisplayMember = "Nombre" Me.ComboBox1.ValueMember = "IDempleado"

8.

En el evento Click del button BtnConsulta, declare la variable pedidos para definir la clase tb_pedidoscabe desde el DataVentasDataContext Data y realizar la consulta de pedidos (p) por empleado seleccionado.
Dim pedidos = From p In Data.tb_pedidoscabe _ Where p.IdEmpleado=ComboBox1.SelectedValue.toString Select p Me.DataGridView1.DataSource = pedidos

9. Guarda la aplicacin y ejecute. Al seleccionar un empleado desde un ComoBox, listamos los pedidos.

LABORATORIO 3.5 MANEJO DE CONSULTA DE PEDIDOS ENTRE FECHAS UTILIZANDO LINQ to SQL
En este escenario, vamos a realizar la consulta de los pedidos entre dos fechas ingresadas. Para ello vamos a utilizar en DataConText DataVentasDataContext. 1. Disea el formulario.

CIBERTEC

CARRERAS PROFESIONALES

56

Objeto Label Label Label TextBox TextBox Button DataGridView

Name Label1 Label2 Label3 TxtFecha1 TxtFecha2 BtnConsulta DataGridView1

Propiedad Text Text Text

Valor Consulta de Pedidos entre Fechas Fecha 1 Fecha 2

Text

Consulta

2. A continuacin defina la instancia de DataVentasDataContext a nivel Formulario


Private Data As New DataVentasDataContext

3. En el evento Click del button BtnConsulta, declare la variable pedidos para definir la clase tb_pedidoscabe desde el DataVentasDataContext Data y realizar la consulta de pedidos (p) entre dos fechas.
Dim f1 As Date = CDate(TXTFECHA1.Text) Dim f2 As Date = CDate(TXTFECHA2.Text) Dim pedidos = From p In data.tb_pedidoscabe _ Where p.FechaPedido >= f1 And p.FechaPedido <= f2 Select p Me.DataGridView1.DataSource = pedidos

4. Guarde la aplicacin y ejecute. Al ingresar dos fechas desde los TextBox listaremos los pedidos entre las fechas ingresadas.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

57

Autoevaluacin
1. Qu es un TableAdapter y cules son los mtodos que utiliza con ms frecuencia? Explique brevemente. 2. Cules son las diferencias que existen entre un TableAdapter y un DataAdapter? 3. Cules son los pasos para crear un TableAdapter para una tabla especfica? 4. Si al TableAdapter se le desea aadir un nuevo Stored Procedure, explique cules son los pasos para agregar un Nuevo Stored Procedure al TableAdapter. 5. Cmo se pueden crear relaciones entre las tablas del DataSet? Explique los pasos. 6. Cules son las sentencias de programacin que permite poblar los datos de un TableAdapter a un DataTable? 7. Explique el concepto del LINQ to SQL. 8. Cules son las herramientas para trabajar con LINQ to SQL? 9. Se tiene dos tablas relacionales: Vendedores y Fac_cabe Cules son las sentencias de programacin donde al seleccionar un vendedor, visualice sus Facturas? 10. Desarrolle una aplicacin que permita realizar la consulta de las facturas al seleccionar un ao y un mes. Para ello, debe trabajar toda la estrategia utilizando TableAdapter.

CIBERTEC

CARRERAS PROFESIONALES

58

Resumen
Los TableAdapters proporcionan comunicacin entre su aplicacin y una base de datos mediante la ejecucin de instrucciones SQL y procedimientos almacenados. El TableAdapter carga los datos devueltos en su tabla de datos asociada de la aplicacin o devuelve nuevas tablas de datos ya rellenadas. A diferencia de los DataAdapters, los TableAdapter pueden contener varias consultas que rellenan las tablas de datos asociadas. Puede definir tantas consultas para un TableAdapter como requiera la aplicacin, con tal de que cada consulta devuelva datos que cumplan el mismo esquema que la tabla de datos asociada. El Asistente para la configuracin de consultas de TableAdapter ayuda a crear y editar las consultas adicionales que se pueden agregar a TableAdapters. En un TableAdapter se pueden Agregar:
o o o

Sentencias SQL de consulta y actualizacin. Agregar Procedures Existentes. Agregar nuevos Procedures.

Visual Studio proporciona herramientas en tiempo de diseo para trabajar con objetos personalizados. El nico requisito es que deben contar, al menos, con una propiedad pblica. No se precisa ningn constructor ni atributo concreto para que los objetos personalizados trabajen con herramientas como la ventana Orgenes de datos. Los TableAdapters se crean con mtodos que se pueden ejecutar directamente contra la base de datos. A estos mtodos (TableAdapter.Insert, TableAdapter.Update y TableAdapter.Delete) se les puede llamar de forma directa para manipular los datos de la base de datos. LINQ to SQL es una implementacin de O/RM (object relational mapping, mapeador de objetos relacionales) y permite modelar bases de datos relacionales con clases de .NET. Podemos consultar bases de datos con LINQ, as como actualizar/aadir/borrar datos de ellas. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas: http://msdn2.microsoft.com/es-es/library/7zt3ycf2(VS.80).aspx Pgina referente al TableAdapter http://msdn2.microsoft.com/es-es/library/87sfaezs(VS.80).aspx Pgina referente a la consulta de Datos http://thinkingindotnet.wordpress.com/2007/05/20/usando-linq-to-sql1%c2%aa-parte/ Pgina referente al LINQ en .NET

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

59

UNIDAD DE APRENDIZAJE

1
SEMANA

4
OPERACIONES DE ACTUALIZACION Y MANEJO DE TRANSACCIONES UTILIZANDO ADO.NET
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que se conectan a un origen de datos utilizando los objetos de ADO.NET para realizar operaciones de consulta y actualizacin de datos.

TEMARIO
Arquitectura y componentes de ADO.NET. Administracin almacenamiento de una cadena de conexin a un origen datos. Operaciones de consulta sobre un origen de datos. Recuperacin de datos utilizando DataAdapter, DataReader y Command. Manejo de TableAdapter, Usando LINQ to SQL. Modificacin de datos, manejo de transacciones de datos y excepciones. de

ACTIVIDADES PROPUESTAS
Los alumnos definen y ejecutan procesos para actualizar datos de un origen de stos utilizando sentencias sql, TableAdapter o LINQ to SQL. Los alumnos identifican los tipos de transacciones en ADO.NET, locales o distribuidas. Los alumnos manejan las transacciones en una capa de datos.

CIBERTEC

CARRERAS PROFESIONALES

60

MODIFICAR DATOS EN UN ORIGEN DE DATOS


La mayora de las aplicaciones escritas en Visual Basic y Visual C# giran en torno a la lectura y actualizacin de informacin de bases de datos. Para permitir la integracin de datos en aplicaciones distribuidas y escalables, Visual Studio .NET es compatible con una nueva generacin de tecnologa de acceso a datos: ADO.NET. El modo de comunicacin entre nuestra aplicacin y la base de datos implica que ambos manejen un lenguaje de programacin comn; entonces para resolver este problema de comunicacin es que se usa el SQL (Structured Query Languaje) o lenguaje estructurado de consultas. Para ejecutar las instrucciones SQL a la base de datos se realiza mediante los OBJETOS ADO.NET, las cuales proporcionan acceso coherente a orgenes de datos como Microsoft SQL Server, as como a orgenes de datos expuestos mediante OLE DB y XML. Entre los objetos que permiten realizar este proceso tenemos: Objetos Command, uso de sentencias SQL. TableAdapter. LINQ to SQL.

1.1 MODIFICACION DE DATOS UTILIZANDO COMMAND


El objeto Command permite ejecutar sentencias SQL o procedimientos almacenados sobre una base de datos. Las instrucciones SQL que modifican datos (por ejemplo INSERT, UPDATE o DELETE) no devuelven ninguna fila. De la misma forma, muchos procedimientos almacenados realizan alguna accin pero no devuelven filas. Para ejecutar comandos de actualizacin, creamos un objeto Command con el comando SQL adecuado y una Connection, incluidos los Parameters necesarios. El objeto Command se debe ejecutar con el mtodo ExecuteNonQuery. El mtodo ExecuteNonQuery devuelve un entero que representa el nmero de filas que se ven afectadas por la instruccin o por el procedimiento almacenado que se haya ejecutado. Si se ejecutan varias instrucciones, el valor devuelto es la suma de los registros afectados por todas las instrucciones ejecutadas. En el ejemplo siguiente se ejecuta una instruccin INSERT para aplicar un registro en una base de datos mediante el mtodo ExecuteNonQuery. connection.Open() Dim sql As String = "INSERT Customers(CustomerID,CompanyName) " & _ " Values('NWIND', 'Northwind Traders')" Dim command As New SqlCommand(queryString, connection) Dim registros As Int32 = command.ExecuteNonQuery()

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

61

Para ejecutar un procedimiento almacenado utilizando el objeto Command, debe indicar el nombre del procedimiento a travs de la propiedad CommandText, y adems indicar que el objeto a ejecutar es un procedimiento almacenado a travs de la propiedad CommandType. Agregue sus parmetros del procedimiento a travs de la coleccin Parameters. Para ejecutar el procedure utilice el mtodo ExecuteNonQuery devuelve un entero que representa el nmero de filas que se ven afectadas por el procedimiento almacenado que se haya ejecutado. En el ejemplo de cdigo siguiente se ejecuta el procedimiento almacenado para insertar un registro a la tabla tb_paises, que reciba dos parmetros de entrada. Dim command As New SqlCommand("InsertPais" , connection) command.CommandType = CommandType.StoredProcedure command.Parameters.Add("@id", SqlDbType.Int).Value=12 command.Parameters.Add("@Name", SqlDbType.Char, 15).Value="Iran Dim rowCount As Int32 =command.ExecuteNonQuery()

1.2 MODIFICACION DE DATOS UTILIZANDO TABLEADAPTER


Los TableAdapters definen mtodos que se ejecutar directamente contra la base de datos. A estos mtodos (TableAdapter.Insert, TableAdapter.Update y TableAdapter.Delete) se les puede llamar de forma directa para manipular los datos de la base de datos. Si no desea crear estos mtodos directos, establezca la propiedad GenerateDbDirectMethods de TableAdapter en false en la ventana Propiedades. Cualquier consulta agregada a TableAdapter, adems de la consulta principal, es una consulta independiente, no genera estos mtodos DbDirect. a) Para insertar nuevos registros directamente en una base de datos Llame al mtodo Insert del TableAdapter, pasando los valores de cada columna como parmetros. Para actualizar registros directamente en una base de datos Llame al mtodo Update del TableAdapter, pasando los valores nuevos y originales de cada columna como parmetros. Para eliminar registros directamente de una base de datos Llame al mtodo Delete del TableAdapter, pasando los valores de cada columna como parmetros de Delete.

b)

c)

1.2.1 MODO DE GUARDAR UN DATASET TIPEADO UTILIZANDO UN TABLEADAPTER Despus que la Data en el DataSet ha sido modificada y validada, probablemente quiere enviarla para actualizar la data a la base de datos. Para modificar la data de la base de datos llame al mtodo Update del TableAdapter o DataAdapter. El mtodo Update del DataAdapter, actualizar una tabla y ejecuta los comandos INSERT, UPDATE y DELETE basado en el estado de la fila RowState.

CIBERTEC

CARRERAS PROFESIONALES

62

Al actualizar un origen de datos (Data Source) dentro de un DataSet, puede contener errores, se debera colocar el cdigo que ejecuta el mtodo Update dentro del bloque Try Catch.
Try Tablacli.Update(Facturacion.Clientes) Catch ex As Exception Messagebox.Show(No se Actualiz) End Try

1.2.2 MODO DE GUARDAR DOS TABLAS RELACIONADAS EN UN DATASET UTILIZANDO UN TABLEADAPTER Cuando actualiza tablas en un DataSet., es importante actualizar los datos segn la prioridad para reducir los cambios de una violacin del constraint de integridad referencial. Para prevenir los errores de la integridad de datos, la mejor prctica es actualizar la Base de Datos en la siguiente secuencia: 1. Tabla Hija: Eliminar registros 2. Tabla Padre: Insertar, Actualizar y Eliminar registros. 3. Tabla Hija: Insertar y Actualizar registros. Debera incluir todas las actualizaciones lgicas dentro de una transaccin. 1.2.3 VISUALIZACIN DE DATOS EN DATA GRID DEL FORM Puede visualizar datos en un DataGridView si arrastra los elementos de la Ventana de origen de datos a su formulario. Antes de arrastrar desde la ventana orgenes de datos, establezca el tipo de control de la tabla en DataGridView. Una alternativa de mostrar los datos en una cuadrcula es mostrar los datos en controles individuales. Para visualizar datos en un DatagridView del Windows Form 1. 2. 3. 4. Abra la Ventana Data Source: Opcin de men Data. Seleccione la tabla en el Data Source. Arrastre la Tabla del Data Source al formulario. Se visualizar: a. Un control DataGridView. b. Un BindingNavigator, navegar por los registros. c. Un DataSet, un TableAdapter, BindingSource BindingNavigator.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

63

TRANSACCIN EN .NET
Cuando se compra un libro de una librera en lnea, se intercambia dinero (en forma de crdito) por el libro. Si el crdito es correcto, una serie de operaciones relacionadas garantiza que se obtiene el libro y que la librera obtiene el dinero. Sin embargo, si una operacin sufre un error durante el intercambio, el error afecta a la totalidad del proceso. No se obtiene el libro y la librera no obtiene el dinero. Las transacciones garantizan que los recursos orientados a datos no se actualicen permanentemente, salvo que todas las operaciones de la unidad transaccional se completen de forma satisfactoria.

TRANSACCIONES EXPLCITAS E IMPLCITAS


Los programadores de aplicaciones de transacciones pueden sacar partido de los dos modelos de programacin que proporciona el espacio de nombres System.Transactions para crear una transaccin. Puede utilizar el modelo de programacin explcito mediante la claseTransaction o el modelo de programacin implcito en el que la infraestructura administra de forma automtica las transacciones por medio de la clase TransactionScope. Ambos modelos admiten la confirmacin de una transaccin cuando el programa alcanza un estado coherente. Si la confirmacin se ejecuta correctamente, la transaccin se confirma de forma duradera. Si la confirmacin no se realiza correctamente, sta se anula. Si el programa de aplicacin no puede realizar correctamente la transaccin, intenta anular y deshacer los efectos de la transaccin.

3.1 Implementar una transaccin con CommittableTransaction


La clase Committable Transaction proporciona un modo explcito de que las aplicaciones utilicen una transaccin. Es til para las aplicaciones que desean utilizar la misma transaccin en varias llamadas a funciones o varias llamadas a subprocesos. A diferencia de lo que sucede con la clase TransactionScope, quien escribe las aplicaciones tiene que llamar de forma especfica a los mtodos Commit y RollBack para confirmar o anular la transaccin. Cuando se implementa una transaccin, se debe llamar al mtodo BeginTransaction dentro del objeto de conexin. Al crear la transaccin, puede especificar el nivel de aislamiento que se aplica a la transaccin. El nivel de aislamiento de una transaccin determina qu nivel de acceso tienen otras transacciones a los datos variables antes de que finalice una transaccin. Si va especificar el nivel de aislamiento, pasar un valor enumerable de System.Data.IsolationLevel dentro del mtodo BeginTransaction. Los valores numerables del IsolationLevel:

CIBERTEC

CARRERAS PROFESIONALES

64

Mtodo
Chaos

Descripcin
Los cambios pendientes de las transacciones ms aisladas no se pueden sobrescribir. Los datos variables no se pueden leer durante la transaccin, pero se pueden modificar. Se pueden leer datos variables y modificarse durante la transaccin. Se pueden leer datos variables pero no modificarse y no se pueden agregar nuevos datos durante la transaccin. Antes de que una transaccin modifique los datos, comprueba si otra transaccin ha cambiado los datos despus de haberlos ledo inicialmente. Si se han actualizado los datos, se produce un error. Esto permite a una transaccin llegar al valor previamente confirmado de los datos. Cuando intenta promocionar una transaccin que se ha creado con este nivel de aislamiento, se produce una excepcin InvalidOperationException con el mensaje de error "No se pueden promocionar transacciones con el nivel de aislamiento Snapshot".

ReadCommitted

ReadUncommitted

Serializable

Snapshot

3.2 Actualizar una base de datos dentro de una transaccin local


En el siguiente ejemplo, actualizaremos el stock y el precio de un determinado artculo. Declarar el objeto SqlConnection
Dim cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

Abra el objeto Conection; cree el objeto transaction y asignarle al Transaction BeginTransaction del objeto Connection con el nivel de Isolation Serializable.
Dim success As Boolean = True cn.Open() Dim tr As SqlTransaction tr = cn.BeginTransaction(IsolationLevel.Serializable)

Para cada comando que se va a ejecutar dentro de la transaccin, asignar la propiedad Transaction para referir al objeto transaccin.
Using cmd As New SqlCommand("Update dbo.Articulos Set art_precio = art_precio + 15 Where art_codigo='a0002'", cn,tr) Dim i As Integer = cmd.ExecuteNonQuery If i > 0 Then Using cmd1 As New SqlCommand("Update dbo.Articulos Set art_stock += 15 Where art_codigo='a0002'", cn, tr) i = cmd1.ExecuteNonQuery If i > 0 Then success = True End Using 'Libera el Command que actualiza el Stock End If End Using 'Libera el Command que actualiza el precio

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

65

Si los comandos se ejecutaron con xito, es decir, la variable success es true, llamar al mtodo Commit del objeto Transaction; si hubo un problema, llamar al mtodo RollBack para cancelar las actualizaciones.
If success = True Then tr.Commit() Else tr.Rollback() End If

Los objetos command se liberarn dentro del Using, luego cerrar la conexin.
cn.Close()

MANEJO DE TRANSACCIONES EN LA CAPA DE DATOS


Se puede manejar transacciones en la capa de datos (Data Tier) utilizando sentencias SQL, dentro de un procedimiento almacenado y triggers o disparadores, al iniciar una transaccin, al comitear la transaccin y al deshacer los cambios (rollback) en la transaccin. La siguiente tabla muestra algunas de las sentencias SQL que se utilizan para manejar transacciones dentro de la capa de datos Sentencia SQL
BEGIN TRANSACTION COMMIT TRANSACTION

Descripcin
Marca el inicio de una transaccin local.

Marcar el fin de una transaccin completada con xito, y comitea o actualiza los cambios efectuados despus del BEGIN TRANSACTION. Marca el fin de una transaccin no completada con xito, y cancela todos los cambios efectuados despus del BEGIN TRANSACTION.

ROLLBACK TRANSACTION

4.1 Manejo de una transaccin explcita en la capa de datos


Crear un procedimiento almacenado En el procedimiento almacenado, iniciar una transaccin (BEGIN TRANSACTION). Colocar las sentencias de actualizacin dentro de la transaccin. Si todas las operaciones se ejecutaron correctamente, comitear la transaccin, pero si la operacin fall, deshacer los cambios a la transaccin. El siguiente ejemplo muestra cmo manejar una transaccin en un procedimiento almacenado. El procedimiento almacenado crea una transaccione y ejecuta dos sentencias de actualizacin dentro de la

CIBERTEC

CARRERAS PROFESIONALES

66

transaccin. Si se ejecut satisfactoriamente se aplicar Commit, si hubo al error se aplicar RollBack.


CREATE PROCEDURE dbo.UpdatePrecios @codprod1 char(5), @codprod2 char(5) As DECLARE @success BIT Select @success=0

Inicia la transaccin donde las actualizaciones se agrupan a partir de aqu

BEGIN TRANSACTION Update dbo.Articulos Set art_precio=art_precio * 1.5 Where art_codigo=@codprod1 if(@@error=0 AND @@rowcount=1) Begin Update dbo.Articulos Set art_precio=art_precio * 2.0 Where art_codigo=@codprod2 if(@@error=0 AND @@rowcount=1) Select @success=1 End If @success=1 COMMIT TRANSACTION Else ROLLBACK TRANSACTION Return

Sentencia de actualizacin de precios por un artculo

Si los procesos se ejecutan satisfactoriamente, se aplicar COMMIT, sino se aplicara ROLLBACK

MANEJO DE TRANSACCIONES DISTRIBUIDAS


Las transacciones distribuidas permiten incorporar en una sola accin de cumplimiento o incumplimiento varias operaciones distintas que tienen lugar en sistemas diferentes. La clase System.Transactions.TransactionScope proporciona una manera sencilla de marcar un bloque de cdigo como participante en una transaccin, sin que el usuario tenga que interactuar con la transaccin. Un mbito de transaccin puede seleccionar y administrar la transaccin de ambiente de forma automtica. Gracias a su fcil uso y a su eficacia, se recomienda utilizar la clase TransactionScope cuando se desarrolle una aplicacin de transaccin. Adems, no es necesario inscribir recursos de forma explcita con la transaccin. Cualquier administrador de recursos de System.Transactions (como SQL Server 2005) puede detectar la existencia de una transaccin de ambiente creada por el mbito e inscribirla de forma automtica. Crear un mbito de transaccin, utilizando TransactionScope.
Using scope As TransactionScope = New TransactionScope() ... End Using

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

67

La clase TransactionScope proporciona varios constructores sobrecargados que aceptan una enumeracin del tipo TransactionScopeOption, que define el comportamiento transaccional del mbito. Un objeto TransactionScope tiene tres opciones: Opcin
Required

Descripcin
Hay presente una transaccin de ambiente. El ambiente se une a esa transaccin. Si no existe ninguna transaccin, el ambiente crea una nueva. Es el valor por defecto. La transaccin siempre crea una nueva transaccin. Nunca participa en una transaccin, independientemente si hay una de stas presente. Por lo tanto, no existir ninguna transaccin.

RequiresNew

Supress

5.1 Completar un mbito de transaccin


Cuando la aplicacin finalice, todo el trabajo que desea llevar a cabo en una transaccin se debe llamar al mtodo Complete slo una vez para informar al administrador de transacciones que se puede confirmar la transaccin. Es muy conveniente realizar la llamada a Complete como ltima instruccin en el bloque using; si no se llama a este mtodo, la transaccin se anula, ya que el administrador de transacciones lo interpreta como un error del sistema o como una excepcin iniciada dentro del mbito de transaccin. La instruccin using garantiza que se llame al mtodo Dispose del objeto TransactionScope aunque se produzca una excepcin. El mtodo Dispose marca el final del mbito de transaccin. Puede que las excepciones que tienen lugar despus de llamar a ese mtodo no afecten a la transaccin. Este mtodo, tambin, restaura la transaccin de ambiente a su estado anterior.

5.2 Deshacer una transaccin


Si desea deshacer una transaccin, no debe llamar al mtodo Complete dentro del mbito de transaccin. Por ejemplo, puede iniciar una excepcin en el mbito. La transaccin en la que ste participa se deshar. En el ejemplo siguiente, se muestra un objeto TransactionScope que crea tres objetos de mbito anidados, cada uno con una instancia con un valor de TransactionScopeOption distinto.
Using scope1 As New TransactionScope() 'Default is Required Using scope2 As New TransactionScope( _ TransactionScopeOption.Required) '..... End Using Using scope3 As New TransactionScope( _ TransactionScopeOption.RequiresNew) '... End Using End Using

CIBERTEC

CARRERAS PROFESIONALES

68

LABORATORIO 4.1 ACTUALIZACIN DE DATOS UTILIZANDO PROCEDIMIENTOS ALMACENADOS.


En este escenario, vamos a realizar la actualizacin de los datos de los empleados, incluyendo la foto del empleado, utilizando procedimientos almacenados de tipo INSERT, UPDATE y DELETE, ejecutando los procedures con el objeto COMMAND. 1. En la Base de datos DBVentas, defina cada uno de los procedimientos almacenados para realizar el proceso de insercin, actualizacin, eliminacin y listado de los empleados, tal como se muestra a continuacin.
Create Procedure usp_insertar @id char(5), @nombre varchar(50), @ape varchar(50), @dni varchar(8), @foto image As Insert tb_empleados Values(@id,@nombre,@ape,@dni,@foto)

-------------------------------------Create Procedure usp_modificar @id char(5), @nombre varchar(50), @ape varchar(50), @dni varchar(8), @foto image As Update tb_empleados Set nomempleado=@nombre,apeempleado=@ape,dniempleado=@dni, foto=@foto Where idempleado=@id

-------------------------------------Create Procedure usp_eliminar @id char(5) As Delete From tb_empleados Where idempleado=@id

-------------------------------------Create Procedure usp_listado As select * from tb_empleados

2. Disea el Formulario, incluya el control image para mostrar la foto del empleado.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

69

Lista de controle del Formulario.


Control Label Label Label Label Button Button Button Button PictureBox TextBox TextBox TextBox TextBox Name Label1 Label2 Label3 Label4 BtnExaminar BtnNuevo BtnGrabar btnActualizar PictureBox1 Txtcodigo TxtApellido txtNombres TxtDNI Propiedad Text Text Text Text Text Text Text Text Valor Codigo Apellidos Nombres DNI Examinar Nuevo Grabar Actualizar

3. Defina el Namespace: System.Data.SqlClient Defina el NameSpace: System.IO 4. Definir e inicializar la cadena de conexin a nivel Class Form.
Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=DBVentas; integrated security=true")

5. Defina la funcin Empleados en la ventana de cdigo del Formulario que ejecute el procedure usp_listado donde retorna los empleados.
Function Empleados() Dim da As New SqlDataAdapter("usp_listado", cn) Dim tabla As New DataTable da.Fill(tabla) Return tabla End Function

6. En el evento Load del Form, llenar los datos en DGArticulos

Me.DataGridView1.DataSource = Empleados()

7. Programa el evento Click del boton Examinar que permita buscar la foto del empleado utilizando el objeto OpenFileDialog.

'BUSCAR LA IMAGEN QUE SE VISUALIZA EN EL PICTUREBOX Dim BUSCAR As New OpenFileDialog BUSCAR.Filter = "Archivo de Imagen|*.bmp" 'SI PRESIONASTE EL BOTON OK If BUSCAR.ShowDialog = Windows.Forms.DialogResult.OK Then Me.PictureBox1.Image = Image.FromFile(BUSCAR.FileName) End If

CIBERTEC

CARRERAS PROFESIONALES

70

8. Programa el evento Click del botn Agregar que permite insertar un registro a la tabla tb_empleados. Ejecute el procedimiento almacenado usp_insertar.
Dim Ms As New MemoryStream Me.PictureBox1.Image.Save(Ms, Imaging.ImageFormat.Bmp) Dim DATA() As Byte = Ms.ToArray 'PROCESO DE INSERCION Dim CMD As New SqlCommand("usp_insertar", cn) CMD.CommandType = CommandType.StoredProcedure 'PASO DE PARAMETROS With CMD.Parameters .Add("@id", SqlDbType.Char, 5).Value = txtcodigo.Text .Add("@nombre", SqlDbType.VarChar, 50).Value = txtnombre.Text .Add("@ape", SqlDbType.VarChar, 50).Value = txtapellido.Text .Add("@dni", SqlDbType.VarChar, 10).Value = txtdni.Text .Add("@foto", SqlDbType.Image).Value = DATA End With cn.Open() Try 'EJECUTAR EL PROCESO Dim i As Integer = CMD.ExecuteNonQuery MessageBox.Show(i.ToString & " Registro Agregado") Me.DataGridView1.DataSource = Empleados() Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() 'CERRAR LA CONEXION End Try

9. Programa el evento Click en el botn Actualizar que permita actualizar los datos de un empleado por su cdigo. Ejecute el procedimiento almacenado usp_modificar.
Dim Ms As New MemoryStream Me.PictureBox1.Image.Save(Ms, Imaging.ImageFormat.Bmp) Dim DATA() As Byte = Ms.ToArray 'PROCESO DE ACTUALIZACION Dim CMD As New SqlCommand("usp_modificar", cn) CMD.CommandType = CommandType.StoredProcedure 'PASO DE PARAMETROS With CMD.Parameters .Add("@id", SqlDbType.Char, 5).Value = txtcodigo.Text .Add("@nombre", SqlDbType.VarChar, 50).Value = txtnombre.Text .Add("@ape", SqlDbType.VarChar, 50).Value = txtapellido.Text .Add("@dni", SqlDbType.VarChar, 10).Value = txtdni.Text .Add("@foto", SqlDbType.Image).Value = DATA End With cn.Open() Try 'EJECUTAR EL PROCESO Dim i As Integer = CMD.ExecuteNonQuery MessageBox.Show(i.ToString & " Registro Actualizado") Me.DataGridView1.DataSource = Empleados() Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() 'CERRAR LA CONEXION End Try

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

71

10. Programa el evento Click en el botn Eliminar que permita eliminar un empleado por su cdigo. Ejecute el procedimiento almacenado usp_eliminar.
'PROCESO DE ELIMINACION Dim CMD As New SqlCommand("usp_eliminar", cn) CMD.CommandType = CommandType.StoredProcedure 'PASO DE PARAMETROS CMD.Parameters.Add("@id",SqlDbType.Char).Value = txtcodigo.Text cn.Open() Try 'EJECUTAR EL PROCESO Dim i As Integer = CMD.ExecuteNonQuery MessageBox.Show(i.ToString & " Registro Eliminado") Me.DataGridView1.DataSource = Empleados() Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() 'CERRAR LA CONEXION End Try

11. Programa el evento CellClick del DataGridView1, donde al seleccionar un registro, visualizamos los datos en los controles.
With DataGridView1.CurrentRow txtcodigo.Text = .Cells(0).Value txtapellido.Text = .Cells(1).Value txtnombre.Text = .Cells(2).Value txtdni.Text = .Cells(3).Value 'ALMACENAR LA CELDA DE LA IMAGEN EN UN ARRAY Dim data() As Byte = .Cells(4).Value 'GUARDAR EL ARRAY DE BYTES EN EL MEMORY Dim Ms As New MemoryStream Ms.Write(data, 0, data.Length) 'VISUALIZAR LA IMAGEN EN EL PICTUREBOX PictureBox1.Image = Image.FromStream(Ms) End With

12. Guarda la aplicacin y ejecutar.

CIBERTEC

CARRERAS PROFESIONALES

72

LABORATORIO 4.3 ACTUALIZACIN DE DATOS UTILIZANDO UN TABLEADAPTER


En este escenario, vamos a realizar el proceso de actualizacin de los datos de los vendedores utilizando un TableAdapter. Para ello vamos a crear dos procedures: INSERT y UPDATE dentro del TableAdapter para efectuar dichos procesos. A continuacin, desarrolle los siguientes pasos.

1. En el DataSet DsFacturas, agregue un TableAdapter llamado Vendedor, tal como se muestra en la figura. 2. Para agregar los mtodos INSERT y UPDATE, haga click derecho en el TableAdapter y seleccione la opcin Add Query tal como se muestra en la figura.

3. En la pgina Choose Command Type seleccione la opcin create new stored procedure, presione el botn Next.

4. En la pgina Choose a Query Type, seleccione el tipo de consulta; en este caso seleccionamos la opcin INSERT. Presione el botn Next.

5. En la pgina Generate the Stored Procedure el Asistente ha definido la sentencia del INSERT y adems mostrar los datos actualizados: SELECT, tal como se muestra en la figura.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

73

6. En

la pgina Create the Stored Procedure asigne un nombre al Procedure: InsertVendedor, presione el boto Next.

7. En la pgina Choose Function Name

confirme el mismo nombre. Presione el botn Finish.

8. En el TableAdapter de vendedor, se visualiza el mtodo InsertVendedor a continuacin, Ud., desarrollar el mtodo UpdateVendedor que permitir actualizar los datos de los vendedores por su cdigo.
Mtodo InsertVendedor

Mtodo InsertVendedor

9. Agregue un formulario dos botones y cambie los valores de las propiedades:

Control Label1 Label2 Label3 Label4 Button1 Button2 Button3

Propiedad Text Text Text Text Text Text Text

Valor Codigo Nombre Fono Direccion Limpiar Aadir Modificar

CIBERTEC

CARRERAS PROFESIONALES

74

10. Defina a nivel Class Form, el DataSet DsFactura y su TableAdapter: Ven_TableAdapter.


Private Ds As New DsFactura Dim Ven_TableAdapter As New _ FacturaTableAdapters.VendedorTableAdapter

11. Dentro del evento Form3_Load, coloque lo siguiente:


Ven_TableAdapter.Fill(Ds.Vendedor) Me.DataGridView1.DataSource = Ds.Vendedor

12. En el evento btnAadir_Click, permitir agregar un registro de vendedor, Coloque

lo siguiente: a. Ejecutar el mtodo InsertVendedor enviando sus parmetros. b. Ejecutar el mtodo Fill, para actualizar el DataTable vendedor. c. Mostrar los datos en el DataGridView1.
Ven_TableAdapter.InsertVendedor(Me.TXTCODIGO.Text, _ Me.TXTNOMBRE.Text, Me.TXTFONO.Text, Me.TXTDIRECCION.Text) Ven_TableAdapter.Fill(Ds.Vendedor) Me.DataGridView1.DataSource = Ds.Vendedor

13. En el evento btnModificar_Click, permitir modificar los datos de un vendedor. Coloque lo siguiente:
Dim i As Integer i = Ven_TableAdapter.UpdateVendedor(Me.TXTNOMBRE.Text, _ Me.TXTFONO.Text, Me.TXTDIRECCION.Text, TXTCODIGO.Text) Ven_TableAdapter.Fill(Ds.Vendedor) Me.DataGridView1.DataSource = Ds.Vendedor

14. Guarde el proyecto, ejecute la aplicacin y compruebe el estado del servicio.

LABORATORIO 4.4 USO DE TRANSACCIONES LOCALES


En este escenario realizaremos el proceso de actualizacin de los clientes registrados en la base de datos BDFactura utilizando transacciones (transacciones explcitas). 1. Ingrese a Visual Studio 2005. 2. Seleccione en el men Files -> New ->Project 3. Elija las siguientes opciones de la ventana para crear un nuevo proyecto. a. En Project Types elija Visual Basic. b. En Templates elija WindowsApplication. c. En name coloque appFacturacion03. d. En Location coloque C:\CursoPOOII.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

75

4. Disee la siguiente interface:

Objeto
Label1 Label2 Label3 Label4 Label5 Textbox1 Textbox2 Textbox3 Textbox4 Textbox5 Button1 Button2 Button3 Button4 Button5 DataGridView1

Name
Label1 Label2 Label3 Label4 Label5 Txtcodigo Txtnombre Txtdireccion Txtfono Txtruc BtnLimpiar BtnGrabar BtnBuscar BtnModificar BtnEliminar DGCliente

Propiedad
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text

Valor
Codigo Nombre Direccion Fono Ruc

Limpiar Grabar Buscar Modificar Eliminar

5. Defina los namespaces: System.Data.SqlClient y System.Transaction. 6. Defina e inicializar la cadena de conexin a nivel Class Form.
Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

7. Defina la funcin DataClientes que retorne los registros de los clientes.


Function DataClientes() As DataTable Dim da As New SqlDataAdapter("Select * from Clientes", cn) Dim t As New DataTable da.Fill(t) Return t End Function

8. En el evento Load del Form, cargamos los registros de los clientes en el DataGridView DGClientes y configuramos el DataGridView para que no se pueda aadir registros.
Me.DGCliente.AllowUserToAddRows = False Me.DGCliente.DataSource = DataClientes() Indica no se puede aadir registros

CIBERTEC

CARRERAS PROFESIONALES

76

9. Para navegar por los registros del DataGridView DGCliente y al seleccionar un registro se visualice en los Textboxes, se deber programar en el evento CellClick.
With DGCliente.CurrentRow txtcodigo.Text = .Cells(0).Value txtnombre.Text = .Cells(1).Value txtfono.Text = .Cells(2).Value txtruc.Text = .Cells(3).Value txtdireccion.Text = .Cells(4).Value End With CurrentRow representa la fila actual

CurrentRow se obtiene el valor de las columnas, el valor de la primera columna:


CurrentRow.Cells(0).Value

10. En el evento Click del botn Limpiar, limpie los controles del Form.
Me.txtcodigo.Text = "" Me.txtnombre.Text = "" Me.txtdireccion.Text = "" Me.txtfono.Text = "" Me.txtruc.Text = "" Me.txtcodigo.Focus()

11. En el evento Click del botn Guarde, ingresar un nuevo cliente: a. Abrir la conexin. b. Crear una transaccin, cuyo nivel de aislamiento es serializable. c. Dentro del Try crear un SqlCommand, aadir los parmetros. d. Ejecutar el comando con el mtodo ExecuteNonQuery. e. Si se proces correctamente, se ejecutar el mtodo Commit. f. Si el proceso tuvo un error, se desencadena el Catch y se ejecutar el mtodo RollBack de la transaccin tr. g. Al finalizar el proceso, se cerrar la conexin.
cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand( "Insert Into Clientes Values(@cod, @nom, @dir, @fono, @ruc)", cn, tr) cmd.Parameters.Add("@cod", SqlDbType.Char).Value = txtcodigo.Text cmd.Parameters.Add("@nom", SqlDbType.VarChar).Value = txtnombre.Text cmd.Parameters.Add("@dir", SqlDbType.VarChar).Value = txtdir.Text cmd.Parameters.Add("@fono", SqlDbType.VarChar).Value = txtfono.Text cmd.Parameters.Add("@ruc", SqlDbType.VarChar).Value = txtruc.Text cmd.ExecuteNonQuery() tr.Commit() Me.DGCliente.DataSource = DataClientes() Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

12. En botn modificar, ejecuta el proceso de actualizacin del cliente: a. Crear una transaccin, cuyo nivel de aislamiento es serializable. b. Dentro del Try crear un SqlCommand, aadir los parmetros.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

77

c. Ejecutar el comando con el mtodo ExecuteNonQuery, este mtodo retorna el nmero de registros afectados donde es almacenado en c. d. Si el valor de c es 1, ejecutar el mtodo Commit, caso contrario se aplicar el mtodo RollBack de la transaccin tr.
cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand("Update dbo.Clientes Set cli_nombre=@nom, cli_direccion=@dir, cli_telefono=@fono, cli_ruc=@ruc Where cli_codigo=@cod", cn, tr) cmd.Parameters.Add("@nom", SqlDbType.VarChar).Value=txtnombre.Text cmd.Parameters.Add("@dir", SqlDbType.VarChar).Value=txtdir.Text cmd.Parameters.Add("@fono", SqlDbType.VarChar).Value=txtfono.Text cmd.Parameters.Add("@ruc", SqlDbType.VarChar).Value = txtruc.Text cmd.Parameters.Add("@cod", SqlDbType.Char).Value = txtcodigo.Text Dim c As Int16 = cmd.ExecuteNonQuery() If c = 1 Then tr.Commit() DGCliente.DataSource = DataClientes() Else tr.Rollback() MessageBox.Show("No se Actualizado") End If Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

13. En el botn eliminar, se borrar un cliente; en el evento Click del botn eliminar, se ejecutar el proceso de eliminacin del cliente: a. Abrir la conexin. b. Dentro del Try crear un SqlCommand, aadir los parmetros. c. Ejecuta el comando con el mtodo ExecuteNonQuery. d. Si c es 1, aplicar Commit; sino aplicar RollBack. e. Al finalizar el proceso, cerrar la conexin.
cn.Open() Using tr As SqlTransaction = _ cn.BeginTransaction(Data.IsolationLevel.Serializable) Try Dim cmd As New SqlCommand( _ "Delete From dbo.Clientes Where cli_codigo=@cod", cn, tr) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text End With Dim c As Int16 = cmd.ExecuteNonQuery() If c = 1 Then tr.Commit() MessageBox.Show("Cliente Eliminado") Me.DGCliente.DataSource = DataClientes() Else tr.Rollback() MessageBox.Show("No se Elimino") End If

CIBERTEC

CARRERAS PROFESIONALES

78

. . . Catch ex As SqlException MessageBox.Show(ex.Message) tr.Rollback() Finally cn.Close() End Try End Using

14. Ejecutar la aplicacin y verificar los resultados. Cmo desarrollara el proceso de bsqueda de un cliente? Aplique sus ideas dentro del ejercicio.

LABORATORIO 4.4 TRANSACCIONES DISTRIBUIDAS, TRANSACTIONSCOPE


En este escenario, se aplicar un caso donde se trabajar con dos base de datos: BDFactura y BDAlmacen. En ellas, se actualizarn los datos sobre dos tablas: artculos en BDFactura y kardex en BDAlmacen: Cuando se agregue un nuevo artculo, ste se agregar en el kardex. Cuando se actualice el stock de artculos, se actualizar el stock en el kardex. La estructura de las tablas es la siguiente:
DATABASE BDFACTURA CREATE TABLE ARTICULOS( art_codigo char(5) primary key, art_nombre varchar(30), art_unidad char(4), art_precio Decimal, art_stock int) DATABASE BDALMACEN CREATE TABLE KARDEX( kar_codigo char(5) primary key, har_nombre varchar(30), kar_unidad char(4), kar_stock int)

1. Agregue un formulario al proyecto. 2. Disee la siguiente interface.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

79

Objeto
Textbox1 Textbox2 Textbox3 Textbox4 Textbox5 Button1 Button2 Button3 DataGridView1

Name
Txtcodigo Txtdescripcion Txtunidad Txtprecio Txtstock BtnLimpiar BtnGrabar BtnActualizar DGArticulos

Propiedad
Text Text Text Text Text Text Text Text

Valor

Limpiar Grabar Actualizar

3. Definir los Namespaces: System.Data.SqlClient y System.Transaction. 4. Definir e inicializar la cadena de conexin a nivel Class Form.
Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

5. Definir la funcin DataArticulos que retorne los artculos.


Function DataArticulos() As DataTable Dim da As New SqlDataAdapter("Select * from Articulos", cn) Dim t As New DataTable da.Fill(t) Return t End Function

6. En el evento Load del Form, llenar los datos en DGArticulos


Me.DGArticulos.DataSource = DataArticulos()

7. Programa el evento CellClick del DataGridView DGArticulos donde al seleccionar un registro se visualice en los Textboxes. 8. En botn Guardar, registrar un nuevo artculo en la tabla artculos y registrar el artculo en el kardex: a. Abrir la conexin y crear una conexin para BDAlmacen. b. Crear un transaccin Scope de tipo Required. c. Establecer la estructura Try Catch Finally. d. Ejecutar el comando con el mtodo ExecuteNonQuery. e. En el Command, definir la sentencia de insercin al kardex. f. Ejecutar el mtodo Complete de la transaccin. g. Si el proceso tuvo un error, se desencadena el Catch. h. Al finalizar el proceso, se cerrarn las conexiones.
cn.Open() cnk.Open() Using tr As New TransactionScope(TransactionScopeOption.Required) Try Dim cmd As New SqlCommand("Insert Articulos(art_codigo, art_nombre,art_unidad,art_precio,art_stock) Values(@cod, @nom, @uni, @pre, @st)", cn) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text .Add("@nom", SqlDbType.VarChar).Value = txtdescripcion.Text .Add("@uni", SqlDbType.VarChar).Value = txtunidad.Text .Add("@pre", SqlDbType.Decimal).Value = Val(txtprecio.Text) .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) End With

......

CIBERTEC

CARRERAS PROFESIONALES

80

......
cmd.ExecuteNonQuery() cmd = New SqlCommand("Insert Kardex(kar_codigo,har_nombre, kar_unidad,kar_stock) Values(@cod, @nom, @uni,@st)", cnk) With cmd.Parameters .Add("@cod", SqlDbType.Char).Value = txtcodigo.Text .Add("@nom", SqlDbType.VarChar).Value = txtdescripcion.Text .Add("@uni", SqlDbType.VarChar).Value = txtunidad.Text .Add("@st", SqlDbType.Int).Value = Val(txtstock.Text) End With cmd.ExecuteNonQuery() tr.Complete() MessageBox.Show("Articulo Agregado") Me.DGArticulos.DataSource = DataArticulos() Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() : cnk.Close() End Try End Using

9. En botn actualizar, actualizar el stock en artculo y en kardex: a. Abrir la conexin y crear una conexin para BDAlmacen. b. Crear un transaccin Scope de tipo Required. c. Establecer la estructura Try Catch Finally. d. Dentro del Try, definir un Command que inserta los artculos. e. Ejecutar el comando con el mtodo ExecuteNonQuery. f. En el Command, definir la sentencia de insercin al kardex. g. Ejecutar el mtodo Complete de la transaccin. h. Si el proceso tuvo un error, se desencadena el Catch. i. Al finalizar el proceso, se cerrarn las conexiones.
cn.Open() cnk.Open() Using tr As New TransactionScope() Try Dim cmd As New SqlCommand("Update dbo.Articulos Set art_stock = @st Where art_codigo=@cod", cn) cmd.Parameters.Add("@st", SqlDbType.Int).Value= Val(txtstock.Text) cmd.Parameters.Add("@cod", SqlDbType.Char).Value = txtcodigo.Text cmd.ExecuteNonQuery() cmd = New SqlCommand("Update dbo.Kardex Set kar_stock = @st Where kar_codigo=@cod", cnk) cmd.Parameters.Add("@st", SqlDbType.Int).Value= Val(txtstock.Text) cmd.Parameters.Add("@cod", SqlDbType.Char).Value = txtcodigo.Text cmd.ExecuteNonQuery() tr.Complete() Me.DGArticulos.DataSource = DataArticulos() Catch ex As SqlException MessageBox.Show(ex.Message) Finally cn.Close() cnk.Close() End Try End Using

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

81

Autoevaluacin
1. Cul es la diferencia entre una transaccin local y una transaccin distribuida? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 2. Defina los niveles de aislamiento (isolation level) de una transaccin. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 3. Qu es una transaccin distribuida? Explique acerca de TransactionScope __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 4. Explique brevemente cada uno de los valores de TransactoinScopeOption. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ____________________________________

5. Desarrollo prctico: Implemente un programa donde realice la actualizacin de vendedores dentro de la base de datos BDFactura, y en dicho proceso aplicar las transacciones locales.

CIBERTEC

CARRERAS PROFESIONALES

82

Resumen
Las transacciones locales son tiles para las aplicaciones que desean utilizar la misma transaccin en varias llamadas a funciones o a subprocesos. Tiene que llamar de forma especfica a los mtodos Commit y RollBack para confirmar o anular la transaccin. Las transacciones locales utilizan niveles de aislamiento o Isolation Level: ReadCommitted, ReadUnCommitted, Serializable, Chaos al momento de actualizar los datos. En la capa de datos, tambin, se maneja transacciones donde se utilizan las siguientes sentencias: o o o BEGIN TRANSACTION COMMIT TRANSACTION ROLLBACK TRANSACTION

Las transacciones distribuidas estn definidas en el .NET FrameWork 2.0 con la clase TransactionScope. La clase TransactionScope define un conjunto de valores segn el tipo de transaccin a realizar: o o o Required: crea una transaccin, si ya existe se agrega. RequiresNew: siempre crea una nueva transaccin. Suppress: suprime una transaccin, donde las sentencias se ejecutan sin transacciones.

Al crear una transaccin: TransactionScope se utiliza la sentencia Using y para actualizar los procesos se utiliza el mtodo Complete. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas:

http://msdn2.microsoft.com/es-es/library/z80z94hz(VS.80).aspx Pgina que referencia el manejo de transacciones http://msdn2.microsoft.com/es-es/library/ms172152(VS.80).aspx Pgina que maneja la implementacin de transacciones

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

83

UNIDAD DE APRENDIZAJE

2
SEMANA

5
OPERACIONES DE SCONECTADAS A UN ORIGEN DE DATOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que accedan a un origen de datos en forma desconectada utilizando los objetos del ADO.NET para obtener una mejor performance en los procesos de consulta y actualizacin de una aplicacin.

TEMARIO
Creacin y definicin DataSet, DataTable, Constraint y DataView. Proceso de consulta y actualizacin de datos desconectados en un DataSet. Operaciones desconectadas utilizando el Asistente del Visual Studio. Operaciones de consultas utilizando el DataView. Manejo de un DataTableReader desde un DataSet o DataTable.

ACTIVIDADES PROPUESTAS
Los alumnos reconocen el modelo desconectados de ADO.NET. Los alumnos manejan los objetos desconectados de datos. Los alumnos realizan operaciones de actualizacin en un DataSet.

CIBERTEC

CARRERAS PROFESIONALES

84

ARQUITECTURA DE ADO .NET


El procesamiento de datos ha dependido, principalmente, de un modelo basado en una conexin. A medida que el procesamiento de datos utiliza cada vez ms arquitecturas de varios niveles, los programadores estn pasando a un enfoque sin conexin. Existen dos componentes de ADO.NET que se pueden utilizar para obtener acceso a datos: Proveedores de datos de .NET Framework: permite manipular los datos y acceso de slo lectura. DataSet: permite el acceso a datos independientemente del origen de datos. En este captulo estudiaremos al DataSet y su Modelo.

DATASET
El DataSet es una representacin de datos residente en memoria que proporciona un modelo de programacin relacional coherente con independencia del origen de datos. Representa un conjunto completo de datos que incluye tablas relacionadas y restricciones, as como relaciones entre las tablas. En la siguiente ilustracin, se muestra el modelo de objetos DataSet.

2.1 Creacin de un DataSet


Al crear un DataSet se define una instancia de Dataset llamando a su constructor. Si lo desea, especifique un nombre de argumento. Si no especifica ninguno, se le asignar "NewDataSet".
Dim ds As New DataSet("DsFactura")

Tambin puede crearse un nuevo DataSet basado en un DataSet existente. El mtodo Clone solo copia la estructura del DataSet original. El mtodo GetChanges solo copiar los datos modificados. Si ejecuta el mtodo Copy, copia el contenido del DataSet.
Dim ds As DataSet = ds.Clone()

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

85

2.2 Forma de aadir una tabla a DataSet


ADO .NET te habilita para crear objetos DataTables y aadirlos a un DataSet existente. El siguiente ejemplo define un DataSet y se aade un DataTable al DataSet.
Dim ds As New DataSet("DsFactura") Dim tabla As New DataTable("Clientes") ds.Tables.Add(tabla)

2.3 Forma de aadir columnas a una tabla


El esquema de una tabla est representado por columnas y constraints. La definicin de un esquema de un DataTable es a travs de los objetos DataColumn, como tambin de los objetos ForeignKeyConstraint y UniqueConstraint. Se crea un objeto DataColumn dentro de una DataTable utilizando un constructor de DataColumn o llamando al mtodo Add de la propiedad Columns de una tabla. El mtodo Add aceptar: o ColumnName: nombre de la columna. o DataType: tipo de dato de la columna. o Expresin: argumento que crea una nueva columna. En el siguiente ejemplo, se aade 4 columnas a la tabla Recibos.
Dim tabla As New DataTable("Recibos") tabla.Columns.Add("numero", Type.GetType("System.String")) tabla.Columns.Add("fecha", Type.GetType("System.DateTime")) tabla.Columns.Add("detalle", Type.GetType("System.String")) tabla.Columns.Add("monto", Type.GetType("System.Decimal")))

o tambin a travs del DataColumn.


Dim tabla As New DataTable("Recibos") Dim dc As New DataColumn("num", Type.GetType("System.String")) tabla.Columns.Add(dc) dc = New DataColumn("fecha", Type.GetType("System.DateTime")) tabla.Columns.Add(dc) dc = New DataColumn("detalle", Type.GetType("System.String")) tabla.Columns.Add(dc) dc = New DataColumn("monto", Type.GetType("System.Decimal")) tabla.Columns.Add(dc)

2.4 Creacin de expresiones


Puede definirse una expresin para una columna, habilitndolo para contener un valor calculado desde otra columna en la misma fila o desde valores de varias columnas de las filas en la tabla. El DataType debe ser el apropiado para el valor de la expresin. En el siguiente ejemplo, agregar la columna renta que representa el 10% del monto.
tabla.Columns.Add("monto", Type.GetType("System.Decimal")) tabla.Columns.Add("monto", Type.GetType("System.Decimal"), _ monto*0.10")

CIBERTEC

CARRERAS PROFESIONALES

86

o se puede generar a travs del DataColumn.


dc = New DataColumn("monto", Type.GetType("System.Decimal")) tabla.Columns.Add(dc) dc = New DataColumn("monto", Type.GetType("System.Decimal")) dc.Expression = "monto*0.10" tabla.Columns.Add(dc)

2.5 Creacin de columnas que generen autogeneren valores


Para asegurar que los valores sean nicos, puede colocar una columna cuyos valores se incrementen automticamente cuando se aade una nueva columna. Para crear una columna Autoincrementada, colocar la propiedad AutoIncrement a true. A continuacin, se define las siguientes propiedades: Opcin
AutoIncrementSeed AutoIncrementStep ReadOnly

Descripcin
Valor inicial del autogenerado Valor incremental Indica que la columna ser de solo lectura

En el siguiente ejemplo agregar la columna nmero, cuyo valor se incrementar de 5 en 5, a partir del valor de 10.

Dc= New DataColumn("numero", Type.GetType("System.Int32")) dc.AutoIncrement = True dc.AutoIncrementSeed = 10 dc.AutoIncrementStep = 5 dc.ReadOnly = True tabla.Columns.Add(dc)

2.6 Definicin de una clave primaria para la tabla


Una tabla, por lo general, tiene una columna o un grupo de columnas que identifica en forma nica a cada fila dentro de la tabla. La identificacin es llamada Primary key. Cuando un dataColumn se identifica como PrimaryKey para la tabla, la propiedad AllowDBNull es falsa, pero la propiedad Unique no es colocada a true. La propiedad PrimaryKey recibe los valores como un array de una o ms objetos DataColumns. El siguiente ejemplo permite definir un Primary Key de una columna o un Primary Key de dos columnas.
tabla.PrimaryKey = New DataColumn() {tabla.Columns(0)} 'o dc = tabla.Columns(0) tabla.PrimaryKey = New DataColumn() {dc}

tabla.PrimaryKey = New DataColumn() {tabla.Columns(0), tabla.Columns(1)}

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

87

2.6 Forma de aadir un Constraint a una tabla


Puede utilizar Constraint para establecer restricciones a los datos en un DataTable y mantener la integridad de datos. Un Constraint es una regla, aplicada a una columna que determina el curso de accin cuando el valor de una fila es alterada. Existen dos tipos de constraint: ForeignKeyConstraint y el UniqueConstraint. 2.6.1 ForeignKeyConstraint Las propiedades DeleteRule y UpdateRule definen la accin a ser tomada cuando el usuario actualiza o elimina una fila en la tabla relacionada. Si una fila de la tabla principal es eliminada, tambin se borrarn los registros de la tabla hija que tienen el mismo valor. A continuacin, se muestra las reglas para las propiedades de UpdateRule y DeleteRule. Rule
Cascade SetNull SetDefault None

Descripcin
Elimina o actualiza las filas relacionadas. Coloca el valor relacional a DBNull. Coloca el valor por defecto a las filas relacionales. Especifica que no se efecta accin a las filas relacionales.

El objeto ForeignKeyConstraint es agregado a la coleccin Constraint de la tabla relacionada a travs del mtodo Add. El siguiente ejemplo establece un ForeignKey entre las tablas clientes y factura, donde el valor DeleteRule es None.
Dim FKCliFact As New ForeignKeyConstraint("FK1", _ Cliente.Columns("cli_codigo"), Factura.Columns("cli_codigo")) FKCliFact.DeleteRule = Rule.None dataSet.Tables("Factura").Constraints.Add(FKCliFact)

2.6.2 UniqueConstraint El objeto UniqueConstraint aplica la unicidad de los valores de las filas de una tabla para una columna o un array de columnas. Se puede crear un UniqueConstraint para una columna o array de columnas. El objeto UniqueConstraint es agregado a la coleccin Constraint de la tabla a travs del mtodo Add. Podemos crear una constraint de tipo Unique asignando la propiedad Unique a true. El siguiente ejemplo permite crear UniqueConstraint a la columna num.
Dim dc As New DataColumn("num", Type.GetType("System.Int32")) dc.Unique = True

CIBERTEC

CARRERAS PROFESIONALES

88

El siguiente ejemplo permite crear UniqueConstraint, a dos columnas.


Dim uknumeros As New UniqueConstraint( _ New DataColumn() {ds.Tables("facturas").Columns(0), _ ds.Tables("facturas").Columns(1)}) ds.Tables("facturas").Constraints.Add(uknumeros)

2.7 FORMA DE AADIR RELACIONES ENTRE TABLAS


En un DataSet que contiene muchas tablas (DataTables), puede utilizar objetos DataRelations donde, permita relacionar dos tablas, navegar entre los registros de las dos tablas y retorne los registros de la tabla hija. Para crear un DataRelation, se debe establecer como argumentos el campo de la tabla padre y el campo de la tabla referencial o hija. Aadiendo un DataRelation a un DataSet, por defecto se crea un Constraint de tipo Unique en la tabla padre y otro constraint de tipo Foreign en la tabla hija, para recuperar todas las filas de facturas de una fila de clientes determinada mediante GetChildRows. El siguiente ejemplo crea una relacin de la tabla clientes y facturas donde la primera columna ser de la tabla padre (clientes) y la segunda ser de la tabla hija (facturas).
Dim relclifac As New DataRelation( _ "r1", ds.Tables("clientes").Columns(cli_codigo), ds.Tables("facturas").Columns(cli_codigo)) ds.Relations.Add(relclifac) For Each pRow In ds.Tables("Clientes").Rows Console.WriteLine(pRow("cli_codigo").ToString()) For Each cRow In pRow.GetChildRows(relation) Console.WriteLine(vbTab & cRow("fac_numero").ToString()) Next Next

DATAADAPTER
El DataSet es un conjunto de datos que residen en memoria, el cual nos proporciona un modelo relacional independiente del origen de datos. Como el DataSet es independiente al origen de datos, para interactuar con los orgenes de datos actuales se necesita del DataAdapter. Un DataAdapter es usado para recuperar los datos desde un origen de datos y publica tablas dentro de un DataSet. Los proveedores que incluye para el DataAdapter son: Proveedor
SqlDataAdapter OleDbDataAdapter OdbcDataAdapter OracleDataAdapter

Descripcin
Proveedor para SQL Server Proveedor para OLE DB Proveedor para ODBC Proveedor para Oracle

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

89

3.1 CONFIGURACIN DE UN DATAADAPTER


El DataAdapter tiene 4 propiedades que son utilizadas para recibir y actualizar datos al origen de datos: Propiedades
InsertCommand UpdateCommand DeleteCommand SelectCommand

Descripcin
Comando para insertar filas en un almacn de datos. Comando para modificar filas en el almacn de datos. Comando para eliminar filas en el almacn de datos. Comando para recuperar filas en el almacn de datos.

En el ejercicio ejecutamos una consulta (Select) en la tabla facturas y procedemos a poblar los registros al DataSet utilizando el mtodo Fill.
Dim da As New SqlDataAdapter("Select * from Facturas", cn) Dim ds As New DataSet da.Fill(ds, "facturas")

3.2 MTODO PARA DATAADAPTER

POBLAR

LOS

DATOS

DESDE

UN

El mtodo Fill del DataAdapter es usado para poblar un DataSet con los resultados del SelectCommand del DataAdapter. El Mtodo Fill toma como argumentos el nombre del DataSet para publicar los registros y el nombre del objeto DataTable. 3.2.1 Llenar un DataSet desde mltiples DataAdapter Se puede utilizar cualquier cantidad de objetos DataAdapter con un DataSet. Cada DataAdapter se puede utilizar para llenar uno o varios objetos DataTable y para reflejar en el origen de datos correspondiente las actualizaciones que sean necesarias. Se pueden agregar, de forma local, objetos DataRelation y Constraint al DataSet, de manera que se pueden relacionar datos procedentes de varios orgenes distintos. Para ocuparse de la comunicacin con cada origen de datos se pueden usar uno o varios objetos DataAdapter.
Dim daCli As New SqlDataAdapter("SELECT * FROM Clientes", cn) Dim daFact As New SqlDataAdapter("SELECT * FROM Facturas", cn) Dim ds As New DataSet() daCli.Fill(ds, "Clientes") daFact.Fill(ds, "Facturas") Dim relation As DataRelation = ds.Relations.Add("CustOrders", _ ds.Tables("Clientes").Columns("cli_codigo"), _ ds.Tables("Facturas").Columns("cli_codigo")) Dim pRow, cRow As DataRow For Each pRow In ds.Tables("Clientes").Rows Console.WriteLine(pRow("cli_codigo").ToString()) For Each cRow In pRow.GetChildRows(relation) Console.WriteLine(vbTab & cRow("fac_numero").ToString()) Next Next

CIBERTEC

CARRERAS PROFESIONALES

90

3.3 ACTUALIZANDO UNA BASE DATAADAPTER Y UN DATASET

DE

DATOS

CON

UN

El mtodo Update del DataAdapter efecta los cambios efectuados en un DataSet. El mtodo Update, al igual que el mtodo Fill, acepta como argumentos una instancia de un DataSet el que contiene los cambios efectuados y un objeto DataTable que identifica la tabla desde la que se pueden recuperar esos cambios. Al llamar al mtodo Update, el DataAdapter analiza los cambios efectuados y ejecuta el comando apropiado (INSERT, UPDATE o DELETE). Cuando el DataAdapter encuentra un cambio en una DataRow, utiliza los comandos InsertCommand, UpdateCommand o DeleteCommand para reflejarlo. Antes de llamar a Update, debe establecer de forma explcita los comandos. El mtodo Update refleja, en el origen de datos los cambios efectuados, pero ya han modificado datos en el origen de datos desde el momento en que se llen el DataSet. Utilice el DataAdapter y el mtodo Fill. Si el mtodo Fill encuentra un valor de clave principal para una fila del DataSet que coincide con un valor de clave principal de una fila de los resultados devueltos por SelectCommand, ste actualiza la fila existente con la informacin de la fila devuelta por SelectCommand y establece el RowState de la fila existente en Unchanged. Si una fila devuelta por SelectCommand tiene un valor de clave principal que no coincide con ninguno de los valores de clave principal de las filas del DataSet, el mtodo Fill agrega una nueva fila con un RowState de Unchanged. En este ejemplo, se demuestra cmo se deben realizar las actualizaciones en las filas modificadas estableciendo, de forma explcita, el comando UpdateCommand de DataAdapter. Observe cmo el parmetro @cod especificado en la clusula WHERE de la instruccin UPDATE utiliza el valor Original de SourceColumn. Este hecho es muy importante, ya que el valor Current puede haber sido modificado de forma que ya no coincida con el valor del origen de datos.
Dim da As New SqlDataAdapter("Select * from Articulos", cn) da.UpdateCommand = New SqlCommand("Update Articulos Set art_nombre=@nom, art_precio=@pre, art_stock = @st Where art_codigo=@cod", cn) With da.UpdateCommand.Parameters .Add("@nom", SqlDbType.VarChar, 30, "art_nombre") .Add("@pre", SqlDbType.Decimal, 10, "art_precio") .Add("@st", SqlDbType.Int, 10, "art_stock") Dim par As SqlParameter = .Add("@cod", SqlDbType.Char) par.SourceColumn = "art_codigo" par.SourceVersion = DataRowVersion.Original End With Dim ds As New DataSet da.Fill(ds, "Articulos") Dim row As DataRow = ds1.Tables("Articulos").Rows(i) row("art_stock") = Val(txtstock.Text) row("art_nombre") = Me.txtdescripcion.Text row("art_precio") = Val(Me.txtprecio.Text) da.Update(ds, "Articulos") Me.DGArticulos.DataSource = ds.Tables("Articulos")

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

91

MANIPULACIN DE DATOS EN UN DATATABLE


Despus de crear un DataTable en un DataSet, se pueden realizar las mismas actividades que al utilizar una tabla de una base de datos. Se puede agregar, ver, modificar y eliminar datos en la tabla, supervisar los errores y eventos y consultar los datos de la tabla. Al modificar los datos de una DataTable, se puede comprobar si los cambios son precisos y determinar si aceptarlos o rechazarlos mediante programacin.

4.1 ADICIN DE UNA FILA A UN DATATABLE


Creado el DataTable, se le pueden agregar nuevas filas de datos. Para agregar una nueva fila, declare una nueva variable como tipo DataRow. Se devuelve un nuevo objeto DataRow cuando se llama al mtodo NewRow. En el ejemplo siguiente se muestra cmo se crea una nueva fila llamando al mtodo NewRow.
Dim Row As DataRow = dt.NewRow Row(0) = txtcodigo.Text dt.Rows.Add(Row)

4.2 BSQUEDA UNA FILA EN UN DATATABLE


Para ubicar una Fila en una tabla, utilice el mtodo Find. ste retorna la fila especificada por el valor de la clave primaria. El siguiente ejemplo muestra cmo se realiza una bsqueda por el cdigo; si existe, se muestra los datos; sino, se muestra un mensaje.
Dim Row As DataRow = dt.Rows.Find(txtcodigo.Text) If Not Row Is Nothing Then txtdescripcion.Text = Row(1) txtunidad.Text = Row(2) Else MessageBox.Show("No Existe") End If

4.3 ELIMINACIN DE UNA FILA EN UN DATATABLE


Existen dos mtodos: Metodo
Remove Delete

Descripcin
Elimina una fila del DataRowCollection Marca la fila para su eliminacin. La eliminacin propiamente se produce al ejecutar el mtodo AcceptChanges

Si se usa Delete, se puede comprobar mediante programacin qu filas estn marcadas para eliminacin antes de eliminarlas. Cuando una fila est marcada para eliminacin, su propiedad RowState est establecida en Deleted. Cuando el DataAdapter encuentra una fila marcada como Deleted, ejecuta el mtodo DeleteCommand para eliminar la fila en el origen de datos. A continuacin se puede quitar la fila permanentemente utilizando el mtodo AcceptChanges.

CIBERTEC

CARRERAS PROFESIONALES

92

En el siguiente ejemplo, se muestra cmo se realiza la eliminacin de una fila por el mtodo Remove
'capturo el indice de la Fila Actual(CurrentRow) del DataGrid Dim i As Integer = Me.DGArticulos.CurrentRow.Index Dim row As DataRow = dt.Rows(i) dt.Rows.Remove(row)

4.4 ESTADOS Y VERSIONES DE UNA FILA


ADO .NET administra las filas de las tablas mediante: o Estado de fila indica el estado de una fila. o Versiones de fila mantienen los valores almacenados en una fila en cuanto se modifica, incluyendo los valores actuales, originales y predeterminados. Cada objeto DataRow cuenta con la propiedad RowState que puede examinar para determinar el estado actual de la fila. En la tabla siguiente, se describen brevemente los valores de la enumeracin RowState. Estado
UnChanged

Descripcin
No se han hecho AcceptChanges. cambios desde la ltima llamada a

Added Modified Deleted

Se ha agregado la fila a la tabla, pero no se ha llamado a AcceptChanges. Se ha cambiado algn elemento de la fila. Se ha eliminado la fila de una tabla y no se ha llamado a AcceptChanges. La fila no forma parte de ninguna DataRowCollection. El RowState de una fila recin creada se establece en Detached. Una vez que se ha agregado la nueva DataRow a la DataRowCollection llamando al mtodo Add, el valor de la propiedad RowState se establece en Added.

Detached

Cuando se llama a AcceptChanges en DataSet, DataTable o DataRow, se quitan todas las filas con el estado de fila Deleted. Las filas que quedan reciben el estado de fila Unchanged y los valores de la versin de fila Original se sobrescriben con los valores de la versin de fila Current. Si se llama a RejectChanges, se quitan todas las filas con el estado de fila Added. Las filas que quedan reciben el estado de fila Unchanged y los valores de la versin de fila Current se sobrescriben con los valores de la versin de fila Original. El siguiente ejemplo muestra los registros aadidos, modificacdos y eliminados (Delete) en un DataTable.
Dim tabla As DataTable = dt.GetChanges(DataRowState.Added) Dim tabla1 As DataTable = dt.GetChanges(DataRowState.Deleted) Dim tabla2 As DataTable = dt.GetChanges(DataRowState.Unchanged)

no

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

93

Las distintas versiones de una fila se pueden ver pasando un parmetro DataRowVersion con la referencia de la columna, como se muestra en el ejemplo siguiente. Versin
Current

Descripcin
Valores actuales de la fila. Es la versin de fila predeterminada para una determinada fila. La versin de fila predeterminada para una fila Added, Modified o Unchanged es Current. Valores originales de la fila. Valores propuestos para la fila.

Default

Original Proposed

Se puede comprobar si una DataRow tiene una versin de fila concreta llamando al mtodo HasVersion y pasando una DataRowVersion como argumento. Ejemplo, DataRow.HasVersion (DataRowVersion.Original) devolver false para las filas recin agregadas antes de que se llame a AcceptChanges.

4.5 MTODO PARA ACEPTAR O RECHAZAR LOS CAMBIOS EN LA FILAS


Despus de comprobar la exactitud de los cambios realizados en un DataTable, se pueden aceptar con el mtodo AcceptChanges de DataRow, DataTable o DataSet, que configurar los valores de fila Current de modo que sean los valores Original y establecer la propiedad RowState en Unchanged. Si se aceptan o se rechazan los cambios, se elimina la informacin de RowError y se establece la propiedad HasErrors en false. Aceptar o rechazar cambios tambin puede afectar a la actualizacin de datos en el origen de datos. Si hay restricciones de clave externa en la DataTable, los cambios que se acepten o se rechacen con AcceptChanges y RejectChanges se propagan a las filas secundarias de la DataRow de acuerdo con la ForeignKeyConstraint.AcceptRejectRule En el siguiente ejercicio, si los registros actualizados han generado errores, HasErrors visualizamos el conjunto de errores y deshacemos la actualizacin RehectChanges, si no hay errores, se procede a actualizar AcceptChanges.
If dt.HasErrors Then Dim str As String = "" For Each row As DataRow In dt.GetErrors str = str + row.RowError + vbCrLf Next MessageBox.Show(str) dt.RejectChanges() End If dt.AcceptChanges()

CIBERTEC

CARRERAS PROFESIONALES

94

LABORATORIO 5.1 CONSULTA DE DATOS RELACIONALES


En el ejemplo siguiente se muestra la consulta entre dos tablas: tb_clientes y tb_pedidoscabe, donde al seleccionar un cliente en un control ListBox, visualice los pedidos del cliente seleccionado. 1. Ingrese a Visual Studio 2005 2. Seleccione File->New->Project 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic - En Templates elija WindowsApplication - En Name coloque appFacturacion4 - En Location coloque C:\CursoPOOII 4. Diseo del Formulario:

5. Defina el Namespaces: System.Data.SqlClient. 6. Defina e inicialice la cadena de conexin a nivel Class Form, el objeto DataSet, que almacenar las tablas.
Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=DBVentas; integrated security=true") Private ds As New DataSet

7. En el Load del formulario realizar las siguientes operaciones: a. Cargar las tablas clientes y pedidos utilizando el DataAdapter. b. Poblar los registros del DataAdapter al DataSet. c. Enlazar el Listbox1, con la tabla clientes. d. Definir la relacin entre las tablas y aadir la relacin al DataSet.
'Manejo de DataAdapter Dim da As New SqlDataAdapter("Select * from tb_clientes", cn) da.Fill(ds, "Clientes") ds.Tables("clientes").PrimaryKey = _ New DataColumn() {ds.Tables("clientes").Columns(0)} da = New SqlDataAdapter("Select * from tb_pedidoscabe",cn) da.Fill(ds, "pedidos") 'Enlazar el Listbox1 Me.ListBox1.DataSource = ds.Tables("clientes") Me.ListBox1.DisplayMember = "NombreCia" Me.ListBox1.ValueMember = "IdCliente" 'Establecer la Relacion entre las Tablas Dim drel As New DataRelation( _ "r1", ds.Tables("clientes").Columns("IdCliente"), _ ds.Tables("facturas").Columns("IdCliente")) 'Agregar la relacion ds.Relations.Add(drel)

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

95

8. En el click del Listbox, mostramos las facturas segn el cliente seleccionado: a. Capturar el ndice de la fila seleccionada: Listbox1.SelectedIndex. b. Definir un Dataview de la tabla clientes. c. Definir un DataRowView. d. A travs del mtodo CreateChildView (nombre de la relacin) del DataRowView se capturan las filas de fac_cabe las cuales se visualizan en el DataGrid1.
Dim i As Integer = ListBox1.SelectedIndex Dim dv As New DataView(ds.Tables("clientes")) Dim drv As DataRowView = dv(i) Me.DataGridView1.DataSource = drv.CreateChildView("r1")

9. Guarde su aplicacin y ejecute. Compruebe el resultado.

LABORATORIO 5.2 ACTUALIZACIN DE DATOS, UTILIZANDO EL DATAADAPTER


En este escenario, se implementara un formulario para realizar el mantenimiento de los vendedores de la base de datos DVentas. A travs de este ejemplo utilizaremos los mtodos del DataAdapter para la actualizacin de datos 1. Agregar un formulario al proyecto y disearlo.

Objeto Label1 Label2 Label3 Label4 Textbox1 Textbox2 Textbox3 Textbox4 Button1 Button2 Button3 Button4 DataGridView1

Name Label1 Label2 Label3 Label4 Txtcodigo Txtnombre Txtfono Txtdireccion BtnLimpiar BtnGrabar BtnActualizar BtnEliminar DGVendedor

Propiedad Text Text Text Text Text Text Text Text Text Text Text Text

Valor Codigo Nombre Telfono Direccion

Limpiar Grabar Actualizar Eliminar

CIBERTEC

CARRERAS PROFESIONALES

96

2. Defina el Namespace y la cadena de conexin 3. Defina la funcin DataArticulos que retorne los artculos.
Function DataVendedor() As DataTable Dim da As New SqlDataAdapter("Select*fron tb_vendedor",cn) Dim t As New DataTable da.Fill(t) Return t End Function

4. En el evento Load del Form, llenar los datos en DGVendedor.


Me.DGVendedor.DataSource = DataVendedor()

5. Para navegar por los registros del DataGridView DGVendedor y al seleccionar un registro se visualice en los Textboxes, se deber programar en el evento CellClick.
With DGVendedor.CurrentRow txtcodigo.Text = .Cells(0).Value txtnombre.Text = .Cells(1).Value txtfono.Text = .Cells(2).Value txtdireccion.Text = .Cells(3).Value End With

6. En el evento click del botn actualizar, modificamos los datos de un vendedor seleccionado: a. Capture el ndice de la fila seleccionada. b. Defina un DataAdapter de tipo UpdateCommand. c. Defina sus parmetros. d. Crea un DataRow de la fila seleccionada. e. Aplique el Update del DataAdapter a la tabla.
Dim i As Integer = Me.DGVendedor.CurrentRow.Index Dim da As New SqlDataAdapter("Select * from tb_Vendedor", cn) da.UpdateCommand = New SqlCommand("Update tb_Vendedor Set ven_nombre=@nom, ven_telefono=@f, ven_direccion = @d Where ven_codigo=@cod", cn) With da.UpdateCommand.Parameters .Add("@nom", SqlDbType.VarChar, 30, "ven_nombre") .Add("@f", SqlDbType.Char, 8, "ven_telefono") .Add("@d", SqlDbType.VarChar, 60, "ven_direccion") Dim par As SqlParameter = .Add("@cod", SqlDbType.Char) par.SourceColumn = "ven_codigo" par.SourceVersion = DataRowVersion.Original End With Dim dt As New DataTable da.Fill(dt) Dim row As DataRow = dt.Rows(i) row("ven_nombre") = txtnombre.Text row("ven_telefono") = txtfono.Text row("ven_direccion") = txtdireccion.Text da.Update(dt) Me.DGVendedor.DataSource = ds1

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

97

7. En el evento click del botn grabar, insertaremos un nuevo vendedor: a. Defina un DataAdapter de tipo InsertCommand, defina sus parmetros. b. Cree un DataRow, definir de tipo NewRow, y le agregamos sus valores. c. Aada la nueva fila a la tabla. d. Aplicamos el Update del DataAdapter a la tabla y visualizamos los registros. Cmo evaluara si el cdigo del vendedor se va a duplicar?
Dim da As New SqlDataAdapter("Select * from tb_Vendedor", cn) da.InsertCommand = New SqlCommand("Insert Into tb_Vendedor(ven_codigo,ven_nombre,ven_telefono,ven_direccion) Values(@cod, @nom, @f, @dir)", cn) With da.InsertCommand.Parameters .Add("@cod", SqlDbType.Char, 5, "ven_codigo") .Add("@nom", SqlDbType.VarChar, 30, "ven_nombre") .Add("@f", SqlDbType.VarChar, 8, "ven_telefono") .Add("@dir", SqlDbType.VarChar, 60, "ven_direccion") End With Dim dt As New DataTable da.Fill(dt) Dim row As DataRow = dt.NewRow row("ven_codigo") = txtcodigo.Text row("ven_nombre") = txtnombre.Text row("ven_telefono") = txtfono.Text row("ven_direccion") = txtdireccion.Text dt.Rows.Add(row) da.Update(dt) Me.DGVendedor.DataSource = dt

8. Aplique el concepto para eliminar un registro seleccionado 9. Guarde su aplicacin y ejectela.

LABORATORIO 5.3 ACTUALIZACIN DE DATOS, UTILIZANDO EL DATASET


En este escenario, se implementar un formulario para realizar el mantenimiento de los artculos de la base de datos BDFactura. 1. Agregue un formulario al proyecto y diselo.

CIBERTEC

CARRERAS PROFESIONALES

98

Objeto Label1 Label2 Label3 Label4 Label5 Textbox1 Textbox2 Textbox3 Textbox4 Textbox5 Button1 Button2 Button3 Button4 Button5 DataGridView1

Name Label1 Label2 Label3 Label4 Label5 Txtcodigo Txtdescripcion Txtunidad Txtprecio Txtstock BtnLimpiar BtnBuscar BtnGrabar BtnModificar BtnEliminar DGArticulos

Propiedad Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text

Valor Codigo Descripcion Unidad Precio Stock

Limpiar Buscar Grabar Modificar Eliminar

2. Defina el NameSpace, su conexin y un DataTable.


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=DBVentas; integrated security=true") Dim dt As New DataTable

3. En el evento Load del Form, defina el DataTable y una clave primaria.


Dim da As New SqlDataAdapter("Select*from tb_productos",cn) da.Fill(dt) dt.PrimaryKey = New DataColumn() {dt.Columns(0)} Me.DGArticulos.DataSource = dt

4. Al seleccionar una fila en el DataGridView, mostrar sus datos, donde haremos una bsqueda de la fila por su cdigo.
Dim row As DataRow = dt.Rows.Find( _ Me.DGArticulos.CurrentRow.Cells(0).Value) txtcodigo.Text = row(0) txtdescripcion.Text = row(1) txtunidad.Text = row(2) txtprecio.Text = row(3) txtstock.Text = row(4)

5. En el evento click del botn grabar, agregar un nuevo artculo.


Dim Row As DataRow = dt.NewRow Row(0) = txtcodigo.Text Row(1) = txtdescripcion.Text Row(2) = txtunidad.Text Row(3) = Val(txtprecio.Text) Row(4) = Val(txtstock.Text) dt.Rows.Add(Row)

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

99

6. En el evento click del botn buscar, ubique un registro por su cdigo, si lo ubica llenar los TextBox.
Dim Row As DataRow = dt.Rows.Find(txtcodigo.Text) If Row Is Nothing Then MessageBox.Show("No Existe") Else txtdescripcion.Text = Row(1) txtunidad.Text = Row(2) txtprecio.Text = Row(3) txtstock.Text = Row(4) End If

7. En el evento click del botn eliminar, se ejecuta el proceso de borrar un registro seleccionado.
Dim row As DataRow Row = dt.Rows.Find(Me.DGArticulos.CurrentRow.Cells(0).Value) dt.Rows.Remove(row)

8. En el evento click del botn modificar, se ejecutar en proceso donde se cambiarn los datos del artculo seleccionado. Se observa que no se actualiza el cdigo del artculo.
Dim row As DataRow row = dt.Rows.Find(Me.DGArticulos.CurrentRow.Cells(0).Value) row(1) = Me.txtdescripcion.Text row(2) = Me.txtunidad.Text row(3) = Val(txtprecio.Text) row(4) = Val(txtstock.Text)

9. Pinte el botn Actualizar Datos, el cual actualizar los datos del DataTable, donde evala, primero, si no tiene errores actualizar los cambios utilizando el mtodo AcceptChanges, caso contrario, visualiza los errores y deshace la operacin a travs del mtodo RejectChanges.
If Not dt.HasErrors Then dt.AcceptChanges() Else Dim str As String = "" For Each row As DataRow In dt.GetErrors str = str + row.RowError + vbCrLf Next MessageBox.Show(str) dt.RejectChanges() End If

CIBERTEC

CARRERAS PROFESIONALES

100

10. Guarde el proyecto y ejecute para realizar las pruebas.

Pregunta: Cmo pasar los datos actualizados en el DataSet a la base de datos?, investigue acerca del CommandBuilder. Tarea de Investigacin.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

101

Autoevaluacin
1. Cul es la Arquitectura del DataSet? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 2. Cmo se agrega columnas, cmo se define un campo Unique y un Primary Key? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 3. Cules son los mtodos del DataAdapter? Explique brevemente. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 4. Explique el estado y la versin de una fila. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 5. Qu es un DataView? Explique su mtodo de ordenamiento y filtro. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________

CIBERTEC

CARRERAS PROFESIONALES

102

Resumen
El modelo de datos desconectados, est representado por el DataSet, el cual est conformado por DataTable Collection, DataRelation Collection, Primary Key, Constraint. Un DataTable se puede trabajar dentro o fuera del DataSet; se le puede agregar columnas, definir constraint: UniqueConstraint y ForeignKeyConstraint. Un DataRelation establece la relacin entre dos tablas: principal y la hija; al generar un DataRelation, est se agrega al DataSet y crea, por defecto, un Constraint Unique y ForeignKey. En un DataAdapter, los datos son actualizados a travs de sus cuatro mtodos: InsertCommand, UpdateCommand, DeleteCommand y SelectCommand, los que afectan directamente al origen de datos, utilizando el mtodo Update. Se puede realizar operaciones en un DataTable: aadir registros, modificar sus datos, eliminar los registros. Para confirmar los registros, se utiliza los mtodos AcceptChanges (actualizar) o RejectChanges (deshacer los cambios). Las filas de un DataTable, segn su operacin manejan estados: Added, Deleted, Modified y Unchanged. Ello para que stas sean visualizadas por el DataRowVersion. El DataView es una vista de datos de una tabla, la cual puede realizar operaciones de ordenamiento y filtro, independiente de la tabla de origen. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas:

http://msdn2.microsoft.com/es-es/library/zb0sdh0b(VS.80).aspx Pgina que explica la estructura del DataSet de ADO.NET

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

103

UNIDAD DE APRENDIZAJE

2
SEMANA

6
OPERACIONES DE SCONECTADAS: USO DEL DATAVIEW Y EL DATATABLEREADER
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos elaboran aplicaciones Windows .NET que accedan a un origen de datos en forma desconectada utilizando los objetos del ADO.NET para obtener una mejor performance en los procesos de consulta y actualizacin de una aplicacin.

TEMARIO
Creacin y definicin DataSet, DataTable, Constraint y DataView. Proceso de consulta y actualizacin de datos desconectados en un DataSet. Operaciones desconectadas utilizando el Asistente del Visual Studio. Operaciones de consultas utilizando el DataView. Manejo de un DataTableReader desde un DataSet o DataTable.

ACTIVIDADES PROPUESTAS
Los alumnos realizan operaciones de consulta en un DatView. Los alumnos realizan operaciones de consulta en un DataTableReader sobre un DataSet o DataTable.

CIBERTEC

CARRERAS PROFESIONALES

104

1.

DATAVIEW
Una DataView proporciona una vista de datos dinmica en la DataTable subyacente: el contenido, el orden y la pertenencia reflejan los cambios en cuanto se producen. Este comportamiento difiere del mtodo Select de la DataTable, que devuelve una matriz de DataRow de una tabla basada en un filtro o un orden determinados: este contenido refleja cambios en la tabla subyacente, pero la pertenencia y la ordenacin siguen siendo estticas.

1.1 CREACIN DE UN DATAVIEW


Hay dos formas de crear una DataView. Puede utilizar el constructor DataView o puede crear una referencia a la propiedad DefaultView de la DataTable. El constructor DataView puede estar vaco o puede aceptar tambin DataTable como nico argumento o DataTable junto con el criterio de filtro o de ordenacin, y un filtro de estado de fila.
Dim dv As DataView = dt.DefaultView

Al crear una DataView sin especificar criterios de ordenacin o de filtro y establecer posteriormente las propiedades Sort, RowFilter o RowStateFilter hace que el ndice se construya dos veces como mnimo: una vez al crear la DataView y otra vez ms al modificar cualquiera de las propiedades de ordenacin o filtro. En el siguiente ejemplo creamos un DataView definido por el DataTable dt, con un filtro RowFilter: cli_codigo=C0001; ordenamiento true, y que el estado de las filas sean Current.
Dim dv1 As New DataView(dt, "cli_codigo='C0001'", True, DataViewRowState.CurrentRows)

1.2

ORDENAMIENTO DATAVIEW

FILTRACIN

DE

DATOS

MEDIANTE

Proporciona varias formas de ordenacin y filtrado en una DataTable: Mediante la propiedad Sort puede especificar criterios simples o mltiples de ordenacin de columnas e incluir parmetros ASC (ascendente) y DESC (descendente). Mediante la propiedadApplyDefaultSort puede crear automticamente un criterio de ordenacin, en orden ascendente, basado en la columna o columnas de clave principal de la tabla. La propiedad RowFilter puede especificar subconjuntos de filas basndose en sus valores de columna. Si desea devolver los resultados de una consulta determinada en los datos, en lugar de proporcionar una vista dinmica de un subconjunto de los datos, para conseguir el mximo rendimiento utilice los mtodos Find o FindRows de la DataView en lugar de establecer la propiedad RowFilter. La propiedad RowFilter es ms idnea en una aplicacin enlazada a datos donde un control enlazado muestra resultados filtrados. Los mtodos Find y FindRows aprovechan el ndice actual, sin necesidad de volver a generarlo. Mediante la propiedad RowStateFilter puede especificar las versiones de fila que desea ver. La DataView administra, implcitamente, qu versin de fila exponer, dependiendo del RowState de la fila

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

105

subyacente. Por ejemplo, si el RowStateFilter est establecido como DataViewRowState.Deleted, la DataView expone la versin de fila Original de todas las filas Deleted, porque no hay ninguna versin de fila Current. En la siguiente tabla se muestran las opciones de DataViewRowState. Estado
CurrenRows Added ModifiedCurrent Deleted ModifiedOriginal OriginalRows Unchanged

Descripcin
Valor predeterminado, la versin de fila Current de las filas Unchanged, Added, Modified. Versin de todas las filas Added. Versin de la fila Current de las filas Modified. Versin de todas las filas Deleted. Versin de fila Original de las filas Modified. Versin de fila Original de filas Unchanged, Modified y Deleted. Versin de fila Current de las filas Unchanged.

El siguiente ejercicio, crea una vista de la tabla artculos que muestra los registros donde su stock sea menor a 50, y que est ordenado por su nombre en forma descendente.
Dim dv As DataView = dt.DefaultView dv.RowFilter = "art_stock<=50" dv.Sort = "art_nombre desc" Me.DGArticulos.DataSource = dv

1.3 MODIFICAR OBJETOS DATAVIEW


Puede utilizar DataView para agregar, eliminar o modificar filas de datos de la tabla subyacente. La posibilidad de utilizar DataView para modificar los datos de la tabla subyacente se controla estableciendo una de las tres propiedades booleanas de DataView. Dichas propiedades son: AllowNew, AllowEdit y AllowDelete. Estn establecidas como true de forma predeterminada. 1.3.1 AllowNew: Utilice el mtodo AddNew de la DataView para crear una nueva DataRowView. Tenga en cuenta que no se agrega realmente una nueva fila a la DataTable subyacente hasta que se llama al mtodo EndEdit de la DataRowView. Si se llama al mtodo CancelEdit de la DataRowView, se descartar la nueva fila. Si se llama al mtodo AddNew o BeginEdit de la DataRowView mientras hay una fila pendiente, se llamar implcitamente a EndEdit en la fila pendiente. Cuando se llama a EndEdit se aplican los cambios a la DataTable subyacente; ms tarde se pueden confirmar o rechazar mediante los mtodos AcceptChanges o RejectChanges del objeto DataTable, DataSet o DataRow.

CIBERTEC

CARRERAS PROFESIONALES

106

1.3.2 AllowEdit: Modifica el contenido de la DataRow mediante DataRowView. Puede confirmar los cambios realizados en la fila subyacente mediante DataRowView.EndEdit o rechazarlos con DataRowView.CancelEdit. Tenga en cuenta que slo puede modificar una fila cada vez. Cuando se llama a EndEdit, los cambios propuestos se ponen en la versin de fila Current de la DataRow subyacente; ms tarde se pueden confirmar o rechazar mediante los mtodos AcceptChanges o RejectChanges del objeto DataTable, DataSet o DataRow. 1.3.3 AllowDelete: Elimina filas en la DataView mediante el mtodo Delete del objeto DataView o DataRowView y las filas se eliminarn de la DataTable subyacente. Ms tarde puede confirmar o rechazar las eliminaciones mediante AcceptChanges o RejectChanges, respectivamente. En el siguiente ejemplo de cdigo se deshabilita el uso de DataView para eliminar filas y se agrega una nueva fila a la tabla subyacente mediante la DataView.
Dim custTable As DataTable = custDS.Tables("tb_clientes") Dim custView As DataView = custTable.DefaultView custView.Sort = "CompanyName" custView.AllowDelete = False Dim newDRV As DataRowView = custView.AddNew() newDRV("CustomerID") = "ABCDE" newDRV("CompanyName") = "ABC Products" newDRV.EndEdit()

2.

DATATABLEREADER
La clase DataTableReader obtiene el contenido de uno o varios objetos DataTable con el formato de uno o varios conjuntos de resultados de solo lectura y con desplazamiento slo hacia delante. La clase DataTableReader funciona de forma bastante similar a cualquier otro lector de datos, como SqlDataReader, excepto en que la clase DataTableReader permite recorrer en iteracin las filas de un objeto DataTable. En otros trminos, permite recorrer en iteracin las filas que hay en una cach. Es posible modificar los datos almacenados en memoria cach mientras el objeto DataTableReader est activo y el lector mantiene su posicin automticamente.

2.1 CREACION DE UN DATATABLEREADER


Cuando se crea un objeto DataTableReader a partir de un objeto DataTable, el objeto DataTableReader resultante contiene un conjunto de resultados con los mismos datos que el objeto DataTable a partir del cual se ha creado, salvo cualquier fila que haya sido marcada como eliminada. Las columnas aparecen en el mismo orden que en el objeto DataTable original. El resultado que devuelve tiene el mismo formato de esquema y datos que el objeto DataTable original. El objeto DataTableReader que se cree llamando al mtodo GetDataReader de un objeto DataSet

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

107

contendr varios conjuntos de resultados si el objeto DataSet incluye ms de una tabla. Los resultados tendrn la misma secuencia que los objetos DataTable de la coleccin DataTableCollection del objeto DataSet. El conjunto de resultados devuelto slo contiene la versin actual de cada DataRow; se omiten las filas que se hayan marcado para eliminarlas. La clase DataTableReader proporciona un iterador estable; esto es, el contenido de un objeto DataTableReader no se invalida aunque se modifique la coleccin subyacente durante la iteracin. Por ejemplo, si se eliminan o quitan una o varias filas de la coleccin de Rows durante la iteracin, la posicin actual en el objeto DataTableReader se mantiene correctamente y el iterador no se invalida.

2.1 PROPIEDADES DE UN DATATABLEREADER


Nombre
FielCount HasRows

Descripcin
Devuelve el nmero de columnas de la fila actual. Obtiene un valor que indica si el objeto DataTableReader contiene una o varias filas. Obtiene un valor que indica si el objeto DataTableReader est cerrado. Obtiene el valor de la columna especificada en su formato nativo. Obtiene el nmero de filas insertadas, modificadas o eliminadas al ejecutar la instruccin SQL. Avanza el objeto DataTableReader al conjunto de resultados siguiente, si hay alguno. Desplaza el objeto DataTableReader al siguiente registro.

IsClosed

Item

RecordAffected

NextResult Next

Cuando se crea un objeto DataTableReader a partir de un objeto DataTable, el objeto DataTableReader resultante contiene un conjunto de resultados con los mismos datos que el objeto DataTable a partir del cual se ha creado, salvo cualquier fila que haya sido marcada como eliminada. Las columnas En el ejemplo siguiente se rellenan de datos en un DataTable. A continuacin, se crea un objeto DataTableReader que se inicializa con el objeto DataTable para mostrar el contenido de sus registros en un ListView.
Dim pReader As New DataTableReader(Productos()) Do While pReader.Read Dim it As New ListViewItem(pReader.GetInt32(0)) it.SubItems.Add(pReader.GetString(1)) it.SubItems.Add(pReader.GetInt32(2)) it.SubItems.Add(pReader.GetInt32(3)) it.SubItems.Add(pReader.GetInt32(2)*pReader.GetInt32(3)) Me.ListView1.Items.Add(it) End While Loop Until pReader.HasRows

CIBERTEC

CARRERAS PROFESIONALES

108

LABORATORIO 6.1 CONSULTA DE DATOS UTILIZANDO UN DATAVIEW


En el ejemplo siguiente se muestra la consulta de los productos registrados en la base de datos por su descripcin. Para este caso, ingrese la descripcin del producto desde un TextBox, donde filtrar los registros por su descripcin. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Asigne el nombre al proyecto: appConsulta.

4. Defina el Namespaces: System.Data.SqlClient. 5. Defina e inicialice la cadena de conexin a nivel Class Form, el objeto DataSet, que almacenar las tablas y el objeto DataView para realizar la consulta.
Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=DBVentas; integrated security=true") Private ds As New DataSet Private dv As New DataView

6. En el Load del formulario realizar las siguientes operaciones: a. Cargar la tabla tb_productos utilizando el DataAdapter. b. Poblar los registros del DataAdapter al DataSet, definiendo un datatable llamado productos. c. Definir la relacin entre las tablas y aadir la relacin al DataSet.
'Manejo de DataAdapter Dim da As New SqlDataAdapter("Select * from tb_productos", cn) da.Fill(ds, "productos") 'Cargar los registros al dataView dv = ds.Tables("productos").DefaultView 'cargar los registros al DataGrid utilizando el DataView Me.DSArticulos.DataSource = dv

7. En el click del botn Consulta, donde mostramos los productos por su nombre: a. Ingresa la descripcin del producto en el control TextBox. b. Asigne al mtodo RowFilter la expresin de comparacin. c. Mostrar el resultado del filtro en el control DataGridView DGArticulos.
dv.RowFilter = _ "nombreproducto LIKE '" + txtdescripcion.Text + "%'" Me.DSArticulos.DataSource = dv

8. Guarde su aplicacin y ejecute. Compruebe.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

109

LABORATORIO 6.2 CONSULTA DE DATOS RELACIONALES UTILIZANDO DATAVIEW


En el ejemplo siguiente se muestra la consulta de los pedidos por un empleado determinado, donde al seleccionar un empleado en un ComboBox, visualice los pedidos del empleado seleccionado. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Agregue un Formulario en el proyecto appConsulta. 4. Disea el Formulario:

5. Defina el Namespaces: System.Data.SqlClient. 6. Defina e inicialice la cadena de conexin a nivel Class Form, el objeto DataSet, que almacenar las tablas y la vista de datos para los empleados.
Private cn As New SqlConnection("server=.;database=DBVentas; integrated security=true") Private ds As New DataSet Private DvEmpleado As New DataView

7. En el Load del formulario realizar las siguientes operaciones: a. Cargar los empleados y pedidos utilizando el DataAdapter. b. Poblar los registros del DataAdapter al DataSet. c. Enlazar el ComboBox1, con el DataView DsEmpleado. d. Definir la relacin entre las tablas y aadir la relacin al DataSet.
Dim da As New SqlDataAdapter( _ "Select Idempleado,Nombre+' '+Apellidos as Datos from tb_empleados", cn) da.Fill(ds, "empleados") ds.Tables("empleados").PrimaryKey = _ New DataColumn() {ds.Tables("empleados").Columns(0)} DvEmpleado = ds.Tables("empleados").DefaultView da = New SqlDataAdapter("Select * from tb_pedidoscabe", cn) da.Fill(ds, "pedidos") Me.ComboBox1.DataSource = dsEmpleado Me.ComboBox1.DisplayMember = "Datos" Me.ComboBox1.ValueMember = "Idempleado" 'Establecer la Relacion entre las Tablas Dim drel As New DataRelation( _ "r1", ds.Tables("empleados").Columns(0), _ ds.Tables("pedidos").Columns("Idempleado")) ds.Relations.Add(drel)

CIBERTEC

CARRERAS PROFESIONALES

110

8. En el click del Listbox, mostramos los pedidos del empleado seleccionado: a. Capturar el ndice de la fila seleccionada: ComboBox1.SelectedIndex. b. Definir un DataRowView. c. A travs del mtodo CreateChildView, del DataRowView, se capturan las filas de pedidos las cuales se visualizan en el DataGrid1.
Dim DVista As DataRowView=vEmpleado(ComboBox1.SelectedIndex) Me.DataGridView1.DataSource = DVista.CreateChildView("r1")

9. Guarde su aplicacin y ejecute. Compruebe el resultado.

LABORATORIO 6.3 ACTUALIZACION DE DATOS UTILIZANDO DATAVIEW


En el ejemplo siguiente desarrollamos una interfaz que permita actualizar los datos de los clientes utilizando un DataView. En este proceso el DataView estar asociado aun DataTable para realizar, el DataView, los procesos de Agregar, Modificar y Eliminar registros de Clientes sobre el DataTable. 1. En el Proyecto AppConsulta, agregue un Formulario. 2. Disea el Formulario:

Objeto Label Label Label Label Label Label TextBox TextBox Textbox TextBox ComboBox Button Button Button DataGridView

Name Label1 Label2 Label3 Label4 Label5 Label6 Txtcodigo TxtNombre TxtDireccion TxtFono ComboBox1 BtnAgregar BtnModificar BtnEliminar DGClientes

Propiedad Text Text Text Text Text Text

Valor Actualizacion de Clientes Codigo Nombre Direccion Pas Fono

Text Text Text

Agregar Modificar Eliminar

3. Defina el Namespaces: System.Data.SqlClient.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

111

4. Defina e inicialice la cadena de conexin a nivel Class Form, el objeto DataSet, que almacenar las tablas y la vista de datos para los Clientes.
Private cn As New SqlConnection("server=.;database=DBVentas; integrated security=true") Private DvClientes As New DataView Private Clientes As New DataTable

5. En el evento Load del formulario, realice las siguientes operaciones: a. Cargar los datos de los pases en el control ComboBox1. b. Cargar los datos de los clientes en el DataTable Clientes. c. Asignar la vista del DataTable Clientes al DataView DvClientes.
Using da As New SqlDataAdapter("Select * from tb_paises", cn) Dim t As New DataTable da.Fill(t) Me.ComboBox1.DataSource = t Me.ComboBox1.DisplayMember = "NombrePais" Me.ComboBox1.ValueMember = "IdPais" End Using Using da As New SqlDataAdapter("Select * from tb_clientes", cn) da.FillSchema(Clientes, SchemaType.Mapped) da.Fill(Clientes) DvClientes = Clientes.DefaultView Me.DGClientes.DataSource = DvClientes End Using

6. En el evento Click del botn Agregar, procedemos agregar un Cliente utilizando el objeto DataView DvClientes.
Dim r As DataRowView = DvClientes.AddNew r(0) = TXTCODIGO.Text r(1) = TXTNOMBRE.Text r(2) = TXTDIRECCION.Text r(3) = Me.ComboBox1.SelectedValue r(4) = TXTFONO.Text r.EndEdit() Clientes.AcceptChanges() Me. DGClientes.DataSource = DvClientes

7. En el evento Click del botn Modificar, procedemos a modificar los datos de un Cliente seleccionado desde el DataGridView.
'la variable f se le asigna la fila seleccionada del DataGridView Dim r As DataRowView = DvClientes(DGClientes.CurrentRow.Index) r(0) = TXTCODIGO.Text r(1) = TXTNOMBRE.Text r(2) = TXTDIRECCION.Text r(3) = Me.ComboBox1.SelectedValue r(4) = TXTFONO.Text r.EndEdit() Clientes.AcceptChanges() Me.DGClientes.DataSource = DvClientes

8. En el evento Click del botn Eliminar, procedemos a eliminar un Cliente. seleccionado desdese DataGridView fila seleccionada del DataGridView 'la variable f el le asigna la
Dim r As DataRowView = DvClientes(DGClientes.CurrentRow.Index) r.Delete() r.EndEdit() Clientes.AcceptChanges() DGClientes.DataSource = DvClientes

CIBERTEC

CARRERAS PROFESIONALES

112

9. En el evento CellClick del DataGridView, seleccionamos un cliente y visualizamos los datos del registro, almacenado en el DataView, en los controles.
'la variable f se le asigna la fila seleccionada del DataGridView Dim f As Integer = Me.DataGridView1.CurrentRow.Index TXTCODIGO.Text = DvClientes(f)(0) TXTNOMBRE.Text = DvClientes(f)(1) TXTDIRECCION.Text = DvClientes(f)(2) Me.ComboBox1.SelectedValue = DvClientes(f)(3) TXTFONO.Text = DvClientes(f)(4)

10. Guarde y ejecute la aplicacin.

LABORATORIO 6.4 LISTADO DE PRODUCTOS UTILIZANDO DATATABLEREADER


En el ejemplo siguiente desarrollamos una interfaz que permita listar los productos en un control ListView, utilizando un objeto DataTableReader. 1. En el Proyecto AppConsulta, agregue un Formulario. 2. Disea el Formulario:

3. Defina la funcin Productos() el cual retorne los registros de la tabla tb_productos. Para este caso utilice el TableAdapter DSVentasTableAdapter.
Function Productos() As DataTable Dim ds As New DBVentasDataSet Dim prod As New _ DVentasDataSetTableAdapters.tb_productosTableAdapter() prod.Fill(ds.tb_productos) Return ds.tb_productos End Function

4. En el evento Load del formulario, listamos los productos en el control ListView utilizando un DataTableReader, el cual se inicializa con la funcin Productos().
Dim pReader As New DataTableReader(Productos()) Do While pReader.Read Dim it As New ListViewItem(pReader.GetInt32(0)) it.SubItems.Add(pReader.GetString(1)) it.SubItems.Add(pReader.GetInt32(2)) it.SubItems.Add(pReader.GetInt32(3)) it.SubItems.Add(pReader.GetInt32(2) * pReader.GetInt32(3)) Me.ListView1.Items.Add(it) End While Loop Until pReader.HasRows

5. Guarde y ejecute la aplicacin.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

113

Autoevaluacin
1. Cmo se crea un DataView? Explique las dos formas. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 2. Cules son los mtodos para ordenar y filtrar un DataView? Explique mediante un ejemplo. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 3. Explique las propiedades del DataViewRowState. _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 4. Cules son los mtodos para modificar los datos a travs del DataView? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ 5. Qu es un DataTableReader?, Cul es la diferencia con el DataReader? _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________ _____________________________________________________________

CIBERTEC

CARRERAS PROFESIONALES

114

Resumen
Una DataView proporciona una vista de datos dinmica en la DataTable subyacente: el contenido, el orden y la pertenencia reflejan los cambios en cuanto se producen. Hay dos formas de crear una DataView. o Puede utilizar el constructor DataView. o O puede crear una referencia a la propiedad DefaultView de la DataTable. Un DataView proporciona metodos para filtrar y ordenar registros: o Mediante la propiedad Sort puede especificar criterios simples o mltiples de ordenacin de columnas e incluir parmetros ASC (ascendente) y DESC (descendente). o Mediante la propiedad RowFilter puede especificar subconjuntos de filas basndose en sus valores de columna. Un DataView puede agregar, eliminar o modificar filas de datos de la tabla subyacente. La posibilidad de utilizar DataView para modificar los datos de la tabla subyacente se controla estableciendo una de las tres propiedades booleanas de DataView. Dichas propiedades son: AllowNew, AllowEdit y AllowDelete. Estn establecidas como true de forma predeterminada. La clase DataTableReader funciona de forma bastante similar a cualquier otro lector de datos, como SqlDataReader, excepto en que la clase DataTableReader permite recorrer en iteracin las filas de un objeto DataTable. Cuando se crea un objeto DataTableReader a partir de un objeto DataTable, el objeto DataTableReader resultante contiene un conjunto de resultados con los mismos datos que el objeto DataTable a partir del cual se ha creado, salvo cualquier fila que haya sido marcada como eliminada. Las columnas aparecen en el mismo orden que en el objeto DataTable original.

Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas: http://msdn.microsoft.com/eses/library/system.data.datatablereader.hasrows(VS.80).aspx Pgina referente al uso del mtodo HasRows del datatableReader http://msdn.microsoft.com/eses/library/system.data.datatablereader.getvalues(VS.80).aspx Pgina referente al uso de los metodos Get del datatableReader http://msdn.microsoft.com/es-es/library/system.data.dataview(VS.80).aspx Pgina referente a la clase DataView

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

115

UNIDAD DE APRENDIZAJE

3
SEMANA

9
MANEJO DE REPORTES
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET construyen reportes, listados y grficos utilizando Crystal Report conectado a un origen de datos.

TEMARIO
Uso del Crystal Report. Manejo de reportes y parmetros con Crystal Report. Uso de reportes grficos.

ACTIVIDADES PROPUESTAS
Los alumnos construyen reportes utilizando el asistente Crystal Reports enlazados a un origen de datos. Los alumnos realizan operaciones de listado de datos visualizando el resultado en el Crystal Report. Los alumnos construyen grficos estadsticos utilizando el asistente Crystal Report.

CIBERTEC

CARRERAS PROFESIONALES

116

CRYSTAL REPORT
Visual Studio .NET proporciona un conjunto de herramientas y asistentes que permiten interactuar con un Origen de Datos. Una de esas herramientas es el Crystal Report. En Visual Studio .NET, se puede crear un nuevo informe Crystal o agregar uno existente a un proyecto. Puede guardar el informe en un equipo local o publicarlo como servicio Web en un servidor Web. En funcin de si va a desarrollar una aplicacin de Windows o una aplicacin Web, deber enlazar primero el informe con Windows Forms Viewer o con Web Forms Viewer y, a continuacin, crear la aplicacin. Los usuarios pueden ejecutar la aplicacin para Windows en una plataforma de Windows o implementar la aplicacin Web en un servidor Web y ver el informe Crystal en un explorador Web.

ACCESO A DATOS DE INFORMES


Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se escribe para controlar un tipo de base de datos especfico o la tecnologa de acceso a bases de datos.

MODELO DE EXTRACCIN E INSERCIN


Con el fin de ofrecer el acceso a datos ms flexible para los programadores, los controladores de base de datos de Crystal Reports se han diseado para proporcionar un modelo de extraccin e insercin de acceso a datos. 2.1.1 Modelo de Extraccin En un modelo de extraccin, el controlador se conectar a la base de datos y extraer datos cuando se necesiten. Con este modelo, Crystal Reports controla tanto la conexin a la base de datos como el comando SQL que se ejecuta para obtener los datos y no necesita ninguna codificacin del programador. Si no se escribe ningn cdigo especial en tiempo de ejecucin, se utiliza el modelo de extraccin.

2.1.1 Modelo de Insercin En comparacin, el modelo de insercin necesita que el programador escriba cdigo para conectarse a la base de datos, ejecutando un comando SQL para crear un conjunto de registros o de datos que se ajusten a los campos del informe y enviando ese objeto al informe. Este mtodo le permite crear recursos compartidos de conexin en la aplicacin y filtrar los datos antes de que Crystal Reports los reciba.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

117

DISEO DE INFORMES
Los informes se crean en el Diseador de Crystal Report. El Diseador de Crystal Report se inicia automticamente al aadir un objeto de Crystal Reports al proyecto o al hacer doble clic en un objeto de Crystal Reports existente en el proyecto.

CONEXIN DE LA BASE DE DATOS


En Crystal Report Designer, seleccione primero el origen de datos al que har referencia el informe. Puede utilizar varios orgenes de datos en un informe. A continuacin, seleccione las tablas de la base de datos que desee utilizar en el informe. Crystal Reports puede vincular las tablas automticamente, o bien puede especificar el modo en el que desea vincularlas. Las tablas de bases de datos se vinculan para que los registros de una base de datos coincidan con los registros relacionados de otra tabla.

3.2 OBJETOS DE INFORMES


Crystal Report Designer utiliza una funcionalidad de arrastrar y colocar parecida a la que se utiliza en Visual Studio .NET, se arrastra un objeto de informe hasta el diseador (como un campo de base de datos o un objeto de texto) y se utiliza la ventana Propiedades o el men contextual para dar formato al objeto. Algunos de los objetos de informe que puede aadir al informe y a los que puede dar formato segn las necesidades incluyen:

Campos de base de datos. Campos de frmula. Campos de parmetro. Campos de nombre de grupo. Campos de total acumulado. Campos de resumen. Grficos. Subinformes.

3.3 SECCIONES DE INFORMES


Crystal Report Designer est dividido en secciones de informe, como los encabezados de las secciones, los pies de pgina y los detalles. Los objetos se arrastran a una seccin de informe. Los datos que aparecen en el informe finalizado dependen de las opciones de organizacin. En particular, los datos del informe varan segn las secciones en las que desee insertar objetos de informe concretos. Por ejemplo, si inserta un objeto de grfico en la seccin Encabezado de informe, el grfico slo aparecer una vez al principio del informe y resumir los datos que contiene el informe. Adems, si un objeto de grfico se aade a la seccin Encabezado de grupo, aparecer un grfico individual al principio de cada grupo de datos y slo se resumirn los datos relacionados con dicho grupo.

CIBERTEC

CARRERAS PROFESIONALES

118

A continuacin detallamos cada una de las secciones de un informe: 3.3.1 Encabezado de informe Los objetos que se colocan en el Encabezado de informe se imprimen una vez, al principio del informe. Esta seccin normalmente contiene el ttulo del informe y la informacin adicional que desea que aparezca slo al principio del mismo. Los grficos y las tablas cruzadas de esta seccin contienen los datos de todo el informe. Las frmulas de esta seccin se evalan una vez, al principio del informe.

3.3.2 Encabezado de pgina Los objetos includos en la seccin Encabezado de pgina se imprimen al principio de cada nueva pgina. Esta seccin suele contener la informacin que desea que aparezca en la parte superior de cada pgina. Puede incluir campos como el nombre de un captulo, de un documento o informacin similar. Tambin se puede utilizar para incluir ttulos de campos, que aparecern como etiquetas sobre las columnas con los datos de los campos del informe. En esta seccin no se pueden incluir grficos ni tablas cruzadas. Las frmulas que se colocan en esta seccin se evalan una vez por pgina, al principio de cada pgina nueva.

3.3.3 Detalles Los objetos colocados en la seccin Detalles se imprimen con cada registro nuevo. Esta seccin contiene los datos del cuerpo del informe. Aqu aparece la mayor parte de los datos de ste. Cuando se ejecuta el informe, la seccin Detalles se vuelve a imprimir para cada registro. Por ejemplo, si aade un objeto de base de datos con 100 registros a la seccin Detalles, el informe imprimir 100 secciones de detalle individuales en tiempo de ejecucin. En esta seccin no se pueden incluir grficos ni tablas cruzadas. Las frmulas incluidas aqu se evalan una vez por cada registro.

3.3.4 Pie de informe Los objetos que se colocan en el Pie de informe se imprimen una vez, al final del informe. Esta seccin se utiliza para incluir la informacin que desea que slo aparezca una vez al final del informe, como los totales generales. Los grficos y las tablas cruzadas de esta seccin contienen los datos de todo el informe. Las frmulas de esta seccin se evalan una vez, al final del informe.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

119

3.3.5 Pie de pgina Los objetos colocados en la seccin Pie de pgina se imprimen en la parte inferior de cada pgina. Normalmente, esta seccin refleja el nmero de pgina, as como cualquier otra informacin que desee que aparezca en la parte inferior de las pginas. En esta seccin no se pueden incluir grficos ni tablas cruzadas. Las frmulas de esta seccin se evalan una vez por pgina, al final de cada una de ellas.

IMPLEMENTACION DEL CRYSTAL REPORT


Es necesario distribuir los archivos de informe (.rpt) cuando se implementa una aplicacin .NET. Puede elegir entre compilar los archivos de informe en la aplicacin o distribuirlos por separado.

4.1 Archivos de informe incrustados


Cuando se agregan informes a una aplicacin Web o Windows .NET, stos se agregan de manera predeterminada como recurso incrustado de la aplicacin. Esto quiere decir que los archivos de informe se compilarn en el manifiesto del ensamblado, no se cargarn desde otro archivo de informe separado. La ventaja de los archivos de informe incrustados estriba en que no es necesario distribuir archivos de informe externos y los usuarios finales no pueden modificarlos.

4.2 Archivos de informe no incrustados


Los archivos de informe no incrustados son archivos de informe que no estn compilados en el ensamblado de una aplicacin y se distribuyen independientemente de sta. Para evitar que los informes se compilen en el manifiesto del ensamblado como un recurso incrustado, es necesario cambiar la manera de agregar el informe al proyecto. Vea Archivos de informes para obtener informacin sobre cmo hacer que los archivos de informe no sean incrustables. Cuando se crea el proyecto, el informe no se compilar en el ensamblado del proyecto y ser necesario cargarlo por separado. La ventaja de conservar los informes fuera del ensamblado es que, de esa manera, se pueden modificar y volver a implementar sin tener que volver a compilar e implementar toda la aplicacin. La desventaja es que no se pueden utilizar objetos de informe con tipos declarados en la aplicacin y hay que cargar los informes por separado.

IMPLEMENTACION DE INFORMES
Crystal Reports 10 funciona en una arquitectura de uno, dos o tres niveles tanto en plataformas Windows Forms como Web Forms.

5.1 DESCRIPCION DE LOS NIVELES


Piense en estos niveles como en una progresin en trminos de escalabilidad. Una aplicacin de un solo nivel requiere que todos los componentes de los informes se instalen en el equipo del usuario y, adems, el procesamiento depende del equipo cliente. Una aplicacin de tres niveles slo necesita un

CIBERTEC

CARRERAS PROFESIONALES

120

explorador en el equipo del usuario; la aplicacin reside en un servidor Web y obtiene acceso al servicio Web de informes a travs de HTTP. Se pueden centralizar los cambios realizados en la aplicacin. Adems, los cambios realizados en el servicio Web de informes se reflejan de forma inmediata, ya que la aplicacin se comunica directamente con este servicio. Nota: En estos casos, los niveles se definen en funcin de donde residan los componentes o la arquitectura de Crystal Reports. El tipo de base de datos que utiliza el informe tambin puede aadir un nivel adicional.

5.2 APLICACIONES DE UN SOLO NIVEL


Una aplicacin de Windows que contiene un informe local se basa en un mtodo de un solo nivel en el que todos los componentes se instalan en el equipo del usuario. Los componentes de los informes, incluidos el archivo del informe (archivo .rpt) y el motor de informes, se instalan con el archivo ejecutable en el equipo del usuario.

Escalabilidad Las aplicaciones de Windows con informes locales son las ms adecuadas para una implementacin a pequea escala, ya que la aplicacin se instala en el equipo del usuario. Si depende mucho del proceso del cliente, no dude en optar por esta opcin. Si hay que realizar cambios en el informe, se debe volver a instalar la aplicacin en el equipo del usuario.

5.3 APLICACIONES DE DOS NIVELES


Si desarrolla una aplicacin Web que albergue un informe local (archivo .rpt), el procesamiento se basa en una relacin de dos niveles en la que el servidor Web gestiona los eventos que tienen lugar en el cliente.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

121

Escalabilidad Los usuarios slo necesitan tener un explorador en el equipo. Todos los componentes de informes residen en el servidor y se pueden actualizar de forma centralizada.

5.4 APLICACIONES DE TRES NIVELES


Un servicio Web de informes es un informe Crystal que se ha publicado o se ha mostrado para que lo utilice una aplicacin. En Internet, una aplicacin de Windows puede conectarse con un servicio Web de informes, utilizar el informe Crystal mostrado y presentar el informe a los usuarios almacenndolo en un visor de formularios. Puede utilizar un servicio Web de informes que forme parte de la arquitectura u obtener acceso a un servicio Web de informes que forme parte de otra arquitectura, como podra ser la arquitectura de un socio comercial.

Escalabilidad Dependiendo del tipo de aplicacin, los usuarios slo necesitan un Visor de Windows Forms o un explorador Web para ver los servicios Web de informes. El resto de los componentes de los informes reside con el servicio Web de informes en un servidor remoto. Los cambios realizados en el servicio Web de informes se reflejan de forma inmediata en la aplicacin.

CIBERTEC

CARRERAS PROFESIONALES

122

LABORATORIO 9.1 MANEJO DE REPORTE SIMPLE CON CRYSTAL REPORT


En el ejemplo siguiente se muestra el listado de los pedidos registrados (tabla tb_pedidoscabe) en la base de datos utilizando el Crystal Report. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija WindowsApplication. - En Name coloque appReportes. - En Location coloque C:\CursoPOOII. 4. Defina un DataSet para definir el tablaAdapter tb_pedidoscabe.

TableAdapter tb_pedidoscabe

5. Agrega en la aplicacin un nuevo elemento de tipo Crystal Report, el cual se llamar rptPedidos, luego presionar el botn Agregar.

Selecciona el elemento Crystal Report Asigna un nombre al elemento: RptReportes

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

123

6. Cuando se configura por primera vez, aparece una licencia. Presiona el botn Acepto el Contrato de licencia y luego Aceptar. Presiona el botn Aceptar contrato, para continuar con el proceso de diseo.

7. A continuacin se visualiza la Galeria de Crystal Report para el diseo de un Reporte. Selecciona la opcin Usar asistente de informes y el tipo de asistente es Estndar, presione el botn Aceptar.

8. El asistente muestra la ventana DATOS que permite seleccionar desde un origen de datos: ADO.NET DataSets el tableAdapter tb_pedidoscabe. Agregarlo a las Tablas Seleccionada y presione el botn Siguiente>

TableAdapter tb_pedidoscabe

CIBERTEC

CARRERAS PROFESIONALES

124

9. En la ventana Campos, debe seleccionar las reas que conforma el reporte, tal como se muestra en la figura. Para terminar presione el botn Finalizar.

Campos que se visualizan en el reporte.

10. Al finalizar el diseo del reporte, se visualiza el archivo de Crystal Report RptReportes.rpt.
Seccin encabezado de informe. Seccin encabezado de pgina. Seccin Detalles: los campos. Seccin pie de pgina.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

125

11. En el Formulario agrega el control CrystalReportViewer para listar el reporte diseado, tal como se muestra en la figura.

12. Codifique el proceso para visualizar el reporte en el Formulario.

Defina la instancia ds de DataSet1 y el tableAdapter de pedidos para poblar los registros al DataSet1 ds.

Defina la instancia rp de RptReportes y asignar como origen de datos al DataSet1 ds. Defina la propiedad ReportSource del control a rp.

13. Ejecute la aplicacin.

CIBERTEC

CARRERAS PROFESIONALES

126

LABORATORIO 6.2 MANEJO DE REPORTE CON PARAMETROS CON CRYSTAL REPORT


En el ejemplo siguiente se muestra el reporte de los pedidos al seleccionar un Cliente desde un ComboBox. Utilice el TableAdapter para implementar el origen de datos. 1. Defina en el TableAdapter tb_pedidoscabe un mtodo que liste los pedidos por un cliente especfico.

Agregue en el TableAdapter tb_pedidoscabe el metodo que consulte los pedidos por cliente.

2. En la ventana Sentencia SQL, defina la condicin para listar los pedidos por cliente, tal como se muestra en la figura.

Condicion para listar los pedidos por cliente.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

127

3. Asigna el nombre al mtodo: FillByCliente

4. Disea el formulario:

Control ComboBox1 para listar los clientes.

Control CrystalReport Viewer para mostrar el reporte.

CIBERTEC

CARRERAS PROFESIONALES

128

5. En la ventana de programacin, defina la conexin y el proceso para configurar el ComboBox1 con los datos de los clientes.
Conexin a la base de datos.

Recuperar los clientes en el dataTable.

Configura el combobox1 con los clientes.

6. Codifica el botn Reporte para listar el reporte de pedidos por cliente seleccionado en el control ComboBox1.
Defina la instancia ds de DataSet1 y el tableAdapter de pedidos para poblar los pedidos por cliente al DataSet1 ds.

Defina la instancia rp de RptReportes y asignar como origen de datos al DataSet1 ds.

7. Ejecuta la aplicacin, seleccione el cliente desde el ComboBox1, al presionar el botn Reportes, se lista los pedidos por el cliente seleccionado.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

129

Autoevaluacin

1. Cul es la importancia de desarrollar Reportes? Explique brevemente 2. En qu tipos de plataformas se puede generar reportes? 3. Explique brevemente cada una de las secciones de un Reporte en Crystal Report. 4. Cules son las capas o niveles de programacin donde se puede implementar el Crystal Report? Explique brevemente cada uno de ellos. 5. Desarrolle un Formulario que permita listar los pedidos al seleccionar un mes y ao desde controles de seleccin. 6. Desarrolle un Formulario que permita visualizar un cuadro estadstico de barras de los pedidos realizados por cada ao.

CIBERTEC

CARRERAS PROFESIONALES

130

Resumen
En Visual Studio .NET, se puede crear un nuevo informe Crystal o agregar uno existente a un proyecto. Puede guardar el informe en un equipo local o publicarlo como servicio Web en un servidor Web. Crystal Reports se conecta a bases de datos mediante controladores de bases de datos. Cada controlador se escribe para controlar un tipo de base de datos especfico o la tecnologa de acceso a bases de datos. En un modelo de extraccin, el controlador se conectar a la base de datos y extraer stos cuando se necesiten. En el modelo de insercin necesita que el programador escriba cdigo para conectarse a la base de datos, ejecutando un comando SQL para crear un conjunto de registros o de datos que se ajusten a los campos del informe y enviando ese objeto al informe. Una aplicacin de Windows que contiene un informe local se basa en un mtodo de un solo nivel en el que todos los componentes se instalan en el equipo del usuario. Los componentes de los informes, incluidos el archivo del informe (archivo .rpt) y el motor de informes, se instalan con el archivo ejecutable en el equipo del usuario. Una aplicacin de dos niveles o Web, alberga un informe local (archivo .rpt), el procesamiento se basa en una relacin de dos niveles en la que el servidor Web gestiona los eventos que tienen lugar en el cliente. Una aplicacin de n niveles represente un servicio Web de informes es un informe Crystal que se ha publicado o se ha mostrado para que lo utilice una aplicacin. En Internet, una aplicacin de Windows puede conectarse con un servicio Web de informes, utilizar el informe Crystal mostrado y presentar el informe a los usuarios almacenndolo en un visor de formularios.s. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas: http://www.willydev.net/CrystalDesde0 Pgina que permite crear un reporte desde cero http://rs10.rapidshare.com/files/20840690/Manual_de_Crystal_Reports.rar Permite descargar el manual del Crystal Report www.mygnet.net/manuales/crystalreport//manual_completo_crystal_repor t10.945 Pgina que permite descargar el manual del Crystal Report

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

131

UNIDAD DE APRENDIZAJE

4
SEMANA

10
MODELO RELACIONAL DE OBJETOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET utilizan una plataforma de acceso a datos, para mapear un modelo conceptual de tipo entidad-relacin apoyndonos en un entorno visual integrado con Visual Studio, y realizar consultas a travs del nuevo lenguaje de consultas integrado.

TEMARIO
Modelo Relacional de Objetos, introduccin. LINQ: arquitectura, DataContext. Consultas y actualizacin de datos utilizando LINQ to SQL. ADO.NET Entity FrameWork. Acceso a datos utilizando EntityClient Provider; administracin de los objetos Entity: EntityConnection, EntityCommand, EntityDataReader, EntityTransaction. Acceso a datos utilizando Servicios de Objetos y LINQ to Entity.

ACTIVIDADES PROPUESTAS
Los alumnos conocen las plataformas de acceso a datos del ADO.NET. Los alumnos realizan operaciones de consultas utilizando el modelo de clases LINQ to SQL. Los alumnos realizan operaciones de consultas y actualizacion utilizando el modelo de clases LINQ to SQL.

CIBERTEC

CARRERAS PROFESIONALES

132

1 MODELO RELACIONAL DE OBJETOS


La visin sobre el acceso a datos de Microsoft soporta una familia de productos y servicios para que los clientes obtengan valor de todos los datos, desde su nacimiento hasta su archivo. Una plataforma de datos tan completa debe tener las siguientes caractersticas: Datos en todas las capas. Una plataforma de datos completa ofrece gestin de datos y acceso a servicios de datos en cualquier lugar. Datos de todos los tipos. La visin de acceso a datos de Microsoft concibe un almacn integrado capaz de almacenar y gestionar datos de todos esos tipos, garantizar su seguridad, permitir bsquedas y consultas sobre ellos, analizarlos, consultarlos, sincronizarlos, etc. Acceso a datos uniforme. Aunque las aplicaciones en diferentes capas requieren diferentes clases de gestin de los servicios de datos, todas esperan (requieren) una uniformidad significativa en lo relativo al entorno de desarrollo de aplicaciones (modelos de programacin y herramientas). Visin completa del negocio. Gira alrededor de la tecnologa que puede permitir a nuestros clientes recoger, limpiar, almacenar y preparar sus datos de negocio para el proceso de toma de decisiones. Gira tambin alrededor de las experiencias que los Usuarios del Negocio y los Trabajadores de la Informacin tendrn al acceder, analizar, visualizar y generar informes a partir de los datos mientras recopilan la informacin necesaria para sus decisiones. Servicios de datos en todos los sitios. Las aplicaciones invierten un esfuerzo significativo en el desarrollo de servicios como la seguridad de datos, la sincronizacin, la seriacin para el intercambio de datos (o para servicios Web), anlisis y generacin de informes a partir de los datos en todas las capas, sobre abstracciones que sean cercanas a la perspectiva de las aplicaciones.

1.1 MODELO CONCEPTUAL DE OBJETOS: LINQ Y ADO.NET ENTITIES


El exponer vistas de cliente a travs de un Proveedor de Datos ADO.NET permite mantener el modelo de programacin familiar de ADO.NET, aprovechando la inversin en cdigo, herramientas y conocimiento existente y dicho proveedor pasa a formar parte del popular conjunto de Proveedores de Datos disponibles. 1.1.1 ADO.NET Entities: aprovecha la inversin realizada en ADO.NET agregndole la habilidad de escribir aplicaciones contra un esquema conceptual enriquecido llamado "Entity Data Model", en lugar de utilizar un esquema relacional de base de datos. El Entity Data Model (EDM) extiende el modelo de datos relacional con Entity-Relationships (ER) para modelar conceptos del mundo real como Herencia (autos y camiones son vehculos), Relaciones (los clientes tienen rdenes), y miembros complejos (calle, ciudad, regin y cdigo postal compuestos como una sola propiedad "direccin" de un cliente). 1.1.2 LINQ: "Language INtegrated Query" y, como su nombre lo indica, integra conceptos de consultas directamente en los lenguajes de programacin, permitiendo que el cdigo de acceso a datos sea verificado por el compilador y las herramientas de desarrollador, como Intellisense para hacer que los desarrolladores escriban queries. Esto, junto con conceptos de modelos conceptuales (como Entidades), contribuye a reducir el abismo entre aplicaciones y datos.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

133

2 MODELO DE OBJETOS: LINQ


Hablando ms formalmente, LINQ es una combinacin de extensiones a los lenguajes y libreras de cdigo manejado que permiten expresar de manera uniforme y extensible las consultas sobre secuencias de datos provenientes de las ms dismiles fuentes.

2.1 VENTAJAS QUE APORTA LINQ A LA PROGRAMACION


Reduce las diferencias entre los modelos que proponen los lenguajes de

propsito general (hoy orientados a objetos) y los que ofrecen los lenguajes de consulta especficos a fuentes de datos: SQL o XPath/XQuery. En particular, los proveedores LINQ se encargan de generar las sentencias SQL a partir de las expresiones de consulta que utilicemos en nuestros programas. LINQ permite elevar el nivel de abstraccin y claridad de la programacin, es decir, indicamos nicamente qu se desea obtener, dejando a un motor de evaluacin de expresiones los detalles sobre cmo lograr ese objetivo. A la hora de expresar sus consultas, el programador podr aprovechar todas las facilidades que el compilador y el entorno integrado ofrecen, con importantes beneficios para la productividad. Las ventajas aqu son de dos tipos diferentes: Seguridad mejorada, gracias a la verificacin de sintaxis y de tipos por parte de los compiladores. Disponibilidad de ayuda IntelliSense dentro de Visual Studio 2008 u otros entornos de desarrollo.

2.2 PROVEEDORES LINQ PREDEFINIDOS


En funcin de la fuente de datos que se desee consultar, el programador deber enchufar el proveedor correspondiente, agregando una referencia al ensamblado en el que dicho proveedor est implementado. La tabla de la figura 3 lista los proveedores LINQ incorporados de serie a .NET Framework 3.5: LINQ to Objects, para consultar arrays y colecciones de objetos en memoria. LINQ to XML, para consultar y actualizar documentos XML. LINQ to DataSets, para consultar y actualizar conjuntos de datos. LINQ to SQL y LINQ to Entities, para consultar y actualizar bases de datos relacionales.

CIBERTEC

CARRERAS PROFESIONALES

134

3 LINQ to SQL
LINQ To SQL es el componente especfico de LINQ que proporciona la infraestructura de runtime necesaria para utilizar datos relacionales como objetos y poder definir consultas sobre dichos objetos, es decir, habilita la consulta de contenedores de datos relacionales sin tener que abandonar la sintaxis o el entorno de tiempo de compilacin. Para hacer posible esto, LINQ To SQL se apoya en las siguientes caractersticas clave: Las innovaciones del lenguaje (C# 3.0 y VB 9.0), as como en las caractersticas propias de LINQ (consultas integradas en el lenguaje). Mapping del esquema de la BD en clases, propiedades, mtodos, etc. La correspondencia que LINQ To SQL hace entre los elementos de un esquema de una BD y los elementos correspondientes a nivel del CLR es el siguiente:

Persistencia, que habilita el control automtico de cambios en la BD, y la

actualizacin de datos a travs de sentencias T-SQL. Integracin de la informacin del esquema de la BD en metadatos del CLR, las tablas se tratan como colecciones, los datos (columnas) son descritos en clases, la conexin a la BD y los resultados estn tipados, etc. los mecanismos necesarios para la definicin (completa o no) de un consultas LINQ sobre las clases de LINQ To SQL nos permitir

En la prctica, LINQ To SQL provee de encapsular y utilizar en nuestras aplicaciones cierto esquema relacional, y poder definir mapeadas. El esquema de la arquitectura comprender mejor las ideas expuestas:

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

135

3.1 MODELANDO UNA BASE DE DATOS CON LINQ to SQL


Visual Studio 2008 viene con un diseador de LINQ to SQL que nos aporta una forma fcil de modelar y visualizar una base de datos como un modelo de objeto de LINQ to SQL: DataContext y las Clases Entitities. 3.1.1 DataContext es el encargado de hacer la interface entre las entidades que son representadas y el programa. Es el origen de todas las entidades asignadas en una conexin de base de datos. Realiza un seguimiento de los cambios realizados en todas las entidades recuperadas y mantiene una "memoria cach de identidad" que garantiza que las entidades que se recuperan ms de una vez se representan utilizando la misma instancia de objeto.

3.1.2 CLASE ENTIDAD (ENTITY CLASS) LINQ to SQL nos permite modelar clases que mapeen una base de datos. Estas clases son tpicamente conocidas como Clases Entidad y a las instancias se las conoce como Entidades. Las clases entidad mapean a tablas de una base de datos. Las propiedades de una clase entidad normalmente mapean las columnas de la tabla. Cada instancia de una clase entidad representa a una fila de una tabla de la base de datos. Las clases entidad definidas por LINQ to SQL no tienen que derivar de una clase base especfica, lo que significa que pueden heredar de cualquier objeto que queramos. Todas las clases creadas por el diseador de LINQ to SQL se definen como clases parciales con lo que podemos, opcionalmente, aadir propiedades adicionales, mtodos y eventos.

CIBERTEC

CARRERAS PROFESIONALES

136

3.2 CONSULTANDO LA BASE DE DATOS CON LINQ to SQL


Una vez que tenemos definido nuestras clases del modelo de datos, podemos consultar y obtener fcilmente datos de nuestra base de datos. LINQ to SQL nos permite esto usando la sintxis de consultas de LINQ sobre la clase DataContext que creamos con el diseador LINQ to SQL. En la seleccin, basta con que escriba una consulta LINQ en su propio lenguaje de programacin y, despus, la ejecuta para recuperar los resultados. LINQ to SQL convierte todas las operaciones necesaria en las operaciones SQL con las que est familiarizado. Por ejemplo: listar los clientes y visualizarlos en el DataGridView.
Dim db As New DataDBVentasDataContext Dim cliente = From c In db.tb_clientes Me.DataGridView1.DataSource = cliente

Una de las cosas que nos aporta LINQ to SQL es que nos da una total flexibilidad en cmo consultar nuestros datos, y podemos aprovecharnos de las asociaciones que hicimos cuando modelamos las clases de LINQ to SQL para hacer consultas ms naturales y ricas sobre la base de datos.

3.3 ACTUALIZANDO LA BASE DE DATOS CON LINQ to SQL


Cuando definimos nuestro modelo de datos, el diseador LINQ to SQL cre una clase llamada DataContext que proporciona todo lo necesario para poder consultar/actualizar la base de datos. Cuando creamos consultas y obtenemos objetos, LINQ to SQL estar pendiente de los cambios o actualizaciones que les hagamos a los objetos. Podemos hacer tantas consultas y cambios como queramos usando la clase DataContext de LINQ to SQL, sabiendo que dichos cambios sern supervisados a la vez. El seguimiento de cambios de LINQ to SQL ocurre en el lado del consumidor - y NO en la base de datos. Es decir, no estamos consumiendo ningn recurso de la base de datos mientras lo usemos, tampoco tenemos que cambiar/instalar nada en la base de datos para que esto funcione. Despus de realizar los cambios que queramos a los objetos que hemos obtenido con LINQ to SQL, podemos llamar al mtodo SubmitChanges() de nuestro DataContext para guardar los cambios en nuestra base de datos. Con esto, LINQ to SQL, creara y ejecutar las sentencias SQL apropiadas para actualizar la base de datos. Cuando llamamos al mtodo SubmitChanges(), LINQ to SQL crea y ejecuta las sentencias UPDATE de SQL necesarias para modificar los productos a los que hemos modificado la propiedad ReorderLevel. 3.3.1 Aadiendo un registro Podemos aadir un producto a la base de datos creando un nuevo objeto, inicializando sus propiedades y aadirlo a la coleccin de nuestro DataContext.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

137

Cuando llamemos a SubmitChanges() se aadir una nueva fila en la tabla de clientes. En el ejemplo siguiente agregue un nuevo cliente a la tabla tb_clientes utilizando el mtodo InsertOnSubmit.
Dim cliente As New tb_clientes cliente.IdCliente = TXTCODIGO.Text cliente.NombreCia = TXTNOMBRE.Text cliente.Direccion = TXTDIRECCION.Text cliente.idpais = ComboBox1.SelectedValue cliente.Telefono = TXTFONO.Text Data.tb_clientes.InsertOnSubmit(cliente) Data.SubmitChanges()

3.3.2 Eliminando registros De la misma forma que aadimos un nuevo registro a la base de datos aadiendo un objeto a la coleccin del DataContext, tambin podemos borrar productos borrndolos de esa misma coleccin: En el ejemplo siguiente, recupera el cliente cuyo IDCliente es 98128. A continuacin se llama a DeleteOnSubmit para quitar ese objeto de la coleccin. Finalmente, se llama a SubmitChanges para transmitir la eliminacin a la base de datos.
Dim cliente = From cli In Data.tb_clientes _ Where cli.IdCliente = 98128 Select cli Data.tb_clientes.DeleteOnSubmit(cliente.First) Data.SubmitChanges()

3.3.3 Actualizando registros Para realizar una operacin Update en una entrada de base de datos, primero recupere el elemento y modifquelo directamente en el modelo de objetos. Despus de haber modificado el objeto, llame a SubmitChanges en DataContext para actualizar la base de datos. En el ejemplo siguiente recupere el cliente cuyo IdCliente es ALFKI. A continuacin, la direccion se cambia a "London Metro". Finalmente, se llama a SubmitChanges.
Dim cliente = From cli In Data.tb_clientes Where cli.IdCliente = ALFKISelect cli Dim updatecliente As New tb_clientes updatecliente = cliente.FirstOrDefault updatecliente.Direccion = "London - Metro" Data.SubmitChanges()

3.4 OBTENER DATOS CON PROCEDIMIENTOS ALMACENADOS


LINQ to SQL es muy flexible, y puede usare para crear un modelo de datos cuyos objetos sean independientes del esquema de la base de datos, y puede encapsular lgica de negocio que funcionan tanto si se usa SQL generado dinmicamente o a travs de procedimientos almacenados. LINQ to SQL puede mapear procedimientos almacenados con la clase DataContext que nos permitir obtener los mismos objetos llamando a un procedimiento almacenado.

CIBERTEC

CARRERAS PROFESIONALES

138

3.4.1 Pasos para mapear un procedimiento almacenado en LINQ to SQL. a) Abra la ventana explorador de servidores de VS 2008 y miramos a los procedimientos almacenados de nuestra base de datos. b) Arrastre y suelte desde el explorador de servidores al diseador de LINQ to SQL. Automticamente se crear un nuevo mtodo en la clase DataContext.

Mtodos: Procedimientos almacenados

3.4.2 Llamada de un procedimiento almacenados Una vez que hemos seguido los pasos para mapear el procedimiento almacenado en la clase DataContext, es muy fcil de usar. Todo lo que tenemos que hacer es llamarlo para obtener los resultados. En el ejemplo siguiente ejecute el procedimiento almacenado usp_clientes y visualice los resultados en un control DataGridView1.
Dim data As New DataVentasDataContext Me.DataGridView1.DataSource = data.usp_Clientes

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

139

LABORATORIO 10.1 CONSULTA DE PEDIDOS POR CLIENTE Y AO


En este escenario vamos a listar los pedidos por un cliente y ao, el cual seleccione un cliente desde un ComboBox e ingrese el ao desde el control TextBox y al presionar el botn Consulta visualice los pedidos por cliente seleccionado y ao ingresado. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija Windows Application. - En Name coloque appLINQ. - En Location coloque C:\CursoPOOII. 4. Agregue un nuevo elemento en el proyecto de Windows; seleccione la plantilla Clases de LINQ to SQL; asigne el nombre DataVentas.dbml.

Seleccione la plantilla para el manejo de las tablas como clases.

5. Desde el explorador de servidor arrastre las tablas hacia el diseador llamado DataVentas.dbml y establecer la asociacin entre las tablas tb_clientes y tb_pedidoscabe, tal como se muestra.

6. Sobre el Form1.vb, cree la siguiente interfase de usuario:

CIBERTEC

CARRERAS PROFESIONALES

140

Control Button1 Label1 Label2 Label3 ComboBox TextBox DataGridView

Nombre BtnConsulta Label1 Label2 Label3 ComboBox1 txtAo DataGridView1

Propiedad Text Text Text Text

Valor Consulta Consulta de Pedidos por Cliente y Ao Cliente Ao

7. En la ventana de cdigo, defina la instancia de DataVentasDataContext a nivel Formulario.


Private Data As New DataVentasDataContext

8. En el evento Load del Formulario, defina una variable clientes que almacene los registros de la tabla tb_clientes para enlazar al control ComboBox1.
Dim cliente = From cli In Data.tb_clientes Me.ComboBox1.DataSource = cliente Me.ComboBox1.DisplayMember = "NombreCia" Me.ComboBox1.ValueMember = "IdCliente"

9. En el evento Click del button BtnConsulta, declare la variable pedidos para realizar la consulta de pedidos por el cliente y ao.
Dim pedidos = From pedido In Data.tb_pedidoscabe _ Where pedido.IdCliente = ComboBox1.SelectedValue.ToString And pedido.FechaPedido.Year=Val(TXTAO.Text) Select pedido Me.DataGridView1.DataSource = pedidos

10. Guarda la aplicacin y ejecute. Al seleccionar un cliente e ingresar el ao desde el TextBox listaremos los pedidos del cliente y ao.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

141

LABORATORIO 10.2 CONSULTA DE PEDIDOS POR EMPLEADOS ENTRE FECHAS


En este escenario vamos a listar los pedidos por un empleado entre dos fechas, donde al seleccionar un empleado desde un ComboBox e ingrese dos fechas desde controles TextBoxes y al presionar el botn Consulta visualice los pedidos por empleado seleccionado y entre dos fechas. 1. En el DataContext DataVentasDataContext agregue la tabla tb_empleados. 2. En el proyecto appLINQ, agregue un formulario;dibuje la siguiente interfaz:

Control Button Label Label Label Label ComboBox TextBox TextBox DataGridView

Nombre BtnConsulta Label1 Label2 Label3 Label4 ComboBox1 txtFecha1 txtFecha2 DataGridView1

Propiedad Text Text Text Text Text

Valor Consulta Consulta Empleado Empleado Fecha 1 Fecha2

de

Pedidos

por

3. En la ventana de cdigo, defina la instancia de DataVentasDataContext a nivel Formulario.


Private Data As New DataVentasDataContext

4. En el evento Load del Formulario, defina una variable empleado que almacene los registros de la tabla tb_empleados para enlazar al control ComboBox1.
Dim empleado = From emp In Data.tb_empleados Me.ComboBox1.DataSource = empleado Me.ComboBox1.DisplayMember = "Nombre" Me.ComboBox1.ValueMember = "Idempleado"

5. En el evento Click del button BtnConsulta, declare la variable pedidos para realizar la consulta de pedidos por el empleado entre dos fechas.
Dim pedidos = From pedido In Data.tb_pedidoscabe _ Where pedido.IdEmpleado = ComboBox1.SelectedValue.ToString And pedido.FechaPedido >= CDate(TXTFECHA1.Text) And pedido.FechaPedido <= CDate(TXTFECHA2.Text Me.DataGridView1.DataSource = pedidos

CIBERTEC

CARRERAS PROFESIONALES

142

6. Guarda la aplicacin y ejecute. Al seleccionar un empleado e ingresar las fechas desde los controles TextBoxes listaremos los pedidos del empleado entre dos fechas.

LABORATORIO 10.3 ACTUALIZACION DE CLIENTES UTILIZANDO LINQ to SQL


En este escenario vamos a actualizar los clientes utilizando LINQ to SQL; para esto vamos a programar las operaciones de Agregar un clientes, modificar los datos de un cliente y eliminar un registro de cliente por su cdigo utilizando el modelo de objetos LINQ to SQL. 1. En el DataContext DataVentas agregue la tabla tb_paises y establezca la asociacin en la tabla tb_clientes.

2. En el proyecto appLINQ, agregue un formulario;dibuje la siguiente interfaz:

3. En la ventana de cdigo, defina la instancia de DataVentasDataContext a nivel Formulario.


Private Data As New DataVentasDataContext

4. En la ventana de cdigo, defina el procedimiento Clientes clientes y visualizarlos en el DataGridView1.

para listar los

Sub Clientes() Dim clientes = From cliente In Data.tb_clientes Me.DataGridView1.DataSource = clientes End Sub

5. En el evento Load del Formulario, listar los pases en el control ComboBox1 y listar los clientes en el DataGridView.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

143

Dim paises = From pais In Data.tb_paises Me.ComboBox1.DataSource = paises Me.ComboBox1.DisplayMember = "NombrePais" Me.ComboBox1.ValueMember = "IdPais" 'Cargar los clientes en el DataGrid Clientes()

6. Codifique el evento Click del botn Agregar para insertar un registro a la tabla tb_clientes y actualizando a la base de datos.
'instancia de la clase tb_clientes Dim cliente As New tb_clientes cliente.IdCliente = TXTCODIGO.Text cliente.NombreCia = TXTNOMBRE.Text cliente.Direccion = TXTDIRECCION.Text cliente.idpais = ComboBox1.SelectedValue cliente.Telefono = TXTFONO.Text 'agrega el cliente a la clase y actualiza a la base de datos Data.tb_clientes.InsertOnSubmit(cliente) Data.SubmitChanges() 'listar los clientes Clientes()

7. Codifique el evento Click del botn Modificar, para actualizar los datos de un cliente seleccionado y actualizando a la base de datos.
Dim cliente = From cli In Data.tb_clientes Where _ cli.IdCliente = TXTCODIGO.Text Select cli 'si no existe, salir del procedimiento If cliente.Count = 0 Then Exit Sub Dim updatecliente As New tb_clientes updatecliente = cliente.FirstOrDefault updatecliente.IdCliente = TXTCODIGO.Text updatecliente.NombreCia = TXTNOMBRE.Text updatecliente.Direccion = TXTDIRECCION.Text updatecliente.idpais = ComboBox1.SelectedValue.ToString updatecliente.Telefono = TXTFONO.Text Data.SubmitChanges() 'listar los clientes Clientes()

8. Codifique el evento Click del botn Eliminar para eliminar un cliente por su cdigo y actualizando la base de datos.
Dim cliente = From cli In Data.tb_clientes _ Where cli.IdCliente = TXTCODIGO.Text Select cli If cliente.Count = 1 Then 'eliminar el primero objeto de los clientes Data.tb_clientes.DeleteOnSubmit(cliente.First) Data.SubmitChanges() 'listar loc clientes Clientes() End If

9. Guarde y ejecute el programa para realizar la actualizacin de los clientes.

CIBERTEC

CARRERAS PROFESIONALES

144

LABORATORIO 10.4 CONSULTA DE PEDIDOS ENTRE FECHAS CON PROCEDIMIENTOS ALMACENADOS Y LINQ to SQL
En este escenario vamos ejecutar un procedimiento almacenado donde liste los pedidos entre fechas. Para ello, definimos el procedimiento almacenado y agregamos el procedimiento como mtodo al DataContext. 1. En el DataContext DataVentas agregue el procedimiento almacenado usp_pedidos_fecha, tal como se muestra.

Procedimiento almacenado usp_pedidos_Fecha agregado como mtodo.

2. En el proyecto agregue el formulario para ejecutar la consulta.

3. Codifique el evento Click del botn Consulta, donde se ejecuta el mtodo usp_pedidos_Fechas al ingresar las fechas.
Dim data As New DataVentasDataContext Dim f1 As Date = CDate(TXTFECHA1.Text) Dim f2 As Date = CDate(TXTFECHA2.Text) Me.DataGridView1.DataSource = data.usp_pedidos_Fechas(f1, f2)

4. Guarde y ejecute el formulario, ingresa dos fechas, al presionar el botn Consulta, listamos los pedidos entre las fechas.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

145

Autoevaluacin

1. Qu es el modelo relacional de Objetos? _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 2. Explique el modelo LINQ. _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 3. Cules son los proveedores de LINQ? _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ 4. Explique el objeto DataContext y la clase Entity. _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________ _______________________________________________________________

5. Implemente un Programa que permita el ingreso o actualizacin de empleados a la base de datos. En esta aplicacin se deber desarrollar los siguientes procesos: Ingresar los datos del usuario e ingresar la imagen: opcional. Actualizar los datos de los usuarios donde se proceder a actualizar su imagen, en caso de no tener agregar la imagen.

CIBERTEC

CARRERAS PROFESIONALES

146

Resumen
LINQ es una combinacin de extensiones a los lenguajes y libreras de cdigo manejado que permiten expresar de manera uniforme y extensible las consultas sobre secuencias de datos provenientes de las ms dismiles fuentes. La tabla de los proveedores LINQ incorporados de serie a .NET Framework 3.5: o LINQ to Objects, para consultar arrays y colecciones de objetos en memoria. o LINQ to XML, para consultar y actualizar documentos XML. o LINQ to DataSets, para consultar y actualizar conjuntos de datos. o LINQ to SQL y LINQ to Entities, para consultar y actualizar bases de datos relacionales. LINQ To SQL es el componente especfico de LINQ que proporciona la infraestructura de runtime necesaria para utilizar datos relacionales como objetos y poder definir consultas sobre dichos objetos, es decir, habilita la consulta de contenedores de datos relacionales sin tener que abandonar la sintaxis o el entorno de tiempo de compilacin. El diseador de LINQ to SQL nos aporta una forma fcil de modelar y visualizar una base de datos como un modelo de objeto de LINQ to SQL: DataContext y las Clases Entitities. El DataContext es el origen de todas las entidades asignadas en una conexin de base de datos. Realiza un seguimiento de los cambios realizados en todas las entidades recuperadas y mantiene una "memoria cach de identidad" que garantiza que las entidades que se recuperan ms de una vez se representan utilizando la misma instancia de objeto. Las clases entidad mapean a tablas de una base de datos. Las propiedades de una clase entidad normalmente mapean las columnas de la tabla. Cada instancia de una clase entidad representa a una fila de una tabla de la base de datos.

http://msguayaquil.com/blogs/julioc/archive/2007/07/27/la-evoluci-243-nde-las-apis-de-acceso-a-datos-de-microsoft-parte-ii.aspx Pgina referente a la evolucin de APIs: LINQ http://thinkingindotnet.wordpress.com/2007/07/13/linq-to-sql-4%c2%aaparte-actualizando-la-base-de-datos/ Pgina referente a la actualizacin de datos utilizando LINQ to SQL http://thinkingindotnet.wordpress.com/2007/08/17/linq-to-sql-parte-6obtener-datos-con-procedimientos-almacenados/ Pgina referente al manejo de procedimientos almacenado en LINQ to SQL

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

147

UNIDAD DE APRENDIZAJE

4
SEMANA

11
ADO.NET ENTITY FRAMEWORK
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET utilizan una plataforma de acceso a datos, para mapear un modelo conceptual de tipo entidad-relacin apoyndonos en un entorno visual integrado con Visual Studio, y realizar consultas a travs del nuevo lenguaje de consultas integrado.

TEMARIO
Modelo Relacional de Objetos, introduccin. LINQ: arquitectura, DataContext. Consultas y actualizacin de datos utilizando LINQ to SQL. ADO.NET Entity FrameWork. Acceso a datos utilizando EntityClient Provider; administracin de los objetos Entity: EntityConnection, EntityCommand, EntityDataReader, EntityTransaction. Acceso a datos utilizando Servicios de Objetos y LINQ to Entity

ACTIVIDADES PROPUESTAS
Los alumnos conocen las plataformas a acceso a datos del ADO.NET Entity FrameWork. Los alumnos realizan operaciones de acceso a datos utilizando EntityClient Provider.

CIBERTEC

CARRERAS PROFESIONALES

148

QU ES ADO.NET ENTITY FRAMEWORK?


Para definir al Entity Framework nos basaremos en una definicin del modelo entidad-relacion. En el modelo entidad-relacion tal y como lo conocemos, tenemos que implementar un conjunto de clases que definen el modelo conceptual de la base de datos y tenemos que definir la capa de acceso a datos, de tal manera que sea esta la encargada de acceder a la base de datos y mapear los datos en las clases creadas para tal efecto. El Entity Framework nos permite trabajar con los objetos definidos a partir del modelo de datos sin tener que preocuparnos de la capa de acceso a datos ya que l se encarga automticamente de su persistencia.

COMPONENTES DEL ADO.NET ENTITY FRAMEWORK


Entity Framework permite a los desarrolladores escribir menos cdigo de acceso a datos, reduce el mantenimiento, condensa la estructura de datos de forma ms manejable (y menos normalizada) y facilita la persistencia de los datos. Entity Framework genera un modelo conceptual para el que los desarrolladores pueden escribir cdigo. Se puede interaccionar directamente un nuevo proveedor de datos llamado EntityClient y un nuevo lenguaje (parecido a T-SQL) llamado Entity SQL. EntityClient tiene un modelo parecido a los objetos conocidos de ADO.NET, usando objetos de EntityConnection y EntityCommand para devolver un DbDataReader. Los Servicios del Objeto permite a los desarrolladores sacar partido de las clases generadas del modelo conceptual mediante un objeto ObjectQuery con Entity SQL o mediante LINQ to Entities.

MODELO DE DATOS DE ENTIDADES


El ncleo de Entity Framework se encuentra en sus modelos. Entity Framework admite un modelo de almacn lgico que representa el esquema relacional de una base de datos. La forma en la que una base de datos relacionales almacena los datos suele ser distinta de la forma en la que una aplicacin los usa. Entity Framework llena el hueco entre los modelos usando una capa de asignacin. Por lo tanto, hay tres capas en el modelo de Entity Framework: Capa conceptual.- definida mediante un archivo .CSDL (Conceptual Schema Definition Language, un archivo XML con informacin relativa a las entidades del modelo), el cul incluye las entidades y las relaciones tal y como la capa de negocio de la aplicacin las conoce. Capa de asignacin.- definida con MSL (Mapping Schema Language), establece el mapeo entre las entidades del modelo conceptual y sus correspondencias con la BD.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

149

Capa lgica.- definida con SSDL (Store Schema Definition Language), y representa el esquema de la BD.

Entity Framework proporciona los medios para definir estas capas mediante los archivos XML. Esto proporciona un nivel de abstraccin que permite a los desarrolladores programar para el modelo conceptual en lugar del modelo relacional.

3.1 DEFINIENDO EN ENTITY DATA MODEL (EDM)


El primer paso para trabajar con ADO.NET Entity Framework pasa por crear un modelo de entidades a partir de un cierto esquema de Base de Datos. a) Aadir al proyecto un elemento de tipo ADO.NET Entity Data Model.

Selecciona la plantilla ADO.NET Entity Data Model.

b) Especificar la opcin de generacin del EDM (a partir de una BD o bien un EDM vaco.
Selecciona Generar desde la base de datos para trabajar una base de datos.

CIBERTEC

CARRERAS PROFESIONALES

150

c) Especificar la cadena de conexin a la BD (puede ser un archivo fsico o bien una instancia de SQL Server).
Conexin a la base de datos del app.config.

Nombre de la conexin de entidad a almacenar en el app.config.

d) Especificar que objetos de la BD queremos que formen de nuestro EDM (en este caso, tablas y procedimientos almacenados).

Seleccione las tablas o procedures de la base de datos.

e) Al finalizar se construye el modelo de entidad de datos, tal como se muestra en la figura: ModelVentas.edmx.

Modelo de Entidades de datos: EDM

Entidades almacenadas en el modelo EDM

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

151

f) En el archivo App.Config el asistente agrega la conexin a la base de datos llamada DBVentasEntities cuyo NameSpace es System.Data.EntityClient.
<connectionStrings> <add name="DBVentasEntities" connectionString="metadata=res://*/ModelVentas.csdl|res://*/Mo delVentas.ssdl|res://*/ModelVentas.msl;provider=System.Data.Sq lClient;provider connection string=&quot;Data Source=.;Initial Catalog=DBVentas;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> </connectionStrings>

3.3 ACCESO AL MODELO DE DATOS


Las tres tcnicas principales que puede usar para interactuar con un EDM:

Escritura de consultas de Entity SQL con el proveedor EntityClient. Escritura de consultas de Entity SQL con Servicios de objeto. Escritura de consultas de Entity con LINQ. 3.3.1 Entity SQL con el proveedor EntityClient.- El proveedor EntityClient define clases y mapea datos para interactuar con modelos de entidades de datos. EntityClient transforma las operaciones de las entidades hacia operaciones directas a la base de datos. La escritura de cdigo con la API de EntityClient le ofrece el control ms granular de las tres tcnicas. Puede crear un objeto EntityConnection para conectar al EDM, escribir una consulta en Entity SQL, ejecutarla con un EntityCommand, y devolver los resultados a travs de un EntityDataReader.
Using cn As New EntityConnection("Name=DBVentasEntities") Dim cmd As New EntityCommand("Select cli.Nombrecia from DBVentasEntities.tb_clientes as cli",cn) cn.Open() Dim dr As EntityDataReader = _ cmd.ExecuteReader(CommandBehavior.SequentialAccess) While dr.Read Me.ComboBox1.Items.Add(dr("NombreCia")) End While dr.Close() End Using

3.3.2 Entity SQL con Servicio de objeto.- Esta tcnica se aleja de la interaccin directa con el proveedor de EntityClient. Usted usara ObjectContext y ObjectQuery<T> para publicar las consultas en el EDM.
Using entidad As New DBVentasEntities Dim cliente As ObjectQuery(Of tb_clientes) = _ entidad.CreateQuery(Of tb_clientes)( _ "Select VALUE cli From tb_clientes as cli") For Each r As tb_clientes In cliente Me.ComboBox1.Items.Add(r.NombreCia) Next End Using

CIBERTEC

CARRERAS PROFESIONALES

152

3.3.3 Entity SQL con LINQ.- La versin de ADO.NET 3.5 incluye una capa que permite exponer los datos de la base de datos como objetos .NET, permitiendo a los desarrolladores formular consultas contra una base de datos directamente desde el lenguaje de programacin utilizado para crear la lgica de negocio. Esta capacidad se conoce como LINQ to Entities.
Using entidades As New DBVentasEntities Dim query = From c In entidades.tb_clientes _ Where c.NombreCia Like "M%" Select c For Each c As tb_clientes In query ComboBox1.Items.Add(c.NombreCia) Next End Using

PROVEEDOR DE ENTIDAD DE DATOS: ENTITYCLIENT


EntityClient se parece mucho a los proveedores ADO.NET, y permite a los desarrolladores ejecutar consultas en trminos de EDM mediante objetos Connection, Command y DataReader. Tambin agrega el motor de vistas de cliente para asignar el modelo de dominio, definido en trminos de EDM, al esquema subyacente de la base de datos relacional. EntityClient permite a los desarrolladores, cuando sea necesario, trabajar en entidades en forma de filas y columnas mediante cadenas de consulta ESQL sin tener que generar clases para representar el esquema conceptual. La principal ventaja de Entity SQL es su flexibilidad. Su sintaxis basada en cadenas se presta fcilmente a la generacin de consultas dinmicas. Esto puede ser muy til cuando se necesita crear una consulta ad hoc. La escritura de cdigo con la API de EntityClient le ofrece el control ms granular de las tres tcnicas. Puede crear un objeto EntityConnection para conectar al EDM, escribir una consulta en Entity SQL, ejecutarla con un EntityCommand, y devolver los resultados a travs de un EntityDataReader.

4.1 PRINCIPALES OBJETOS DEL ENTITYCLIENT


Clase EntityCommand EntityConnection EntityConnectionStringBuilder EntityDataReader EntityParameter EntityProviderFactory EntityTransaction Descripcin Comando que ejecuta una sentencia hacia el modelo de entidad de datos. Contiene la referencia al EMD y la conexion al origen de datos. Maneja y crea la cadena de conexion utilizada por EntityClient. Leer los registros del origen de datos. Parmetro de un EntityCommand. Representa un conjunto de mtodos para crear o implementer las clases del origen de datos. Transaccin para un EntityCommand.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

153

4.2 CONEXIN A UNA BASE DE DATOS: ENTITYCONNECTION


El objeto EntityConnection permite conectarse con un determinado origen de datos mediante una cadena de conexin en la que se proporciona la informacin de autenticacin necesaria.

4.2.1 Definicin de la cadena de conexin


Cuando implementamos el modelo de entidad de datos EDM, a travs del asistente, se crea la cadena de conexin, la cual se almacena en el archivo App.Config:
<connectionStrings> <add name="DBVentasEntities" connectionString="metadata=res://*/ModelVentas.csdl|res://*/Mod elVentas.ssdl|res://*/ModelVentas.msl;provider=System.Data.SqlC lient;Data Source=.;Initial Catalog=DBVentas;Integrated Security=True; MultipleActiveResultSets=True" providerName="System.Data.EntityClient" /> </connectionStrings>

A partir de la publicacin de la conexin, definimos al objeto de conexin EntityConnection:


Imports System.Data.EntityClient . . . Dim cn As New EntityConnection("Name=DBVentasEntities")

El siguiente ejemplo muestra como conectarse a la base de datos DBVentas utilizando la cadena de conexin almacenada en el archivo App.Config.
Dim cn As New EntityConnection("Name=DBVentasEntities") o a traves de la Estructura Using Using cn As New EntityConnection("Name=DBVentasEntities") . . . End Using

Using: Un bloque Using garantiza la eliminacin de uno o ms de


tales recursos cuando su cdigo termina de usarlos. Esto los pone a disposicin de otro cdigo para que los pueda utilizar.

4.3 TRABAJAR CON EL ENTITYCOMMAND


El proveedor EntityClient posee una clase que permite ejecutar consultas sobre el modelo de entidad de datos: EntityCommand. La clase EntityCommand tiene 4 mtodos que permite utilizar para ejecutar sentencias SQL:

EntityCommand
ExecuteScalar ExecuteReader ExecuteNonQuery

Descripcin
Ejecuta una consulta que retorna un valor. Ejecuta una consulta que retorna un conjunto de datos a un DataReader. Ejecuta una Sentencia para actualizar los datos.

CIBERTEC

CARRERAS PROFESIONALES

154

4.3.1 Ejecutar una consulta en la base de datos


1. Instancia el objeto EntityConnection 2. Instancia el objeto EntityCommand. En el constructor especificar la sentencia sql que se va a ejecutar y la conexin. 3. Especifique la propiedad CommandType. Si ejecuta una sentencia SQL el valor del CommandType es CommandType.Text; si ejecuta un procedimiento almacenado el valor ser CommandType.StoredProcedure. 4. Llame al mtodo Open del objeto Conexin. 5. Ejecute el mtodo del objeto Command, asignando su resultado a una variable o control. El siguiente ejemplo permite ejecutar una consulta que retorne el nmero de clientes almacenadas en la base de datos DBVentas.
Using cn As New EntityConnection("Name=DBVentasEntities") Dim cmd As New EntityCommand( _ "Select count(cli.idcliente) from DBVentasEntities.tb_clientes as cli", cn) cmd.CommandType = CommandType.Text cn.Open() TextBox1.Text = cmd.ExecuteScalar End Using

4.4 TRABAJAR CON EL ENTITYDATAREADER


El proveedor EntityClient posee una clase que permite recuperar las filas: EntityDataReader. Con el EntityDataReader puede aumentar el rendimiento de la aplicacin tanto al recuperar datos en cuanto estn disponibles como al almacenar (de forma predeterminada) una fila cada vez en memoria, lo que reduce la sobrecarga del sistema. 4.4.1 Recuperacin de datos mediante EntityDataReader La recuperacin de datos mediante EntityDataReader implica crear una instancia del objeto Command, para lo cual se llama al mtodo Command.ExecuteReader a fin de recuperar filas de un origen de datos. En el ejemplo se muestra cmo se utiliza un EntityDataReader, donde command representa un objeto EntityCommand vlido.
'Definir el Objeto CmdReader Dim CmdReader As New EntityCommand 'cargar los datos al ejecutar el Metodo ExecuteReader Dim reader As EntityDataReader=CmdReader.ExecuteReader()

El mtodo Read del objeto EntityDataReader permite obtener una fila a partir de los resultados de una consulta. Para tener acceso a cada columna de la fila devuelta, puede pasar a EntityDataReader el nombre o referencia numrica de la columna en cuestin. Sin embargo, el mejor rendimiento se logra con los mtodos que ofrece el EntityDataReader y que permiten tener acceso a los valores de las columnas en sus tipos de datos nativos (GetDateTime, GetDouble, GetGuid, GetInt32, etc).

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

155

En el ejemplo de cdigo siguiente se repite por un objeto DataReader y se devuelven dos columnas de cada fila.
Using cn As New EntityConnection("Name=DBVentasEntities") Dim cmd As New EntityCommand("Select cli.Nombrecia from DBVentasEntities.tb_clientes as cli",cn) cn.Open() Dim dr As EntityDataReader = _ cmd.ExecuteReader(CommandBehavior.SequentialAccess) Do While reader.Read str += reader(0) + vbTab + reader.GetString(1) Loop 'Terminado el proceso cerrar el reader dr.Close() End Using

4.4.2 Cerrar el EntityDataReader Siempre debe llamar al mtodo Close cuando haya terminado de utilizar el objeto EntityDataReader. Tenga en cuenta que mientras est abierto un EntityDataReader, ste utiliza de forma exclusiva el objeto Connection.

LABORATORIO 11.1 CONSULTA DE DATOS UTILIZANDO ENTITY PROVIDER


En este escenario vamos a desarrollar un aplicativo el cual permita listar los clientes que se encuentra administrado en el modelo de entidad de datos (EDM). A continuacin sigua los siguientes pasos para realizar este proceso. 1. Ingrese a Visual Studio 2005. 2. Elija las siguientes opciones: - En Proyect Types elija Visual Basic - En Templates elija Windows Application - En Name coloque appEntidades11 - En Location coloque C:\CursoPOOII 3. Agregar un Item al Proyecto: tipo Modelo de Entidad de datos.

Selecciona la plantilla ADO.NET Entity Data Model

CIBERTEC

CARRERAS PROFESIONALES

156

4. Selecciona Generar desde la base de datos para definir el modelo.


Selecciona Generar desde la base de datos para trabajar una base de datos

6. Especifica la cadena de conexin a la BD y FINALIZAR.

Conexin a la base de datos del app.config

Nombre de la conexin de entidad a almacenar en el app.config

7. Especificar que objetos de la BD queremos que formen de nuestro EDM (en este caso, tablas y procedimientos almacenados). 8. Al finalizar se construye el modelo de entidad de datos, tal como se muestra en la figura: Model1.edmx

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

157

9. Disea el formulario para listar los registros de los clientes.

Control ListView

10. Defina la librera para trabajar con los objetos Entity.


Imports System.Data.EntityClient

11. En el evento Load del Formulario ejecutamos un objeto Command para recuperar los registros de tb_clientes, almacenndolos en el DataReader.
'conexin definida por el app.config: DBVentasEntities Using cn As New EntityConnection("Name=DBVentasEntities") 'VALUE retorna todos los valores de cada fila Dim cmd As New EntityCommand( "Select VALUE cli from DBVentasEntities.tb_clientes as cli", cn) cn.Open() 'Retornar los registros en forma secuencial Dim dr As EntityDataReader = _ cmd.ExecuteReader(CommandBehavior.SequentialAccess) 'Mientras se lea el registro While dr.Read Dim it As New ListViewItem(dr("IdCliente").ToString) it.SubItems.Add(dr("NombreCia")) it.SubItems.Add(dr("Direccion")) it.SubItems.Add(dr("idpais")) Me.ListView1.Items.Add(it) End While dr.Close() End Using

12. Grabe el proyecto y ejecute el aplicativo para realizar las pruebas.

CIBERTEC

CARRERAS PROFESIONALES

158

LABORATORIO 11.2 CONSULTA DE PEDIDOS ENTRE DOS FECHAS


En este escenario vamos a consultar los pedidos entre dos fechas. Al seleccionar las fechas en los controles ComboBox, listar los pedidos entre las fechas seleccionadas. 1. Agregue un formulario al proyecto, disee el formulario tal como se muestra.

2. Importe la librera para trabaja con la librera EntityClient Provider.


Imports System.Data.EntityClient

3. Defina la variable de conexin a nivel Formulario.


Private cn As New EntityConnection("Name=DBVentasEntities")

4. En el evento Load del formulario, cargue las fechas en los ComboBoxes.


'instancia del contexto DBVentasEntities Dim db As New DBVentasEntities 'configurar el ComboBox1 y ComboBox2 Me.ComboBox1.DataSource = db.tb_pedidoscabe Me.ComboBox1.DisplayMember = "FechaPedido" Me.ComboBox2.DataSource = db.tb_pedidoscabe Me.ComboBox2.DisplayMember = "FechaPedido"

5. Defina, en el evento Click del botn Consulta, el proceso para listar los pedidos entre dos fechas seleccionadas por ComboBoxes.
Dim cmd As New EntityCommand( _ "Select VALUE p from DBVentasEntities.tb_pedidoscabe As p Where p.FechaPedido>=@f1 AND p.FechaPedido<=@f2", cn) 'defina los parametros de la consulta: f1 y f2 cmd.Parameters.Add("f1", DbType.DateTime).Value = CDate(ComboBox1.Text) cmd.Parameters.Add("f2", DbType.DateTime).Value = CDate(ComboBox2.Text) cn.Open() 'retorna los registros en forma secuencial de la consulta Dim dr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess) Me.ListView1.Items.Clear() cn.Close()

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

159

. . . While dr.Read Dim it As New ListViewItem(dr("IdPedido").ToString) it.SubItems.Add(dr("IdCliente")) it.SubItems.Add(dr("FechaPedido")) it.SubItems.Add(dr("FechaEntrega")) Me.ListView1.Items.Add(it) End While dr.Close() cn.Close()

6. Grabe el proyecto y ejecute la aplicacin.

LABORATORIO 11.3 ACTUALIZACION DE CLIENTES


En este escenario vamos a actualizar los datos de los clientes utilizando los objetos del Modelo de Entidad de Datos DBVentasEntities. 1. Agregue un formulario al proyecto, disee el formulario tal como se muestra.

Control Button Button Button Button Label Label Label Label Label Label TextBox TextBox TextBox TextBox ComboBox DataGridView

Nombre BtnLimpiar BtnAgregar BtnModificar BtnEliminar Label1 Label2 Label3 Label4 Label5 Label6 TxtCodigo TxtNombre TxtDireccion TxtFono ComboBox1 DataGridView1

Propiedad Text Text Text Text Text Text Text Text Text Text

Valor LIMPIAR AGREGAR MODIFICAR ELIMINAR Mantenimiento de Clientes Cdigo Nombre Direccin Pas Fono

2. Defina la instancia de DBVentasEntities a nivel formulario


Private DB As New DBVentasEntities

CIBERTEC

CARRERAS PROFESIONALES

160

3. En el evento Load del formulario, configura el ComboBox con la entidad tb_paises y liste los clientes en el DataGridView1.
'configura el combobox con la entidad tb_paises Me.ComboBox1.DataSource = DB.tb_paises Me.ComboBox1.DisplayMember = "NombrePais" Me.ComboBox1.ValueMember = "idpais" 'listar los clientes en el DataGridView1 Me.DataGridView1.DataSource = DB.tb_clientes.ToList

4. En el botn grabar se proceder a Grabar un nuevo cliente a la entidad tb_clientes, actualizando los datos en el Contexto DBVentasEntities DB.
'definir la instancia de tb_clientes Dim cliente As New tb_clientes 'asigne los valores a la instancia cliente cliente.IdCliente = Me.txtcodigo.Text cliente.NombreCia = Me.txtnombre.Text cliente.Direccion = Me.txtdireccion.Text cliente.idpais = Me.ComboBox1.SelectedValue cliente.Telefono = Me.txtfono.Text 'aadir cliente a la entidad tb_clientes DB.AddTotb_clientes(cliente) 'actualizar los cambios DB.SaveChanges() DataGridView1.DataSource = DB.tb_clientes.ToList

5. En el botn modificar se proceder a actualizar los datos de un cliente seleccionado, observe que los datos se actualiza en la entidad tb_clientes del contexto DBVentasEntities.
'asigne el objeto tb_cliente seleccionado del DataGridView1 Dim cliente As tb_clientes = _ DB.tb_clientes.ToList.ElementAt(DataGridView1.CurrentRow.Index) 'asigne los datos a actualizar cliente.NombreCia = Me.txtnombre.Text cliente.Direccion = Me.txtdireccion.Text cliente.idpais = Me.ComboBox1.SelectedValue cliente.Telefono = Me.txtfono.Text 'actualizar los cambios DB.SaveChanges() Me.DataGridView1.DataSource = DB.tb_clientes.ToList

6. En el botn eliminar se elimina el objeto cliente seleccionado desde el DataGridView1 y se actualizar en el contexto DBVentasEntities.
Dim cliente As tb_clientes = DB.tb_clientes.ToList.ElementAt( _ DataGridView1.CurrentRow.Index) 'eliminar el objeto y actualizar los cambios DB.DeleteObject(cliente) DB.SaveChanges() Me.DataGridView1.DataSource = DB.tb_clientes.ToList

7. Grabe y ejecute la aplicacin para comprobar sus procesos.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

161

Autoevaluacin
1. Qu es el modelo relacional de objetos? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 2. Explique cada una de las capas del modelo de entidad de datos. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 3. Qu es el ADO.NeT Entity Provider? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 4. Explique cada una de las clases que integran el Entity Provider. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________

5. Cmo se conecta a una base de datos utilizando el EntityConnection? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________

CIBERTEC

CARRERAS PROFESIONALES

162

Resumen
El Entity Framework permite a los desarrolladores escribir menos cdigo de acceso a datos, reduce el mantenimiento, condensa la estructura de datos de forma ms manejable (y menos normalizada) y facilita la persistencia de los datos. Hay hay tres capas en el modelo de Entity Framework: o Capa conceptual.- definida mediante un archivo .CSDL (Conceptual Schema Definition Language, un archivo XML con informacin relativa a las entidades del modelo), el cul incluye las entidades y las relaciones tal y como la capa de negocio de la aplicacin las conoce. o Capa de asignacin.- definida con MSL (Mapping Schema Language), establece el mapeo entre las entidades del modelo conceptual y sus correspondencias con la BD. o Capa lgica.- definida con SSDL (Store Schema Definition Language), y representa el esquema de la BD. Las tres tcnicas principales que puede usar para interactuar con un EDM: Escritura de consultas de Entity SQL con el proveedor EntityClient Escritura de consultas de Entity SQL con Servicios de objeto Escritura de consultas de Entity con LINQ. El proveedor EntityClient define clases y mapea datos para interactuar con modelos de entidades de datos. EntityClient transforma las operaciones de las entidades hacia operaciones directas a la base de datos. La versin de ADO.NET 3.5 incluye una capa que permite exponer los datos de la base de datos como objetos .NET, permitiendo a los desarrolladores formular consultas contra una base de datos directamente desde el lenguaje de programacin utilizado para crear la lgica de negocio. Esta capacidad se conoce como LINQ to Entities. EntityClient se parece mucho a los proveedores ADO.NET, y permite a los desarrolladores ejecutar consultas en trminos de EDM mediante objetos Connection, Command y DataReader. Tambin agrega el motor de vistas de cliente para asignar el modelo de dominio, definido en trminos de EDM, al esquema subyacente de la base de datos relacional. Si desea conocer mas acerca del tema, visite las siguientes paginas: http://msdn.microsoft.com/es-ar/library/bb738679(en-us).aspx Pgina referente al marco de los objetos de entidad http://msdn.microsoft.com/es-ar/library/system.data.entityclient(enus).aspx Pgina referente al ADO.NET Entity Provider http://msdn.microsoft.com/es-es/magazine/cc507640.aspx Pgina referente al modelo de Entidad

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

163

UNIDAD DE APRENDIZAJE

4
SEMANA

12

ADO.NET ENTITY FRAMEWORK


LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET utilizan una plataforma de acceso a datos, para mapear un modelo conceptual de tipo entidad-relacin apoyndonos en un entorno visual integrado con Visual Studio, y realizar consultas a travs del nuevo lenguaje de consultas integrado.

TEMARIO
Modelo Relacional de Objetos, introduccin. LINQ: arquitectura, DataContext. Consultas y actualizacin de datos utilizando LINQ to SQL ADO.NET Entity FrameWork. Acceso a datos utilizando EntityClient Provider; administracin de los objetos Entity: EntityConnection, EntityCommand, EntityDataReader, EntityTransaction. Acceso a datos utilizando Servicios de Objetos y LINQ to Entity.

ACTIVIDADES PROPUESTAS
Los alumnos realizan operaciones de consulta utilizando los servicios de objetos con entidades. Los alumnos realizan operaciones de actualizacin de datos utilizando los servicios de objetos con entidades.

CIBERTEC

CARRERAS PROFESIONALES

164

ADO.NET ENTITY FRAMEWORK: SERVICIOS DE OBJETOS


Los Servicios de Objeto son un componente del Marco de Entidad que le permite consultar, insertar, actualizar, y suprimir datos, expresados como fuerte escrito CLR los objetos que son los casos de tipos de entidad. Los Servicios de Objeto apoyan tanto al Lenguaje de consulta integrada (LINQ) como al Entity SQL Query sobre los tipos que son definidos en un Modelo de Datos de Entidad (EDM). Los Servicios de Objeto materializan datos devueltos como objetos, y actualizan cambios de objeto a la fuente de datos. Esto tambin proporciona instalaciones de rastrear cambios, enlazar objetos al origen de datos (data source). Los Servicios de Objeto son puestos en prctica por clases en el Sistema. Data. Objects y Sistema. Data. Objects. DataClasses.

1.1 OBJECT CONTEXT


ObjectContext es la puerta de enlace a EntityConnection para Servicios de objeto. Ofrece acceso al EDM a travs del EntityConnection subyacente. Por ejemplo, puede tener acceso a las entidades a travs de ObjectContext, interrogar a ObjectContext para averiguar informacin acerca del estado de objetos y crear consultas de ObjectQuery<T> con el mtodo CreateQuery. Otro de los objetivos de ObjectContext es permitir que los objetos obtengan informacin de actualizacin sobre las entradas de la base de datos. Por ejemplo, puede usar los mtodos de ObjectContext para agregar entidades a ObjectContext, eliminar entidades, manipular entidades y, por ltimo, guardar los cambios de las entidades en la base de datos (a travs del mtodo SaveChanges). Una instancia de la clase ObjectContext encapsula: Una conexion a la base de datos, en el formulario de un objeto EntityConnection. Metadata que describe el modelo, en el formulario de un objeto MetadataWorkspace . Un objeto ObjectStateManager que manejo objetos durante las operaciones de creacin, actualizacin yate, y eliminacin.

2 CONSULTA DE DATOS COMO OBJETOS


Los Servicios de Objeto le permiten usar el Lenguaje de consulta integrada (LINQ), Entity SQL, o query bulider para ejecutar consultas contra un Modelo de Datos de Entidad (EDM) y retornar datos como objetos.Para realizar consulta al modelo trabajamos con la clase ObjectQuery.

2.1 LA CLASE OBJECTQUERY


La clase genrica ObjectQuery representa una consulta que retornar una coleccin de cero a ms objetos de entidad tipeadas. Un ObjectQuery siempre pertenece a un ObjectContext. Este contexto provee la conexin y la informacin de la metadata que es requerido para definir y ejecutar una

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

165

consulta. Un ObjectContext tipeado incluye un conjunto de propiedades que retornar instancias de ObjectQuery tipeados. Hay una de esas propiedades para cada entidad en el modelo. Esas propiedades hacen mas fcil crear e instanciar un ObjectQuery tipeado. El ObjectQuery es ejecutado en los siguientes escenarios: Cuando es recuperado sus objetos dentro de un For Each. Cuando es asignado para poblar en una coleccin List collection. Cuando se ejecuta el mtodo Execute. Cuando se ejecuta un operador del LINQ query tal como First or Any. La siguiente consulta retorna los objetos tb_pedidoscabe, almacenando los objetos en un LIST y visualizando los objetos en un DataGridView.
Dim db As New DBVentasEntities Dim lista As ObjectQuery(Of tb_pedidoscabe) = db.tb_pedidoscabe Me.DataGridView1.DataSource = lista.ToList

2.2 MTODO PARA CONSTRUIR CONSULTAS EN OBJECTQUERY La clase ObjectQuery soporta consultas para LINQ to Entities y Entity SQL en el modelo de entidad de datos (EDM). ObjectQuery tambin implementa un conjunto de mtodos para construir consultas que puede ser usado para construir comando de consultas que son equivalente a Entity SQL. Los mtodos para construir mtodos de ObjectQuery:
Mtodo ObjectQuery Distinct Except GroupBy OrderBy Select Skip Top Union Where Descripcin Retorna objeto no repetido. Retorna objetos excluidos de otra consulta. Retorna objetos agrupados por un criterio. Retorna objetos ordenados. Retorna conjunto de objetos definiendo las columnas. Especifica el nmero de resultados de la consulta. Retorna el primer objeto de la consulta. Retorna objetos producto de la unin de dos consultas. Retorna un conjunto de objetos filtrados por una condicin.

En el siguiente ejemplo listamos el registro de cliente cuyo cdigo sea ALFKI


'defina la instancia del modelo
Dim db As New DBVentasEntities

Al igual queun ObjectQuery que resuelva unasintaxis directa para 'definir Entity SQL, LINQ tampoco admite la consulta de clientes
'a travs de la condicin del idcliente
Dim ls As ObjectQuery(Of tb_clientes)=db.CreateQuery(Of tb_clientes) _ ("Select VALUE c From tb_clientes As c Where c.idcliente=ALFKI")

'listar los resultados


Me.DataGridView1.DataSource = lista.ToList

CIBERTEC

CARRERAS PROFESIONALES

166

3 TRABAJANDO CON OBJETOS


Trabajar con los objetos del modelo de entidad de datos implica utilizar la clase Object Services para crear, cambiar y eliminar objetos dentro del Object Context. As como manejar las excepciones dentro del origen de datos y enlazar los objetos a los controles.

3.1 ADICIONANDO, MODIFICANDO Y ELIMINANDO OBJETOS


Los objetos dentro del ObjectContext son instancias de los tipos de entidades que representan los datos dentro del origen de datos. Puede modificar, crear y eliminar objetos dentro del ObjectContext y el Object Services realizar los cambios de esos objetos. Cuando se ejecuta el mtodo SaveChanges, el Object Services genera y ejecuta los commandos que funcionan como las sentencias insert, update, or delete sobre el origen de datos. 3.1.1 Agregando Objetos Cuando quieres agregar data en el origen de datos, debes crear una instancia del tipo de la Entidad y aadir el objeto al ObjectContext. Antes de agregar un nuevo objeto, debes asignar, primero, a todas las propiedades que no soporten valores null. Considere utilizan el mtodo CreateObjectName para crear una nueva instancia de un tipo de entidad. El modelo de entidad de datos (EDM) incluye este mtodo en cada clase que son generados como tipos de entidad; para crear una instancia de un objeto utilizando este mtodo, asigne a todas las propiedades de la clase que no puede ser null. El siguiente ejemplo utiliza el mtodo Createtb_clientes para crear una instancia de la clase tb_clientes.
Dim cliente As tb_clientes = _ Tb_clientes.Createtb_clientes("ABC","CIBERTEC","San Isidro", _ "001","123456"")

Puede agregar nuevos objetos dentro de un ObjectContext invocando al mtodo AddObject o llamando al mtodo AddToEntitySetName. El siguiente ejemplo utiliza el mtodo AddTotb_clientes para agregar un objeto dentro del ObjectContext DBVentasEntities (db).
'definir la instancia de tb_clientes Dim cliente As New tb_clientes 'asigne los valores a la instancia cliente cliente.IdCliente = "ABC1" cliente.NombreCia = "CIBERTEC-UPC" cliente.Direccion = ("San Isidro" cliente.idpais = ("001" cliente.Telefono = ("234567" 'aadir cliente al ObjectContext DB.AddTotb_clientes(cliente)

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

167

3.1.2 Modificando Objetos Cuando realizas cambios de un objeto a una propiedad escalar, compleja o de navegacin y llamas al mtodo SaveChanges, los datos actualizados son enviados al origen de datos. Los Object Services realizar cambios a los objetos que son adjuntados al ObjectContext utilizando una instancia del IEntityChangeTracker. Las consultas retornan objetos en el estado Unchanged. El Modelo de entidad de datos ejecuta mtodos para realizar los cambios asignando a cada propiedad de la entidad. En el siguiente ejemplo asigne un valor a la propiedad idpais de la entidad tb_clientes.
Set(ByVal value As String) Me.OnStatusChanging(value) Me.ReportPropertyChanging("Status") Me._Status = StructuralObject.SetValidValue(value) Me.ReportPropertyChanged("Status") Me.OnStatusChanged() End Set

3.1.3 Eliminando Objetos Llamar al mtodo DeleteObject del modelo ObjectContext para especificar el objeto de la eliminacin. La fila no es borrada desde el origen de datos hasta ejecutar el mtodo SaveChanges. Las siguientes consideraciones se aplican cuando eliminamos objetos: Cuando un objeto es eliminado, cualquier relacin a otros objetos tambin es eliminado. Cuando dos objetos estn relacionados, eliminando un objeto padre eliminar todos sus objetos hijos. Este resultado se aplica habilitando la propiedad CascadeDelete. Llamando al mtodo DeleteObject para un objeto que ya ha sido eliminado. En el ejemplo eliminamos el primer cliente de la entidad tb_clientes ejecutando el mtodo DeleteObject.
Dim cliente As tb_clientes = DB.tb_clientes.First 'eliminar el objeto y actualizar los cambios DB.DeleteObject(cliente)

3.2 SALVANDO CAMBIOS Y MANEJANDO CONCURRENCIAS


Cuando ejecutamos el mtodo SaveChange, el Object Service trata de combinar los cambios en el origen de datos. Cuando existen conflictos en los cambios realizados al origen de datos al ejecutar el mtodo SaveChanges, se desencadena la concurrencia OptimisticConcurrencyException. Cuando agregamos un objeto al ObjectContext a travs del mtodo SaveChanges, puede generar un UpdateException cuando un objeto agregado al ObjectContext no puede creado satisfactoriamente en el origen de datos.

CIBERTEC

CARRERAS PROFESIONALES

168

El siguiente ejemplo actualizamos los cambios de la entidad tb_clientes.


Try 'realizar los cambios, el cual puede causar conflicto Dim n As Integer = context.SaveChanges() Messagebox.Show("Registros Actualizados:" & n) Catch ex As OptimisticConcurrencyException 'en caso existe conflict, refrescar los cambios los 'objetos antes del cambios. context.Refresh(RefreshMode.ClientWins, orders) 'salvar los cambios. context.SaveChanges() Messagebox.Show(" Se ha desencanado un OptimisticConcurrencyException, se grab los cambios") End Try

ENLAZANDO OBJETOS A LOS CONTROLES


Los Object Services permiten enlazar controles tales como ComboBox, ListView, and DataGridView a un EntityCollection o un ObjectResult el cual es retornado cuanod se ejecuta un ObjectQuery. En ambas clase Entity Framework se implementa la interface IListSource para datos enlazados. Todos los objetos de entidad derivados desde una clase base StructuralObject, el cual implementa INotifyPropertyChanged. Para enlazar objetos a los controles Windows Form control, asignar la propiedad DataSource del control al EntityCollection o al ObjectResult que es retornado cuando se ejecute el mtodo Execute de un objeto ObjectQuery object. El siguiente ejemplo enlazamos EntityCollection a un control DataGridView.
'Enlazar la data de productos al DataGridView. Me.DataGridView1.DataSource = db.tb_productos

LABORATORIO 12.1 CONSULTA DE DATOS UTILIZANDO ENTITY PROVIDER


En este escenario vamos a desarrollar un aplicativo el cual permita filtrar todos los productos por su nombre; donde al ingresar los primeros caracteres del nombre del producto, visualice los productos que se encuentra administrado en el modelo de entidad de datos (EDM). A continuacin sigua los siguientes pasos para realizar este proceso. 1. Ingrese a Visual Studio 2005 2. Elija las siguientes opciones: - En Proyect Types elija Visual Basic - En Templates elija Windows Application.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

169

- En Name coloque appEntidades12. - En Location coloque C:\CursoPOOII. 3. Agregar un Item al Proyecto: tipo Modelo de Entidad de datos.

Selecciona la plantilla ADO.NET Entity Data Model.

4. Selecciona Generar desde la base de datos para definir el modelo.


Selecciona Generar desde la base de datos para trabajar una base de datos.

5. Especifica la cadena de conexin a la BD y FINALIZAR.

Conexin a la base de datos del app.config.

Nombre de la conexin de entidad a almacenar en el app.config.

6. Especificar que objetos de la BD queremos que formen de nuestro EDM (en este caso, tablas y procedimientos almacenados).

CIBERTEC

CARRERAS PROFESIONALES

170

7. Al finalizar se construye el modelo de entidad de datos, tal como se muestra en la figura: Model1.edmx

8. Disea el formulario para listar los registros de los clientes.

Control Button Label Label TextBox DataGridView

Nombre BtnConsulta Label1 Label2 TxtNombre DataGridView1

Propiedad Text Text Text

Valor CONSULTA Consulta de Productos Nombre

9. Defina la librera para trabajar con los objetos Entity.


Imports System.Data.EntityClient

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

171

10. En el evento Load del Formulario ejecutamos un objeto Command para recuperar los registros de tb_clientes, almacenndolos en el DataReader.
Dim nombre As String = Me.txtnombre.Text + "%" 'definir la instancia del modelo Dim db As New DBVentasEntities 'definir la consulta de productos a travs del object query Dim lista As ObjectQuery(Of tb_productos) = db.CreateQuery( _ Of tb_productos)("Select VALUE p From tb_productos as p Where p.NombreProducto LIKE '" + nombre + "'") 'listar Me.DataGridView1.DataSource = lista.ToList

11. Grabe el proyecto y ejecute el aplicativo para realizar las pruebas.

LABORATORIO 12.2 CONSULTA DE PEDIDOS ENTRE DOS FECHAS


En este escenario vamos a consultar los pedidos entre dos fechas. Al seleccionar las fechas en los controles ComboBox, listar los pedidos entre las fechas seleccionadas. 1. Agregue un formulario al proyecto, disee el formulario tal como se muestra.

2. Importe la librera para trabaja con la librera Objects.


Imports System.Data.Objects

3. Defina la variable de contexto a nivel Formulario.


Dim db As New DBVentasEntities

CIBERTEC

CARRERAS PROFESIONALES

172

4. En el evento Load del formulario, cargue las fechas en los ComboBoxes.


'configurar el ComboBox1 y ComboBox2 Me.ComboBox1.DataSource = db.tb_pedidoscabe Me.ComboBox1.DisplayMember = "FechaPedido" Me.ComboBox1.ValueMember = "FechaPedido" Me.ComboBox2.DataSource = db.tb_pedidoscabe Me.ComboBox2.DisplayMember = "FechaPedido" Me.ComboBox2.ValueMember = "FechaPedido"

5. Defina, en el evento Click del botn Consulta, el proceso para listar los pedidos entre dos fechas seleccionadas por ComboBoxes.
'definir la consulta de productos a travs del object query Dim lista As ObjectQuery(Of tb_pedidoscabe) = _ db.CreateQuery(Of tb_pedidoscabe)( _ "Select VALUE p From tb_pedidoscabe as p " + _ "Where p.FechaPedido BetWeen @f1 AND @f2", _ New ObjectParameter("f1", ComboBox1.SelectedValue), _ New ObjectParameter("f2", ComboBox2.SelectedValue)) 'listar Me.DataGridView1.DataSource = lista.ToList

6. Grabe el proyecto y ejecute la aplicacin.

LABORATORIO 12.3 ACTUALIZACION DE CLIENTES


En este escenario vamos a actualizar los datos de los clientes utilizando los objetos del Modelo de Entidad de Datos DBVentasEntities.

1. Agregue un formulario al proyecto, disee el formulario tal como se muestra.

Control Button Button Button Button

Nombre BtnLimpiar BtnAgregar BtnModificar BtnEliminar

Propiedad Text Text Text Text

Valor LIMPIAR AGREGAR MODIFICAR ELIMINAR

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

173

Label Label Label Label Label Label TextBox TextBox TextBox TextBox ComboBox DataGridView

Label1 Label2 Label3 Label4 Label5 Label6 TxtCodigo TxtNombre TxtDireccion TxtFono ComboBox1 DataGridView1

Text Text Text Text Text Text

Mantenimiento de Clientes Codigo Nombre Direccion Pais Fono

2. Defina la instancia de DBVentasEntities a nivel formulario.


Private DB As New DBVentasEntities

3. En el evento Load del formulario, configura el ComboBox con la entidad tb_paises y liste los clientes en el DataGridView1.
'configura el combobox con la entidad tb_paises Me.ComboBox1.DataSource = DB.tb_paises Me.ComboBox1.DisplayMember = "NombrePais" Me.ComboBox1.ValueMember = "idpais" 'listar los clientes en el DataGridView1 Me.DataGridView1.DataSource = DB.tb_clientes.ToList

4. En el botn grabar se proceder a Grabar un nuevo cliente a la entidad tb_clientes, actualizando los datos en el Contexto DBVentasEntities DB.
'definir el tb_clientes Dim cliente As tb_clientes = tb_clientes.Createtb_clientes( _ Me.txtcodigo.Text, Me.txtnombre.Text, Me.txtdireccion.Text, _ Me.ComboBox1.SelectedValue, Me.txtfono.Text) 'aadir cliente a la entidad tb_clientes DB.AddTotb_clientes(cliente) 'actualizar los cambios Try DB.SaveChanges() Me.DataGridView1.DataSource = DB.tb_clientes.ToList Catch ex As UpdateException MessageBox.Show(ex.Message) End Try

5. En el botn modificar se proceder a actualizar los datos de un cliente seleccionado, observe que los datos se actualiza en la entidad tb_clientes.
'asigne el objeto tb_cliente seleccionado del DataGridView1 Dim cliente As tb_clientes = _ DB.tb_clientes.ToList.ElementAt(DataGridView1.CurrentRow.Index) 'asigne los datos a actualizar cliente.NombreCia = Me.txtnombre.Text cliente.Direccion = Me.txtdireccion.Text cliente.idpais = Me.ComboBox1.SelectedValue cliente.Telefono = Me.txtfono.Text 'actualizar los cambios DB.SaveChanges() Me.DataGridView1.DataSource = DB.tb_clientes.ToList

CIBERTEC

CARRERAS PROFESIONALES

174

6. En el botn eliminar se elimina el objeto cliente seleccionado desde el DataGridView1 y se actualizar en el contexto DBVentasEntities.
Dim cliente As tb_clientes = DB.tb_clientes.Where( _ "c.idcliente='" + txtcodigo.Text + "'").First DB.DeleteObject(cliente) DB.SaveChanges() Me.DataGridView1.DataSource = DB.tb_clientes.ToList

7. En el evento CellClick del DataGridView1, visualizamos los datos del registro al seleccionar el Cliente.
Me.txtcodigo.Text = DataGridView1.CurrentRow.Cells(0).Value Me.txtnombre.Text = DataGridView1.CurrentRow.Cells(1).Value Me.txtdireccion.Text = DataGridView1.CurrentRow.Cells(2).Value Me.txtfono.Text = DataGridView1.CurrentRow.Cells(4).Value ComboBox1.SelectedValue=DataGridView1.CurrentRow.Cells(3).Value

8. Grabe y ejecute la aplicacin para comprobar sus procesos.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

175

Autoevaluacin
1. Qu es el Servicio de objetos? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 2. Qu es el Object Context? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 3. Explique la funcionalidad de la clase Object Query. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________ 4. Explique las operaciones de actualizacin del ObjectQuery. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________

5. Cmo salvamos los objetos y manejamos la concurrencia? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________

CIBERTEC

CARRERAS PROFESIONALES

176

Resumen
Los Servicios de Objeto materializan datos devueltos como objetos, y actualizan cambios de objeto a la fuente de datos. Esto tambin proporciona instalaciones de rastrear cambios, enlazar objetos al origen de datos (data source). ObjectContext es la puerta de enlace a EntityConnection para Servicios de objeto. Ofrece acceso al EDM a travs del EntityConnection subyacente. Por ejemplo, puede tener acceso a las entidades a travs de ObjectContext, interrogar a ObjectContext para averiguar informacin acerca del estado de objetos y crear consultas de ObjectQuery<T> con el mtodo CreateQuery. La clase genrica ObjectQuery representa una consulta que retornar una coleccin de cero a ms objetos de entidad tipeadas. Un ObjectQuery siempre pertenece a un ObjectContext. Este contexto prove la conexin y la informacin de la metadata que es requerido para definir y ejecutar una consulta. Cuando quieres agregar data en el origen de datos, debes crear una instancia del tipo de la Entidad y aadir el objeto al ObjectContext. Antes de agregar un nuevo objeto, debes asignar, primero, a todas las propiedades que no soporten valores null. Los Object Services realizar cambios a los objetos que son adjuntados al ObjectContext utilizando una instancia del IEntityChangeTracker. Las consultas retornan objetos en el estado Unchanged. El Modelo de entidad de datos ejecuta mtodos para realizar los cambios asignando a cada propiedad de la entidad para crear la lgica de negocio. Esta capacidad se conoce como LINQ to Entities. El mtodo DeleteObject del modelo ObjectContext para especificar el objeto de la eliminacin. La fila no es borrada desde el origen de datos hasta ejecutar el mtodo SaveChanges. Si desea conocer mas acerca del tema, visite las siguientes paginas: http://msdn.microsoft.com/es-ar/library/bb738470(en-us).aspx Pgina referente a las actualizaciones de los servicios de objetos http://geeks.ms/blogs/ciin/archive/2008/01/25/ado-net-entity-frameworklinq-to-entities-entity-sql-y-entity-services-i.aspx Pgina referente al los servicios de objetos y entidades http://msdn.microsoft.com/es-es/magazine/cc507640.aspx Pgina referente al modelo de Entidad

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

177

UNIDAD DE APRENDIZAJE

5
SEMANA

13
OPERACIONES CON XML
LOGRO DE LA UNIDAD DE APRENDIZAJE Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET resuelven operaciones de lectura y edicin de datos en documentos XML utilizando la arquitectura DOM, as como la evaluacin de expresiones XPath mediante XPathNavigator.

TEMARIO o Proceso de lectura y escritura un DataSet utilizando un archivo XML o Proceso de carga y lectura de XML Document en un DOM. o Grabacin y modificacin de datos en un archivo XML. o Proceso para seleccionar datos XML mediante XPathNavigator. o Proceso para evaluar expresiones XPath utilizando XPathNavigator.

ACTIVIDADES PROPUESTAS Los alumnos guardan y leen datos en XML en un DataSet utilizando XML Schema. Los alumnos manejan los mtodos WriteXml y ReadXml. Los alumnos manejan los datos XML utilizando DOM. Los alumnos manejan el objeto XmlDocument en un DOM para grabar y modificar los datos de un archivo XML utilizando DOM.

CIBERTEC

CARRERAS PROFESIONALES

178

XML
El lenguaje de marcado extensible (XML) es un lenguaje que proporciona un formato para describir datos. Con ello se facilita la realizacin de declaraciones de contenido ms precisas y la obtencin de resultados de bsqueda ms significativos en varias plataformas. Adems, XML permite la separacin de la presentacin de datos. XML es un subconjunto de SGML optimizado para la entrega a travs de Web. Su definicin est recogida en el Consorcio W3C. Gracias a esta estandarizacin, se garantiza que los datos estructurados son uniformes e independientes entre los distintos proveedores y aplicaciones. En XML se usan hojas de estilos, como el lenguaje XSL (Extensible Stylesheet Language, lenguaje de hojas de estilos extensible) y CSS (Cascading Style Sheets, hojas de estilos en cascada) para mostrar los datos en un explorador.

UTILIZACIN DE XML EN UN DATASET


Con ADO.NET es posible llenar un DataSet a partir de una secuencia o un documento XML. Se puede utilizar la secuencia o el documento XML para suministrar datos al DataSet, informacin de esquema o ambas cosas. En una representacin XML de un DataSet, los datos se escriben en XML y el esquema, si est incluido en lnea en la representacin, se escribe utilizando el lenguaje de definicin de esquemas XML (XSD). XML y el esquema XML proporcionan un formato cmodo para transferir el contenido de un DataSet a y desde clientes remotos.

2.1 MODO DE SALVAR UN DATASET CON DATOS XML


La representacin XML del DataSet puede ser escrito a un Archivo, un Stream, un XmlWriter o una cadena. Esas elecciones proveen de gran flexibilidad de cmo transportar el XML del DataSet. Para obtener la representacin XML del DataSet como una cadena, utilice el mtodo GetXml como se muestran en el siguiente ejemplo:
Dim XmlStr as String = Ds.Getxml()

El mtodo Getxml() retorna la representacin del DataSet sin esquema (Schema). Para escribir la informacin del esquema desde el DataSet (como XML Schema) a una cadena, utilice GetXmlSchema. Para escribir un DataSet en un archivo, una secuencia o XmlWriter, utilice el mtodo WriteXml. El primer parmetro que se pasa a WriteXml es el destino del resultado XML. En tabla se muestran las opciones de XmlWriteMode Opcin
IgnoreSchema WriteSchema DiffGram

Descripcin
Escribe el contenido del DataSet como datos XML sin un esquema XML. Escribe el contenido del Dataset como datos XML con la estructura relacional como un esquema XML. Escribe el DataSet completo como un DiffGram incluyendo los valores originales y actuales.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

179

A continuacin se muestra cmo escribir la representacin XML de un DataSet en un archivo: Definir un Archivo FileStream y un Objeto StreamWriter. Referenciar al StreamWriter. Al FileStream. Definir el DataSet dsxml. Escribir desde el DataSet al StreamWriter, de tipo WriteSchema.

Dim savefile As New SaveFileDialog savefile.Filter = "Archivo XML|*.xml" If savefile.ShowDialog = Windows.Forms.DialogResult.OK Then Dim sfile As New System.IO.StreamWriter(savefile.FileName) Dim dsxml As New DsFacturas dsxml.WriteXml(sfile, XmlWriteMode.WriteSchema) sfile.Close() End If

2.2 MODO DE ASIGNAR COLUMNAS A ELEMENTOS, ATRIBUTOS Y TEXTO XML


Se puede especificar cmo se representar en XML una columna de una tabla, si se utiliza la propiedad ColumnMapping del objeto DataColumn. En la siguiente tabla, se muestran los distintos valores de MappingType para la propiedad ColumnMapping de una columna de tabla y el cdigo XML resultante. Tipo Descripcin
Valor Predeterminado. La columna se escribe como un elemento XML, donde ColumnName es el nombre del elemento y el contenido se escribe como el texto, ejemplo: <ColumnName>Texto</ColumnName> La columna se escribe como atributo XML del elemento XML para la fila actual, ejemplo: <RowElement ColumnName=texto /> El contenido de la columna se escribe como texto en el elemento XML del a fila actual, ejemplo: <RowElement> Texto </RowElement> Hidden La columna no se escribe en el resultado XML.

Element

Attribute

SimpleContent

2.4 DATARELATIONS ANIDADAS


En una representacin relacional de datos, las tablas individuales contienen filas que estn relacionadas entre s por una columna o un conjunto de columnas. En el DataSet, la relacin entre tablas se implementa mediante una DataRelation. En la representacin jerrquica de los datos proporcionada por XML, las relaciones primaria-secundaria se representan mediante elementos primarios que contienen elementos secundarios anidados. Al establecer la propiedad Nested de una DataRelation como true, las filas secundarias de la relacin se anidan dentro de la columna primaria cuando se escriben como datos XML o cuando se sincronizan con un XmlDataDocument.

CIBERTEC

CARRERAS PROFESIONALES

180

La propiedad Nested de la DataRelation es false de manera predeterminada.


Dim ds As New DataSet Dim da As New SqlDataAdapter("Select * from clientes", cn) da.Fill(ds, "Clientes") da = New SqlDataAdapter("Select * from dbo.fac_cabe", cn) da.Fill(ds, "f") Dim drel As New DataRelation("r1", ds.Tables("clientes"). _ Columns("cli_codigo"),ds.Tables("f").Columns("cli_codigo")) 'Agregar la relacion drel.Nested = True ds.Relations.Add(drel) Dim sw As New System.IO.StreamWriter("C:\xmldata.xml") ds.WriteXml(sw) sw.Close()

2.5 FORMA DE CARGAR UN DATASET DESDE UN XML


Para rellenar un DataSet con datos XML, utilice el mtodo ReadXml del objeto DataSet. El mtodo ReadXml lee desde un archivo, una secuencia o un XmlReader y toma como argumentos el origen de XML y un argumento XmlReadMode opcional. El mtodo ReadXml lee el contenido de la secuencia o el documento XML y carga datos en el DataSet. Tambin, crea el esquema relacional del DataSet dependiendo del XmlReadMode especificado y de si ya existe o no un esquema relacional. La siguiente tabla describe las opciones de los argumentos de XmlReadMode. Modo Descripcin
Valor predeterminado. Examina el cdigo XML y elige la opcin mas apropiada en el orden: 1. Si el codigo XML es DiffGram, utiliza DiffGram. 2. Si el DataSet contiene un esquema XML, utiliza ReadSchema. 3. Si el DataSet no contiene esquema, utiliza InferSchema. Si el DataSet ya contiene esquema, se agregan nuevas tablas del esquema en lnea al esquema existente en el DataSet. Si el DataSet no contiene esquema de una tabla, no se leer ningn dato. Pasa por alto cualquier esquema en lnea y carga los datos en el esquema del DataSet existente. Pasa por alto cualquier esquema en lnea, deduce el esquema por la estructura de datos XML y carga los datos. Lee un DiffGram y agrega los datos al esquema actual. DiffGram combina las filas nuevas con las filas existentes en las que coinciden los valores de identificador. Sigue leyendo varios fragmentos de XML hasta llegar al final de la secuencia.

Auto

ReadSchema

IgnoreSchema InferShema

DiffGram

Fragment

En el presente ejemplo, vamos a cargar en un DataSet llamado ds, desde una secuencia xml: xmldata.
Dim ds As New DataSet ds.ReadXml("C:\xmldata.xml", XmlReadMode.ReadSchema)

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

181

En el siguiente ejemplo vamos a cargar una cadena xml que contiene algunos de los distritos de Lima para convertirla en un DataSet y visualizarla en un DataGridView: a. Definir e instanciar un DataSet. b. Definir un DataTable y agregarle dos columnas: id y nombre. c. Agregar la Tabla al DataSet. d. Definir una cadena xmlData y asignarle una estructura xml, observen la estructura <dt></dt>, es la tabla; <id>01</id> campo1 y <nombre>Lima</nombre> campo 2. e. Definir un objeto StringReader y asignarle el valor de xmlData. f. Ejecutar el Metod ReadXml del DataSet, utilizando el Stream y el esquema de tipo ReadSchema. Visualizar la Tabla.
Dim dataSet As DataSet = New DataSet Dim dataTable As DataTable = New DataTable("dt") dataTable.Columns.Add("id", Type.GetType("System.String")) dataTable.Columns.Add("nombre", Type.GetType("System.String")) dataSet.Tables.Add(dataTable) Dim xmlData As String xmlData= "<XmlDS><dt><id>01</id><nombre>Lima</nombre></dt>" xmlData += "<dt><id>02</id><nombre>Lince</nombre></distrito>" xmlData += "<dt><id>03</id><nombre>Ate</nombre></dt></XmlDS>" Dim xmlSR As New System.IO.StringReader(xmlData) dataSet.ReadXml(xmlSR, XmlReadMode.ReadSchema) Me.DGVendedor.DataSource = dataSet.Tables(0)

MANEJO DEL ESQUEMA DE UN DATASET


3.1 FORMA DE GUARDAR LA INFORMACION DEL ESQUEMA DEL DATASET COMO UN ESQUEMA XML
Puede escribir el Esquema de un DataSet (tablas, columnas, relaciones y constraints) como XML. El esquema XSD permite transportarlos con o sin data relacional en un Documento XML. XML Schema puede ser escrito en un File, Stream, XmlWriter, una cadena generando un DataSet Tipeado. Para escribir el Esquema del un DataSet como XML Schema, utilice el metodo WriteSchema de DataSet. El siguiente ejemplo muestra como escribe el esquema XML del DataSet al archivo distritos.xsd creado por un FileStream.
Dim filedistrito As New System.IO.FileStream("C:\distritos.xsd", IO.FileMode.Create) dataSet.WriteXmlSchema(filedistrito) filedistrito.Close()

3.2 FORMA DE CARGAR LA INFORMACION DE ESQUEMA DE DATASET DESDE UN ESQUEMA XML


El esquema de un DataSet (sus tablas, columnas, relaciones y restricciones) se puede definir mediante programacin, crear mediante los mtodos Fill o FillSchema de un DataAdapter o cargar desde un documento XML.

CIBERTEC

CARRERAS PROFESIONALES

182

Para cargar informacin de esquema de un DataSet desde un documento XML puede utilizar el mtodo ReadXmlSchema o InferXmlSchema del DataSet. 3.2.1 ReadXmlSchema Para cargar el esquema de un DataSet desde un documento XML sin cargar ningn dato, puede utilizar el mtodo ReadXmlSchema del DataSet. ReadXmlSchema crea el esquema del DataSet definido mediante el esquema del lenguaje de definicin de esquemas XML (XSD). Mientras que ReadXmlSchema carga o deduce nicamente el esquema de un DataSet, el mtodo ReadXml del DataSet carga o deduce el esquema y los datos contenidos en el documento XML. En el ejemplo, se muestra cmo cargar el esquema de un DataSet desde un documento XML utilizando un objeto System.IO.StreamReader.
Imports System.IO Dim xmlStream As New StreamReader("C:\distritos.xsd") Dim ds As New DataSet dataSet.ReadXmlSchema(xmlStream) xmlStream.Close()

3.2.2 InferXmlSchema Tambin, puede indicar al DataSet que deduzca su esquema a partir de un documento XML mediante el mtodo InferXmlSchema del DataSet. InferXmlSchema funciona del mismo modo que ReadXml con un XmlReadMode de InferSchema (carga datos y deduce el esquema) y ReadXmlSchema, si el documento que se lee no contiene ningn esquema en lnea. Sin embargo, InferXmlSchema ofrece la posibilidad adicional de especificar que se pasen por alto determinados espacios de nombres XML cuando se deduzca el esquema.

Por ejemplo, tomemos el siguiente cdigo XML:


<NewDataSet xmlns:od="urn:schemas-microsoftcom:officedata"> <Categories> <CategoryID od:adotype="3">1</CategoryID> <CategoryName od:maxLength="15" od:adotype="130"> Beverages</CategoryName> <Description od:adotype="203">Gaseosas</Description> </Categories> <Products> <ProductID od:adotype="20">1</ProductID> <ReorderLevel od:adotype="3">10</ReorderLevel> <Discontinued od:adotype="11">0</Discontinued> </Products> </NewDataSet>

Para asegurarse de que el esquema inferido pasa por alto los atributos especificados en los elementos XML, utilice el mtodo InferXmlSchema y especifique que se debe pasar por alto el espacio de nombres XML para officedata, como se muestra en el siguiente ejemplo:

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

183

Dim dataSet As New DataSet dataSet.InferXmlSchema("input_od.xml", New String[] {"urn:schemas-microsoft-com:officedata"})

MODELO DE OBJETOS DE DOCUMENTO XML (DOM)


La clase modelo de objetos de documento XML (DOM) es una representacin en la memoria de un documento XML. DOM permite leer, manipular y modificar un documento XML mediante programacin. La clase XmlReader tambin lee XML, aunque proporciona acceso de slo avance y de slo lectura sin almacenamiento en memoria cach. A continuacin se muestran datos XML:
<?xml version="1.0"?> <books> <book> <author>Carson</author> <price format="dollar">31.95</price> <pubdate>05/01/2001</pubdate> </book> <pubinfo> <publisher>MSPress</publisher> <state>WA</state> </pubinfo> </books>

En la ilustracin siguiente se muestra cmo se estructura la memoria cuando se leen estos datos XML en la estructura DOM. Dentro de la estructura de los documentos XML, cada crculo de esta ilustracin representa un nodo, que se denomina objeto XmlNode. El objeto XmlNode es el objeto bsico del rbol de DOM. La clase XmlDocument, que extiende la clase XmlNode, admite mtodos para realizar operaciones en el documento en conjunto. Adems, la clase XmlDocument proporciona un medio para ver y manipular los nodos de todo el documento XML. Las clases XmlNode y XmlDocument han mejorado el rendimiento y la capacidad de uso y disponen de mtodos y propiedades para realizar lo siguiente: Obtener acceso y modificar nodos especficos de DOM, como nodos de elemento, de referencia de entidad, etc. Recuperar nodos completos, adems de la informacin que contiene el nodo, como el texto de un nodo de elemento.

5 CARGA DE UN XMLDOCUMENT EN UN ARBOL DOM


La informacin en Xml es ledo en la memoria desde diferente formato. Puede ser ledo desde una cadena, un stream, a URL, un text reader o una clase derivada desde el XmlReader. XmlDocument tiene dos mtodos para cargar XML, el mtodo Load carga en la memoria; el mtodo LoadXml leer los datos desde una cadena.

CIBERTEC

CARRERAS PROFESIONALES

184

El XmlDocument es cargada utilizando el mtodo Load y un parmetro de un XmlReader. El mtodo Load acepta los siguientes parmetros: Stream String TextReader XmlReader El mtodo Load solo checkea si el XMl esta bien formado. El siguiente ejemplo carga un documento XML llamado book.xml y validarlo contra un documento de esquema XML llamado book.xsd.
Dim doc as New XmlDocument() Dim settings as New XmlReader Settings() Settings.Schemas.Add(Nothing, book.xsd) Settings.validationType=ValidationType.Schema Dim reader as XmlReader=XmlReader.Create(book.xml, settings) doc.Load(reader)

El siguiente ejemplo carga datos XML directamente desde una cadena.


Dim doc As New XmlDocument() doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" & _ "<title>Pride And Prejudice</title></book>") Guardar el documento a un Archivo. doc.Save("data.xml")

5.1 PROPIEDADES Y MTODOS DEL XMLDOCUMENT


A continuacin mostramos los mtodos ms importantes del XMLDocument.
Nombre Descripcin

AppendChild Clone CreateAttribute CreateDocumentType CreateElement CreateNavigator CreateNode CreateTextNode

Agrega el nodo especificado al final de la lista de nodos secundarios de este nodo. Crea un duplicado de este nodo. Crea objeto XmlAttribute con nombre especificado. Devuelve un nuevo objeto XmlDocumentType. Sobrecargado. Crea un objeto XmlElement. Crea un nuevo objeto XPathNavigator para desplazarse por este documento. Sobrecargado. Crea un objeto XmlNode. Crea un objeto XmlText con el texto especificado.

CreateXmlDeclaration Crea nodo XmlDeclaration con valores especficos. GetElementById Obtiene el XmlElement con el identificador especificado.

Devuelve un objeto XmlNodeList que contiene una GetElementsByTagName lista de todos los elementos descendientes que coinciden con el nombre especificado. GetEnumerator InsertAfter InsertBefore Proporciona funcionalidad para la iteracin de estilo "foreach" en los nodos de XmlNode. Inserta el nodo especificado inmediatamente detrs del nodo de referencia igualmente especificado. Inserta el nodo especificado inmediatamente antes del nodo de referencia igualmente especificado.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

185

Load LoadXml RemoveAll RemoveChild Save SelectNodes SelectSingleNode ToString WriteTo

Sobrecargado. Carga los datos XML especificados. Carga el documento XML desde un archivo. Quita todos los atributos y nodos secundarios del nodo actual. Quita el nodo secundario especificado. Guarda el documento XML en archivo especificada. Selecciona una lista de nodos que coinciden con la expresin XPath. Selecciona el primer XmlNode que coincide con la expresin XPath. Devuelve una clase String que representa la clase Object actual. Guarda el nodo XmlDocument en el XmlWriter especificado.

Las propiedades ms importantes del XMLDocument.

Nombre

Descripcin

Attributes BaseURI ChildNodes

Obtiene un objeto XmlAttributeCollection que contiene los atributos de este nodo. Obtiene el URI base del nodo actual. Obtiene todos los nodos secundarios del nodo.

DocumentElement Obtiene el XmlElement raz del documento. FirstChild HasChildNodes InnerText InnerXml Item LastChild NamespaceURI NameTable NodeType OuterXml ParentNode Schemas Value Obtiene el primer nodo secundario del nodo. Obtiene un valor que indica si este nodo tiene nodos secundarios. Obtiene o establece los valores concatenados del nodo y de todos sus nodos secundarios. Obtiene o establece el marcado que representa los nodos secundarios del nodo actual. Obtiene el elemento secundario especificado. Obtiene el ltimo nodo secundario del nodo. Obtiene el identificador URI de espacio de nombres de este nodo. Obtiene el objeto XmlNameTable asociado a esta implementacin. Obtiene el tipo del nodo actual. Obtiene el marcado que representa este nodo y todos sus nodos secundarios. Obtiene el nodo primario de este nodo, en los nodos que pueden tener nodos primarios. Obtiene o establece el objeto XmlSchemaSet asociado con este objeto XmlDocument. Obtiene o establece el valor del nodo.

CIBERTEC

CARRERAS PROFESIONALES

186

5.2 LECTURA DE DATOS XML UTILIZANDO DOM


EL DOM es una representacin en la memoria de un documento XML. DOM permite leer, manipular y modificar un documento XML mediante programacin, as como la navegacin y edicin de un documento. La clase XmlDataDocument extiende XmlDocument y permite datos estructurados para almacenar, recuperar y manipular a travs de un DataSet relacional. Esta clase permite componentes mezclar XML y vistas relacionales de la data. Para leer datos en XML utilizando DOM, puede recuperar las secciones de un documento recuperando los nodos del documento.

5.3 ACCEDIENDO A LA COLECCIN NAMEDNODEMAPS Y NODELISTS

DE

NODES

EN

Puede actualizar un conjunto de nodos y colocar en una coleccin ordenada o no ordenada. Cuando coloca un conjunto de nodos en una coleccin no ordenada, el conjunto es llamado un NamedNodeMap por la W3C. Puede recuperar la data ordenada por el nombre o ndex en este tipo de coleccin. Colocar un conjunto de nodes en una coleccin ordenada es llamado NodeList y la data puede recuperarse por un ndice de base cero (zero-based). NamedNodeMaps es implementado por la clase XmlNamedNodeMap y NodeList es implementado por la clase XmlNodeList.

5.4 RECUPERACIN DE NODOS DESORDENADOS POR NDICE


XmlNamedNodeMap controla un conjunto de nodos desordenado con la capacidad de hacer referencia a los mismos mediante su nombre o ndice. Hay tres mtodos o propiedades que devuelven un XmlNamedNodeMap: XmlElement.Attributes. XmlDocumentType.Entities. XmlDocumentType.Notations. La propiedad XmlDocumentType.Entities obtiene la coleccin de nodos XmlEntity declarada en la declaracin de tipo de documento. Esta coleccin se devuelve como XmlNamedNodeMap y se puede recorrer en iteracin mediante la propiedad Count. Tambin se puede mostrar informacin de entidad.

5.5 RECUPERACIN DE NODOS ORDENADOS POR NDICE


La nodeList incluida en .NET Framework se denomina XmlNodeList. Los mtodos y propiedades que devuelve una XmlNodeList son los siguientes: XmlNode.ChildNodes. XmlDocument.GetElementsByTagName. XmlElement.GetElementsByTagName. XmlNode.SelectNodes. XmlNodeList tiene una propiedad Count que se puede utilizar para escribir bucles y recorrer en iteracin los nodos de XmlNodeList.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

187

En el presente ejemplo, visualizaremos los nombres de los clientes que se almacenan en el archivo xmldata.xml, donde este archivo ha sido cargado desde la tabla de clientes.
Dim doc As New XmlDocument doc.Load("C:\xmldata.xml") 'Recupera los Clientes Dim root As XmlElement = doc.DocumentElement Dim elemList As XmlNodeList = _ root.GetElementsByTagName("cli_nombre") For i As Integer =0 To elemList.Count - 1 ListBox1.Items.Add(elemList.ItemOf(i).InnerXml) Next

El metodo GetEnumerator permite la coleccin de nodos en el XmlNodeList:


For each nombre as xmlNode in elemList 'Visualizar los nombre de los Clientes. ListBox1.Items.Add(nombre.InnerXml) Next

5.6 ACCEDIENDO A LOS CHILD NODES


La propiedad XmlNode.ChildNodes es un XmlNodeList que contiene todos los nodos hijos del node. Si no hay nodos hijos, el XmlNodeList retorna vaco. En este ejemplo, retornamos los child node del elemento root.
Dim doc As New XmlDocument doc.Load("C:\books.xml") ' Recupera todos los ttulos de books Dim root As XmlElement = doc.DocumentElement If root.HasChildNodes Then For i As Integer = 0 To root.ChildNodes.Count - 1 ListBox1.Items.Add(root.ChildNodes(i).InnerXml) Next End If

Pregunta si tiene Nodos hijos

5.7 RECUPERACIN DE LOS ATRIBUTOS EN UNA COLECCIN


Para obtener todos los atributos de un nodo de elemento en una coleccin, llame a la propiedad XmlElement.Attributes. Los mtodos y propiedades disponibles en la coleccin incluyen, los disponibles en la asignacin de nodo especificada, adems de los mtodos y propiedades especficos de la clase XmlAttributeCollection, como la propiedad ItemOf o el mtodo Append. Para buscar el nmero de atributos de un elemento, obtenga el XmlAttributeCollection y utilice la propiedad Count para saber cuntos nodos XmlAttribute hay en la coleccin. El siguiente ejemplo de muestra cmo recuperar una coleccin de atributos y cmo utilizar el mtodo Count, adems se muestra cmo recuperar un solo atributo de la coleccin y mostrar su valor.
Dim docbook As New XmlDocument() docbook.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" & _ "<title>Pride And Prejudice</title></book>") Dim myElement As XmlElement = docbook.DocumentElement Dim at As XmlAttributeCollection = myElement.Attributes Dim str As String = "" For i As Integer = 0 To attrColl.Count - 1 str = str + attrColl.ItemOf(i).Name + ":" str = str + attrColl.ItemOf(i).Value.ToString + vbCrLf Next MessageBox.Show(str)
CIBERTEC CARRERAS PROFESIONALES

188

5.8 RECUPERACIN DE UN NODO DE ATRIBUTO INDIVIDUAL


El mtodo XmlElement.GetAttributeNode devuelve un objeto de tipo XmlAttribute. Una vez que se tiene el objeto XmlAttribute, todos los mtodos y propiedades de la clase estn disponibles en ese objeto, como OwnerElement.

Dim doc As XmlDocument = New XmlDocument() doc.LoadXml( _ "<book gr='terror' ISBN='1-857-5' misc='sale item'>" & _ "<title>Dracula</title><price>40.95</price></book>") If doc.DocumentElement.HasAttributes Then ' Mover a un elemento Dim root As XmlElement = doc.DocumentElement ' Recuperar un atributo Dim at As XmlAttribute = root.GetAttributeNode("ISBN") Dim at1 As XmlAttribute = root.GetAttributeNode("misc") ' Visualizar el valor de los atributos Dim atV As String = at.InnerXml + vbCrLf + at1.InnerXml MessageBox.Show(atV) End If

Pregunto si tiene atributos.

Recupero el valor del atributo ISBN en at.

6 CREACIN DE UN DOCUMENTO XML EN UN ARBOL DOM


Existen dos mtodos para crear un XML: Definir la instancia de XmlDocument sin parmetros. Definir la instancia de XmlDocument y pasarle un XmlNameTable como parmetro.

DEFINICIN DE LA DECLARACIN XML


Un documento XML debe tener una declaracin XML y un elemento raz (root). La clase XmlDocument tiene un metodo CreateXmlDeclaration que permite crear la declaracin CML, tiene los siguientes parmetros; Versin la versin debe ser1.0 , Encoding, el valor del atributo encoding, por defecto es UTF-8 y graba el XmlDocument un archivo, stream y un conjunto de cadenas. Los atributos son expuestos en el nodo XmlDeclaration y no como un nodo XmlAttribute.
Dim doc As XmlDocument = New XmlDocument() doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'><title>The Ell cartero</title><price>14.95</price></book>") Dim xmldec As XmlDeclaration = _ doc.CreateXmlDeclaration("1.0", Nothing, Nothing) Dim root As XmlElement = doc.DocumentElement doc.InsertBefore(xmldec, root) doc.Save("C:\libros.xml") La declaracion es insertada antes del nodo.

Dim docbook As New XmlDocument()

Definir el XmlDeclation .

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

189

Al ejecutar el Proceso, la estructura Xml se visualiza:


<?xml version="1.0"?> <book genre="novel" ISBN="1-861001-57-5" misc="sale item"> <title>The Handmaid's Tale</title> <price>14.95</price> </book>

MODIFICAR DATOS XML UTILIZANDO DOM


Puede modificar un documento insertando nuevos nodos. Los nodos insertados creados recientemente, existirn en el mismo documento o puede ser importado desde otro documento.

7.1 CREACIN DE NUEVOS NODOS EN EL DOM


Para crear el nodo, proporcione el mtodo con un nombre cuando sea preciso, y el contenido y otros parmetros para aquellos nodos que tengan contenido. Los siguientes mtodos crean un nodo apropiado. CreateCDataSection. CreateComment. CreateDocumentFragment. CreateDocumentType. CreateElement. CreateNode. CreateProcessingInstruction. CreateSignificantWhitespace. CreateTextNode. CreateWhitespace. CreateXmlDeclaration. Otros tipos de nodos tienen ms requisitos aparte de que se proporcionen datos a los parmetros. Una vez creados los nuevos nodos, hay disponibles varios mtodos para insertarlos en el rbol. En la tabla se enumeran los mtodos con una descripcin de dnde aparece el nuevo nodo en el Modelo de objetos de documento (DOM). Mtodo
InsertBefore InsertAfter AppendChild

Colocacin del nodo


Insertado antes del nodo de referencia. Insertado despus del nodo de referencia. Agrega el nodo al final de la lista de nodos secundarios del nodo especificado.

PrependChild Agrega el nodo al principio de la lista de nodos secundarios del nodo especificado. Append Agrega un nodo XmlAttribute al final de la coleccin de atributos asociada a un elemento.

CIBERTEC

CARRERAS PROFESIONALES

190

7.2 CMO QUITAR NODOS DEL DOM


Para quitar un nodo del Modelo de objetos de documento XML (DOM), utilice el mtodo RemoveChild para quitar un nodo especfico. Cuando se quita un nodo, el mtodo quita el subrbol que pertenece al nodo que se est quitando; es decir, no se trata de un nodo hoja. Para quitar varios nodos del DOM, utilice el mtodo RemoveAll para quitar todos los atributos y nodos secundarios, si es preciso, del nodo actual. En el siguiente ejemplo, eliminamos el primer elemento: <title>
Dim doc As XmlDocument = New XmlDocument() doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>"<title>El cartero</title><price>14.95</price></book>") Dim node As XmlNode = doc.DocumentElement node.RemoveChild(node.FirstChild)

7.3 MODIFICACIN DE NODOS, CONTENIDO Y VALORES EN UN DOCUMENTO XML


Existen muchas formas de modificar los nodos y el contenido de un documento. Puede: Cambiar el valor de los nodos utilizando la propiedad Value. Modificar un conjunto completo de nodos reemplazando los nodos por nodos nuevos. Para ello, utilice la propiedad InnerXml. Reemplazar los nodos existentes por nuevos nodos utilizando el mtodo RemoveChild. Modificar el contenido eliminando un intervalo de caracteres utilizando el mtodo DeleteData en los tipos de nodos que heredan de XmlCharacterData. Una tcnica muy sencilla para cambiar el valor de un nodo consiste en utilizar node.Value = "new value". En la siguiente tabla se enumeran los tipos de nodos en los que funciona esta lnea de cdigo y qu datos se cambian exactamente para ese tipo de nodo.

Tipo de nodo
Attribute CDATASection Comment ProcessingInstruction Text XmlDeclaration Whitespace

Datos cambiados
El valor del atributo. El contenido de CDATASection. El contenido del comentario. El contenido, sin incluir el destino. El contenido del texto. El contenido de la declaracin, sin incluir el marcado <?xml y ?>. El valor del espacio en blanco. Puede establecer este valor en uno de los cuatro caracteres de espacio en blanco XML reconocidos: space, tab, CR, o LF.

SignificantWhitespace El valor del espacio en blanco significativo. Puede establecer este valor en uno de los cuatro caracteres de espacio en blanco XML reconocidos: space, tab, CR, o LF.

Cualquier tipo de nodo que no se incluya en la tabla no es un tipo de nodo vlido para establecer un valor en l. Al establecer un valor en cualquier otro tipo de nodo, se inicia una InvalidOperationException.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

191

La propiedad InnerXml cambia el marcado de los nodos secundarios del nodo actual. Al establecer esta propiedad, los nodos secundarios se reemplazan por el contenido analizado de la cadena especificada. InnerXml elimina las declaraciones de espacios de nombres redundantes. Al utilizar los mtodos ReplaceData y RemoveChild, los mtodos devuelven el nodo eliminado o reemplazado. Luego, este nodo se puede volver a insertar en cualquier lugar del modelo de objetos de documento (DOM) XML. El mtodo ReplaceData realiza dos comprobaciones de validacin en el nodo que se va a insertar en el documento.

8 GRABACIN DE UN DOCUMENTO XML


Cuando cargue y guarde un XmlDocument, el documento guardado puede ser diferente al original de varias formas: Si la propiedad PreserveWhitespace se establece en true antes de llamar al mtodo Save, en el resultado se conserva el espacio en blanco del documento; sin embargo, si la propiedad es false, XmlDocument, se aplica sangra automticamente al resultado. De manera predeterminada, el carcter de la comilla que se utiliza delante y detrs de los valores de los atributos se cambia por la comilla doble. Puede utilizar la propiedad QuoteChar en XmlTextWriterpara establecer el carcter de la comilla como doble o simple. De manera predeterminada, se expanden las entidades de caracteres numricos como &#123. No se conserva la marca de orden de bytes del documento de entrada. UCS-2 se guarda como UTF-8 a menos que cree explcitamente una declaracin XML en la que se especifique otra codificacin. La declaracin XmlDeclaration slo se escribe si hay alguna en el documento y la codificacin que se utiliza al escribir el documento es la misma que la del nodo de la declaracin.

8.1 ESCRIBIR UNA DECLARACIN XMLDECLARATION


Los miembros XmlDocument y XmlDeclaration de OuterXml, InnerXml y WriteTo, adems de los mtodos XmlDocument de Save y WriteContentTo, crean una declaracin XML. Para las propiedades XmlDocument de OuterXml, InnerXml, y los mtodos Save, WriteTo y WriteContentTo, la codificacin escrita en la declaracin XML se obtiene del nodo XmlDeclaration. Si no hay codificacin en el nodo XmlDeclaration, la codificacin no se escribe en la declaracin XML.
Dim doc As New XmlDocument() Dim tw As XmlTextWriter = New XmlTextWriter("out.xml", Nothing) doc.Load("text.xml") doc.Save(tw)

CIBERTEC

CARRERAS PROFESIONALES

192

LABORATORIO 13.1 GRABAR UN DATASET EN UN ARCHIVO XML


En este escenario, se solicita guardar la informacin de los clientes en un Archivo XML. En dicho proceso se podr realizar un filtro de los clientes por su nombre y los registros resultados se debern almacenar en un archivo XML. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija WindowsApplication. - En Name coloque appFacturacion06. - En Location coloque C:\CursoPOOII. 4. Arrastre los controles necesarios para disear el siguiente formulario como se muestra en la figura: (Label, TextBox, Button y DataGriView).

5. Cambie los valores de las siguientes propiedades de los controles:


Control TextBox1 Label1 Button1 DataGridView1 Propiedad Name Text Name Valor txtCliente Cliente BtnXml

6. Haga doble clic sobre el formulario para ingresar a la ventana de cdigo. Importe el namespace System.Data.SqlClient.
Imports System.Data.SqlClient

7. Dentro de la clase Form1 (Form1.vb), declare la conexin cn.


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true")

8. Defina la funcin MisClientes, el cual filtrar los clientes por su nombre.


Function MisClientes(ByVal n As String) As DataTable Dim dt As New DataTable Dim da As New SqlDataAdapter("Select * from Clientes Where cli_nombre like '" + n + "%'", cn) da.Fill(dt) Return dt End Function

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

193

9. Dentro del evento Load del Form1, cargue el DataSet con la funcin
Me.DataGridView1.DataSource = MisClientes(Space(0))

10. Dentro del evento TextChanged del TextBox txtcliente, filtramos los clientes por su nombre, donde utilizaremos la funcion MisClientes.
Me.DataGridView1.DataSource = MisClientes(txtcliente.Text)

11. Guarde los clientes en un Archivo XML, en el evento click del bton BtnXml se realizar dicho proceso. Se observa que utilizaremos una ventana de dilogo que guardar el archivo XML.
Dim dsconsulta As New DataSet dsconsulta.Tables.Add(CType(Me.DataGridView1.DataSource, DataTable)) Dim sv As New SaveFileDialog sv.Filter = "Archivos XML|*.xml" If sv.ShowDialog = Windows.Forms.DialogResult.OK Then Dim swriter As New System.IO.StreamWriter(sv.FileName) dsconsulta.WriteXml(swriter, XmlWriteMode.WriteSchema) swriter.Close() End If dsconsulta.Dispose()

12. Guarde la aplicacin y ejecute. Compruebe la ejecucin de la consulta

LABORATORIO 13.2 CARGAR UN DATOS CON DATOS XML


En este escenario aprenderemos a trabajar con archivos XML y visualizar los datos en un DataSet, para ello se tiene un archivo xml llamado xmldata.xml. 1. Aada un Nuevo Formulario al Proyecto. 2. Sobre el Form2.vb, cree la siguiente interface de usuario:

CIBERTEC

CARRERAS PROFESIONALES

194

3. Haga doble clic sobre el formulario para ingresar a la ventana de cdigo. Importe el namespace System.Data.SqlClient.
Imports System.Data.SqlClient

4. Dentro de la clase Form1 (Form1.vb), declare la conexin cn y un DataSet ds.


Private cn As New SqlConnection("Server=(local)\SQLEXPRESS; DataBase=BDFactura; integrated security=true") Private ds As New DataSet

5. Defina la funcin MisClientes, el cual filtrar los clientes por su nombre.


Function MisClientes(ByVal n As String) As DataTable Dim dt As New DataTable Dim da As New SqlDataAdapter("Select * from Clientes Where cli_nombre like '" + n + "%'", cn) da.Fill(dt) Return dt End Function

6. Dentro del evento click del botn Buscar Archivo XML, se abrir un archivo de tipo XML. Para esto utilice un cuadro de dilogo OpenFileDialog se leer su contenido y se guardar las tablas en el DataSet. Luego, procedemos a mostrar las tablas que estn en el DataSet en un ListBox: lbTablas.
Dim op As New OpenFileDialog op.Filter = "Archivo xml|*.xml" If op.ShowDialog = Windows.Forms.DialogResult.OK Then ds.Tables.Clear() Dim sw As New System.IO.StreamReader(op.FileName) ds.ReadXml(sw) sw.Close() For Each dt As DataTable In ds.Tables LbTablas.Items.Add(dt.TableName) Next End If

7. Dentro del evento SelectedIndexChanged del ListBox, se visualizar los registros de la tabla que se ha seleccionado en el ListBox1.
If ListBox1.SelectedIndex > -1 Then Me.DataGridView1.DataSource = ds.Tables(ListBox1.Text) End If

8. Guarde la aplicacin y ejecute. Compruebe la ejecucin de la consulta.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

195

LABORATORIO 13.3 ACTUALIZACIN DE VALORES DE UN ARCHIVO XML


En este escenario, tenemos un archivo xml llamado articulos.xml donde almacena la informacin de los precios de los artculos que vende y distribuye la empresa, se solicita que los precios se incrementen en 10% con respecto a su valor original. 1. Ingrese a Visual Studio 2005. 2. Seleccione File->New->Project. 3. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija Windows Application. - En Name coloque appFacturacion09. - En Location coloque C:\CursoPOOII. 4. En la parte superior de la clase, importar el namespace System.Xml. 5. Disee el Formulario.

Control Button1 Button1 Button2 Button2 DataGridView1

Propiedad Text Name Text Name

Valor Buscar BtnBuscar Incrementar Precio BtnIncrementarPrecio

6. Declare, a nivel de Clase Form, un DataSet para cargar los datos de un archivo XML, adems definir una variable llamada filexml que almacenara la ubicacin del archivo de artculos.
Private ds As New DataSet Dim filexml As String

7. En el botn buscar, procedemos a buscar un archivo XML utilizando un cuadro de dilogo, cargamos el archivo en el DataSet y lo visualizamos en el DataGridView.

CIBERTEC

CARRERAS PROFESIONALES

196

Dim op As New OpenFileDialog op.Filter = "Archivo xml|*.xml" If op.ShowDialog = Windows.Forms.DialogResult.OK Then filexml = op.FileName ds.Tables.Clear() Dim sw As New System.IO.StreamReader(filexml) ds.ReadXml(sw) DataGridView1.DataSource = ds.Tables(0) sw.Close() End If

Definir un StreamReader para leer el archivo xml en filexml.

Leer en el DataSet el StreamReader y se visualiza en DataGrid.

8. En el botn Incrementar precio, realizamos los siguientes procesos a. Defina la instancia de un XmlDocument llamado myXml. b. Cargue al XmlDocument myXml con el archivo xml en filexml. c. Ejecute el procedimiento IncrementarPrecio, enviando como parmetro al DocumentElement de myxml. d. Si esta correcto el proceso, se abrir un cuadro de dilogo para guardar los precios actualizados en un archivo xml, donde se ejecutara el mtodo Save del objeto XmlDocument myXml. e. Si ocurre una excepcin: Catch, se lanzar una excepcin donde se visualizar el error de la excepcin.
Try Dim myXml As New XmlDocument() ' Crear un XmlDocument myXml.Load(filexml) IncrementarPrecio(myXml.DocumentElement) Dim sdialog As New SaveFileDialog sdialog.Filter = "Archivo XML|*.xml" If sdialog.ShowDialog = Windows.Forms.DialogResult.OK Then myXml.Save(sdialog.FileName) End If MessageBox.Show("Actualizado en " + sdialog.FileName) Catch ex As Exception MessageBox.Show(ex.ToString()) End Try

9. A continuacin definimos el procedimiento IncrementarPrecio teniendo como parmetro un XmlNode. a. Pregunte si el node se llama art_precio: node.Name. b. Si es as, capture el node en node.FirstChild. c. Declare una variable price que recibira el valor de node: node.Value. d. Declare una variable newprice que recibir el valor incrementado de price y el valor del nodo se le asigna newprice. e. Este proceso continuar mientras el nodo (node) no este vaco, entonces avanzara al siguiente nodo: node.NextSibling.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

197

Public Sub IncrementarPrecio (ByVal node As XmlNode) If (node.Name = "art_precio") Then node = node.FirstChild Dim price As Decimal = System.Decimal.Parse(node.Value) ' Incrementar el precio de los libros en 10% mas Dim newprice As String newprice = CType(price*(New Decimal(1.1)), Decimal).ToString node.Value = newprice End If node = node.FirstChild While Not node Is Nothing IncreasePrice(node) node = node.NextSibling End While End Sub

10. Guarde el Proyecto, compruebe la ejecucin del proceso.

LABORATORIO 13.4 LECTURA DE UN ARCHIVO XML


En este escenario vamos a leer cualquier archivo xml que este almacenado donde se visualizar su estructura, as como los valores de los nodos. 1. Agrega un nuevo formulario al proyecto, cree la siguiente interfaz.

alor tnBuscar uscar txml

2. Importar el namespace System.Xml y el nameSpace System.IO. 3. En el botn buscar, se realizar la bsqueda de un archivo xml almacenando su estructura en un XmlTextReader llamado xmlreader, a continuacin, ejecute el procedimiento FormatXml.
Dim op As New OpenFileDialog op.Filter = "Archivo xml|*.xml" If op.ShowDialog = Windows.Forms.DialogResult.OK Then Dim xmlreader As New XmlTextReader(op.FileName) FormatXml(xmlreader, op.FileName) End If

4. El mtodo FormatXml, evala el tipo de nodo donde ejecutar el proceso FormatXml segn el tipo de nodo.
Private Sub FormatXml(ByVal r As XmlTextReader, ByVal fn As String) While r.Read() Select Case (r.NodeType) Case XmlNodeType.DocumentType: Format(r, "DocumentType") Case XmlNodeType.Element : Format(r, "Element") Case XmlNodeType.Text : Format(r, "Text") CIBERTEC CARRERAS PROFESIONALES End Select End While End Sub

198

5. El mtodo Format imprimir la estructura del nodo, sus elementos y sus valores, tal como se muestra.
Private Sub Format(ByRef r As XmlTextReader, ByVal Tipo As String) ' Formato de salida Dim str As String = r.Depth.ToString & " " & _ r.AttributeCount.ToString & vbCrLf Dim i As Integer For i = 0 To reader.Depth - 1 str += Strings.Chr(9) Next str += Tipo & "<" & r.Name & ">" & r.Value 'Visualiza los valores de los atributos del nodo actual If (r.HasAttributes) Then str += " Atributos:" Dim j As Integer For j = 0 To r.AttributeCount - 1 str += r(j).ToString Next End If str += vbCrLf txtxml.Text += str End Sub

6. Guarde el proyecto y ejecute la aplicacin.

Autoevaluacin

1. Cul es el mtodo que permite guardar un DataSet como Datos XML? Defina sus opciones. 2. Cmo se puede guardar DataRelations Anidadas? Explique con un ejemplo

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

199

3. Cul es el mtodo que permite cargar un DataSet desde un archivo XML? Explique cada uno de sus opciones 4. Cundo utilizamos WriteXmlSchema? Explique. 5. Cul es la diferencia entre un ReadXmlSchema y el InferXmlSchema? Explique. 6. Cmo se leen los datos XML utilizando DOM? 7. Cules son los mtodos que permite recuperar los nodos ordenados? 8. Cuales son los mtodos que permiten recuperar loas atributos de una coleccin? 9. Cmo se crea una declaracin XML? 10. Implemente un Programa donde almacene los registros de facturas de un artculo seleccionado; al seleccionar un artculo en un control de lista, visualice las facturas registradas. Almacene dichos resultados en un archivo XML.

Resumen
Con ADO.NET es posible llenar un DataSet a partir de una secuencia o un documento XML. Se puede utilizar la secuencia o el documento XML para suministrar datos al DataSet, informacin de esquema o ambas cosas. Para escribir un DataSet en un archivo, una secuencia o XmlWriter, utilice el mtodo WriteXml, el cual utiliza dos parmetros: el destino del resultado XML y el modo de escritura que puede ser: o DiffGram o IgnoreSchema o WriteSchema Para facilitar el anidamiento de objetos en un DataSet, el DataRelation expone una propiedad Nested. Al establecer la propiedad Nested de una DataRelation como true, las filas secundarias de la relacin se anidan dentro de la columna primaria

CIBERTEC

CARRERAS PROFESIONALES

200

cuando se escriben como datos XML o cuando se sincronizan con un XmlDataDocument. Para rellenar un DataSet con datos XML, utilice el mtodo ReadXml del objeto DataSet. El mtodo ReadXml lee desde un archivo, una secuencia o un XmlReader y toma como argumentos el origen de XML y un argumento XmlReadMode que es opcional. La clase XmlDataDocument extiende XmlDocument y permite datos estructurados para almacenar, recuperar y manipular a travs de un DataSet relacional. Esta clase permite componentes mezclar XML y vistas relacionales de la data. Un documento XML debe tener una declaracin XML y un elemento raz (root). La clase XmlDocument tiene un metodo CreateXmlDeclaration que permite crear la declaracin CML, tiene los siguientes parmetros: Versin la versin debe ser1.0, Encoding, el valor del atributo encoding, por defecto es UTF-8. Si desea consultar mas acerca de estos temas puede consultar las siguientes paginas: http://msdn2.microsoft.com/es-es/library/84sxtbxh(VS.80).aspx Pgina referente a utilizar datos XML en un DataSet http://msdn2.microsoft.com/es-es/library/7sfkwf9s(VS.80).aspx Pgina referente a la relacin de datos anidados http://msdn2.microsoft.com/es-es/library/atchhx4f(VS.80).aspx Pgina referente a cargar informacin de datos en un DataSet

http://msdn2.microsoft.com/es-es/library/azsy1tw2(VS.80).aspx Pgina referente a la lectura de un documento XML en DOM http://msdn2.microsoft.com/es-es/library/hk61a712(VS.80).aspx Pgina referente al acceso de atributos en DOM

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

201

UNIDAD DE APRENDIZAJE

5
SEMANA

14
CONSULTA XML UTILIZANDO XPATH

LOGRO DE LA UNIDAD DE APRENDIZAJE Al trmino de la unidad, los alumnos mediante aplicaciones Windows .NET resuelven operaciones de lectura y edicin de datos en documentos XML utilizando la arquitectura DOM, as como la evaluacin de expresiones XPath mediante XPathNavigator. TEMARIO o Proceso de lectura y escritura un DataSet utilizando un archivo XML. o Proceso de carga y lectura de XML Document en un DOM. o Grabacin y modificacin de datos en un archivo XML. o Proceso para seleccionar datos XML mediante XPathNavigator. o Proceso para evaluar expresiones XPath utilizando XPathNavigator.

ACTIVIDADES PROPUESTAS Los alumnos realizan consultas y navegacin por los nodos de un Documento XML. Los alumnos realizan evaluaciones de expresiones XPath utilizando XPathNavigator. Los alumnos editan los datos XML utilizando XPathNavigator.

CIBERTEC

CARRERAS PROFESIONALES

202

1. PROCESAMIENTO DE DATOS XML CON EL MODELO XPATH


El espacio de nombres System.Xml proporciona una representacin mediante programacin de documentos XML, fragmentos, nodos o conjuntos de nodos en memoria utilizando las clases XmlDocument o XPathDocument. La clase XPathDocument proporciona una representacin en memoria rpida y de slo lectura de un documento XML utilizando el modelo de datos XPath. La clase XmlDocument proporciona una representacin en memoria editable de un documento XML mediante la implementacin de la parte principal del nivel 1 del Modelo de objetos de documento (DOM) y el nivel 2 de la parte principal del DOM del W3C. Ambas clases implementan la interfaz IXPathNavigable y devuelven un objeto XPathNavigator que se utiliza para seleccionar, evaluar, desplazarse y, en algunos casos, editar los datos XML subyacentes.

1.1 LECTURA DE XMLDOCUMENT

DATOS

XML

CON

XPATHDOCUMENT

La clase XPathDocument proporciona una representacin en memoria rpida y de slo lectura de un documento XML utilizando el modelo de datos XPath. Estos constructores permiten leer un documento XML utilizando el objeto Stream, TextReader o XmlReader, as como la ruta string a un archivo XML.
Dim Doc As New XPathDocument(C:\book.xml)

La clase XmlDocument es una representacin en memoria editable de un documento XML (W3C) y el nivel 2 de la parte principal del DOM. Puede crear un objeto XmlDocument nuevo llamando al constructor de la clase XmlDocument sin ningn parmetro. Utilice el mtodo Load para cargar datos XML en el objeto XmlDocument desde un objeto Stream, TextReader o XmlReader, as como la ruta string a un archivo XML.
Dim document As New XmlDocument() document.Load ("books.xml")

1.2 CREAXION DEL OBJETOS XPATHNAVIGATOR


Despus de haber ledo un documento XML en un XPathDocument o XmlDocument, puede crear un objeto XPathNavigator para seleccionar, evaluar, desplazarse y, en algunos casos, editar los datos XML subyacentes. Las clases XPathDocument y XmlDocument, adems de la clase XmlNode, implementan la interfaz IXPathNavigable del espacio de nombres System.Xml.XPath. Como resultado, las tres clases proporcionan un mtodo CreateNavigator que devuelve un objeto XPathNavigator.
Dim document As New XPathDocument() Dim navegador As New XpathNavegator= document.CreateNavigator

1.2.1 Edicin de documentos XML con XPathNavigator La clase XPathNavigator se puede utilizar para editar un documento XML en algunos casos, basndose en el objeto que lo ha creado.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

203

La clase XPathDocument es de slo lectura, mientras que la clase XmlDocument es editable. La propiedad CanEdit de la clase XPathNavigator especifica si un objeto XPathNavigator puede editar datos XML. En la tabla se describe el valor de la propiedad CanEdit por clase.
Implementacin de IXPathNavigable XPathDocument XmlDocument Valor CanEdit False Trae

1.2.3 Desplazamiento de XPathNavigator de un nodo a otro en XML El cdigo siguiente muestra la misma estructura de un formulario XML tradicional.

<Basket> <Item Desc="Uber Drill 9000"> <Category /> </Item> <Item /> </Basket>

1.2.4 Seleccin de datos XML con XPathNavigator La clase XPathNavigator tiene un conjunto de mtodos que se utilizan para seleccionar un conjunto de nodos de un objeto XPathDocument o XmlDocument utilizando una expresin XPath. Una vez seleccionado, puede iterar por el conjunto de nodos seleccionado. 1.2.5 Mtodos de seleccin de XPathNavigator La clase XPathNavigator tiene mtodos para seleccionar nodos primarios, secundarios y descendientes ms rpido que con XPath. 1.2.6 Seleccin de nodos con expresiones XPath Para seleccionar un conjunto de nodos con una expresin XPath, utilice uno de los siguientes mtodos de seleccin. Select SelectSingleNode Cuando se llama a estos mtodos, stos devuelven un conjunto de nodos por los que puede desplazarse libremente utilizando un objeto

CIBERTEC

CARRERAS PROFESIONALES

204

XPathNodeIterator o un objeto XPathNavigator en el caso de que haya un solo nodo seleccionado. El desplazamiento por un objeto XPathNodeIterator no afecta a la posicin del objeto XPathNavigator que se ha utilizado para crearlo. El objeto XPathNavigator que devuelven los mtodos SelectSingleNode se sita en el nico nodo devuelto y tampoco afecta a la posicin del objeto XPathNavigator que se ha utilizado para crearlo. Ejemplo, creamos un XPathNavigator a partir del XPathDocument, utilizamos el mtodo Select para seleccionar todos los <book> que sean elementos hijos de <bookstore> en el objeto XPathDocument y el uso del objeto XPathNodeIterator para iterar por los nodos seleccionados.
Dim document As New XPathDocument("books.xml") Dim navigator As XPathNavigator=document.CreateNavigator() Dim nod As XPathNodeIterator= _ Navigator.Select("/bookstore/book") Dim Str As String While nod.MoveNext() Str += nodes.Current.Name + vbCrLF End While MessageBox.Show(Str)

1.2.7 Uso el mtodo SelectSingleNode para Seleccionar un Nodo. El metodo SelectSingleNode selecciona el primer nodo que coincida con la consulta XPath en el objeto XPatnNavigator. En el siguiente ejemplo seleccionamos el primer elemento <title>
Dim document As New XPathDocument("books.xml") Dim nav As XPathNavigator = document.CreateNavigator() Dim nod As XpathNavigator = _ Nav.SelectSingleNode("/bookstore/book/title") MessageBox.Show(nod.InnerXml)

1.3 EVALUAR EXPRESIONES XPATH CON XPATHNAVIGATOR


XPathNavigator incluye el mtodo Evaluate para evaluar una expresin XPath. El mtodo Evaluate toma una expresin XPath, la evala y devuelve un tipo XPath del W3C de tipo booleano, numrico, de cadena o de conjunto de nodos basndose en el resultado de expresin XPath. El mtodo Evaluate toma una expresin XPath, la evala y devuelve un resultado con tipo de tipo booleano (Boolean), numrico (Double), de cadena (String) o de conjunto de nodos (XPathNodeIterator). Por ejemplo, el mtodo Evaluate se podra utilizar en un mtodo matemtico. El siguiente cdigo de ejemplo calcula el precio total de todos los libros del archivo books.xml.
Dim document As New XPathDocument("C:\books.xml") Dim nav As XPathNavigator = document.CreateNavigator() Dim query As XPathExpression = nav.Compile("sum(//price/text())") Dim total As Double = CType(nav.Evaluate(query), Double) MessageBox.Show(total.toString)

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

205

El mtodo Evaluate tiene una sobrecarga que toma dos parmetros: o XPathExpression expresin a ser evaluada. o XPathNodeIterator nodos seleccionados que seran evaluados. En el ejemplo, se evala la expresin XPathExpression y devuelve un valor de tipo Double mediante el nodo Current de XPathNodeIterator como nodo de contexto.
Dim Dim Dim Dim document As New XPathDocument("C:\books.xml") nav As XPathNavigator = document.CreateNavigator() nodes As XpathNodeIterator = nav.Select("//book") query As XPathExpression = _ nodes.Current.Compile("sum(descendant::price)") Dim total As Double = CType(nav.Evaluate(query,nodes), Double) MessageBox.Show(total.toString)

1.4 EXPRESIONES XPATH COMPILADAS


XPathExpression representa consulta XPath compilada devuelta desde el mtodo Compile esttico de la clase XPathExpression o desde el mtodo Compile de la clase XPathNavigator. 1.4.1 La clase XPathExpression Una consulta XPath compilada que representa a XPathExpression es til si esa misma consulta XPath se utiliza ms de una vez. Compilado, el objeto XPathExpression se puede utilizar como entrada en los siguientes mtodos de la clase XPathNavigator dependiendo del tipo devuelto desde la consulta XPath. XPathNavigator.Evaluate(.XPathExpression) XPathNavigator.Evaluate(XPathExpression,XPathNodeIterator) Matches Select SelectSingleNode En la tabla se describe cada uno de los tipos de valores devueltos de XPath del W3C, sus equivalencias en Microsoft .NET Framework y con qu mtodos se puede utilizar el objeto XPathExpression.
Tipo de valor devuelto de Tipo equivalente en XPath del W3C .NET Framework Node set XPathNodeIterator Descripcin Mtodos

Coleccin no ordenada de nodos Select o Evaluate sin duplicados creados en el orden del documento. Un valor true o false. Nmero punto flotante. Evaluate o Matches Evaluate

Boolean Number String

Boolean Double String

Una secuencia de caracteres UCS. Evaluate

1.4.2 La propiedad ReturnType Compilada la consulta XPath en un objeto XPathExpression, puede utilizar la propiedad ReturnType del objeto XPathExpression para determinar qu devuelve la consulta XPath.

CIBERTEC

CARRERAS PROFESIONALES

206

La propiedad ReturnType devuelve uno de los siguientes valores de enumeracin XPathResultType que representan los tipos de valores devueltos de XPath del W3C. Any Boolean Error Navigator NodeSet Number String En el ejemplo, se utiliza el XPathExpression para devolver un nmero y un conjunto de nodos desde el archivo books.xml. La propiedad ReturnType de cada objeto XPathExpression, as como los resultados de los mtodos Evaluate y Select.
Dim document As New XPathDocument("books.xml") Dim navigator As XPathNavigator = document.CreateNavigator() ' Retorna un nmero. Dim query1 As XPathExpression = _ navigator.Compile("bookstore/book/price/text()*10") Dim number As Double = CType(navigator.Evaluate(query1), Double) ' Retorna un Nodo. Dim query2 As XPathExpression = _ navigator.Compile("bookstore/book/price") MessageBox.Show(query2.ReturnType.toString) Dim nodes As XPathNodeIterator = navigator.Select(query2) nodes.MoveNext()

1.5 EXPRESIONES XPATH DE MAYOR RENDIMIENTO


Para mejorar el rendimiento, utilice la expresin XPath lo ms especfica posible en las consultas. Por ejemplo, si el nodo book es un nodo secundario del nodo bookstore y el nodo bookstore es el elemento superior de un documento XML, es ms rpido utilizar la expresin XPath /bookstore/book que //book. La expresin XPath //book examinar cada nodo del rbol XML para identificar nodos coincidentes. Adems, el uso de mtodos de desplazamiento por conjuntos de nodos que proporciona la clase XPathNavigator, puede producir una mejora del rendimiento con respecto a los mtodos de seleccin que proporciona la clase XPathNavigator en los casos en los que los criterios de seleccin sean sencillos. Por ejemplo, si tiene que seleccionar el primer nodo secundario del nodo actual, es ms rpido utilizar el mtodo MoveToFirst que la expresin XPath child::*[1] y el mtodo Select.
Dim document As New XPathDocument("books.xml") Dim nav As XPathNavigator = document.CreateNavigator() ' Seleccionar todos los atributos ISBN Dim exp As XPathExpression=nav.Compile("bookstore/book/@bk:ISBN") Dim nsmgr As New XmlNameSpaceManager(nav.NameTable) Nsmgr.AddNameSpace("bk","urn:samples") Exp.SetContext(nsmgr) ' Visualizamos la seleccin Dim iterator As XPathNodeIterator = nav.Select(exp) While iterator.MoveNext() MessageBox.Show (iterator.Current.toString) End While

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

207

2. EDICIN DE DATOS XML CON XPATHNAVIGATOR


La clase XPathNavigator proporciona mtodos para insertar, modificar y quitar nodos y valores de un documento XML contenido en un objeto XmlDocument. Para poder utilizar cualquiera de estos mtodos para insertar, modificar y quitar nodos y valores, el objeto XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true.

2.1 INSERCION DE DATOS XML CON XPATHNAVIGATOR


La clase XPathNavigator incluye un conjunto de mtodos que se utilizan para insertar nodos de atributos, secundarios y relacionados en un documento XML. Para utilizar estos mtodos, el objeto XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true. La clase XPathNavigator incluye los siguientes mtodos para insertar nodos relacionados. InsertAfter InsertBefore InsertElementAfter InsertElementBefore Los mtodos InsertAfter e InsertBefore aceptan un objeto string, XmlReader, o un objeto XPathNavigator que contiene el nodo relacionado para agregarlos como parmetros. Ambos mtodos tambin devuelven un objeto XmlWriter que se utiliza para insertar nodos relacionados. Los mtodos InsertElementAfter e InsertElementBefore insertan un solo nodo relacionado antes y despus del nodo en el que est situado actualmente un objeto XPathNavigator, utilizando como parmetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\books.xml") Dim nav As XPathNavigator = document.CreateNavigator() nav.MoveToChild("bookstore", "http://www.contoso.com/books") nav.MoveToChild("book", "http://www.contoso.com/books") nav.MoveToChild("price", "http://www.contoso.com/books") 'Inserta un elemento despues de price nav.InsertAfter("<pages>100</pages>") nav.MoveToParent() MessageBox.Show(nav.OuterXml)

2.2 INSERCION DE NODOS SECUNDARIOS


XPathNavigator incluye mtodos para insertar nodos secundarios. AppendChild PrependChild AppendChildElement PrependChildElement Los mtodos AppendChild y PrependChild aceptan un objeto string, XmlReader o un objeto XPathNavigator que contiene el nodo secundario, para agregarlos como parmetros. Ambos mtodos tambin devuelven un objeto XmlWriter que se utiliza para insertar nodos secundarios. Los mtodos AppendChildElement y PrependChildElement insertan un solo nodo secundario al final y al principio de la lista de nodos secundarios del nodo en el que se encuentra situado actualmente un objeto

CIBERTEC

CARRERAS PROFESIONALES

208

XPathNavigator, utilizando como parmetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado. En el ejemplo, se agrega un nuevo elemento secundario pages a la lista de elementos secundarios del primer elemento book en Books.xml.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\books.xml") Dim navig As XPathNavigator = document.CreateNavigator() navig.MoveToChild("bookstore", "http://www.contoso.com/books") navig.MoveToChild("book", "http://www.contoso.com/books") navig.AppendChild("<pages>100</pages>") MessageBox.Show(navigator.OuterXml)

2.3 INSERCION DE NODOS DE ATRIBUTOS


XPathNavigator incluye mtodos para insertar nodos de atributos. CreateAttribute CreateAttributes Estos mtodos insertan nodos de atributos en el nodo de elementos en el que est situado actualmente un objeto XPathNavigator. El mtodo CreateAttribute crea un nodo de atributos en el nodo de elementos en el que est situado actualmente un objeto XPathNavigator, utilizando como parmetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado. El mtodo CreateAttributes devuelve un objeto XmlWriter que se utiliza para insertar nodos de atributos. En el ejemplo se crean nuevos atributos discount y currency en el elemento secundario price del primer elemento book de Books.xml utiliza el objeto XmlWriter devuelto desde el mtodo CreateAttributes.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\books.xml") Dim navig As XPathNavigator = document.CreateNavigator() navig.MoveToChild("bookstore", "http://www.contoso.com/books") navig.MoveToChild("book", "http://www.contoso.com/books") navig.MoveToChild("price", "http://www.contoso.com/books") Dim attributes As XmlWriter = navigator.CreateAttributes() attributes.WriteAttributeString("discount", "1.00") attributes.WriteAttributeString("currency", "USD") attributes.Close() navigator.MoveToParent() MessageBox.Show(navigator.OuterXml)

2.4 OPERACIONES DE LA COPIA DE NODOS


XPathNavigator como XmlWriter pueden copiar nodos en un objeto XmlDocument desde un XmlReader existente o XPathNavigator. Los mtodos AppendChild, PrependChild, InsertBefore y InsertAfter de la clase XPathNavigator tienen sobrecargas que pueden aceptar como parmetro un objeto XPathNavigator o un objeto XmlReader. El mtodo WriteNode de la clase XmlWriter tiene sobrecargas que pueden aceptar un objeto XmlNode, XmlReader o XPathNavigator.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

209

En el siguiente ejemplo se copian todos los elementos book de un documento a otro llamado newbooks.xml.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\books.xml") Dim navigator As XPathNavigator = document.CreateNavigator() navigator.MoveToChild("bookstore", String.Empty) Dim newBooks As XPathDocument = New XPathDocument("C:\newBooks.xml") Dim newBooksNavigator As XPathNavigator = newBooks.CreateNavigator() Dim nav As XPathNavigator For Each nav In newBooksNavigator.SelectDescendants("book","",False) navigator.AppendChild(nav) Next document.Save("C:\newBooks.xml")

2.5 MODIFICACION DE DATOS CON XPATHNAVIGATOR


Incluye mtodos para modificar nodos y valores en un documento XML. Para utilizar estos mtodos, el objeto XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true. 2.5.1 Modificacin de nodos Para cambiar el valor de un nodo consiste en utilizar los mtodos SetValue y SetTypedValue de la clase XPathNavigator. En la tabla se enumeran los efectos de estos mtodos en diferentes tipos de nodos.
XPathNodeType Root Element Attribute Text ProcessingInstruction Comment Namespace Datos cambiados No admitido. El contenido del elemento. El valor del atributo. El contenido del texto. El contenido, sin incluir el destino. El contenido del comentario. No admitido.

2.5.2 Modificacin de valores sin informacin de tipos El mtodo SetValue simplemente inserta el valor string sin informacin de tipos, que se pasa como parmetro, como valor del nodo en el que se encuentra situado actualmente el objeto XPathNavigator. En el siguiente ejemplo, el mtodo SetValue se utiliza para actualizar todos los elementos price del archivo books.xml.

Dim document As XmlDocument = New XmlDocument() document.Load("C:\Books.xml") Dim nav As XPathNavigator = document.CreateNavigator() Dim manager As New XmlNamespaceManager(nav.NameTable) manager.AddNamespace("bk", "http://www.contoso.com/books") For Each nv As XPathNavigator In nav.Select("//bk:price", manager) If nv.Value = "8.99" Then nv.SetValue("9.99") Next MessageBox.Show(nav.OuterXml)
CIBERTEC CARRERAS PROFESIONALES

210

2.5.3 Modificacin de atributos Los mtodos SetValue y SetTypedValue pueden utilizarse para modificar nodos de atributos con y sin informacin de tipos. En el ejemplo se cambia el valor del atributo genre del primer elemento book en el archivo books.xml.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\books.xml") Dim navigator As XPathNavigator = document.CreateNavigator() navigator.MoveToChild("bookstore", String.Empty) navigator.MoveToChild("book", String.Empty) navigator.MoveToAttribute("genre", String.Empty) navigator.SetValue("non-fiction") navigator.MoveToRoot() MessageBox.Show(navigator.OuterXml)

2.6 QUITAR DATOS XML CON XPATHNAVIGATOR


XPathNavigator incluye mtodos que utiliza para quitar nodos y valores de un documento XML. Para utilizar estos mtodos, XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true. 2.6.1 Cmo quitar nodos XPathNavigator incluye el mtodo DeleteSelf para eliminar el nodo actual situado un objeto XPathNavigator de un documento XML. Eliminado un nodo con el mtodo DeleteSelf, ya no se puede llegar a l desde la raz del objeto XmlDocument. La operacin de eliminacin no afecta a la posicin de ningn objeto XPathNavigator situado en el nodo eliminado. Estos objetos XPathNavigator son vlidos en el sentido de que se pueden mover en el subrbol eliminado, pero no se pueden mover al rbol del nodo principal utilizando los mtodos normales de desplazamiento por conjuntos de nodos de la clase XPathNavigator. En el ejemplo, se elimina el elemento price del primer elemento book del archivo books.xml utilizando el mtodo DeleteSelf. La posicin del objeto XPathNavigator despus de eliminar el elemento price se encuentra en el elemento book primario.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\Books.xml") Dim nav As XPathNavigator = document.CreateNavigator() nav.MoveToChild("bookstore", "http://www.contoso.com/books") nav.MoveToChild("book", "http://www.contoso.com/books") nav.MoveToChild("price", "http://www.contoso.com/books") nav.DeleteSelf() Console.WriteLine("Posicion despues eliminar:{0}", navigator.Name) MessageBox.Show(navigator.OuterXml)

2.6.2 Cmo quitar valores XPathNavigator incluye los mtodos SetValue y SetTypedValue para quitar valores con y sin informacin de tipos de un documento XML. 2.6.3 Cmo quitar valores sin informacin de tipos

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

211

El mtodo SetValue simplemente inserta el valor string sin informacin de tipos, que se pasa como parmetro, como valor del nodo en el que se encuentra situado actualmente el objeto XPathNavigator. Al pasar una cadena vaca al mtodo SetValue, se quita el valor del nodo actual. En el siguiente ejemplo, se quita el valor del elemento price del primer elemento book en el archivo contosoBooks.xml utilizando el mtodo SetValue.
Dim document As XmlDocument = New XmlDocument() document.Load("C:\Books.xml") Dim navigator As XPathNavigator = document.CreateNavigator() navigator.MoveToChild("bookstore", "http://www.contoso.com/books") navigator.MoveToChild("book", "http://www.contoso.com/books") navigator.MoveToChild("price", "http://www.contoso.com/books") navigator.SetValue("") navigator.MoveToRoot() MessageBox.Show(navigator.OuterXml)

GUARDAR UN DOCUMENTO XML


La Clase XmlDocument, tiene el metod Save que permite guardar el contexto de un XmlDocument.
Dim doc As New XmlDocument() doc.Load("book.xml") doc.Save("news.xml")

Si carga un XmlDocument y al grabarlo, puede se diferente del original, se puede seguir los siguientes caminos:

Si la propiedad PreserveWhitespace se establece en true antes de llamar al mtodo Save, en el resultado se conserva el espacio en blanco del documento; sin embargo, si la propiedad es false, XmlDocument, se aplica sangra automticamente al resultado. Todos los espacios en blanco entre los atributos se reducen a un carcter de un solo espacio. Se cambia el espacio en blanco entre los elementos. Se conserva el espacio blanco importante, pero no se conserva el poco importante. Sin embargo, cuando se guarda el documento, se utiliza el modo XmlTextWriter Sangra de manera predeterminada para imprimir con claridad el resultado con el fin de que sea ms legible. De manera predeterminada, el carcter de la comilla que se utiliza delante y detrs de los valores de los atributos se cambia por la comilla doble. Puede utilizar la propiedad QuoteChar en XmlTextWriterpara establecer el carcter de la comilla como doble o simple. De manera predeterminada, se expanden las entidades de caracteres numricos como &#123. No se conserva la marca de orden de bytes del documento de entrada. UCS-2 se guarda como UTF-8 a menos que cree explcitamente una declaracin XML en la que se especifique otra codificacin. Si desea escribir XmlDocument en un archivo o una secuencia, el resultado escrito es el mismo que el contenido del documento. Es decir, la declaracin XmlDeclaration slo se escribe si hay alguna en el

CIBERTEC

CARRERAS PROFESIONALES

212

documento y la codificacin que se utiliza al escribir el documento es la misma que la del nodo de la declaracin.

3.1 ESCRIBIR EL CONTENIDO DE UN DOCUMENTO CON LA


PROPIEDAD OUTERXML
La propiedad OuterXml es una extensin de Microsoft de los estndares del Modelo de objetos de documento (DOM) XML del W3C (World Wide Web Consortium). La propiedad OuterXml se utiliza para obtener el marcado de todo el documento XML o tan slo el de un nodo y sus nodos secundarios. OuterXml devuelve el marcado que representa el nodo en concreto y todos sus nodos secundarios. El siguiente ejemplo de cdigo muestra cmo guardar un documento por completo como una cadena.
Dim mydoc As New XmlDocument() Mydoc.Load("book.xml") ' Ahora grabamos el documento auna variable String "xml". Dim xml As String = mydoc.OuterXml

El siguiente ejemplo muestra cmo guardar el elemento de documento.


Dim xml As String = mydoc.DocumentElement.OuterXml

3.2 ESCRIBIR UNA DECLARACION XMLDECLARATION


Los miembros XmlDocument y XmlDeclaration de OuterXml, InnerXml y WriteTo, adems de los mtodos XmlDocument de Save y WriteContentTo, crean una declaracin XML. Para las propiedades XmlDocument de OuterXml, InnerXml, y los mtodos Save, WriteTo y WriteContentTo, la codificacin escrita en la declaracin XML se obtiene del nodo XmlDeclaration. Si no existe ningn nodo XmlDeclaration, XmlDeclaration no se escribe. Si no hay codificacin en el nodo XmlDeclaration, la codificacin no se escribe en la declaracin XML. Los mtodos System.Xml.XmlDocument.Save(System.IO.TextWriter) y System.Xml.XmlDocument.Save(System.Xml.XmlWriter) siempre escriben una declaracin XmlDeclaration. Estos mtodos toman la codificacin del sistema de escritura que est escribiendo. Es decir, el valor de codificacin en el sistema de escritura sobrescribe la codificacin en el documento y en la declaracin XmlDeclaration. Por ejemplo, el siguiente cdigo no escribe una codificacin en la declaracin XML que se encuentra en el archivo de salida out.xml.
Dim doc As New XmlDocument() Dim tw As XmlTextWriter = New XmlTextWriter("out.xml", Nothing) doc.Load("text.xml") doc.Save(tw)

Para el mtodo Save, la declaracin XML se escribe utilizando el mtodo WriteStartDocument en la clase XmlWriter. Por lo tanto, al sobrescribir el

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

213

mtodo WriteStartDocument, cambia la forma de escribir el principio del documento. Para los miembros XmlDeclaration de OuterXml, WriteTo e InnerXml, si no se establece la propiedad Encoding, no se escribe la codificacin. De lo contrario, la codificacin escrita en la declaracin XML es la misma que la que se encuentra en la propiedad Encoding.

LABORATORIO 14.1
En este escenario se carga un objeto XPathDocument con los datos XML encontrados en el archivo productos.xml, crea un objeto XPathNavigator para una presentacin de los datos y, a continuacin, realizamos un conjunto de operaciones por el documento. Ingrese a Visual Studio 2005. 1. Seleccione File->New->Project. 2. Elija las siguientes opciones: - En Proyect Types elija Visual Basic. - En Templates elija WindowsApplication. - En Name coloque appFacturacion 14. - En Location coloque C:\CursoPOOII. 3. En el Form1 del proyecto, construya la siguiente interfaz:

Controles Label1 ListView1 Button1 Button2 Button3 Button4 Button5

Propiedad Text

Valor Productos

Name Name Name Name Name

BtnListado BtnCantidad BntInventario BtnNoStock BtnBuscar

CIBERTEC

CARRERAS PROFESIONALES

214

4. Defina las librera para el manejo de los archivos XML

5. Defina el procedimiento para el botn Listado el cual permita buscar el archivo XML y listar los nodos en el ListView1.

Defina un XMLDocument para cargar el archivo XML Defina un XpathNavigator del XMLDocument, ubique en el 1er Nodo

Proceso para realizar el desplazamiento por el XpathNavigator del XMLDocument, visualizando los valores de los nodos en el ListView1

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

215

6. Defina el procedimiento en el botn Cantidad Productos para mostrar en un cuadro de dilogo, la cantidad de productos que se han listado

Defina un XMLDocument para cargar el archivo XML.

El XpathExpression evala la expresin para contar los productos, visualizando el resultado en el MessageBox. 7. Defina el procedimiento en el botn Inventario para mostrar en un cuadro de dilogo, el total cantidad disponibles de productos almacenados

Defina un XMLDocument para cargar el archivo XML.

El XpathExpression evala la expresin para sumar el campo stock, visualizando el resultado en el MessageBox.

CIBERTEC

CARRERAS PROFESIONALES

216

8. Defina el procedimiento en el botn NO TIENEN STOCK, que permita visualizar todos los productos que no tienen stock.

Defina un XMLPathNodeIterator que almacene los nodos cuyo stock=0

Para listar los productos de stock cero, realice un desplazamiento por el XpathNodeIterator para obtener los productos sin stock. 9. Defina el procedimiento del botn BUSCAR, donde al ingresar el cdigo del producto por un InputBox, visualice su descripcin.

Defina un XMLPathNodeIterator que almacene la descripcin del cdigo a buscar en el mtodo Select del XPathNavigator.

Listar la descripcin del producto buscado, visualizando el resultado en el MessageBox.

CARRERAS PROFESIONALES

CIBERTEC

PROGRAMACIN ORIENTADA A OBJETOS II

217

Autoevaluacin
1. Qu es el XPathNavigator? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 2. Cmo evaluar las expresiones utilizando XPathNavigator? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 3. Qu es el XPathExpression, qu valores retornar? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ______________________________________________ 4. Cmo editar datos utilizando XPathNavigator? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ____________________________________ 5. Cules son los mtodos para insertar atributos? Explique cada uno. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ ____________________________________

CIBERTEC

CARRERAS PROFESIONALES

218

Resumen
La clase XPathDocument proporciona una representacin en memoria rpida y de slo lectura de un documento XML utilizando el modelo de datos XPath. Las clases XPathDocument y XmlDocument, adems de la clase XmlNode, implementan la interfaz IXPathNavigable del espacio de nombres System.Xml.XPath. Como resultado, las tres clases proporcionan un mtodo CreateNavigator que devuelve un objeto XPathNavigator. XPathExpression representa consulta XPath compilada devuelta desde el mtodo Compile esttico de la clase XPathExpression o desde el mtodo Compile de la clase XPathNavigator. XPathNavigator incluye mtodos para insertar nodos de atributos. o CreateAttribute o CreateAttributes Estos mtodos insertan nodos de atributos en el nodo de elementos en el que est situado actualmente un objeto XPathNavigator. XPathNavigator incluye mtodos para modificar nodos y valores en un documento XML. Para utilizar estos mtodos, el objeto XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true. Para cambiar el valor de un nodo consiste en utilizar los mtodos SetValue y SetTypedValue de la clase XPathNavigator. XPathNavigator incluye el mtodo DeleteSelf para eliminar el nodo actual situado un objeto XPathNavigator de un documento XML. Eliminado un nodo con el mtodo DeleteSelf, ya no se puede llegar a l desde la raz del objeto XmlDocument. La Clase XmlDocument, tiene el metod Save que permite guardar el contexto de un XmlDocument. Se desea realizar consultas referentes al Tema:

http://msdn2.microsoft.com/es-es/library/87274khy(VS.80).aspx
Pgina referente al procesamiento de datos XML con el modelo de datos XPath

http://msdn2.microsoft.com/es-es/library/439wyfyh(VS.80).aspx
Pgina referente al desplazamiento por nodos de espacios de nombres y atributos con XPathNavigator

http://msdn2.microsoft.com/es-es/library/sb9ca14t(VS.80).aspx
Pgina referente a la edicin de datos en XML

http://msdn2.microsoft.com/es-es/library/xws54wwx(VS.80).aspx
Pgina referente a como quitar datos XML con XPathNavigator

CARRERAS PROFESIONALES

CIBERTEC

You might also like