Está en la página 1de 21

Programaci amb C# .

NET

Tema 5 (g): ADO.NET


Jordi Linares i Pellicer

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
!

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.

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
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=&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
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.

Cuadrcula
(DataGrid)

Vista Detalle
Modo diseo

Ejecucin

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:

"

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

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

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
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Data;
MySql.Data.MySqlClient;
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:

También podría gustarte