achref el mouelhic#: ado.net achref el mouelhi docteur de l’universite d’aix-marseille´...
TRANSCRIPT
C# : ADO.NET
Achref El Mouelhi
Docteur de l’universite d’Aix-MarseilleChercheur en programmation par contrainte (IA)
Ingenieur en genie logiciel
H & H: Research and Training 1 / 32
Plan
1 Introduction
2 Referencement de MySQL dans un projet C#
3 CRUD avec ADO.NET
4 Restructuration du code
H & H: Research and Training 2 / 32
© Achref EL MOUELHI ©
Introduction
ADO.NET
ADO.NET : ActiveX Data Objects
Un module (ensemble de classes) dans .NET Framework.
Exposant les services d’acces et de gestion de donnees situeesdans une base de donnees relationnelle (SQL Server, MySQL...)ou NoSQL.
Constitue de deux composants : un premier pour la connexion etun second pour la gestion.
H & H: Research and Training 3 / 32
© Achref EL MOUELHI ©
Introduction
ADO.NET
Quelques classes de ADO.NET
Connection : permet d’assurer la connectivite avec une sourcede donnees
Command : permet de definir des requetes SQL afin de lire ouecrire de donnee, ou d’executer des procedures stockees...
DataReader : fournit un flux tres performant de donnees enprovenance de la source de donnees.
DataAdapter : utilise la requete definie dans un objet Commands afin de charger le DataSet avec des donnees.
DataSet : est un tableau concu pour accueillir des donneesvenant d’une source de donnees relationnelle.
H & H: Research and Training 4 / 32
© Achref EL MOUELHI ©
Introduction
ADO.NET
Deux modes de fonctionnement
Mode connecte : le programme se connecte a la base dedonnees et effectue des operations comme SELECT, INSERT,UPDATE... La connexion est ensuite fermee et aucune donneen’est donc stockee en memoire sur le client.
Mode deconnecte : le programme se connecte a la base dedonnees, recupere les donnees et les stocker en memoire etreferme immediatement la connexion. Les operations sur lesdonnees (affichage...) ne se font qu’une fois la connexion fermee.
H & H: Research and Training 5 / 32
© Achref EL MOUELHI ©
Introduction
ADO.NET
Pour se connecter a une base de donnees (autre que SQL Server ) apartir de Visual Studio
Il faut :
Un connecteur (MySQL Connector ici)
Integrer MySQL dans Visual Studio
Commencons par telecharger (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
© Achref EL MOUELHI ©
Introduction
ADO.NET
Pour se connecter a une base de donnees (autre que SQL Server ) apartir de Visual Studio
Il faut :
Un connecteur (MySQL Connector ici)
Integrer MySQL dans Visual Studio
Commencons par telecharger (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
© Achref EL MOUELHI ©
Introduction
ADO.NET
Ensuite
Installer les deux
(Re)lancer Visual Studio
Creer un nouveau projet C# (Application Console) nommeCoursAdoDotNet
H & H: Research and Training 7 / 32
© Achref EL MOUELHI ©
Referencement de MySQL dans un projet C#
ADO.NET
Pour utiliser une base de donnees MySQL dans un projet C#, ilfaut l’ajouter en tant que reference
Etapes
Dans l’Explorateur de solutions, faire un clic droit surReferences et choisir Ajouter une reference
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 / 32
© Achref EL MOUELHI ©
Referencement de MySQL dans un projet C#
ADO.NET
Pour utiliser une base de donnees MySQL dans un projet C#, ilfaut l’ajouter en tant que reference
Etapes
Dans l’Explorateur de solutions, faire un clic droit surReferences et choisir Ajouter une reference
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 / 32
© Achref EL MOUELHI ©
Referencement de MySQL dans un projet C#
ADO.NET
Pour utiliser une base de donnees MySQL dans un projet C#, ilfaut l’ajouter en tant que reference
Etapes
Dans l’Explorateur de solutions, faire un clic droit surReferences et choisir Ajouter une reference
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 / 32
© Achref EL MOUELHI ©
Referencement de MySQL dans un projet C#
ADO.NET
Avant de commencer, voici le script SQL qui permet de creer la base dedonnees utilisee dans ce cours
CREATE DATABASE myBase;
USE myBase;
CREATE TABLE personne(num INT PRIMARY KEY AUTO_INCREMENT,nom VARCHAR(30),prenom VARCHAR(30));
SHOW TABLES;
INSERT INTO personne (nom, prenom) VALUES ("Wick", "John"),("Dalton", "Jack");
SELECT * FROM personne;
H & H: Research and Training 9 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Les etapes pour faire le CRUD
Construire la chaıne de connexion
Etablir la connexion
Preparer la commande
Executer la commande (et recuperer le resultat)
H & H: Research and Training 10 / 32
© Achref EL MOUELHI ©
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();
Etablir la connexion
MySqlConnection mySqlConnection = new MySqlConnection(connString);mySqlConnection.Open();
H & H: Research and Training 11 / 32
© Achref EL MOUELHI ©
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();
Etablir la connexion
MySqlConnection mySqlConnection = new MySqlConnection(connString);mySqlConnection.Open();
H & H: Research and Training 11 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Preparer la commande
String query = "SELECT * FROM personne";MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);
Executer la commande et recuperer le resultat (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 12 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Preparer la commande
String query = "SELECT * FROM personne";MySqlCommand mySqlCommand = new MySqlCommand(query,
mySqlConnection);
Executer la commande et recuperer le resultat (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 12 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NETUne deuxieme 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 necessaire pour cette deuxieme solution
using System.Data;
H & H: Research and Training 13 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NETUne deuxieme 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 necessaire pour cette deuxieme solution
using System.Data;
H & H: Research and Training 13 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
DataSet vs DataReader
DataReader : fonctionne en mode connecte.
DataSet : fonctionne en mode deconnecte.
DataReader : plus rapide
DataSet : explicitement concu pour un acces aux donneesindependamment de toute source de donnees (XML, Base dedonnees...)
H & H: Research and Training 14 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Inserer une personne dans la base de donnees avec une requete parametree
String query = "INSERT INTO personne (nom, prenom) VALUES (@nom, @prenom)";
MySqlCommand mySqlCommand = new MySqlCommand(query,mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@nom","wick");mySqlCommand.Parameters.AddWithValue("@prenom","john");int i = mySqlCommand.ExecuteNonQuery();Console.WriteLine($"number of added persons is {i}");
H & H: Research and Training 15 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Pour recuperer la cle primaire affectee a la derniere personne inseree
String query = "INSERT INTO personne (nom, prenom) VALUES (@nom, @prenom); select last_insert_id();";
MySqlCommand mySqlCommand = new MySqlCommand(query,mySqlConnection);
mySqlCommand.Parameters.AddWithValue("@nom","wick");mySqlCommand.Parameters.AddWithValue("@prenom","john");int i = i = Convert.ToInt32(mySqlCommand.ExecuteScalar());Console.WriteLine($"Primary key of last inserted person: {i}");
H & H: Research and Training 16 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NETSolution 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");// creons un DataTable associe a la table PersonneDataTable 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 creer un objet requetenew MySqlCommandBuilder(adapter);// appeler la methode Update pour faire les requetes INSERT, UPDATE et
DELETEint i = adapter.Update(dataTable);Console.WriteLine($"number of added persons is {i}");
H & H: Research and Training 17 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Modifier une personne dans la base de donnees avec une requete parametree
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 18 / 32
© Achref EL MOUELHI ©
CRUD avec ADO.NET
ADO.NET
Supprimer une personne dans la base de donnees avec une requete parametree
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 19 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Organisation du code
Placer toutes les donnees de connexion (url, nomUtilisateur,motDePasse...) dans une classe de connexion.
Pour chaque table de la base de donnees, creer un modele, uneclasse C#, ayant comme attributs les colonnes de cette table.
Placer tout le code correspondant a l’acces aux donnees (de labase de donnees) dans des nouvelles classes et interfaces quiconstitueront la couche DAO (Data Access Object).
H & H: Research and Training 20 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NETLa classe MyConnection dans un repertoire Configurations
using MySql.Data.MySqlClient;
namespace CoursAdoDotNet.Configurations{
class MyConnection{
private static MySqlConnection mySqlConnection;private MyConnection(){
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();mySqlConnection = new MySqlConnection(connString);try{
mySqlConnection.Open();}catch(MySqlException e){
mySqlConnection = null;Console.WriteLine(e.StackTrace);
}}
H & H: Research and Training 21 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
La classe MyConnection (suite)
public static MySqlConnection GetConnexion(){
if (mySqlConnection == null) {new MyConnection();
}return mySqlConnection;
}public static void CloseConnection(){
if (mySqlConnection != null){
mySqlConnection.Close();mySqlConnection = null;
}}
}}
H & H: Research and Training 22 / 32
© Achref EL MOUELHI ©
Restructuration du code
La classe Personne dans un repertoire Model
namespace CoursAdoDotNet.Model{
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;
}
public override string ToString(){
return $"Numero : { Num }, Nom : { Nom }, Prenom: { Prenom }";}
}}
H & H: Research and Training 23 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
L’interface IPersonne dans un repertoire Dao
namespace CoursAdoDotNet.Dao{
interface IDao<T>{
T Save(T t);T Update(T t);void Remove(T t);List<T> FindAll();T FindById(int id);
}}
H & H: Research and Training 24 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Creons une classe PersonneDao dans le repertoire Dao
namespace CoursAdoDotNet.Dao{
classe PersonneDao{}
}
H & H: Research and Training 25 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Faisons heriter la classe PersonneDao de l’interface IDao
namespace CoursAdoDotNet.Dao{
classe PersonneDao: IDao<Personne>{}
}
H & H: Research and Training 26 / 32
© Achref EL MOUELHI ©
Restructuration du code
Implementons les methodes de l’interface IDao
namespace CoursAdoDotNet.Dao{
class PersonneDao : IDao<Personne>{
public List<Personne> FindAll(){
throw new NotImplementedException();}
public Personne FindById(int id){
throw new NotImplementedException();}
public void Remove(Personne t){
throw new NotImplementedException();}
public Personne Save(Personne t){
throw new NotImplementedException();}
public Personne Update(Personne t){
throw new NotImplementedException();}
}}
H & H: Research and Training 27 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NETImplementons la methode FindAll() dans la classe PersonneDao
namespace CoursAdoDotNet.Dao{
public class PersonneDao : IDao<Personne>{
public List<Personne> FindAll(){
MySqlDataReader result = null;List<Personne> personnes = new List<Personne>();MySqlConnection mySqlConnection = MyConnection.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();MyConnection.CloseConnection();return personnes;
}
H & H: Research and Training 28 / 32
© Achref EL MOUELHI ©
Restructuration du code
Implementons la methode 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);mySqlCommand.Parameters.AddWithValue("@prenom", personne.Prenom);
i = Convert.ToInt32(mySqlCommand.ExecuteScalar());personne.Num = i;MyConnection.CloseConnection();
}return personne;
}public Personne Update(Personne t){
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
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Le Main pour tester toutes ces classes
class Program{static void Main(string[] args){
PersonneDao personneDao = new PersonneDao();Console.WriteLine(personneDao.Save(new Personne("Sy", "
Omar")));List<Personne> personnes = personneDao.FindAll();personnes.ForEach(Console.WriteLine);Console.ReadKey();
}}
H & H: Research and Training 30 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Exercice 1
Implementer les methodes Remove, Update et FindById
H & H: Research and Training 31 / 32
© Achref EL MOUELHI ©
Restructuration du code
ADO.NET
Exercice 2
Implementer une methode FindAllByPattern(string pattern)qui retourne toutes les personnes dont le nom ou le prenom contient lachaine pattern.
H & H: Research and Training 32 / 32