FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA PROGRAMACIÓN VISUAL Profr. Víctor Castillo PRÁCTICA No. 8 Creación de una conexión de datos usando acceso no conectado con ADO.NET ALUMNO: ________________________________________________ GRUPO: ____ I.- Objetivo Crear una conexión de datos mediante acceso no conectado con un proveedor de datos del framework .NET. II.- Introducción ADO.NET es la tecnología sobre la cual se enfoca principalmente la arquitectura de base de datos del framework de .NET. Tal tecnología tiene las siguientes características: • Usa XML para transferir datos. • Se pueden acceder datos de varios proveedores: OLE DB, ODBC, SQL server. Se pueden encontrar ás proveedores en: http://msdn.microsoft.com/downloads. • Soporta arquitectura de no conexión. • Proporciona representación común de datos. Como se muestra en la Figura 1, la arquitectura de ADO.NET se compone de un objeto proveedor de datos, mismo que debe ser manipulado preferentemente mediante un conjunto de datos. Uno de los aspectos más interesantes de ADO.NET es que utiliza un modelo de capas, en el que es posible separar la presentación de datos, la lógica de negocios y los datos. Un conjunto de datos (DataSet) incluye una o más tablas basadas en un origen de datos, puede contener información sobre las relaciones y restricciones en el origen de datos (ver Figura 1). 1 de 10 Figura 1. La tecnología ADO.NET. Otro componente importante de la tecnología ADO.NET es el proveedor de datos o data provider, el cual sirve como puente entre una aplicación y un origen de datos. El framework .NET incluye los siguientes proveedores: – – – – ODBC (disponible en el espacio de nombre System.Data.Odbc). OLE DB (disponible en el espacio de nombre System.Data.OleDb). Oracle (disponible en el espacio de nombre System.Data.OracleClient). SQL Server (disponible en el espacio de nombre System.Data.SqlClient). Un proveedor de datos puede recuperar y actualizar datos y cuenta con los siguientes objetos: – – – – Conexión (Connection). Orden (Command). Lector de datos (DataReader). Adaptador de datos (DataAdapter). La tarea más importante de un objeto tipo conexión es presentar atributos y métodos para establecer y modificar las propiedades de conexión de datos (identificación del usuario, contraseña, por ejemplo). Los siguientes ejemplos mostrados en el Código 1 crean conexiones a dos distintos proveedores de datos (OleDB y SqlClient): 2 de 10 OleDbConnection conexion1 = new OleDbConnection(); conexion1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0 ;Password=;User ID=Admin; Data Source=E:\Authors.mdb“; conexion1.Open(); SqlConnection conexion2 = new SqlConnection(); conexion2.ConnectionString = "Data Source=localhost;user id=sa;pwd=; Initial Catalog=Northwind"; conexion2.Open(); Código 1. Creación de dos conexiones mediante el uso de dos proveedores de datos diferentes. Un objeto del tipo orden (command) ejecuta sentencias SQL y devuelve resultados de las mismas. El Código 2 muestra un ejemplo de una orden. SqlCommand comando = new SqlCommand("SELECT * FROM rTransaccion WHERE atendido=0"); Código 2. Definición de una instancia de una orden. Por otra parte, un objeto lector de datos (DataReader) se usa para crear una aplicación de sólo lectura. El siguiente código crea una conexión a la tabla Employes de la base de datos Northwind (incluidas en las la mayoría de las versiones de Microsoft SQL Server) y un lector de datos es usado para desplegar en la consola el primero de todos los campos de la tabla Employes, para ello se utiliza como proveedor de datos SQLClient. string cadena = "data source=localhost; Initial Catalog=Northwind;user id=sa;pwd=;"; string cadenaSQL = "SELECT lastname, firstname FROM Employees"; SqlConnection conexion = new SqlConnection(cadena); SqlCommand comando = new SqlCommand(); comando.CommandText = cadenaSQL; comando.Connection = conexion; conexion.Open(); SqlDataReader lectorDatos; lectorDatos = comando.ExecuteReader(); while (lectorDatos.Read()) { Console.WriteLine((lectorDatos.GetString(0))); } lectorDatos.Close(); conexion.Close(); Código 3. Uso de un lector de datos. Un objeto adaptador de datos (DataAdapter) se usa para intercambiar datos entre un origen de datos y un conjunto de datos (DataSet). Lo más común es usar tantos adaptadores como tablas tenga el DataSet. Como ejemplo de la definición de un DataAdapter usando un proveedor de datos SqlClient tenemos el Código 4. 3 de 10 SqlDataAdapter adaptadorDatos = new SqlDataAdapter(); adaptadorDatos.SelectCommand = comando; Código 4. Creación de un adaptador de datos usando el proveedor de datos SqlClient. Las características de los objetos DataReader y DataAdapter son tan importantes que ellas definen los dos tipos de conexiones de que dispone ADO.NET, los primeros se usan para acceso conectado a una fuente de datos, mientras que los segundos para acceso en modo conectado. En esta práctica haremos énfasis en el último tipo de conexión mencionado debido a que el acceso a bases de datos distribuidas se beneficia del mismo al permitir utilizar un acceso al origen de datos sólo cuando este sea realmente necesario, la Figura 2 muestra el esquema de este tipo de acceso, en cual se puede apreciar que para llevarlo a cabo es necesario crear primeramente un objeto del tipo conexión a la base de datos, la conexión se relaciona entonces con un adaptador de datos –el cual permite ejecutar comando SQL en el origen de datos-, con el fin de que un componente gráfico use los datos contenidos en un adaptador de datos, este debe asociarse a un conjunto de datos. Figura 2. Esquema de un acceso orientado a no conexión utilizando la tecnología ADO.NET. Para ilustrar en forma completa los puntos mencionados previamente mostraremos cómo desarrollar una aplicación con acceso orientado a no conexión utilizando el proveedor SqlClient de ADO.NET. Primero, debemos considerar que existe ya creada una instancia de SQL Server en nuestro equipo y que hemos creado una base de datos llamada pracsFIME, así mismo, que hemos creado una tabla llamada alumno, cuya estructura se muestra en la Figura 3). Para acceder a una tabla de SQL Server mediante ADO.NET podemos crear una aplicación Windows en el entorno de desarrollo de Visual Studio .NET. La Figura 4 muestra la distribución que tiene nuestro ejemplo. El componente gráfico mostrado al centro del formulario es un objeto del tipo dataGrid. 4 de 10 Figura 3. Estructura de la tabla alumno creada en SQL Server. Figura 4. Aspecto de diseño del formulario de ejemplo. El recuadro que se encuentra al centro es un componente dataGrid llamado dataGrid1. 5 de 10 El código para el evento Click del botón de comando que es necesario para llenar el dataGrid con los datos de la tabla alumno es mostrado en el Código 4. Observe como el orden en el que se llevan a cabo los comandos concuerda con el esquema mostrado en la Figura 2, en el cual se aprecia que para realizar un acceso de no conexión es necesario primeramente realizar la conexión (comando.Connection = conexionDatos), luego se debe crear el adaptador de datos (adaptadorDatos.SelectCommand = comando), el cual posteriormente debe vincularse a un conjunto de datos (adaptadorDatos.Fill(conjuntoDatos,"alumno")) para que pueda vincularse finalmente a un componente gráfico (dataGrid1.DataSource = conjuntoDatos.Tables[0]), en este caso un dataGrid. private void button1_Click(object sender, System.EventArgs e) { string cadComandoSQL = "SELECT * FROM alumno"; SqlDataAdapter adaptadorDatos = new SqlDataAdapter(); SqlCommand comando = new SqlCommand(); SqlCommand comandoActualizar = new SqlCommand(); SqlConnection conexionDatos = new SqlConnection(); comandoActualizar.Connection = conexionDatos; conexionDatos.ConnectionString = "Data Source=IBMVICTOR;user id=sa;pwd=sysadmin;Initial Catalog=pracsFIME"; conexionDatos.Open(); comando.Connection = conexionDatos; comando.CommandText = cadComandoSQL.Trim(); adaptadorDatos.SelectCommand = comando; DataSet conjuntoDatos = new DataSet(); adaptadorDatos.Fill(conjuntoDatos,"alumno"); dataGrid1.DataSource = conjuntoDatos.Tables[0]; conexionDatos.Close(); } Código 4. Código para el evento Click del botón de comando de nuestro ejemplo. Como en este caso estamos usando objetos y métodos para un proveedor tipo SqlClient es necesario añadir en la sección de inclusión de espacios de nombre la siguiente sentencia: using System.Data.SqlClient; La presente práctica trata sobre la creación de una aplicación Windows que usará un proveedor de datos OleDB para realizar un acceso de no conexión, similar al mostrado en el ejemplo previo, a una tabla creada en Microsoft Access. III.- Desarrollo 1.- Cargue el entorno de desarrollo de Microsoft Visual Studio .NET. 2.- Seleccione el botón New Project de la ventana Start Page. 6 de 10 3.- En la ventana New Project escriba el nombre de su proyecto e indique el nombre de la carpeta donde lo almacenará en su disco. Usted puede indicar el nombre de proyecto y carpeta que desee. Nota: No olvide seleccionar Visual C# Projects en el tipo de proyecto (sección Project Types de la ventana New Projects). Así mismo, asegúrese que la plantilla(Template) para el proyecto sea una aplicación Windows (Windows Application). 4.- Haga uso de la barra de herramientas (Toolbox) del entorno de desarrollo. Seleccione y enseguida arrastre hasta el área de diseño del formulario los componentes gráficos dataGrid y Button, como se ilustra en la Figura 4. 5.- A continuación debemos indicar a nuestra aplicación que deseamos tener acceso a las clases para manipular un proveedor de datos con tecnología OLEDB, para ello debemos usar el espacio de nombres System.Data.OleDb. Para lo anterior seleccione el formulario en modo de diseño, pulse sobre algún punto del área de edición del mismo el botón secundario del ratón y seleccione la opción “View Code” del menú emergente. 6.- Añada la línea using System.Data.OleDb; a la sección de adición de espacios de nombre del código de su aplicación. La lista de los espacios de nombre incluidos tendría que ser la siguiente: using using using using using using using System; System.Drawing; System.Collections; System.ComponentModel; System.Windows.Forms; System.Data; System.Data.OleDb; 7.- Escriba el código para el evento Click del botón “Llenar datos”. Al pulsarlo nuestro programa tendrá el acceso a una tabla llamada alumno de una base de datos creada en Microsoft Access, tomará todos los datos de la misma y los vinculará con un componente dataGrid. Escriba el código fuente mostrado en Código 5. 7 de 10 private void button2_Click(object sender, System.EventArgs e) { string cadComandoSQL = "SELECT * FROM alumno"; OleDbDataAdapter adaptadorDatos = new OleDbDataAdapter(); OleDbCommand comando = new OleDbCommand(); OleDbCommand comandoActualizar = new OleDbCommand(); OleDbConnection conexionDatos = new OleDbConnection(); comandoActualizar.Connection = conexionDatos; conexionDatos.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;;Password=;User ID=Admin;Data Source=C:\\DocsVic\\pracsFIME.mdb"; conexionDatos.Open(); comando.Connection = conexionDatos; comando.CommandText = cadComandoSQL.Trim(); adaptadorDatos.SelectCommand = comando; DataSet conjuntoDatos = new DataSet(); adaptadorDatos.Fill(conjuntoDatos,"alumno"); dataGrid1.DataSource = conjuntoDatos.Tables[0]; conexionDatos.Close(); } Código 5. Código para el evento Click del botón de comando de nuestro ejemplo. El código que está resaltado en color azul es escrito de manera automática por Visual C# y usted no debe cambiarlo, es posible que el nombre de la función no coincida, en cuyo caso no se afecta al desempeño del método. El código resaltado en color amarillo puede cambiar dependiendo la carpeta de su sistema de disco donde almacene la base de datos que creará en los siguientes pasos de esta práctica. 8.- Guarde todos los cambios en su proyecto, para ello pulse Ctrl+Shift+S o siga la secuencia File+Save All. 9.- La parte siguiente consiste en crear una base de datos en Microsoft Access. 10.- Cargue el Microsoft Access. 11.- Seleccione la opción “Nuevo” del menú “Archivo”. 12.- Seleccione la opción “Base de datos en blanco…”. 13.- En la ventana “Archivo nueva base de datos” escriba como nombre de la base de datos pracsFIME. Vea Figura 5. 8 de 10 Figura 5. Aspecto de diseño de la tabla alumno de la base de datos pracsFIME. Las longitudes de los campos son 9, 15, y 15, para los campos nocta, nombre y apellido, respectivamente, el campo edad es un entero. 14.- Guarde la estructura de la tabla. 15.- Añada algunos registros de datos a la misma. 16.- Seleccione ahora el entorno de desarrollo de Visual Studio .NET, ejecute su aplicación. 17.- Pulse el botón “Llenar datos”. El dataGrid debe mostrar los datos insertados previamente en Microsoft Access. 18.- Añada un nuevo registro en el dataGrid. 19.- Cierre su aplicación. 20.- Vuelva a cagar la aplicación y pulse el botón “Llenar datos”. 21.- ¿Se despliega el registro que había añadido previamente? 22.- Dé una explicación de por qué ocurre eso. 23.- Describa cuál o cuales son las diferencias más significativas, en cuanto a la escritura de código, que deben realizarse para hacer una conexión de datos usando el proveedor de datos SqlClient con respecto al proveedor OleDB. 9 de 10 IV.- Observaciones y/o conclusiones _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ _________________________________________________________________________ V.- Referencias *** Pendiente. 10 de 10