Vous êtes sur la page 1sur 38

C# : ADO.

NET

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 32


Plan

1 Introduction

2 Référencement de MySQL dans un projet C#

3 CRUD avec ADO.NET

4 Restructuration du code

H & H: Research and Training 2 / 32


Introduction

ADO.NET

ADO.NET : ActiveX Data Objects

H I
Un module (ensemble de classes) dans .NET Framework. ©
UEL
O
Exposant les services d’accès et de gestion de données situées

f E LM
dans une base de données relationnelle (SQL Server, MySQL...)
ou NoSQL.
ch r e
©A
Constitué de deux composants : un premier pour la connexion et
un second pour la gestion.

H & H: Research and Training 3 / 32


Introduction

ADO.NET

Quelques classes de ADO.NET

Connection : permet d’assurer la connectivité avec une source


de données
H I ©
EL
Command : permet de définir des requêtes SQL afin de lire ou
OU
écrire de donnée, ou d’exécuter des procédures stockées...
M
fluxLtrès performant de données en
DataReader : fournit un E
provenance de lah e f
r de données.
A c source
© : utilise la requête définie dans un objet Command
DataAdapter
s afin de charger le DataSet avec des données.
DataSet : est un tableau conçu pour accueillir des données
venant d’une source de données relationnelle.

H & H: Research and Training 4 / 32


Introduction

ADO.NET

Deux modes de fonctionnement

H I ©
Mode connecté : le programme se connecte à la base de

UEL
données et effectue des opérations comme SELECT, INSERT,
UPDATE... La connexion est ensuite fermée et aucune donnée
O
f E LM
n’est donc stockée en mémoire sur le client.

ch r e
Mode déconnecté : le programme se connecte à la base de

©A
données, récupère les données et les stocker en mémoire et
referme immédiatement la connexion. Les opérations sur les
données (affichage...) ne se font qu’une fois la connexion fermée.

H & H: Research and Training 5 / 32


Introduction

ADO.NET

Pour se connecter à une base de données (autre que SQL Server ) à


partir de Visual Studio
Il faut :
H I ©
Un connecteur (MySQL Connector ici)
UEL
O
Intégrer MySQL dans Visual Studio
f E LM
ch r e
©A

H & H: Research and Training 6 / 32


Introduction

ADO.NET

Pour se connecter à une base de données (autre que SQL Server ) à


partir de Visual Studio
Il faut :
H I ©
Un connecteur (MySQL Connector ici)
UEL
O
Intégrer MySQL dans Visual Studio
f E LM
ch r e
©A
Commençons par télécharger (les installers .msi)
https://dev.mysql.com/downloads/connector/net/

https://dev.mysql.com/downloads/windows/visualstudio/1.2.html

H & H: Research and Training 6 / 32


Introduction

ADO.NET

Ensuite
H I ©
Installer les deux
UEL
O
(Re)lancer Visual Studio
f E LM
ch r e
Créer un nouveau projet C# (Application Console) nommé

©A
CoursAdoDotNet

H & H: Research and Training 7 / 32


Référencement de MySQL dans un projet C#

ADO.NET
Pour utiliser une base de données MySQL dans un projet C#, il
faut l’ajouter en tant que référence

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 8 / 32


Référencement de MySQL dans un projet C#

ADO.NET
Pour utiliser une base de données MySQL dans un projet C#, il
faut l’ajouter en tant que référence

Étapes

H I ©
EL
Dans l’Explorateur de solutions, faire un clic droit sur

OU
Références et choisir Ajouter une référence
M
Ouvrir le menu Assemblys
f E Let cliquer sur Extensions
e
chr et cocher la case correspondante
A
Chercher MySql.Data
©
Valider en cliquant sur Ok

H & H: Research and Training 8 / 32


Référencement de MySQL dans un projet C#

ADO.NET
Pour utiliser une base de données MySQL dans un projet C#, il
faut l’ajouter en tant que référence

Étapes

H I ©
EL
Dans l’Explorateur de solutions, faire un clic droit sur

OU
Références et choisir Ajouter une référence
M
Ouvrir le menu Assemblys
f E Let cliquer sur Extensions
e
chr et cocher la case correspondante
A
Chercher MySql.Data
©
Valider en cliquant sur Ok

Pour l’utiliser, il faut utiliser l’espace de noms suivant :


using MySql.Data.MySqlClient;

H & H: Research and Training 8 / 32


Référencement de MySQL dans un projet C#

ADO.NET
Avant de commencer, voici le script SQL qui permet de créer la base de
données utilisée dans ce cours

CREATE DATABASE myBase;

USE myBase;
H I ©
CREATE TABLE personne(
UEL
num INT PRIMARY KEY AUTO_INCREMENT,
O
nom VARCHAR(30),
f E LM
prenom VARCHAR(30)
);
ch r e
SHOW TABLES; ©A
INSERT INTO personne (nom, prenom) VALUES ("Wick", "John"),
("Dalton", "Jack");

SELECT * FROM personne;

H & H: Research and Training 9 / 32


CRUD avec ADO.NET

ADO.NET

Les étapes pour faire le CRUD


H I ©
Construire la chaı̂ne de connexion
UEL
O
Établir la connexion
f E LM
Préparer la commande
ch r e
©A
Exécuter la commande (et récupérer le résultat)

H & H: Research and Training 10 / 32


CRUD avec ADO.NET

ADO.NET

Construire la chaı̂ne de connexion

MySqlConnectionStringBuilder conn = new MySqlConnectionStringBuilder();


conn.Server = "localhost";
conn.UserID = "root";
conn.Password = "";
H I ©
conn.Database = "myBase";
UEL
//conn.SslMode = MySqlSslMode.None;
O
LM
conn.Port = 3306;
var connString = conn.ToString();

r e f E
ch
©A

H & H: Research and Training 11 / 32


CRUD avec ADO.NET

ADO.NET

Construire la chaı̂ne de connexion

MySqlConnectionStringBuilder conn = new MySqlConnectionStringBuilder();


conn.Server = "localhost";
conn.UserID = "root";
conn.Password = "";
H I ©
conn.Database = "myBase";
UEL
//conn.SslMode = MySqlSslMode.None;
O
LM
conn.Port = 3306;
var connString = conn.ToString();

r e f E
ch
©A
Établir la connexion

MySqlConnection mySqlConnection = new MySqlConnection(connString);


mySqlConnection.Open();

H & H: Research and Training 11 / 32


CRUD avec ADO.NET

ADO.NET

Préparer la commande

String query = "SELECT * FROM personne";


MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

H I ©
UEL
O
f E LM
ch r e
©A

H & H: Research and Training 12 / 32


CRUD avec ADO.NET

ADO.NET

Préparer la commande

String query = "SELECT * FROM personne";


MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

H I ©
U EL
O
LM
Exécuter la commande et récupérer le résultat (lecture)

r e f E
MySqlDataReader result = mySqlCommand.ExecuteReader();
while (result.Read())
ch
{
©A
Console.WriteLine("{0} {1} {2}", result[0], result[1], result
[2]);
}
result.Close();
mySqlConnection.Close();

H & H: Research and Training 12 / 32


CRUD avec ADO.NET

ADO.NET
Une deuxième solution (plus verbeuse) avec MySqlDataAdapter et DataSet

DataSet myDataSet = new DataSet();


String query = "SELECT * FROM personne";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

H I ©
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);
adapter.Fill(myDataSet, "Personne");
UEL
mySqlConnection.Close();
O
{
f E LM
foreach (DataRow row in myDataSet.Tables["Personne"].Rows)

ch r e
Console.WriteLine(row["num"] + " " + row["nom"] + " " + row

©A
["prenom"]);
}

H & H: Research and Training 13 / 32


CRUD avec ADO.NET

ADO.NET
Une deuxième solution (plus verbeuse) avec MySqlDataAdapter et DataSet

DataSet myDataSet = new DataSet();


String query = "SELECT * FROM personne";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

H I ©
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);
adapter.Fill(myDataSet, "Personne");
UEL
mySqlConnection.Close();
O
{
f E LM
foreach (DataRow row in myDataSet.Tables["Personne"].Rows)

ch r e
Console.WriteLine(row["num"] + " " + row["nom"] + " " + row

©A
["prenom"]);
}

L’espace de noms System.Data est nécessaire pour cette deuxième solution

using System.Data;

H & H: Research and Training 13 / 32


CRUD avec ADO.NET

ADO.NET

DataSet vs DataReader
DataReader : fonctionne en mode connecté.
H I ©
U
DataSet : fonctionne en mode déconnectEé. L
O
DataReader : plus rapide L M
r e f E
A chde touteconçu
DataSet : explicitement pour un accès aux données
©
indépendamment source de données (XML, Base de
données...)

H & H: Research and Training 14 / 32


CRUD avec ADO.NET

ADO.NET

Insérer une personne dans la base de données avec une requête paramétrée

H I ©
EL
String query = "INSERT INTO personne (nom, prenom) VALUES (@nom
, @prenom)";
O U
LM
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

r e f E
mySqlCommand.Parameters.AddWithValue("@nom","wick");
ch
mySqlCommand.Parameters.AddWithValue("@prenom","john");
©A
int i = mySqlCommand.ExecuteNonQuery();
Console.WriteLine($"number of added persons is {i}");

H & H: Research and Training 15 / 32


CRUD avec ADO.NET

ADO.NET

Pour récupérer la clé primaire affectée à la dernière personne insérée

H I ©
EL
String query = "INSERT INTO personne (nom, prenom) VALUES (@nom
, @prenom); select last_insert_id();";
O U
LM
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

r e f E
mySqlCommand.Parameters.AddWithValue("@nom","wick");
ch
mySqlCommand.Parameters.AddWithValue("@prenom","john");
©A
int i = i = Convert.ToInt32(mySqlCommand.ExecuteScalar());
Console.WriteLine($"Primary key of last inserted person: {i}");

H & H: Research and Training 16 / 32


CRUD avec ADO.NET

ADO.NET
Solution avec DataSet

MySqlDataAdapter adapter = new MySqlDataAdapter();


string selectQuery = "SELECT * FROM personne";
MySqlCommand mySqlCommand = new MySqlCommand(selectQuery,
mySqlConnection);
adapter.SelectCommand = mySqlCommand;
H I ©
EL
DataSet myDataSet = new DataSet();
adapter.Fill(myDataSet, "Personne");

O U
// créons un DataTable associé à la table Personne

var newRow = dataTable.NewRow();


f E LM
DataTable dataTable = myDataSet.Tables["Personne"];

newRow["num"] = personne.Num;
ch r e
©A
newRow["nom"] = personne.Nom;
newRow["prenom"] = personne.Prenom;
dataTable.Rows.Add(newRow);
// Et pour créer un objet requête
new MySqlCommandBuilder(adapter);
// appeler la méthode Update pour faire les requêtes INSERT, UPDATE et
DELETE
int i = adapter.Update(dataTable);
Console.WriteLine($"number of added persons is {i}");

H & H: Research and Training 17 / 32


CRUD avec ADO.NET

ADO.NET

Modifier une personne dans la base de données avec une requête paramétrée

String query = "UPDATE personne SET nom = @nom, prenom =


H I ©
EL
@prenom WHERE num = @num";
MySqlCommand mySqlCommand = new MySqlCommand(query,
O U
LM
mySqlConnection);

r e E
mySqlCommand.Parameters.AddWithValue("@nom","denzel");
f
mySqlCommand.Parameters.AddWithValue("@prenom","washington");
ch
mySqlCommand.Parameters.AddWithValue("@num",100);

©A
int i = mySqlCommand.ExecuteNonQuery();
Console.WriteLine($"number of updated persons is {i}");

H & H: Research and Training 18 / 32


CRUD avec ADO.NET

ADO.NET

Supprimer une personne dans la base de données avec une requête paramétrée

H I ©
MySqlCommand mySqlCommand = new MySqlCommand(query,
UEL
String query = "DELETE FROM personne WHERE num = @num";

O
LM
mySqlConnection);

r e
int i = mySqlCommand.ExecuteNonQuery();E
mySqlCommand.Parameters.AddWithValue("@num",100);
f
ch
©A
Console.WriteLine($"number of deleted persons is {i}");

H & H: Research and Training 19 / 32


Restructuration du code

ADO.NET

Organisation du code

I ©
Placer toutes les données de connexion (url, nomUtilisateur,
H
motDePasse...) dans une classe de connexion.
UEL
O
f E LM
Pour chaque table de la base de données, créer un modèle, une
classe C#, ayant comme attributs les colonnes de cette table.
r e
ch correspondant à l’accès aux données (de la
base de©
A
Placer tout le code
données) dans des nouvelles classes et interfaces qui
constitueront la couche DAO (Data Access Object).

H & H: Research and Training 20 / 32


Restructuration du code

ADO.NET
La classe MyConnection dans un répertoire Configurations

using MySql.Data.MySqlClient;

namespace CoursAdoDotNet.Configurations
{
class MyConnection
{
private static MySqlConnection mySqlConnection;
private MyConnection()
H I ©
EL
{

conn.Server = "localhost";
O U
MySqlConnectionStringBuilder conn = new MySqlConnectionStringBuilder();

LM
conn.UserID = "root";
conn.Password = "";
conn.Database = "myBase";

r e f E
conn.SslMode = MySqlSslMode.None;
conn.Port = 3306;
ch
©A
var connString = conn.ToString();
mySqlConnection = new MySqlConnection(connString);
try
{
mySqlConnection.Open();
}
catch(MySqlException e)
{
mySqlConnection = null;
Console.WriteLine(e.StackTrace);
}
}

H & H: Research and Training 21 / 32


Restructuration du code

ADO.NET
La classe MyConnection (suite)

public static MySqlConnection GetConnexion()


{
if (mySqlConnection == null) {

}
new MyConnection();
H I ©
return mySqlConnection;
UEL
}
O
public static void CloseConnection()
f E LM
{

ch r e
if (mySqlConnection != null)
{
©A mySqlConnection.Close();
mySqlConnection = null;
}
}
}
}

H & H: Research and Training 22 / 32


Restructuration du code

La classe Personne dans un répertoire Model

namespace CoursAdoDotNet.Model
{
public class Personne
{
public int Num { get; set; }
public String Nom { get; set; }
public String Prenom { get; set; }

public Personne()
{
}
H I ©
public Personne(String nom, String prenom)
U EL
{
O
LM
Nom = nom;
Prenom = prenom;
}

r e f E
ch
public Personne(int num, String nom, String prenom)

©A
{
Num = num;
Nom = nom;
Prenom = prenom;
}

public override string ToString()


{
return $"Numéro : { Num }, Nom : { Nom }, Prénom: { Prenom }";
}
}
}

H & H: Research and Training 23 / 32


Restructuration du code

ADO.NET

L’interface IPersonne dans un répertoire Dao


namespace CoursAdoDotNet.Dao
{
interface IDao<T> H I ©
{
UEL
O
T Save(T t);
T Update(T t);
f E LM
void Remove(T t);
ch r e
©A
List<T> FindAll();
T FindById(int id);
}
}

H & H: Research and Training 24 / 32


Restructuration du code

ADO.NET

Créons une classe PersonneDao dans le répertoire Dao


namespace CoursAdoDotNet.Dao H I ©
{
UEL
O
classe PersonneDao
{
f E LM
}
ch r e
}
©A

H & H: Research and Training 25 / 32


Restructuration du code

ADO.NET

Faisons hériter la classe PersonneDao de l’interface IDao


namespace CoursAdoDotNet.Dao H I ©
{
UEL
O
classe PersonneDao: IDao<Personne>
{
f E LM
}
ch r e
}
©A

H & H: Research and Training 26 / 32


Restructuration du code

Implémentons les méthodes de l’interface IDao

namespace CoursAdoDotNet.Dao
{
class PersonneDao : IDao<Personne>
{
public List<Personne> FindAll()
{
throw new NotImplementedException();
}

public Personne FindById(int id)


{
H I ©
}
throw new NotImplementedException();

UEL
O
LM
public void Remove(Personne t)
{

f E
throw new NotImplementedException();

r e
ch
}

©A
public Personne Save(Personne t)
{
throw new NotImplementedException();
}

public Personne Update(Personne t)


{
throw new NotImplementedException();
}
}
}

H & H: Research and Training 27 / 32


Restructuration du code

ADO.NET
Implémentons la méthode FindAll() dans la classe PersonneDao

namespace CoursAdoDotNet.Dao
{
public class PersonneDao : IDao<Personne>
{

public List<Personne> FindAll()


{
MySqlDataReader result = null;
H I ©
EL
List<Personne> personnes = new List<Personne>();

U
MySqlConnection mySqlConnection = MyConnection.GetConnexion();

O
LM
if (mySqlConnection != null)
{

r e f E
string query = "SELECT * FROM personne";
MySqlCommand mySqlCommand = new MySqlCommand(query, mySqlConnection);

ch
result = mySqlCommand.ExecuteReader();

©A
while (result.Read())
{
personnes.Add(new Personne(Int32.Parse(result[0].ToString()), result[1].
ToString(), result[2].ToString()));
}

result.Close();
MyConnection.CloseConnection();
return personnes;
}

H & H: Research and Training 28 / 32


Restructuration du code
Implémentons la méthode save() dans la classe PersonneDao

public Personne Save(Personne personne)


{
int i = 0;
MySqlConnection mySqlConnection = MyConnection.GetConnexion();
if (mySqlConnection != null)
{
string query = "INSERT INTO personne (nom, prenom) VALUES (@nom, @prenom);
select last_insert_id();";
MySqlCommand mySqlCommand = new MySqlCommand(query, mySqlConnection);

©
mySqlCommand.Parameters.AddWithValue("@nom", personne.Nom);

I
mySqlCommand.Parameters.AddWithValue("@prenom", personne.Prenom);

H
personne.Num = i;
U EL
i = Convert.ToInt32(mySqlCommand.ExecuteScalar());

MyConnection.CloseConnection();
O
LM
}

}
return personne;

r e f E
ch
public Personne Update(Personne t)
{

©A
throw new NotImplementedException();
}
public Personne FindById(int id)
{
throw new NotImplementedException();
}
public void Remove(Personne t)
{
throw new NotImplementedException();
}
}
}

H & H: Research and Training 29 / 32


Restructuration du code

ADO.NET

Le Main pour tester toutes ces classes

class Program
{
static void Main(string[] args)
H I ©
{
UEL
PersonneDao personneDao = new PersonneDao();
O
f E LM
Console.WriteLine(personneDao.Save(new Personne("Sy", "
Omar")));

ch r e
List<Personne> personnes = personneDao.FindAll();

©A
personnes.ForEach(Console.WriteLine);
Console.ReadKey();
}
}

H & H: Research and Training 30 / 32


Restructuration du code

ADO.NET

H I ©
Exercice 1
UEL
O
f E LM
Implémenter les méthodes Remove, Update et FindById

ch r e
©A

H & H: Research and Training 31 / 32


Restructuration du code

ADO.NET

Exercice 2
H I ©
UEL
O
Implémenter une méthode FindAllByPattern(string pattern)

f E LM
qui retourne toutes les personnes dont le nom ou le prénom contient la
chaine pattern.
ch r e
©A

H & H: Research and Training 32 / 32

Vous aimerez peut-être aussi