0% ont trouvé ce document utile (0 vote)
317 vues38 pages

Cours Csharp Ado Net

Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
317 vues38 pages

Cours Csharp Ado Net

Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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