Vous êtes sur la page 1sur 31

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 / 25


Plan

1 Introduction

2 Référencer MySQL dans un projet C#

3 CRUD avec ADO.NET

4 Classes connexion et DAL

H & H: Research and Training 2 / 25


Introduction

ADO.NET

ADO.NET : ActiveX Data Objects


Un module (ensemble de classes) dans .NET Framework
Exposant les services d’accès et de gestion de données situées
sur une base de données relationnelle (SQL Server, MySQL...) ou
non SQL
Constitué de deux composants : un premier pour la connexion et
un second pour la gestion

H & H: Research and Training 3 / 25


Introduction

ADO.NET

Quelques classes de ADO.NET

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


de données
Command : permet de définir des requêtes SQL afin de lire ou
écrire de donnée, ou d’exécuter des procédures stockées...
DataReader : fournit un flux très performant de données en
provenance de la source de données.
DataAdapter : utilise la requête définie dans un objet Command
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 / 25


Introduction

ADO.NET

Deux modes de fonctionnement


Mode connecté : le programme se connecte à la base de
données et effectue des opérations comme SELECT, INSERT,
UPDATE... La connexion est ensuite fermée et aucune donnée
n’est donc stockée en mémoire sur le client.
Mode déconnecté : le programme se connecte à la base de
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 / 25


Introduction

ADO.NET

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


partir de Visual Studio
Il faut :
Un connecteur (MySQL Connector ici)
Intégrer MySQL dans Visual Studio

H & H: Research and Training 6 / 25


Introduction

ADO.NET

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


partir de Visual Studio
Il faut :
Un connecteur (MySQL Connector ici)
Intégrer MySQL dans Visual Studio

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 / 25


Introduction

ADO.NET

Ensuite
Installer les deux
(Re)lancer Visual Studio
Créer un nouveau projet C# (console)

H & H: Research and Training 7 / 25


Référencer 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 & H: Research and Training 8 / 25


Référencer 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
Dans l’Explorateur de solutions, faire un clic droit sur
Références et choisir Ajouter une référence
Ouvrir le menu Assemblys et cliquer sur Extensions
Chercher MySql.Data et cocher la case correspondante
Valider en cliquant sur Ok

H & H: Research and Training 8 / 25


Référencer 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
Dans l’Explorateur de solutions, faire un clic droit sur
Références et choisir Ajouter une référence
Ouvrir le menu Assemblys et cliquer sur Extensions
Chercher MySql.Data et cocher la case correspondante
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 / 25


CRUD avec ADO.NET

ADO.NET

Les étapes pour faire le CRUD


Construire la chaı̂ne de connexion
Établir la connexion
Préparer la commande
Exécuter la commande (et récupérer le résultat)

H & H: Research and Training 9 / 25


CRUD avec ADO.NET

ADO.NET
Construire la chaı̂ne de connexion
MySqlConnectionStringBuilder conn = new
MySqlConnectionStringBuilder();
conn.Server = "localhost";
conn.UserID = "root";
conn.Password = "";
conn.Database = "myBase";
//conn.SslMode = MySqlSslMode.None;
conn.Port = 3306;
var connString = conn.ToString();

H & H: Research and Training 10 / 25


CRUD avec ADO.NET

ADO.NET
Construire la chaı̂ne de connexion
MySqlConnectionStringBuilder conn = new
MySqlConnectionStringBuilder();
conn.Server = "localhost";
conn.UserID = "root";
conn.Password = "";
conn.Database = "myBase";
//conn.SslMode = MySqlSslMode.None;
conn.Port = 3306;
var connString = conn.ToString();

Établir la connexion
MySqlConnection mySqlConnection = new
MySqlConnection(connString);
mySqlConnection.Open();
H & H: Research and Training 10 / 25
CRUD avec ADO.NET

ADO.NET
Préparer la commande
String query = "select * from personne";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

H & H: Research and Training 11 / 25


CRUD avec ADO.NET

ADO.NET
Préparer la commande
String query = "select * from personne";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);

Exécuter la commande et récupérer le résultat (lecture)


MySqlDataReader result = mySqlCommand.ExecuteReader
();
while (result.Read())
{
Console.WriteLine("{0} {1} {2}", result[0], result
[1], result[2]);
}
result.Close();
mySqlConnection.Close();
H & H: Research and Training 11 / 25
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);
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);
adapter.Fill(myDataSet, "Personne");
mySqlConnection.Close();
foreach (DataRow row in myDataSet.Tables["Personne"].Rows)
{
Console.WriteLine(row["num"] + " " + row["nom"] + " " + row
["prenom"]);
}

H & H: Research and Training 12 / 25


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);
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCommand);
adapter.Fill(myDataSet, "Personne");
mySqlConnection.Close();
foreach (DataRow row in myDataSet.Tables["Personne"].Rows)
{
Console.WriteLine(row["num"] + " " + row["nom"] + " " + row
["prenom"]);
}

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

using System.Data;

H & H: Research and Training 12 / 25


CRUD avec ADO.NET

ADO.NET

DataSet vs DataReader
DataReader : fonctionne en mode connecté.
DataSet : fonctionne en mode déconnecté.
DataReader : plus rapide
DataSet : explicitement conçu pour un accès aux données
indépendamment de toute source de données (XML, Base de
données...)

H & H: Research and Training 13 / 25


CRUD avec ADO.NET

ADO.NET

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

String query = "insert into personne (num, nom, prenom) values(


@num, @nom, @prenom)";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@nom","wick");
mySqlCommand.Parameters.AddWithValue("@prenom","john");
mySqlCommand.Parameters.AddWithValue("@num",100);
int i = mySqlCommand.ExecuteNonQuery();
Console.WriteLine($"number of added persons is {i}");

H & H: Research and Training 14 / 25


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;
DataSet myDataSet = new DataSet();
adapter.Fill(myDataSet, "Personne");
// créons un DataTable associé à la table Personne
DataTable dataTable = myDataSet.Tables["Personne"];
var newRow = dataTable.NewRow();
newRow["num"] = personne.Num;
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 15 / 25


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 = @prenom


where num = @num";
MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@nom","denzel");
mySqlCommand.Parameters.AddWithValue("@prenom","washington");
mySqlCommand.Parameters.AddWithValue("@num",100);
int i = mySqlCommand.ExecuteNonQuery();
Console.WriteLine($"number of updated persons is {i}");

H & H: Research and Training 16 / 25


CRUD avec ADO.NET

ADO.NET

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

String query = "delete from personne where num = @num";


MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@num",100);
int i = mySqlCommand.ExecuteNonQuery();
Console.WriteLine($"number of deleted persons is {i}");

H & H: Research and Training 17 / 25


Classes connexion et DAL

ADO.NET

Organisation du code

Il faut mettre toutes les données (url, nomUtilisateur,


motDePasse...) relatives à notre connexion dans une classe
connexion
Pour chaque table de la base de données, on crée un modèle,
une classe C#, ayant comme attributs les colonnes de cette table
Il faut mettre tout le code correspondant à l’accès aux données
(de la base de données) dans des nouvelles classes et interfaces
qui constitueront la couche DAL : Data Access Layer (DAO en
Java)

H & H: Research and Training 18 / 25


Classes connexion et DAL

La classe MyConnexion
using MySql.Data.MySqlClient;

namespace MyProject {
class MyConnexion {
private static MySqlConnection mySqlConnection;
private MyConnexion() {
MySqlConnectionStringBuilder conn = new
MySqlConnectionStringBuilder();
conn.Server = "localhost";
conn.UserID = "root";
conn.Password = "";
conn.Database = "jdbc";
conn.SslMode = MySqlSslMode.None;
conn.Port = 3306;
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 19 / 25


Classes connexion et DAL

ADO.NET
La classe MyConnexion (suite)

public static MySqlConnection GetConnexion() {


if (mySqlConnection == null) {
new MyConnexion();
}
return mySqlConnection;
}
public static void CloseConnection()
{
if (mySqlConnection != null)
{
mySqlConnection.Close();
mySqlConnection = null;
}
}
}
}

H & H: Research and Training 20 / 25


Classes connexion et DAL

La classe Personne dans un répertoire model


namespace MyProject
{
public class Personne
{
public int Num { get; set; }
public String Nom { get; set; }
public String Prenom { get; set; }

public Personne()
{
}
public Personne(String nom, String prenom)
{
Nom = nom;
Prenom = prenom;
}
public Personne(int num, String nom, String prenom)
{
Num = num;
Nom = nom;
Prenom = prenom;
}
}
}
H & H: Research and Training 21 / 25
Classes connexion et DAL

ADO.NET

L’interface IPersonne
namespace MyProject
{
public interface IPersonne
{
int Save(Personne personne);
int Update(Personne personne);
int Delete(int id);
List<Personne> FindAll();
Personne FindById(int id);
}
}

H & H: Research and Training 22 / 25


Classes connexion et DAL

ADO.NET
La classe PersonneRepository

namespace MyProject
{
public class PersonneRepository : IPersonne
{

public List<Personne> FindAll()


{
MySqlDataReader result = null;
List<Personne> personnes = new List<Personne>();
MySqlConnection mySqlConnection = MyConnexion.GetConnexion();

if (mySqlConnection != null)
{
String query = "select * from personne";
MySqlCommand mySqlCommand = new MySqlCommand(query, mySqlConnection);
result = mySqlCommand.ExecuteReader();
while (result.Read())
{
personnes.Add(new Personne(Int32.Parse(result[0].ToString()), result[1].
ToString(), result[2].ToString()));
}

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

H & H: Research and Training 23 / 25


Classes connexion et DAL

ADO.NET
La classe PersonneRepository (suite)

public int Save(Personne personne)


{
int i = 0;
MySqlConnection mySqlConnection = MyConnexion.GetConnexion();
if (mySqlConnection != null)
{
string query = "insert into personne values(@num, @nom,@prenom)";
MySqlCommand mySqlCommand = new MySqlCommand(query, mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@num", personne.Num);
mySqlCommand.Parameters.AddWithValue("@nom", personne.Nom);
mySqlCommand.Parameters.AddWithValue("@prenom", personne.Prenom);
i = mySqlCommand.ExecuteNonQuery();
MyConnexion.CloseConnection();
}
return i;
}
public int Update(Personne personne)
{
throw new NotImplementedException();
}
public Personne FindById(int id)
{
throw new NotImplementedException();
}
public int Delete(int id)
{
throw new NotImplementedException();
}
}
}
H & H: Research and Training 24 / 25
Classes connexion et DAL

ADO.NET

Le Main pour tester toutes ces classes

class Program
{
static void Main(string[] args)
{
PersonneRepository personneRepository = new
PersonneRepository();
List<Personne> personnes = personneRepository.FindAll();
personnes.ForEach(personne => Console.WriteLine(personne.
Nom + " " + personne.Prenom));
Console.WriteLine("Fin");
}
}

H & H: Research and Training 25 / 25

Vous aimerez peut-être aussi