Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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:
" " " "
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 bsicas:
Objetos ADO.NET
" "
Trabaja en modo desconectado: El programa no requiere una conexin persistente con la BD. " La conexin se abre y se cierra cuando se necesita.
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
!
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. 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.
Desde el nodo Conexiones de Datos podremos conectar a una base de datos existente:
1 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.
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.
"
"
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.
"
"
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 conjunto de datos es dinmico y durante el desarrollo de la aplicacin pueden volverse a configurar desde:
! !
"
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.
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.
Cuadrcula
(DataGrid)
. . . 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(); } }
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]
"
"
"
"
{
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 prviament 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<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(); }
"
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; } 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); } }
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
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"]);
Resultado de la ejecucin: