NET
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
4 Restructuration du code
ADO.NET
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.
ADO.NET
ADO.NET
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.
ADO.NET
ADO.NET
https://dev.mysql.com/downloads/windows/visualstudio/1.2.html
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
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
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
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
ADO.NET
Avant de commencer, voici le script SQL qui permet de créer la base de
données utilisée dans ce cours
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");
ADO.NET
ADO.NET
r e f E
ch
©A
ADO.NET
r e f E
ch
©A
Établir la connexion
ADO.NET
Préparer la commande
H I ©
UEL
O
f E LM
ch r e
©A
ADO.NET
Préparer la commande
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();
ADO.NET
Une deuxième solution (plus verbeuse) avec MySqlDataAdapter et DataSet
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"]);
}
ADO.NET
Une deuxième solution (plus verbeuse) avec MySqlDataAdapter et DataSet
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"]);
}
using System.Data;
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...)
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}");
ADO.NET
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}");
ADO.NET
Solution avec DataSet
O U
// créons un DataTable associé à la table 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}");
ADO.NET
Modifier une personne dans la base de données avec une requête paramétrée
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}");
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}");
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).
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);
}
}
ADO.NET
La classe MyConnection (suite)
}
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;
}
}
}
}
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;
}
ADO.NET
ADO.NET
ADO.NET
namespace CoursAdoDotNet.Dao
{
class PersonneDao : IDao<Personne>
{
public List<Personne> FindAll()
{
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();
}
ADO.NET
Implémentons la méthode FindAll() dans la classe PersonneDao
namespace CoursAdoDotNet.Dao
{
public class PersonneDao : IDao<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;
}
©
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();
}
}
}
ADO.NET
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();
}
}
ADO.NET
H I ©
Exercice 1
UEL
O
f E LM
Implémenter les méthodes Remove, Update et FindById
ch r e
©A
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