Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la...

21
Jordi Linares i Pellicer Programació amb C# .NET Tema 5 (g): ADO.NET Í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

Transcript of Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la...

Page 1: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

Jordi Linares i Pellicer

Programació amb C# .NET

Tema 5 (g): ADO.NET

Í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

Page 2: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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

Page 3: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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.

Page 4: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! Objetos del proveedorTodos 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

! 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.

! La ventana se hace visible desde el menú Ver#Explorador de Servidores.

Page 5: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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

2

3

Page 6: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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.

Page 7: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

" 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.

Page 8: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! Definición de un origen de datos

Page 9: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

" 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:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

</configSections>

<connectionStrings>

<add name="BD_Biblioteca.Properties.Settings.BibliotecaConnectionString"

connectionString="DataSource=.\SQLEXPRESS; AttachDbFilename=&quot; I:\2007-2008 IES BATOI\DAE - C#\Projectes c# 2005\BD_Biblioteca\FITXER SQL SERVER BD BIBLIOTECA\Biblioteca.mdf&quot;;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 configuración de la cadena de conexión para la ejecución. Se puede modificar para actualizar la ruta a la BD.

Page 10: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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

Page 11: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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.

Vista Detalle

Cuadrícula(DataGrid)

EjecuciónModo diseño

Page 12: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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(); } }

Page 13: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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:

Page 14: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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();

}

" 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();

}

Page 15: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

! 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(<nombreRel>, <colPadre>, <colHija>).

! Ejemplo: DataRelation custOrderRel= thisDataSet.Relations.Add("CustOrders", thisDataSet.Tables["Customers"].Columns["CustomerID"], thisDataSet.Tables["Orders"].Columns["CustomerID"]);

" El método GetChildRows(<DataRelationObj>) obtiene las filas hijas a partir de una fila de la tabla padre.

! Ejemplo:customerRow.GetChildRows(custOrderRel);

Page 16: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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); } }

Page 17: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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:

Page 18: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

Creación de una BBDD con MySQL! Creando la tabla ‘cliente’:

Creación de una BBDD con MySQL! Insertando algunas filas:

Page 19: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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’:

Page 20: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

Creación de una BBDD con MySQL! Creando una aplicación e insertando el componente MySQL:

Creación de una BBDD con MySQLusing 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"]);

}

}

}

Page 21: Programació amb C# - users.dsic.upv.esusers.dsic.upv.es/~jlinares/csharp/Tema 5-2.pdf · "Desde la barra de herramientas Diseñador de consultas se pueden diseñar consultas SQL.

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: