SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexió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.
!

Definición de un origen 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:

<?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 BATOIDAE - C#
Projectes c# 2005BD_BibliotecaFITXER SQL SERVER BD
BIBLIOTECABiblioteca.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.
!

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 programaMicrosoft SQL
ServerMSSQL.1MSSQLDatanorthwnd.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() +
"tt" + maReader["ContactName"].ToString() +
"tt"+ maReader["CompanyName"].ToString() +
"rn";

}

}

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 programaMicrosoft SQL
ServerMSSQL.1MSSQLDatanorthwnd.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<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 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);
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 programaMicrosoft SQL
ServerMSSQL.1MSSQLnorthwnd.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
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 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:

Más contenido relacionado

La actualidad más candente

Chapter10 conceptual data modeling
Chapter10 conceptual data modelingChapter10 conceptual data modeling
Chapter10 conceptual data modelingDhani Ahmad
 
Tableau And Data Visualization - Get Started
Tableau And Data Visualization - Get StartedTableau And Data Visualization - Get Started
Tableau And Data Visualization - Get StartedSpotle.ai
 
Group By, Order By, and Aliases in SQL
Group By, Order By, and Aliases in SQLGroup By, Order By, and Aliases in SQL
Group By, Order By, and Aliases in SQLMSB Academy
 
Tableau interview questions www.bigclasses.com
Tableau interview questions www.bigclasses.comTableau interview questions www.bigclasses.com
Tableau interview questions www.bigclasses.combigclasses.com
 
Introduction to database & sql
Introduction to database & sqlIntroduction to database & sql
Introduction to database & sqlzahid6
 
El modelo de datos relacional (Base de Datos)
El modelo de datos relacional (Base de Datos)El modelo de datos relacional (Base de Datos)
El modelo de datos relacional (Base de Datos)Jose Carlos Guerra
 
SQL Tutorial for Beginners
SQL Tutorial for BeginnersSQL Tutorial for Beginners
SQL Tutorial for BeginnersAbdelhay Shafi
 
SQL Queries Information
SQL Queries InformationSQL Queries Information
SQL Queries InformationNishant Munjal
 
Les03 (Using Single Row Functions To Customize Output)
Les03 (Using Single Row Functions To Customize Output)Les03 (Using Single Row Functions To Customize Output)
Les03 (Using Single Row Functions To Customize Output)Achmad Solichin
 
What are Parameters in Tableau | Tableau Tutorial | Edureka
What are Parameters in Tableau | Tableau Tutorial | EdurekaWhat are Parameters in Tableau | Tableau Tutorial | Edureka
What are Parameters in Tableau | Tableau Tutorial | EdurekaEdureka!
 

La actualidad más candente (20)

Chapter10 conceptual data modeling
Chapter10 conceptual data modelingChapter10 conceptual data modeling
Chapter10 conceptual data modeling
 
Sql and Sql commands
Sql and Sql commandsSql and Sql commands
Sql and Sql commands
 
SQL
SQL SQL
SQL
 
Tableau And Data Visualization - Get Started
Tableau And Data Visualization - Get StartedTableau And Data Visualization - Get Started
Tableau And Data Visualization - Get Started
 
Group By, Order By, and Aliases in SQL
Group By, Order By, and Aliases in SQLGroup By, Order By, and Aliases in SQL
Group By, Order By, and Aliases in SQL
 
DATABASE CONSTRAINTS
DATABASE CONSTRAINTSDATABASE CONSTRAINTS
DATABASE CONSTRAINTS
 
GUI programming
GUI programmingGUI programming
GUI programming
 
Tableau interview questions www.bigclasses.com
Tableau interview questions www.bigclasses.comTableau interview questions www.bigclasses.com
Tableau interview questions www.bigclasses.com
 
Introduction to database & sql
Introduction to database & sqlIntroduction to database & sql
Introduction to database & sql
 
El modelo de datos relacional (Base de Datos)
El modelo de datos relacional (Base de Datos)El modelo de datos relacional (Base de Datos)
El modelo de datos relacional (Base de Datos)
 
Uml clase 04_uml_clases
Uml clase 04_uml_clasesUml clase 04_uml_clases
Uml clase 04_uml_clases
 
DML, DDL, DCL ,DRL/DQL and TCL Statements in SQL with Examples
DML, DDL, DCL ,DRL/DQL and TCL Statements in SQL with ExamplesDML, DDL, DCL ,DRL/DQL and TCL Statements in SQL with Examples
DML, DDL, DCL ,DRL/DQL and TCL Statements in SQL with Examples
 
SQL Tutorial for Beginners
SQL Tutorial for BeginnersSQL Tutorial for Beginners
SQL Tutorial for Beginners
 
SQL Queries Information
SQL Queries InformationSQL Queries Information
SQL Queries Information
 
DAX (Data Analysis eXpressions) from Zero to Hero
DAX (Data Analysis eXpressions) from Zero to HeroDAX (Data Analysis eXpressions) from Zero to Hero
DAX (Data Analysis eXpressions) from Zero to Hero
 
Sql server T-sql basics ppt-3
Sql server T-sql basics  ppt-3Sql server T-sql basics  ppt-3
Sql server T-sql basics ppt-3
 
Sql commands
Sql commandsSql commands
Sql commands
 
Introduction to sql
Introduction to sqlIntroduction to sql
Introduction to sql
 
Les03 (Using Single Row Functions To Customize Output)
Les03 (Using Single Row Functions To Customize Output)Les03 (Using Single Row Functions To Customize Output)
Les03 (Using Single Row Functions To Customize Output)
 
What are Parameters in Tableau | Tableau Tutorial | Edureka
What are Parameters in Tableau | Tableau Tutorial | EdurekaWhat are Parameters in Tableau | Tableau Tutorial | Edureka
What are Parameters in Tableau | Tableau Tutorial | Edureka
 

Similar a ADO.NET para acceder a bases de datos con C

Similar a ADO.NET para acceder a bases de datos con C (20)

ADO .NET
ADO .NETADO .NET
ADO .NET
 
ADO
ADOADO
ADO
 
11- Unidad 2: Aplicaciones Windows Forms- 2.3 Acceso a datos Adonet
11- Unidad 2: Aplicaciones Windows Forms- 2.3 Acceso a datos Adonet11- Unidad 2: Aplicaciones Windows Forms- 2.3 Acceso a datos Adonet
11- Unidad 2: Aplicaciones Windows Forms- 2.3 Acceso a datos Adonet
 
ADO .net
ADO .netADO .net
ADO .net
 
ADO.NET
ADO.NETADO.NET
ADO.NET
 
Ado.Net
Ado.NetAdo.Net
Ado.Net
 
Ochoa ornelas raquel_acceso a una base de datos
Ochoa ornelas raquel_acceso a una base de datosOchoa ornelas raquel_acceso a una base de datos
Ochoa ornelas raquel_acceso a una base de datos
 
11-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
11-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net11-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
11-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
 
Conexión a SQL Server con C#.NET a través de ODBC
Conexión a SQL Server con C#.NET a través de ODBCConexión a SQL Server con C#.NET a través de ODBC
Conexión a SQL Server con C#.NET a través de ODBC
 
S3 - ADO.NET
S3 - ADO.NETS3 - ADO.NET
S3 - ADO.NET
 
Proveedor act1 uni2_daw_6a
Proveedor act1 uni2_daw_6aProveedor act1 uni2_daw_6a
Proveedor act1 uni2_daw_6a
 
Active x data object ado.net
Active x data object ado.netActive x data object ado.net
Active x data object ado.net
 
Modoconexion
ModoconexionModoconexion
Modoconexion
 
visual basic .net
visual basic .netvisual basic .net
visual basic .net
 
Jdbc
JdbcJdbc
Jdbc
 
Sistema Ado.Net
Sistema Ado.NetSistema Ado.Net
Sistema Ado.Net
 
Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)
 
S3-PD1.pptx
S3-PD1.pptxS3-PD1.pptx
S3-PD1.pptx
 
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
 
Proveedores nativos
Proveedores nativosProveedores nativos
Proveedores nativos
 

Último

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 

Último (13)

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 

ADO.NET para acceder a bases de datos con C

  • 1. 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
  • 2. 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
  • 3. ! 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. "
  • 4. ! 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.
  • 5. ! 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
  • 6. ! 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. "
  • 7. " 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.
  • 8. ! Definición de un origen de datos
  • 9. " 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 BATOIDAE - C# Projectes c# 2005BD_BibliotecaFITXER SQL SERVER BD BIBLIOTECABiblioteca.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.
  • 10. ! 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
  • 11. 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
  • 12. 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 programaMicrosoft SQL ServerMSSQL.1MSSQLDatanorthwnd.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() + "tt" + maReader["ContactName"].ToString() + "tt"+ maReader["CompanyName"].ToString() + "rn"; } } this.textBoxClients.Refresh(); } // Tancar reader maReader.Close(); // Tancar la connexió maConnexio.Close();
  • 13. ! 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:
  • 14. " 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 programaMicrosoft SQL ServerMSSQL.1MSSQLDatanorthwnd.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<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(); }
  • 15. ! 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);
  • 16. 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 programaMicrosoft SQL ServerMSSQL.1MSSQLnorthwnd.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); } }
  • 17. 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:
  • 18. Creación de una BBDD con MySQL ! Creando la tabla ‘cliente’: Creación de una BBDD con MySQL ! Insertando algunas filas:
  • 19. 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’:
  • 20. Creación de una BBDD con MySQL ! Creando una aplicación e insertando el componente MySQL: Creación 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 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"]);
  • 21. 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: