Tema 5 (g): ADO.NET ndice ! Introduccin ! Qu es ADO.NET? ! Clases y Objetos de ADO.NET ! Explorador de Servidores ! Orgenes de Datos ! Interfaz Conectada a Datos ! Programar con ADO.NET Introduccin ! La mayora de las aplicaciones actuales guardan su informacin en bases de datos por lo que necesitan acceder a ellas ya sea de forma local o remota. ! La aparicin nuevas tecnologas como ADO.NET y los servicios de acceso a datos de .NET Framework han simplificado bastante la manipulacin 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 evolucin 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 actan como intermediarios entre la base de datos y la aplicacin: " SqlClient " OracleClient " OleDB " ODBC ! Objetivos de diseo de ADO.NET " Acceso simple a datos. A travs de clases fciles de usar que representan tablas, filas y columnas de la BD. " Extensibilidad para soporte a diferentes orgenes 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 electrnico. ADO.NET utiliza XML para la comunicacin entre capas. " Unificacin 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 jerrquica de los documentos XML. Clases y Objetos de ADO.NET ! Clases bsicas: ! Objetos ADO.NET " Las clases de ADO.NET estn definidas en el espacio de nombres System.Data. " Trabaja en modo desconectado: El programa no requiere una conexin persistente con la BD. " La conexin 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 conexin 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 slo lectura y slo hacia delante de un origen de datos. Ej: SqlDataReader, OdbcDataReader, " DataAdapter. Representa un conjunto de comandos SQL y una conexin al origen de datos para rellenar el objeto DataSet y actualizar los datos. Ej: SqlDataAdapter, Explorador de Servidores ! Permite abrir conexiones a datos y conectar con servidores para explorar sus bases de datos. ! Tambin permite crear nuevas bases de datos, definir tablas, acceder a su contenido, etc. ! Las conexiones se muestran en el nodo Conexiones de datos. ! Cada conexin representa un nodo que contiene: tablas, vistas, procedimientos almacenados, etc. ! La ventana se hace visible desde el men Ver#Explorador de Servidores. ! Conexin a una base de datos existente " Desde el nodo Conexiones de Datos podremos conectar a una base de datos existente: ! Creacin de una Base de Datos 1 2 3 ! Definicin de Tablas " Al cerrar el diseador se le da nombre a la nueva tabla. " La tabla creada aparece en el Explorador de servidores. ! Edicin de una tabla " Desde el explorador de servidores podremos efectuar sobre la tabla operaciones de insercin, modificacin, borrado, agrupacin, 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 edicin, los cambios son permanentes en la BD del servidor. " Desde la barra de herramientas Diseador de consultas se pueden disear consultas SQL. Orgenes de Datos ! Con el Explorador de Servidores se obtienen las cadenas de conexin a las bases de datos. ! Estas cadenas de conexin nos permitirn definir uno o ms orgenes de datos. ! Un Origen de datos es un objeto de la aplicacin que representa un conjunto de datos que residen en algn lugar (normalmente SGBDR). ! Los orgenes de datos facilitan el acceso y edicin de los datos que la aplicacin necesita. ! Mostrar la ventana orgenes de datos: Datos#Mostrar Orgenes de datos. ! Definicin de un origen de datos " Como resultado final se crea el conjunto de datos y se aade al proyecto: ! Un esquema XSD con su estructura ! Un mdulo con la clase derivada de DataSet " Durante el diseo, el fichero app.config contiene la configuracin para la cadena de conexin a la BD: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="BD_Biblioteca.Properties.Settings.BibliotecaConnectionString" connectionString="DataSource=.\SQLEXPRESS; AttachDbFilename=" I:\2007-2008 IES BATOI\DAE - C# \Projectes c# 2005\BD_Biblioteca\FITXER SQL SERVER BD BIBLIOTECA\Biblioteca.mdf";Integrated Security=True; ConnectTimeout=30;User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration> " Al compilar el proyecto se genera un fichero: <NomAplicacion>.exe.config que guarda la configuracin de la cadena de conexin para la ejecucin. Se puede modificar para actualizar la ruta a la BD. ! El diseador de conjuntos de datos " El conjunto de datos es dinmico y durante el desarrollo de la aplicacin pueden volverse a configurar desde: ! Configurar DataSet con el asistente o ! Editar DataSet con el diseador. " El Adaptador de datos acta como intermediario entre el SGBDR y el DataSet. ! Asociar elementos de interfaz a tablas y columnas " Desde orgenes 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 diseador 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 Cuadrcula mediante el uso del control DataGridView, o " Vista detalle mediante el uso de controles: Label, TextBox, ListaBox, etc. ! Desde la ventana Orgenes de datos se puede arrastrar al formulario la tabla entera o por columnas. ! El Diseador 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. Vista Detalle Cuadrcula (DataGrid) Ejecucin Modo diseo 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 actualizacin 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 mtodo Fill() de un objeto DataAdapter. " La estructura para acceder a tablas, filas y columnas en el DataSet es la siguiente: 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 prviament definida en el DataAdapter maAdapter.Fill(maDataSet, "Clients"); // Omplir la llista amb els noms del clients OmplirLlista(); } " Ejemplo: private void OmplirLlista() { listBoxClients.Items.Clear(); for(int i=0; i<maDataSet.Tables[0].Rows.Count; i++) listBoxClients.Items.Add(maDataSet.Tables[0].Rows[i]["CompanyName"]); listBoxClients.Refresh(); listBoxClients.SelectedIndex = 0; } private void listBoxClients_SelectedIndexChanged(object sender, EventArgs e) { if (listBoxClients.SelectedIndex>=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 coleccin de objetos DataRelation que representan las relaciones entre las tablas del DataSet. " Ejemplo: Customers i Orders de la BD NorthWind " Para crear una relacin entre dos tablas usar el mtodo Add(<nombreRel>, <colPadre>, <colHija>). ! Ejemplo: DataRelation custOrderRel= thisDataSet.Relations.Add("CustOrders", thisDataSet.Tables["Customers"].Columns["CustomerID"], thisDataSet.Tables["Orders"].Columns["CustomerID"]); " El mtodo GetChildRows(<DataRelationObj>) 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; }
maDataSet.Tables["Clients"].Rows[comboBoxClientes.SelectedIndex]; MostrarOrdresClient(RowClient); } } Creacin de una BBDD con MySQL ! Crear un nuevo usuario ! Crear una nueva tabla (asociada a un esquema) ! Crear campos e insertar informacin ! Dar permisos al usuario creado sobre la tabla creada Creacin de una BBDD con MySQL ! Crear un nuevo usuario: Creacin de una BBDD con MySQL ! Creando la tabla cliente: Creacin de una BBDD con MySQL ! Insertando algunas filas: Creacin de una BBDD con MySQL ! Insertando algunas filas: Creacin de una BBDD con MySQL ! Asignando permisos de acceso a la tabla al usuario prova: Creacin de una BBDD con MySQL ! Creando una aplicacin e insertando el componente MySQL: Creacin 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 algn 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"] + " " + "Direccin: " + maDataSet.Tables["client"].Rows[i]["Direccion"]); } } } Creacin 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 algn 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"] + " " + "Direccin: " + maDataSet.Tables["client"].Rows[i]["Direccion"]); Creacin de una BBDD con MySQL ! Resultado de la ejecucin: