Documente Academic
Documente Profesional
Documente Cultură
CARRERAS PROFESIONALES
CIBERTEC
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 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
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
Manejo de Reportes
Arquitectu ra de ADO.NET
Manejo de parmetros
CARRERAS PROFESIONALES
CIBERTEC
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
CARRERAS PROFESIONALES
CIBERTEC
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
CARRERAS PROFESIONALES
CIBERTEC
11
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.
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
CARRERAS PROFESIONALES
CIBERTEC
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
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.
CIBERTEC
CARRERAS PROFESIONALES
14
CARRERAS PROFESIONALES
CIBERTEC
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>
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
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
17
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.
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.
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
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
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
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
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
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
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
CARRERAS PROFESIONALES
CIBERTEC
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")
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
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()
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
27
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)
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
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
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
Control Label
Control DataGridView
Propiedad Text
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
31
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.
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
CARRERAS PROFESIONALES
CIBERTEC
33
Objeto
Label1 Label2 ComboBox1 ComboBox2 Button DataGridView1
Name
Label1 Label2 CboVendedor CboAo BtnConsulta DGFactura
Propiedad
Text Text
Valor
Vendedor Ao
Text
Consulta
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
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"
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"
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
35
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
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
CARRERAS PROFESIONALES
CIBERTEC
37
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
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.
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
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.
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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.
CIBERTEC
CARRERAS PROFESIONALES
44
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
45
Dim ds As New Facturacion Dim cli As New FacturacionTableAdapters.ClientesTableAdapter cli.Fill(ds.Clientes) Me.DataGridView1.DataSource = ds.Clientes
CIBERTEC
CARRERAS PROFESIONALES
46
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
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.
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
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
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.
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
CARRERAS PROFESIONALES
CIBERTEC
51
3. Disee el Formulario.
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")
CIBERTEC
CARRERAS PROFESIONALES
52
CARRERAS PROFESIONALES
CIBERTEC
53
4.
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.
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.
CARRERAS PROFESIONALES
CIBERTEC
55
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
Text
Consulta
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
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
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
CARRERAS PROFESIONALES
CIBERTEC
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()
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
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.
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
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
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()
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
CIBERTEC
CARRERAS PROFESIONALES
66
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
CARRERAS PROFESIONALES
CIBERTEC
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
CIBERTEC
CARRERAS PROFESIONALES
68
-------------------------------------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
2. Disea el Formulario, incluya el control image para mostrar la foto del empleado.
CARRERAS PROFESIONALES
CIBERTEC
69
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
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
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
CIBERTEC
CARRERAS PROFESIONALES
72
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
73
6. En
la pgina Create the Stored Procedure asigne un nombre al Procedure: InsertVendedor, presione el boto Next.
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
CIBERTEC
CARRERAS PROFESIONALES
74
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
CARRERAS PROFESIONALES
CIBERTEC
75
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
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")
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
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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
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")
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
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
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
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.
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
85
CIBERTEC
CARRERAS PROFESIONALES
86
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)
CARRERAS PROFESIONALES
CIBERTEC
87
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
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
89
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")
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
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
91
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)
Descripcin
No se han hecho AcceptChanges. cambios desde la ltima llamada a
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
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.
CIBERTEC
CARRERAS PROFESIONALES
94
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
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")
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
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
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
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
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
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)
CARRERAS PROFESIONALES
CIBERTEC
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
Pregunta: Cmo pasar los datos actualizados en el DataSet a la base de datos?, investigue acerca del CommandBuilder. Tarea de Investigacin.
CARRERAS PROFESIONALES
CIBERTEC
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:
CARRERAS PROFESIONALES
CIBERTEC
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.
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
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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.
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
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
CARRERAS PROFESIONALES
CIBERTEC
109
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")
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
CARRERAS PROFESIONALES
CIBERTEC
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)
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
CARRERAS PROFESIONALES
CIBERTEC
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
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.
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
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.
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.
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
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 DE INFORMES
Crystal Reports 10 funciona en una arquitectura de uno, dos o tres niveles tanto en plataformas Windows Forms como Web Forms.
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.
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.
CARRERAS PROFESIONALES
CIBERTEC
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.
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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.
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
125
11. En el Formulario agrega el control CrystalReportViewer para listar el reporte diseado, tal como se muestra en la figura.
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.
CIBERTEC
CARRERAS PROFESIONALES
126
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.
CARRERAS PROFESIONALES
CIBERTEC
127
4. Disea el formulario:
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.
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.
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
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
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
CARRERAS PROFESIONALES
CIBERTEC
133
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.
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:
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
135
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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()
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.
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
139
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.
CIBERTEC
CARRERAS PROFESIONALES
140
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
141
Control Button Label Label Label Label ComboBox TextBox TextBox DataGridView
Nombre BtnConsulta Label1 Label2 Label3 Label4 ComboBox1 txtFecha1 txtFecha2 DataGridView1
de
Pedidos
por
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.
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
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
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.
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
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
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
CARRERAS PROFESIONALES
CIBERTEC
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.
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.
d) Especificar que objetos de la BD queremos que formen de nuestro EDM (en este caso, tablas y procedimientos almacenados).
e) Al finalizar se construye el modelo de entidad de datos, tal como se muestra en la figura: ModelVentas.edmx.
CARRERAS PROFESIONALES
CIBERTEC
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="Data Source=.;Initial Catalog=DBVentas;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" /> </connectionStrings>
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
CARRERAS PROFESIONALES
CIBERTEC
153
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
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
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
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.
CIBERTEC
CARRERAS PROFESIONALES
156
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
157
Control ListView
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
CIBERTEC
CARRERAS PROFESIONALES
158
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
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()
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
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
CARRERAS PROFESIONALES
CIBERTEC
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
163
UNIDAD DE APRENDIZAJE
4
SEMANA
12
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
CARRERAS PROFESIONALES
CIBERTEC
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.
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")
CIBERTEC
CARRERAS PROFESIONALES
166
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
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)
CIBERTEC
CARRERAS PROFESIONALES
168
CARRERAS PROFESIONALES
CIBERTEC
169
- En Name coloque appEntidades12. - En Location coloque C:\CursoPOOII. 3. Agregar un Item al Proyecto: tipo Modelo de Entidad de datos.
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
CARRERAS PROFESIONALES
CIBERTEC
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
CIBERTEC
CARRERAS PROFESIONALES
172
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
CARRERAS PROFESIONALES
CIBERTEC
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
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
CARRERAS PROFESIONALES
CIBERTEC
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
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.
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
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
Element
Attribute
SimpleContent
CIBERTEC
CARRERAS PROFESIONALES
180
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
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)
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.
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
183
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.
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)
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
185
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.
Nombre
Descripcin
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
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.
CARRERAS PROFESIONALES
CIBERTEC
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
188
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
Definir el XmlDeclation .
CARRERAS PROFESIONALES
CIBERTEC
189
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
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
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.
CIBERTEC
CARRERAS PROFESIONALES
192
6. Haga doble clic sobre el formulario para ingresar a la ventana de cdigo. Importe el namespace System.Data.SqlClient.
Imports System.Data.SqlClient
CARRERAS PROFESIONALES
CIBERTEC
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()
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
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
CARRERAS PROFESIONALES
CIBERTEC
195
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
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
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
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
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
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
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
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.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
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)
CARRERAS PROFESIONALES
CIBERTEC
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)
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
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()
CARRERAS PROFESIONALES
CIBERTEC
207
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)
CARRERAS PROFESIONALES
CIBERTEC
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.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.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
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)
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 {. 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.
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
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:
Propiedad Text
Valor Productos
CIBERTEC
CARRERAS PROFESIONALES
214
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
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
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
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.
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.
CARRERAS PROFESIONALES
CIBERTEC
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