Programació amb C# .NET - Índice
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
Programació amb C# .NET Tema 5 (g): ADO.NET Jordi Linares i Pellicer Índice ! Introducción ! ¿Qué es ADO.NET? ! Clases y Objetos de ADO.NET ! Explorador de Servidores ! Orígenes de Datos ! Interfaz Conectada a Datos ! Programar con ADO.NET
Introducción ! La mayoría de las aplicaciones actuales guardan su información en bases de datos por lo que necesitan acceder a ellas ya sea de forma local o remota. ! La aparición nuevas tecnologías como ADO.NET y los servicios de acceso a datos de .NET Framework han simplificado bastante la manipulación de bases de datos. ! Con Visual Studio el acceso a bases de datos desde las aplicaciones se convierte en una tarea bastante sencilla. ¿Qué es ADO.NET? ! ADO.NET es un avanzado modelo de Bases de Datos para acceder a SGBDR. ! Es la evolución de ADO (ActiveX Data objects) y proporciona una serie de clases para acceder a datos actualizadas al entorno .NET ! Incluye una serie de proveedores que actúan como intermediarios entre la base de datos y la aplicación: " SqlClient " OracleClient " OleDB " ODBC
! Objetivos de diseño de ADO.NET " Acceso simple a datos. A través de clases fáciles de usar que representan tablas, filas y columnas de la BD. " Extensibilidad para soporte a diferentes orígenes de datos. Esto permite crear nuevos proveedores de datos para .NET, p.ej. MySQL. " Soporte para aplicaciones multicapa. Es la arquitectura actual de las aplicaciones de negocios y comercio electrónico. ADO.NET utiliza XML para la comunicación entre capas. " Unificación de XML y Acceso a Datos Relacionales. .NET está basado en XML y ADO.NET es el puente entre los datos relacionales y la estructura jerárquica de los documentos XML. Clases y Objetos de ADO.NET ! Clases básicas: ! Objetos ADO.NET " Las clases de ADO.NET están definidas en el espacio de nombres System.Data. " Trabaja en modo desconectado: El programa no requiere una conexión persistente con la BD. " La conexión se abre y se cierra cuando se necesita.
! Objetos del proveedor Todos los objetos llevan el prefijo único del proveedor: SqlXxxxxxx, OleDbXXXXXX,….etc: " Connection. Establece la conexión con el origen de datos. SqlConnection, OdbcConnection,… " Command. Recupera datos del proveedor. (SELECT * FROM…). Ej: SqlCommand, OdbcCommand, OleDbCommand,…. " CommandBuilder. Permite hacer consultas SQL para modificar datos de objetos basados en una sola tabla. Ej: SqlCommandBuilder, OdbcCommandBuilder,… " DataReader. Permite recuperar datos de sólo lectura y sólo hacia delante de un origen de datos. Ej: SqlDataReader, OdbcDataReader, … " DataAdapter. Representa un conjunto de comandos SQL y una conexión al origen de datos para rellenar el objeto DataSet y actualizar los datos. Ej: SqlDataAdapter,… Explorador de Servidores ! La ventana se hace visible desde el menú Ver#Explorador de Servidores. ! Permite abrir conexiones a datos y conectar con servidores para explorar sus bases de datos. ! También permite crear nuevas bases de datos, definir tablas, acceder a su contenido, etc. ! Las conexiones se muestran en el nodo Conexiones de datos. ! Cada conexión representa un nodo que contiene: tablas, vistas, procedimientos almacenados, etc.
! Conexión a una base de datos existente " Desde el nodo Conexiones de Datos podremos conectar a una base de datos existente: ! Creación de una Base de Datos 1 3 2
! Definición de Tablas " Al cerrar el diseñador se le da nombre a la nueva tabla. " La tabla creada aparece en el Explorador de servidores. ! Edición de una tabla " Desde el explorador de servidores podremos efectuar sobre la tabla operaciones de inserción, modificación, borrado, agrupación, filtrado, etc. " Al editar la tabla, se está trabajando directamente con SQL Server 2005 que se encargará de almacenar y recuperar los datos, cumplir las restricciones, etc. " Al cerrar la edición, los cambios son permanentes en la BD del servidor.
" Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL. Orígenes de Datos ! Con el Explorador de Servidores se obtienen las cadenas de conexión a las bases de datos. ! Estas cadenas de conexión nos permitirán definir uno o más orígenes de datos. ! Un Origen de datos es un objeto de la aplicación que representa un conjunto de datos que residen en algún lugar (normalmente SGBDR). ! Los orígenes de datos facilitan el acceso y edición de los datos que la aplicación necesita. ! Mostrar la ventana orígenes de datos: Datos#Mostrar Orígenes de datos.
" Como resultado final se crea el conjunto de datos y se añade al proyecto: ! Un esquema XSD con su estructura ! Un módulo con la clase derivada de DataSet " Durante el diseño, el fichero app.config contiene la configuración para la cadena de conexión a la BD: " Al compilar el proyecto se genera un fichero: .exe.config que guarda la configuración de la cadena de conexión para la ejecución. Se puede modificar para actualizar la ruta a la BD.
! El diseñador de conjuntos de datos " El conjunto de datos es dinámico y durante el desarrollo de la aplicación pueden volverse a configurar desde: ! Configurar DataSet con el asistente… o ! Editar DataSet con el diseñador. " El Adaptador de datos actúa como intermediario entre el SGBDR y el DataSet. ! Asociar elementos de interfaz a tablas y columnas " Desde orígenes de datos se puede configurar el control a emplear en el formulario para cada tipo de columna. NOTA: El formulario debe estar abierto en el diseñador para que las listas desplegables aparezcan. Asociaciones para la tabla Asociaciones para las columnas
Interfaz Conectada a Datos ! Los datos conectados se pueden mostrar en el formulario: " En una Cuadrícula mediante el uso del control DataGridView, o " Vista detalle mediante el uso de controles: Label, TextBox, ListaBox, etc. ! Desde la ventana Orígenes de datos se puede arrastrar al formulario la tabla entera o por columnas. ! El Diseñador se encarga de establecer la propiedad DataBindings de cada control de forma adecuada. ! Si los controles se insertan directamente desde el Cuadro de herramientas se ha de establecer la propiedad DataBindings de forma manual. Cuadrícula (DataGrid) Vista Detalle Modo diseño Ejecución
Programar con ADO.NET ! Leer datos con DataReader . . . Using System.Data; Using System.Data.SqlClient; public partial class Form1 : Form { private SqlConnection maConnexio; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Cadena de connexió maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\northwnd.mdf; Integrated Security=True;Connect Timeout=30; User Instance=True"); } private void butLlistarClients_Click(object sender, EventArgs e) { // Obrir la connexió maConnexio.Open(); // Crear el command SqlCommand maCommand = maConnexio.CreateCommand(); // Especificar la consulta SQL per al Command maCommand.CommandText = "SELECT CustomerID, ContactName, CompanyName from Customers"; // Executar el DataReader per al command SqlDataReader maReader = maCommand.ExecuteReader(); this.textBoxClients.Clear(); // Llegir les files while (maReader.Read()) { // mostrar les files en el textbox this.textBoxClients.Text += maReader["CustomerID"].ToString() + "\t\t" + maReader["ContactName"].ToString() + "\t\t"+ maReader["CompanyName"].ToString() + "\r\n"; this.textBoxClients.Refresh(); } // Tancar reader maReader.Close(); // Tancar la connexió maConnexio.Close(); } }
! Actualizar datos con DataSet " La actualización de datos se realiza con el objeto DataSet. " Cada DataSet contiene un conjunto de objetos DataTable. " Cada DataTable contiene objetos DataRow y DataColumn. que representan las filas y columnas de la tabla de la BD. " Las tablas, filas y columnas del DataSet se pueden acceder por su índice o por su nombre: Ejemplo: maDataSet.Tables["Customers"].Rows[n] " El DataSet se llena con el método Fill() de un objeto DataAdapter. " La estructura para acceder a tablas, filas y columnas en el DataSet es la siguiente:
" Ejemplo: public partial class Form1 : Form { private SqlConnection maConnexio; private SqlDataAdapter maAdapter; private DataSet maDataSet; private void Form1_Load(object sender, EventArgs e) { // Cadena de connexió maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\northwnd.mdf; Integrated Security=True;Connect Timeout=30; User Instance=True"); // Crear el DataAdapter per actualitzar les dades maAdapter = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", maConnexio); // Crear el DataSet que contindrà taules, files i columnes maDataSet = new DataSet(); // Omplir el DataSet usant la consulta prèviament definida en el DataAdapter maAdapter.Fill(maDataSet, "Clients"); // Omplir la llista amb els noms del clients OmplirLlista(); } private void OmplirLlista() { listBoxClients.Items.Clear(); for(int i=0; i=0) { textBoxNom.Text = (listBoxClients.SelectedItem).ToString(); textBoxNom.Focus(); } } private void btActualitzarNom_Click(object sender, EventArgs e) { if (textBoxNom.Text != "") { listBoxClients.Items[listBoxClients.SelectedIndex] = textBoxNom.Text; maDataSet.Tables[0].Rows[listBoxClients.SelectedIndex]["CompanyName"] = textBoxNom.Text; // actualitzar la BD maAdapter.Update(maDataSet, "Clients"); MessageBox.Show("BD Actualitzada"); textBoxNom.Clear(); } } private void btLlistarClients_Click(object sender, EventArgs e) { OmplirLlista(); }
! Relacionar tablas en el DataSet " Cada DataSet contiene la propiedad Relations que es una colección de objetos DataRelation que representan las relaciones entre las tablas del DataSet. " Ejemplo: Customers i Orders de la BD NorthWind " Para crear una relación entre dos tablas usar el método Add(, , ). ! Ejemplo: DataRelation custOrderRel= thisDataSet.Relations.Add("CustOrders", thisDataSet.Tables["Customers"].Columns["CustomerID"], thisDataSet.Tables["Orders"].Columns["CustomerID"]); " El método GetChildRows() obtiene las filas hijas a partir de una fila de la tabla padre. ! Ejemplo: customerRow.GetChildRows(custOrderRel);
public partial class ClientsOrdres : Form { private SqlConnection maConnexio; private DataSet maDataSet; private SqlDataAdapter clientsAdapter; private SqlDataAdapter ordresAdapter; private DataRelation ClientOrdreRel; private void Form1_Load(object sender, EventArgs e) { // Cadena de connexió maConnexio = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\northwnd.mdf; Integrated Security=True;Connect Timeout=30; User Instance=True"); maDataSet = new DataSet(); // DataAdapters clientsAdapter = new SqlDataAdapter("SELECT * FROM Customers", maConnexio); clientsAdapter.Fill(maDataSet, "Clients"); ordresAdapter = new SqlDataAdapter("SELECT * FROM Orders", maConnexio); ordresAdapter.Fill(maDataSet, "Ordres"); //Relació ClientOrdreRel = maDataSet.Relations.Add("ClientsOrdres", maDataSet.Tables["Clients"].Columns["CustomerID"], maDataSet.Tables["Ordres"].Columns["CustomerID"]); //carregar els clients al combobox de clients OmplirComboClients(); //mostrar les ordres del primer client DataRow RowClient = maDataSet.Tables["Clients"].Rows[0]; MostrarOrdresClient(RowClient); } private void OmplirComboClients() { comboBoxClientes.Items.Clear(); foreach (DataRow d in maDataSet.Tables["Clients"].Rows) comboBoxClientes.Items.Add(d["CompanyName"] + " - " + d["CustomerID"]); comboBoxClientes.SelectedIndex = 0; } private void MostrarOrdresClient(DataRow RowClient) { listBoxOrdenes.Items.Clear(); foreach (DataRow d in RowClient.GetChildRows(ClientOrdreRel)) { DateTime fecha = System.Convert.ToDateTime(d["OrderDate"]); listBoxOrdenes.Items.Add(d["OrderID"] + " - " + d["CustomerID"] + " - " + d["EmployeeID"] + " - " + fecha.ToShortDateString() + " - " + d["ShipVia"] + " - " + d["ShipCity"] + " - " + d["ShipCountry"]); } } private void comboBoxClientes_SelectedIndexChanged(object sender, EventArgs e) { DataRow RowClient = maDataSet.Tables["Clients"].Rows[comboBoxClientes.SelectedIndex]; MostrarOrdresClient(RowClient); } }
Creación de una BBDD con MySQL ! Crear un nuevo usuario ! Crear una nueva tabla (asociada a un esquema) ! Crear campos e insertar información ! Dar permisos al usuario creado sobre la tabla creada Creación de una BBDD con MySQL ! Crear un nuevo usuario:
Creación de una BBDD con MySQL ! Creando la tabla ‘cliente’: Creación de una BBDD con MySQL ! Insertando algunas filas:
Creación de una BBDD con MySQL ! Insertando algunas filas: Creación de una BBDD con MySQL ! Asignando permisos de acceso a la tabla al usuario ‘prova’:
Creación de una BBDD con MySQL ! Creando una aplicación e insertando el componente MySQL: Creación de una BBDD con MySQL using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using MySql.Data.MySqlClient; using MySql.Data.Types; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { MySqlConnection maConexio = null; MySqlDataAdapter maAdapter; DataSet maDataSet; // Formem la cadena de conexió string cadenaconexio = "SERVER=127.0.0.1; PORT=3306; USER=prova; PASSWORD=prova; DATABASE=test;"; // Creem la conexió try { maConexio = new MySqlConnection(cadenaconexio); } catch (Exception e) { Console.WriteLine("Hi ha algún problema en la conexió amb la base de dades:\n" + e.Message); } string select = "SELECT * FROM client"; maAdapter = new MySqlDataAdapter(select, maConexio); maDataSet = new DataSet(); maAdapter.Fill(maDataSet, "client"); // Llistat de clients int numclients = maDataSet.Tables["client"].Rows.Count; for (int i = 0; i < numclients; i++) Console.WriteLine("Nombre: " + maDataSet.Tables["client"].Rows[i]["Nombre"] + " " + "Dirección: " + maDataSet.Tables["client"].Rows[i]["Direccion"]); } } }
Creación de una BBDD con MySQL MySqlConnection maConexio = null; MySqlDataAdapter maAdapter; DataSet maDataSet; // Formem la cadena de conexió string cadenaconexio = "SERVER=127.0.0.1; PORT=3306; USER=prova; PASSWORD=prova; DATABASE=test;"; // Creem la conexió try { maConexio = new MySqlConnection(cadenaconexio); } catch (Exception e) { Console.WriteLine("Hi ha algún problema en la conexió amb la base de dades:\n" + e.Message); } string select = "SELECT * FROM client"; maAdapter = new MySqlDataAdapter(select, maConexio); maDataSet = new DataSet(); maAdapter.Fill(maDataSet, "client"); // Llistat de clients int numclients = maDataSet.Tables["client"].Rows.Count; for (int i = 0; i < numclients; i++) Console.WriteLine("Nombre: " + maDataSet.Tables["client"].Rows[i]["Nombre"] + " " + "Dirección: " + maDataSet.Tables["client"].Rows[i]["Direccion"]); Creación de una BBDD con MySQL ! Resultado de la ejecución:
También puede leer