Vous êtes sur la page 1sur 99

École Doctorale en Sciences Economique, Gestion et Informatique

Faculté des Sciences Économiques et de Gestion de Sfax


Département Informatique

Auditoire
2ème Licence Fondamentale en Informatique de Gestion

Environnement de développement de
Soutenance de thèse
Base de données
24 septembre 2004

Enseignante

Année Universitaire
Introduction Générale
Traitement de l’information

 L'informatique est une science du traitement de l'information

 L‟informaticien s'est intéressé aux diverses manières de pouvoir


stocker des données dans des mémoires auxiliaires autres que la
mémoire centrale

 Les données sont stockées dans des périphériques dont les supports
physiques ont évolué dans le temps

 La notion de fichier est apparue en premier : le fichier regroupe tout


d'abord des objets de même nature, des enregistrements

 Dès que la quantité de données est très importante, les fichiers


montrent leurs limites et il a fallu trouver un moyen de stocker ces
données et de les organiser d'une manière qui soit facilement
accessible Base de Données (BD)
3/99
Base de Données (BD)

 Une BD est composée de données stockées dans des mémoires de


masse sous une forme structurée, et accessibles par des
applications différentes et des utilisateurs différents.
 Une BD doit pouvoir être utilisée par plusieurs utilisateurs en "même
temps"
 La structure d‟une BD doit avoir un caractère universel :
 Il ne faut pas que cette structure soit adaptée à une application particulière,
mais qu'elle puisse être utilisable par plusieurs applications distinctes qui ont
des données communes
 Par exemple la BD des passagers d'un avion
• peut aussi servir au service de police à vérifier l'identité des
personnes interdites de séjour
• et au service des douanes pour associer des bagages aux
personnes….
4/99
Système d’Information (SI)

 Un système d'information c‟est un système informatique qui assure


 La structuration sémantique des données,
 L‟organisation des données logique et physique,
 Le partage et l'accès à de grandes quantités de données

5/99
Système de Gestion de BD : SGBD

 un SGBD (système de gestion de base de données) qui repose


essentiellement sur un système informatique composé d'une BD et
d'un réseau de postes de travail consultant ou mettant à jour les
informations contenues dans la base de données située sur un
ordinateur-serveur
 Un SGBD est un ensemble de logiciels chargés d'assurer les
fonctions minimales suivantes :
 Le maintien de la cohérence des données entre elles,
 le contrôle d'intégrité des données accédées,
 les autorisations d'accès aux données,
 les opérations classiques sur les données (consultation, insertion , modification,
suppression)

6/99
Les différents types de BD

 Bases de données relationnelles


 SQL Server
 Oracle
… Relationnelle

 XML
 EasyPhp
…
<Livre>
<Livre>
<Livre>
<titre>
<titre>
<titre>
<Auteur
<Auteur
<Auteur

7/99
Architecture du framework .NET

Offre des Langages


de développement VB.NET C++ C# JScript …

Génère un Langage
Commun après la Common Language Specification
compilation

Visual Studio.NET
ASP.NET: Web Services Windows
Offre des bibliothèques And Web Forms forms
pour les différents types
d’application ADO.NET: Data and XML
Et de base de données

Base Class Library

Cours de Programmation Orientée Objet

Offre les outils d’exécution Common Language Runtime

8/99
ADO.NET : ActiveX Data Objects

 ADO.NET est un ensemble de classes qui exposent des services


standardisés d'accès aux données

 Ces classes permettent de se connecter à des sources de données


variées et, d‟extraire, de manipuler et de mettre à jour ces données

 Une des principales caractéristiques de l‟architecture d‟ADO.NET,


est l‟intégration de deux modèles d‟accès aux données qui sont :

 Le modèle « connecté » qui est bien adapté aux applications à deux couches
traditionnelles;

 Le modèle « déconnecté » qui est destinés aux applications à multicouches


9/99
Les outils

 Framework .NET

 IDE Visual Studio

 SQL Server 2014


http://www.windows8facile.fr/telecharger-installer-sql-server-2014/

10/99
Chapitre 1 : ADO.NET
I. Présentation

II. Mode connecté

III. Mode déconnecté

IV. Gestion d’une BDR

V. Gestion d’un DataSet

VI. Liaison de données (DataSource)


I. Présentation

I.1. ADO.NET : ActiveX Data Objects


 ADO.NET est un ensemble de classes qui exposent des services
standardisés d'accès aux données.

 Ces classes permettent


 de se connecter à des sources de données variées : SQLServer, MySql,
SqlDevelopper, XML….
 d‟extraire, de manipuler et de mettre à jour ces données
 Et même de créer une Base de données

12/99
I.2. Fournisseurs de données : Data provider (Serveur)

A. Existants : plusieurs espaces de noms sont disponibles avec ADO.Net


parmi lesquels :
Espace de nom Description
Fournisseur de données spécifiques pour SQLServer V7
System.Data.SqlClient
ou supérieure
Propose un accès à des sources de données Oracle
System.Data.OracleClient
(v8.1.7 ou supérieure)
Propose des classes permettant d'accéder à la
System.Data.XML
fonctionnalité XML sous SQL Server 2000 ou supérieur

B. Autres : faciles à ajouter en ajoutant dans la Référence l‟espace de noms


spécifique au fournisseur de données parmi lesquels : (voir TP1)
Espace de nom Description
Propose des classes permettant d'accéder au serveur
MySql.Data
MySQL sous easyPhp
13/99
I.3. Mode connecté et déconnecté

 Une des principales caractéristiques de l‟architecture d‟ADO.NET,


est l‟intégration de deux modèles d‟accès aux données qui sont :
 Le modèle « connecté »
 Le modèle « déconnecté »

Mode déconnecté

Mode connecté
14/99
I.4. Vue globale du Framework .NET

15/99
I.5. Les principales classes selon le mode

 Les classes pour le mode « connecté »


Connection : pour la connexion
Command : pour les requêtes
DataReader : pour récupérer des données

 Les classes pour le mode « non connecté »


DataAdapter : pour assurer la lecture et l‟écriture d‟une BD
DataSet (DS) : pour créer la BD virtuelle
DataTable (DT) : pour créer un tableau dans DS
DataRow : pour créer une ligne dans DT
DataColumn : pour créer une colonne dans DT
CommandBuilder : pour actualiser la BD

16/99
II. Mode connecté

 L‟application client a un accès direct à la source de données


 Les objets utilisés dans ce mode sont :
1. Connection : permet d‟établir une connexion avec la source de données
2. Command : cet objet permet d‟exécuter des traitements ou de modifier /
lire des données sur la source. Il contiendra la requête SQL
3. DataReader : permet de parcourir, en lecture seule, l‟ensemble des
enregistrements récupérés par la requête. Il est créé par l‟objet Command

17/99
II.1.La notion de Data Provider

 Implémentation physique du modèle ADO <Livre>


<Livre>
<Livre>
<titre>
<titre>
 Data Provider pour MySql Server <titre>
<Auteur
<Auteur
<Auteur
MySqlConnection
MySqlCommand Relationnelle XML

MySqlDataReader
MySqlDataAdapter

 Data Provider optimisé pour SQL Server


SQLConnection
SQLCommand
SQLDataReader
SQLDataAdapter

 Pour les autres Data Provider par exemple XXX


XXXConnection
XXXCommand
XXXDataReader
XXXDataAdapter
18/99
II.2. La connexion : XXXConnection

A. Propriétés de XXXConnection
 Database : retourne le nom de la BD de cette connexion
 DataSource : retourne le nom de l‟instance du serveur connecté
 State : retourne décrit l‟état actuel de la connexion à une source de
données
 System.Data.ConnectionState.Open : si la connexion est ouverte
 System.Data.ConnectionState.Closed : si la connexion est fermée

B. Méthodes de XXXConnection
 XXXConnection(String chaineCon) : constructeur qui prend en paramétre
une chaine de connexion composée par les informations nécessaires pour
la connexion par exemple pour MySql :
 SERVER : nom du serveur
 DATABASE : nom de la base de données
 UID : nom d‟utilisateur
 PASSWORD : mot de passe
Exemple de chaine de connexion : String chaineCon="SERVER=127.0.0.1;
DATABASE=BDVentes; UID=root; PASSWORD=mypass"; 19/99
 Open() : ouvre la connexion selon les caractéristiques du constructeur
 Close() : ferme la connexion déjà ouverte
C. Remarque
 Créer une classe seule pour gérer la connexion à la BD dans l‟application
 Vérifier l‟état de la connexion qui ne peut pas être ouverte plusieurs fois
 Fermer la connexion après chaque commande (requête)
public class ConnexionVente
{ static String chaineCnx = "SERVER=127.0.0.1; DATABASE=bdVente;
uid=root; password=;";
static MySqlConnection cnx = new MySqlConnection(chaineCnx);

public static MySqlConnection GetInstance()


{ try
{ if (cnx.State != System.Data.ConnectionState.Open)
cnx.Open(); }
catch (Exception ex)
{ MessageBox.Show("Vente: Pb de connexion\n " + ex.Message); }
20/99
return cnx; }
D. Exemple de Connection

 MySql //avec easyPhp


MySqlConnection cnx;
string chaineCon = "SERVER=127.0.0.1; DATABASE=BDCommerciale;
UID=root; PASSWORD="
cnx = new MySqlConnection (chaineCon);
cnx.Open();

 SQL Server
// code de connexion SQL
SqlConnection cnx= new SqlConnection( @"Data Source= ASUS\SQLEXPRESS;
Initial Catalog=BDCommerciale; Integrated Security=True"
cnx.Open();

21/99
II.3. Les commandes : XXXCommand

 Permet d‟exécuter des requêtes de lecture ou de mise à jour


A. Propriétés de XXXCommand
 Connection : retourne la connexion de cette commande
 CommandText : retourne la chaine de la requête
B. Méthodes de XXXCommand
 XXXCommand(String requete, XXXConnection) : constructeur qui prend
en paramétre une chaine composée par une requête et la connexion
 int ExecuteNonQuery( ) : retourne nombre de lignes modifiées
 XXXDataReader ExecuteReader ( ) : peut être utilisée pour récupérer un
jeu d'enregistrement et retourne un objet XXXDataReader
Exemple :
MySqlCommand cmd ;
string strSQL = "INSERT INTO tproduit VALUES ('70009', 'impri', '20', '15')";
cmd = new MySqlCommand(strSQL, cnx) ;
int n = cmd.ExecuteNonQuery() ; //n nombre de lignes modifiées 22/99
C. Requête paramétrée : les paramètres sont précédés par @ dans
la chaine de la requête

Exemple :
string strSQL = "INSERT INTO tproduit VALUES (@ref, @des, @quat, @prix)";
MySqlCommand cmd = new MySqlCommand(strSQL, cnx) ;

//affecter les valeurs de tous les paramètres


cmd.Parameters.Add(“@ref”, p.Reference);
cmd.Parameters.Add(“@des”, p.Designation);
cmd.Parameters.Add(“@quat”, p.Quantite);
cmd.Parameters.Add(“@prix”, p.PrixAchat);
int n = cmd.ExecuteNonQuery() ; //n nombre de lignes modifiées
23/99
.
II.4.La récupération des données en lecture seule :

xxxDataReader
 Le DataReader permet de lire une table, enregistrement par
enregistrement, du début à la fin
 L‟objet DataReader serve à extraire d'une BD un flux de données en
lecture seule
 Il est créé par la méthode ExecuteReader de l'objet xxxCommand
 Le défilement des lignes se fera par en avant uniquement
 Le parcours des lignes se fait au moyen de la méthode Read()
 un DataReader charge une ligne entière en mémoire à chaque appel
de la méthode Read() : dr.Read()
 L‟accès à chaque colonne de la ligne courante par 2 méthodes :
 Le champ typé : dr.GetString(0), dr.GetInt32(1), drGetDateTime(5)….
 Le champ non typé : dr[ 0 ] ou dr.GetValue( 1 ); 24/99
A. Méthode de xxxDataReader TMedecin(cin, prenom, nom,
dateNais, adresse)
TService (nom, nbLits, chefSev#)

Méthode Exemple
bool Read() MySqlDataReader dr = cd.ExecuteReader();
Permet d‟avancer l‟objet vers la ligne suivant
et retourne false s‟il n‟y a pas une autre ligne while (dr.Read()) { …}
String GetString( int numCl) String cin=drMed.GetString(1) ;
Retourne la chaine selon le numéro de la
colonne numCl
String GetString( String nomCl) : Retourne String cin=drMed.GetString("cin") ;
la chaine selon le nom de la colonne nomCl
int GetInt32( int numCl) int x = drSer.GetInt32(1) ;
Retourne l‟entier selon le num de la Col // 1 : numéro de la colonne dans TService
int GetInt32( String nomCl) int x = drSer.GetInt32("nbLit") ; //
Retourne l‟entier selon le nom de la Col // nbLit : nom de la colonne dans TService
DateTime GetDateTime( int numCl) DateTime d1 = drMed.GetDateTime(3) ;
Retourne la date selon le num de la col // 3 : numéro de la colonne dans TMedecin
DateTime GetDateTime ( String nomCl) DateTime d2 = drMed.GetDateTime("dateNais") ;
Retourne la date selon le nom de la col // dateNais : nom de la colonne dans 25
25/99
TMedecin
B. Exemple de xxxDataReader

TMedecin(cin, prenom, nom,


MySqlCommand cd; dateNais, adresse)
string strSQL = "select * from tmedecin"; TService (nom, nbLits, chefSev#)
cd = new MySqlCommand(strSQL, cnx);
MySqlDataReader dr = cd.ExecuteReader();
List<Medecin> medecins=new List<Medecin>();
Champs
while (dr.Read())
non typé
{dgvMedecins.Rows.Add(dr[0], dr[1], dr["nom"], dr[3], dr[4]);
Medecin m=new Medecin(dr.GetString(0), dr.GetString(1), dr.GetString(“nom”),
dr.GetDateTime(3), dr.GetString(4)); //Champs typés
medecins.Add(m) ;
dr : xxxDataReader
}
cin prenom nom dateNais adresse

10111155 mohamed khemkhem 2000-01-09 Sfax


dr.Read()
26/99
III. Mode déconnecté

 L‟application client a une BD Locale (BDL) :


 Créée à partir d‟une source de données (BDS) dans le serveur
 Temporelle : en cas de l‟interruption toutes les informations perdues
 Nécessite une étape de sauvegarde

 Les objets utilisés dans ce mode sont :


1. xxxDataAdapter : permet d‟actualiser la BDS
2. DataSet : permet de représenter une BDL
3. DataTable : permet de représenter une table dans la BDL
4. DataRow : permet de représenter une ligne dans la table de la BDL
5. DataColumn : permet de représenter une colonne dans la table de la BDL
6. xxxCommandBuilder : pour mettre à jour la BD dans le serveur

27/99
III.1.Le principe de fonctionnement

BD

xxxConnexion

Update() Fill()

xxxCommandBuilder xxxDataAdapter xxxCommand

28/99
III.2. La gestion des données en lecture et écriture

xxxDataAdapter
 L‟objet xxxDataAdapter fonctionne comme un pont entre le DataSet
et les données source. Il permet de :
 peupler le DataSet Par les données issues de la source de données (SELECT)
et
 mettre à jour la base de données par les données du DataSet

29/99
A. Propriétés de xxxDataAdapter

 SelectCommand : Obtient ou définit une requête SQL sous forme de


xxxCommand pour sélectionner des enregistrements dans la BD. Cette propriété
est initialisée par le constructeur par une requête de sélection
 InsertCommand : pour ajouter des enregistrements dans la BD
 UpdateCommand : pour actualiser des enregistrements dans la BD
 DeleteCommand : pour supprimer des enregistrements dans la BD

B. Méthodes de xxxDataAdapter
 xxxDataAdapter(String requete, XXXConnexion) : elle prend en paramétre :
 une requête de selection pour le chargement d‟une table dans la BDL et
 une connection d‟une BD dans le Serveur
 int Fill(DataSet ds, String nomTable) : remplit l‟objet DataSet ds avec le résultat
de SelectCommand. Elle renvoie le nombre de lignes reçues du serveur. Une
table est ainsi ajoutée au dataset. Aucune table n‟est cependant ajoutée au dataset
si ce nombre de lignes est égal à zéro
 int Update(DataSet ds, String nomTable) : actualise la BDS par la table
nomTable du DataSet ds. Elle renvoie le nombre de lignes modifiées dans le
serveur. 30/99
III.3. La BD Locale : DataSet

 Le DataSet est une représentation en mémoire des données, ils


comprend des tables, des contraintes et des relations entre les tables
 On charge le DataSet à partir de la base de données
 Une fois chargé on peut travailler en mode déconnecté
 Pour effectuer une modification, on modifie le DataSet puis on met à jour la BD
à partir du DataSet à la fin de toutes les opérations de mise à jour
 Pour remplir un DataSet il faut une xxxConnexion puis
un xxxDataAdapter.
A. Propriétés de DataSet
 Tables : retourne la collection des tables dans la BDL
 Relations : retourne la collection des relations dans la BDL

B. Méthodes de DataSet
 DataSet( ) : constructeur qui assure le chargement d‟une BDL
31/99
Exemple

// 1- code de connexion cnx à placer ici


// 2- création de DataAdaptater
MySqlDataAdapter da;
da = new MySqlDataAdapter("select * from tmedecin", cnx);
// 3- chargement de BDL : Dataset
DataSet dsHop = new DataSet(); //création d‟une BDL
da.Fill(dsHop, “TLMedecin"); //TLMedecin c‟est la table DataTable dans BDL
// 4- fermeture de la connexion et travailler en mode déconnecté
cnx.Close();
// 5- Travail hort connexion avec BDL
// affiche le nom du premier médecin :
MessageBox.Show((string)dsHop.Tables[“TLMedecin"].Rows[0]["nom"]);

objet DataTable
32/99
objet DataRow
III.4. La table locale : DataTable

 Le DataTable est une représentation en mémoire d‟une table


A. Propriétés de DataTable
 Rows : la collection des lignes d‟une table
 Columns : la collection des colonnes d‟une table
B. Méthodes de DataTable
 DataTable(String nom) : pour créer une nouvelle table
 DataRow NewRow() : retourne une ligne de même structure que la table
 void Clear() : pour supprimer toutes les lignes de la table
Exemple : Remplir ListBox listeMed pour afficher prénom et nom des médecins
DataTable dtMedecin=dsHop.Tables["TLMedecin"]; //dsHop : DataSet
for(int i=0; i<dtMedecin.Rows.Count; i++) //pour parcourir les lignes
{
listeMed.Items.Add("Dr."+dtMedecin.Rows[ i ][“prenom”]+” “+ dtMedecin.Rows[ i ][“2”]
)
} Nom de la colonne Numéro de la colonne
33/99
dans TLMedecin dans TLMedecin
III.5. La ligne de la table locale : DataRow

 DataRow assure la représentation d‟une ligne dans une DataTable


 Les étapes de création d‟une ligne de DataTable :
1- Choisir la table DataTable qui existe dans DataSet
2- Créer une ligne vide comme la table choisie
3- Remplir les clonnes de la ligne, en précisant le numéro ou le nom de clonne
entre deux crochets : ligne[0] ou ligne[“nom”]
4- Ajouter la ligne remplie dans la collection des lignes de la table

Exemple :
DataTable dtService=dsHop.Tables["TLService"]; //dsHop : DataSet
DataRow ligneSer=dtService.NewRow() //Créer une ligne vide comme table dtService
ligneSer["nom"] = txtNom.Text; //on utilise nom de la colonne dans TLService
ligneSer[1] = txtNbreLits.Text; //on utilise numéro de la colonne dans TLService
ligneSer[2] = cbMedecins.Text;
dtService.Rows.Add(ligneSer); //Ajouter ligne remplie dans la table
//ou : dsHop.Tables["TLService"].Rows.Add(ligneSer);
34/99
III.6. Transformer DataTable en Collection
Il faut parcourir les lignes de DataTable, ensuite lire colonne par colonne
 Le parcours des lignes se fait par boucle :
foreach(DataRow ligne in dt.Rows)
 L‟accès à chaque colonne de la ligne courante par 2 méthodes :
 Le cellule typée : ligne.Field<String>("cin") //nom de la colonne
ligne.Field<DateTime>(3) //numéro de la colonne
 Le cellule non typée : ligne[ 0 ];
da.Fill(dsHop, “TLMedecin"); Medecin med; //2éme méthode les cellules typéés

dtMed = dsHop.Tables[" TLMedecin"]; foreach (DataRow ligne in dtMedecin.Rows)


foreach (DataRow ligne in dtMed.Rows) {m = new Medecin(ligne.Field<String>("cin"),
{med= new Medecin(ligne[0].ToString(), ligne.Field<String>("prenom"),
ligne[1].ToString(), ligne[2].ToString(), ligne.Field<String>("nom"),
Convert.ToDateTime(ligne[3].ToString()), ligne.Field<DateTime>(3),
ligne[4].ToString()); medecins.Add(med); ligne.Field<String>(4)); medecins.Add(m);}
35/99
}
III.7. La mise à jour de la BD Serveur :

xxxCommandBuilder
 xxxCommandBuilder assure la génération automatique des requêtes
(Command) de mise à jour de xxxDataAdapter
 Elle construit les commandes InsertCommand, UpdateCommand et
DeleteCommand à partir de la commande SelecteCommand

 Mise à jour de BDS à partir d‟une table DataTable :


1- Vérifier SelectCommand de DataAdapter
2- Instancier xxxCommandBuilder avec DataAdapter en paramétre
3- Appeler la méthode Update de DataAdapter

Exemple :
da.SelectCommand.CommandText = "select* from tservice"; //da : DataAdapter
MySqlCommandBuilder cmdBui = new MySqlCommandBuilder(da);
int n=da.Update(dsHop,"TLService"); //n : nombre de lignes modifiées 36/99
IV. Gestion d’une BDR

 Création d‟une BD

 Choisir mode de connexion

 Offrir les fonctionnalités possibles selon le domaine traité


1. Ajouter un objet ou une relation

2. Modifier un objet ou une relation

3. Supprimer un objet ou une relation

4. Chercher un objet ou une relation

5. Chercher tous les objets avec ses relations

37/99
Choisir mode de connexion

3’
TMedecin(cin, prenom, nom,
dateNais, adresse)
2’
TService (nom, nbLits,
1’ chefSev#)

Affectation_service(cinMed#,
nomServ#, debut, fin)

3
1
2
4 4

1
38/99
Scénario en mode connecté : Cas nouveau Service

: Utilisateur : IHM Service : ControlleurService tous : Service

1. Saisir(nom, nbLit, medCef)

2. AjouterService( S )
2.1. Add( S )
2.1.1. AffServs : FindAll( )

If(AffServs.contains( S ))
2.1.2. Afficher(« Service existe déjà») Nouveau :
Service

else
2.1.3. Add( S )
2.1.4. Actualiser( S )

2.1.5. Afficher(«Service ajouté»)

39/99
Scénario en mode déconnecté : Cas nouveau Service

: DataSet Hopital
: Utilisateur : IHM ServiceMDC : ControlleurServiceMDC

1. Saisir(nom, nbLit, medCef)

2. AjouterService ( S )
2.1. Add( S )
2.1.1. AffServs : FindAll( )

If(AffServs.contains( S ))
2.2. Afficher(« Service existe déjà»)

else 2.3.1. Add( S ) Nouveau :


2.3.2. Actualiser( S ) AffectationService
2.3.3. Afficher(«Service ajouté»)

3. EnregistrerService( ) 3.1. EnregistrerService( ) 3.1.1. Update( «tservice» )


3.3.1.1. Update( «tservice» )
40/99
Cas AffecationService

41/99
Scénario en mode connecté : Cas AffecationService

: IHM : Controlleur tous :


:Utilisateur FAffectationService AffectationService AffectationService

1. Saisir(service,
medecin, debut,fin)

2. AjouterAffectation(AS)
2.1. Add(AS)
2.1.1. AffServs : FindToMedl(AS.medecin)

If(As.debut< AffServs [ i ].fin)


2.2.1. Afficher(« Médecin déjà affecté » ) Nouveau :
AffectationService

else
2.2.2. Add( AS )

42/99
V. La gestion d’un DataSet

 La structure d‟un DataSet est très proche de celle d‟une base de données
relationnelle
 un Dataset est constitué d‟une hiérarchie de classes représentant des
tables (DataTable), des lignes (DataRow), des colonnes (DataColumn),
des contraintes (Constraint) et même des relations (Relation)

43/99
V.1. Création du DataSet

 Déclarer et instancier un objet DataSet


//using System.Data;
private DataSet ds=new DataSet();

V.2. Ajouter une table au DataSet


 Ouvrir la connexion
 cnx.Open(); //
 Écrire une requête SQL de sélection
String req= "select * from tmedecin";
 Déclarer et instancier un objet xxxDataAdapter
//using MySql.Data.MySqlCliet;
private MySqlDataAdapter da=new MySqlDataAdapter(req); //requête de sélection
 Charger une table dans la BDV en utilisant DataAdapter
nom_Dadapter.Fill(nom_DataSet, "nom_table_virtuelle");
Exemple : da.Fill(ds, "TVMedecin"); //using 44/99
V.3. Ajouter d’autres tables au DataSet

 Modifier la requête SQL de sélection de la commande de


DataAdapter
nom_Dadapter.SelectCommand.CommandText= "select * from tservice"
 Charger une autre table dans la BDV en utilisant DataAdapter
nom_Dadapter.Fill(nomDataSet, "nomTableVirtuelle2");
da.Fill(ds, "TVService");

V.4. Vérifier la table n’est pas vide


 DataTable nomTable = nomDataSet.Tables[ "nomTableVirtuelle" ];
 int nbLigne= nomTable.Rows.Count; //retourne nbre de ligne de la table

45/99
L‟architecture de l‟application en mode connecté

<<Table>>
Service DAO
nom : varchar(20)

<<Table>>
naissance : DATE ConnexionHopital ServiceDAO
TMedecin
cin : varchar(8) chainCnx : String MedecinDAO
cin : String
nom : varchar(20) cnx : MySqlConnection nom : String
BDHopital936 cnx : MySqlConnection
prenom : varchar(20) prenom : String
getInstance() : MySqlConnection +Add(m : Medecin)
dateNais : DATE naissance : DATE
adresse : varchar(20) +Delete(m : Medecin)
Close() : void +FindAll() : List<Medecin>
+Update(Personne p)

Metier
Vue Controller
Service
Medecin
cin : String FService ServiceController
nom : String
cin :prenom
String : String FMedecin MedecinController
nomnaissance
: String : DATE
prenom : String +btnAjouter_Click(,) +medecins : List<Medecin>
dateNais : DATE
adresse : String FindAll() : List<Medecin>
Find( cin : String) : Medecin
46 46/99
L‟architecture de l‟application en mode déconnecté

DAO

ConnexionHopital HopitalDAO
chainCnx : String
cnx : MySqlConnection cnx : MySqlConnection
getInstance() : MySqlConnection dsHop : DataSet
Close() : void
+FindMedecins() : List<Medecin>
+SaveMedecins() : void
Controller
+FindServices() : List<Service>
+SaveServices() : void ServiceController
MedecinController
+medecins : List<Medecin>

FindAll() : List<Medecin>
Find( cin : String) : Medecin
47 47/99
VI. Liaisons de données

 Plusieurs composants visuels présentent une propriété DataSource


qui permet d‟associer directement une source de données au
composant

 Les données en question peuvent provenir


 D‟une base de données : résultat de requête SQL sous forme de DataTable
 D‟un tableau : String [ ], Etudiant [ ]
 Ou d‟une collection (conteneur d‟objet) : List<>, ArrayList…

 L‟initialisation des composants visuels à partir de ces données, en


utilisant les propriétés Text ou Items, selon le composant

 Les techniques de liaison de données présentent l‟avantage d‟être


automatiques
48/99
VI.1. Liaison avec DataGridView

Gérer les données proviennent de la mémoire et non d‟une BD, en


utilisant la propriété DataSouce
 Remplir la grille à partir d‟un  Remplir la grille à partir d‟une
DataTable collection
 Avec des colonnes : possibilité de  Les colonnes proviennent des
définir des colonnes en cours propriétés publiques de la
d‟exécution classe affectée dans la
 Les lignes possibilité d‟ajout et de collection
suppression à n‟importe quel  La grille est en lecture seule
moment Pour trier selon cette colonne

Pour ajouter
une new Row 49/99
Exemple de Chargement de DataGridView

MySqlDataAdapter da;
DataSet dsHop = new DataSet();
DataTable dtSer, dtMed;
List<Medecin> medecins = new List<Medecin>();

Avec DataTable Avec une Collection


da.SelectCommand.CommandText= "select * from tmedecin";
da = new MySqlDataAdapter("select
da.Fill(dsHop, “TLMedecin");
* from tservice", cnx)
dtMed = dsHop.Tables[" TLMedecin"];
da.Fill(dsHop, “TLService");
foreach (DataRow ligne in dtMed.Rows)
dtSer = dsHop.Tables[" { Medecin med = new Medecin(ligne[0].ToString(),
TLService"]; ligne[1].ToString(), ligne[2].ToString(),

dgvServices.DataSource = dtSer; Convert.ToDateTime(ligne[3].ToString()),


ligne[4].ToString());
medecins.Add(med); }
dgvMedecins.DataSource = dtMed ; 50/99
VI.2. Liaison avec boîte de liste ou boîte combo

 Les boîtes de liste peuvent être peupler par un DataTable ou


Collection, les propriétés suivantes assure la manipulation :
 DataSource : objet qui représente la source de données qui peut être un
tableau, une collection ou un DataTable
 DisplayMember : nom du champ (Propriété ou nom de colonne), qui sera
inserer dans la boite de liste, il doit s‟agir d‟une
 ValueMember : le nom du champ à utiliser comme valeur réelle pour les
éléments

cbMedecins.DataSource = dtMed;
cbMedecins.DataSource = dtMed;
ou
cbMedecins.DisplayMember = "nom";
cbMedecins.DataSource = medecins;

51/99
Exercice

 Ecrire la méthode Load de cette fenêtre qui


 Charge dans DataSet les médecins et les services
 Transforme les DataTables Sous forme de collection
 Charger cbMedcins et dgvServices comme la figure suivante

52/99
Chapitre 2 : LINQ
Language-INtegrated Query
1. Présentation

2. Nouveaux concepts utiles

3. Syntaxe générale

4. Commandes avancées
Introduction (besoin de LINQ)

 Manipuler plusieurs données de différents types et de sources de


données différentes (collection, table…)
 Chercher les produits commandés par les clients de Gabes
 Chercher les clients qui ont des factures non livrées
 Afficher les mêmes données de différentes façons
 Afficher Nom et prénom des médecins de Touzeur
 Afficher Cin, Nom et prénom des médecins qui vont sortir en retraite
 Trier les données selon des critères différents
 Afficher les médecins par ordre décroissant
 Afficher les médecins selon leur grade

1- Utiliser des requêtes SQL Compliquées sous forme de chaine de


caractères (sans compilation)
2- Utiliser des requêtes SQL de sélections simples ensuite utiliser
des boucles imbriquéesEnvironnement
et compliquées
de développement de BD
54/99
I. Présentation

 LINQ est un nouveau procédé du mapping O/R (ORM : Object


Relational Mapper)

 Il s'agit d'un ensemble de classes et de méthodes permettant de


requêter des objets et des sources de données au sens large un peu
à la manière de SQL directement dans le code .Net.

 LINQ permet de requêter des bases de données, mais également


des objets, des collections, des fichiers XML, des datasets...

 C‟est un SQL totalement objet qui s‟adapte à différents contextes,


dont les bases de données mais pas seulement :
 LINQ to Objects : Collection (List<T>, ArrayList)
 LINQ to ADO.NET : DataSet, SQL, Entities
 LINQ to XML
55/99
I.1.LINQ dans le FrameWork .Net

 Requêtage integré au langage C# (ou VB)


 Langage de requêtes .NET 3.5

56/99
I.2.Langage de requête unifié pour le développeur

57/99
I.3.LINQ : Language-Integrated Query

 Syntaxe proche de SQL, mais, l'ordre des opérateurs est quasiment


inverse par rapport à SQL
 La requête LINQ commence par from et l'on termine par select :
Ce n'est pas pour embêter le développeur mais entre autre pour
pouvoir bénéficier de l'IntelliSense lors de l'écriture d'une requête

from …X.. in …collection.. from m in medecins


where …condition... where m.Adresse.Equals("Sfax")
select …X….. ;//qque Propriétés de X select m.Nom ;

 La validité d‟une requête et la vérification des types sont établis lors


de la phase de compilation du code.
 Les fautes de frappe et les erreurs syntaxiques seront donc
détectées par le compilateur, ce qui représente un avantage certain
par rapport aux accès Sql ou Xml qui ne révèleront leurs erreurs
qu‟à l‟exécution 58/99
II. Nouveaux concepts utiles

II.1. Déclarer une variable avec var

 Le mot-clé var permet de déclarer une variable typée


 Le type est déterminé automatiquement par le compilateur grâce au
type de la valeur qui est affecté
 L‟affectation doit forcément avoir lieu au moment de la déclaration de
la variable : var monEntier = 10;
 Après l‟initialisation, le compilateur vérifie si les affectations
ultérieures sont correctes :
monEntier = 125; //Correct
monEntier = „c‟ ; //Erreur de compilation car elle est de type int
Remarque : on évite d‟utiliser le mot-clé var car cela rend le code plus
difficile à comprendre (connaître immédiatement le type).
59/99
II.2. IEnumerable

 Le framework .NET dans sa version 3 propose une interface


générique IEnumerable pour représenter toute donnée susceptible
de faire l‟objet d‟une requête ou d‟une manipulation propre aux
données.
 La collection qui implémente IEnumerable peut être balayée par
foreach mais aussi par un énumérateur (toujours en lecture
uniquement)
 IEnumerable étant repris en interface des collections, tout objet
List<T> est un IEnumerable<T>
 IEnumerable ne comprenant pas de méthode d‟ajout ou de
modification de cellule, il est impossible d‟insérer dans une telle
collection un objet incompatible (un seul type T)

60/99
 Implémenter IEnumerable signifie posséder les extensions de
méthode nécessaires à Linq pour assurer le bon déroulement de
requêtes écrites avec la syntaxe vue précédemment

 Les collections et DataTable ont la méthode AsEnumerable() qui doit


retourner un objet capable de parcourir les éléments de la collection
61/99
un à un.
II.3.Type anonyme

 C# version 3 permet de construire une classe sans devoir donner un nom à


la classe
 Ecrire rapidement une classe sans méthodes
 Le typage anonyme permet de créer une variable sans en spécifier le type
ni l‟appel explicite au constructeur

Syntaxe : new { [name1 =] expr1, …,[namen =] exprn};


namen ne peut être typé  Inféré par le type de l’expression exprn

Exemple :

Medecin p = new Medecin("333","Semi","Salem", new DateTime(1999,3,3), "Sfax");


var monTypeAnonyme = new { p.Nom, p.Age };

62/99
III. Syntaxe générale

 Une requête correctement formulée doit


 commencer par une clause from et
 se terminer par une clause select ou une clause group
 La clause from indique quels types d‟objets vont être interrogés et
ceux-ci doivent implémenter l‟interface IEnumerable représentant
une collection de données générique susceptible de faire l‟objet
d‟une requête.
Le résultat Pas de
fonctionne boucle ?
dans foreach !!!
Une syntaxe
familière…
IEnumerable<string> medSfax = from m in medecins
where m.Adresse.Equals(“Sfax“)
select m.Nom + “ “+ m.Prenom;

On cherche Nom et prénom des médecins de la ville de Sfax


63/99
III.1. Recherche dans une collection

 Le résultat est une collection d‟un type déjà défini


IEnumerable<DateTime> medSfax = from m in medecins
where m.Adresse.Equals(“Sfax“)
select m.DateNaissance ;

IEnumerable<Medecin> medSfax = from m in medecins


where m.Adresse.Equals(“Sfax“)
select m ;

 Le résultat est une collection d’un type anonyme


var medSfax = from m in medecins
where m.Adresse.Equals(“Sfax“)
select new {Dr= m.Nom + “ “+ m.Prenom, Nais=m.DateNaissance };
dgvResultat.DataSource = medSfax.ToList();
//parcourir une collection en utilisant
//une propriété du type anonyme
foreach (var s in medSfax)
cbResultat.Items.Add(s.Dr); 64/99
III.2. Recherche dans un DataTable

 Pour parcourir les lignes (Rows) d‟un tableau (DataTable), il faut


appeler la méthode AsEnumerable()

DataTable dtMed = HopitatDAO.bdHopital.Tables["TVMedecin"] ;


IEnumerable<DataRow> lignes = dtMed. AsEnumerable() ;

 Pour utiliser les colonnes d‟une ligne (DataRow), il faut appeler la


méthode Field<T>("nomColonne") : qui fournit un accès fortement
typé à chacune des valeurs de colonne dans la ligne spécifiée
foreach (DataRow lig in dtMed.Rows)
{ String prenom = lig.Field<String>("prenom") ;
DataTime nais = lig.Field<DateTime>("dateNaissance") ;
}
65/99
 Le résultat est une collection d‟un type déjà défini

IEnumerable<string> medSfax = from row in dtMed.AsEnumerable()


where row.Field<String>("adresse") .Equals(“Sfax“)
select row.Field<String>("nom") + “ “+row.Field<String>("prenom") ;

 Le résultat est une collection d‟un type anonyme


var medSfax = from row in dtMed.AsEnumerable()
where row.Field<String>("adresse") .Equals(“Sfax“)
select new {Prenom= row.Field<String>("prenom"), Nom=row.Field<String>("nom") };
dgvResultat.DataSource = medSfax.ToList();

66/99
Exercice

 Afficher les services en précisant leur nom et avec le nom et prénom


de leur chef

67/99
Solution

DataTable dtSer = HopitalDAO2018.dsHopital.Tables["TVService"];


if (dtSer == null)
dtSer = HopitalDAO2018.ChargerAffectationService();

DataTable dtMed = HopitalDAO2018.dsHopital.Tables["TVMedecin"];


if (dtMed == null)
dtMed = HopitalDAO2018.ChargerMedecin();

var res = from s in dtServ.AsEnumerable()


from m in dtMed.AsEnumerable()
where s.Field<String>("chefSev").Equals(m.Field<String>("cin"))
select new {Service = s.Field<String>("nom"),
Chef = m.Field<String>("Nom") + " " + m.Field<String>("prenom")
};

dgvResultat.DataSource = res.ToList();

68/99
IV. Commandes avancées

IV.1.Liste des clauses obligatoires

 Obligatoires Elément courant


de l‟itérateur
 1ère From Collections à
requêter
from c in customers …

 Dernière Select ou Group by

… select c.CompanyName; … group c by c.CompanyName;

Retourne une collection Choix des


paramétrée par le type valeurs
sélectionné sélectionnés

69/99
IV.2.Liste des clauses facultatives

 Facultatives
 From  0...n en plus
 Where (filtre)  1
where expression
 Join (regroupement)  0…n
join var in queryable on jointure_expression
 OrderBy (trie)  0…n
orderby var.property (ascending | descending)
 Into (stockage intermédiaire)  0…n
• select, group by et join
• From intermédiaire
into var
 Et bien d‟autre encore…

70/99
IV.3. Les opérateurs

 Opération sur un (sous-)ensemble de données


 Avec sélecteur de champs
 Count
 Sum
 Min/Max
 Average
 Avec comparateur
 Distinct
 Union
 Exept
 Intersect

71/99
V. Domaine : Location des bus

 Bus : immat, marque, dateAchat, capacite, prixAchat, prixJour


 Location : dateLoc, montant, client

Quand il faut réduire la location


d’un bus ?
Normalement, si nous avons
collecté son prix achat, il faut
faire une réduction de 100dt

72/99
Comment Gérer les Locations des Bus ?

1. Historique: persistance des données 2.Traitement : vérifier la somme


Langage SQL Langage C#

 Bus (matricule, marque, dateAchat,


Bus Location
capacite, prixAchat, prixLocJour)
immat
marque dateLoc
 Location (dateLoc, matriculeBus#, dateAchat montant
montant, client) capacite client
prixAchat bus : Bus
prixLocJour
locations : List<Location>

Les méthodes dépendent des


besoins de l’utilisateur (voir73A, B 73/99
et C)
3.Transformer : Objet / 4. Interface utilisateur : conviviale
Relationnel
 Acteurs : Secrétaire & Chef
 Besoin de la secrétaire :
A. Gérer les locations
 Besoin du Chef :
B. Gérer les Bus
C. Gérer les statistiques

74/99
A. Gérer les locations
Les méthodes nécessaires

Bus Location
immat
marque dateLoc
capacite
dateAchat
montant
prixAchat
client
bus : Bus
prixLocJour
locations : List<Location>
Location(dateLoc,nbr
Bus (matricule, marque, eJour, prixLoc, client)
dateAchat, nbrePlaces,
prixAchat, prixLocJour) //obligatoire
//optionnelle setBus(bus)
setLocation( List<Location>) //ou
Location(dateLoc,nbr
eJour, prixLoc, client,
bus)
75/99
Comment aider secrétaire et trouver les bus
disponibles ?

76/99
B. Gérer les bus
Les méthodes nécessaires

Bus Location
immat
marque dateLoc
dateAchat
montant
capacite
client
prixAchat
bus : Bus
prixLocJour
locations : List<Location>

Bus (matricule, marque,


dateAchat, nbrePlaces, Location(dateLoc,
prixAchat, prixLocJour)
montant, client)
//obligatoire
set(Location( List<Location>) //optionnelle
setBus(bus)

77/99
Chapitre 3 : Entity Framework
I. Présentation

II. Principe de EF

III. Différentes approches

IV. Code First

V. Database First

VI. Model First


I. Présentation

I.1. Object Relation Mapping : ORM

« Un mapping objet-relationnel (en anglais object-relational


mapping ou ORM) est une technique de programmation informatique
qui crée l'illusion d'une BD orientée objet à partir d'une BD
relationnelle en définissant des correspondances entre cette base de
données et les objets du langage utilisé. relationnel ».
[https://fr.wikipedia.org/wiki/Mapping_objet-relationnel]

 Entity Framework est ORM officiel de .NET Framework, développe


par Microsoft en utilisant le langage C#
 Autres ORM pour C# : NHibernate et PetaPOCO qui sont inspirés
par certains concepts java comme JavaBean
79/99
I.2. Entity Framework : EF

 Un programme informatique qui joue le rôle d‟un traducteur entre le


monde relationnel et le monde objet

 L‟objectif est de ne plus écrire des requêtes SQL dans les classes

 Dans les ORM, il y a deux composants :


 Les entités (des classes à implémenter par le développeur) : qui
représentent certaines tables.

Dans le cas EF : des classes décorées [annotées]

 Le gestionnaire d’entités (une classe qui existe déjà) : à utiliser pour


persister les entités dans la base de données
Dans le cas EF : Linq to Entities
80/99
I.3. Fonctionnalités d‟Entity Framework

Application

Create

Read
Update

Delete

81/99
I.4. Intégration de EF : utiliser NuGet

 Pour intégrer Entity Framework dans le projet, on utilise NuGet :


 Un gestionnaire de paquets, pour .NET Framework

 Open-source et gratuit

 inclus dans Visual Studio depuis 2012

 À partir de l‟Entity Framework version 4.1, l‟Entity Framework ne fait


pas partie du .NET Framework, mais repose sur le .NET

 Pour obtenir la version la plus récente de l‟Entity Framework, utilisez


le package « Entity Framework » NuGet

82/99
I.5. Utiliser NuGet pour référencer EF dans un projet

 Un clic droit sur Références dans l’Explorateur de solution


 Choisir Gérer les packages NuGet
 Aller dans l‟onglet Parcourir et chercher Entity Framework
 Choisir la dernière version stable et installer
 Accepter, attendre la fin de l‟installation et aller vérifier dans la rubrique
Références l‟ajout des packages relatifs à Entity Framework

83/99
II. Principe de EF

84/99
II.1. Entity Data Model(EDM)

 L‟Entity Data Model (EDM) est l‟élément centrale de l‟EF

 Il représente le modèle de données du coté applicatif. Celui-ci peut-


être complètement différent du modèle de la base de données.

 Il reflète les besoins de l‟application plutôt que ceux de la base de


données. Classes, type de données différentes, etc.

85/99
II.2. Assistant EDM

offre des méthodes qui dépendent de


l‟approche choisie (voir III.)

 Crée un modèle dans EF Designer basé sur une BD existante. Sélectionnez la


connexion de base de données, les paramètres du modèle et les objets de base de
données à inclure dans le modèle. Les classes avec lesquelles votre application va
interagir sont générées à partir du modèle.
 Crée un modèle vide dans EF Designer comme point de départ pour concevoir
visuellement un modèle. Vous pouvez par la suite générer une base de données
à partir de votre modèle. Les classes avec lesquelles votre application va interagir
sont générées à partir du modèle.
 Crée un modèle Code First vide comme point de départ pour concevoir un modèle
à l'aide de code. Vous pouvez par la suite générer une BD à partir de votre
modèle.
 Crée un modèle Code First basé sur une BD existante. Sélectionnez la
connexion de base de données, les paramètres du modèle et les objets de BD à
inclure dans le modèle. 86/99
II.3. Composition de l‟EDM

Trois fichiers XML :


 Modèle conceptuel : syntaxe CSDL au format XML (Conceptual Schema Definition
Language) qui définit les entités et les associations entre elles. Il décrit les classes
utilisées dans l‟application pour accéder et gérer les données.

 Modèle logique : syntaxe SSDL (Store Schema Definition Language). Il définit les
tables et l‟ensemble des contraintes sur ces tables. Il présente ainsi une vue de la base
de données.

 Schéma de liaison : syntaxe MSL (Mapping Specification Language) qui permet de


faire le lien entre les 2 modèles précédents. Il réalise alors les opérations de mapping.

L'assistant de modèle EDM génère les 3 schémas du modèle EDM et les


insère en tant que ressource dans l'assembly du projet. C'est pour cela que la
chaine de connexion fait référence à des fichiers ressources.
87/99
III. Les différentes approches

 Code First : on crée les entités puis et Visual Studio génère la base
de données

 Database First : on crée la base de données (ou on a une base de


données qui existe déjà) et Visual Studio génère nos entités à partir
de cette base de données

 Model First : on crée notre modèle (de classe) et Visual Studio


génère la base de données et les entités correspondantes

88/99
III.1.Comment choisir son approche ?

Quand vous démarrez un projet, vous allez souvent vous poser


beaucoup de questions. Les principales questions :

 Est-ce qu‟il y a déjà une base de données ? Si oui, il serait sûrement


dommage de tout réinventer, vous ne croyez pas ?

 Est-ce que vous êtes seuls ? Si oui, vous faites comme vous
préférez, c‟est comme ça que vous serez le plus efficace, mais si
vous êtes à plusieurs il vous faudra vous poser une troisième
question primordiale…

 Qui s‟occupe de la BD : un codeur, ou un expert qui a réfléchi son


modèle via un diagramme ? Il y a fort à parier que s‟adapter à
l‟expertise de la personne qui gère la BD est une bonne pratique,
non ? 89/99
III.2. Choix de l‟approche

90/99
IV. Code First

DbContext
ModelBuilder

Custom
Configuration As needed

91/99
Les étapes à suivre de code First

1. Créer les entités

2. Préparer le contexte DbContext

3. Vérifier la configuration App.config

4. Générer la base de données et manipuler les données CRUD

92/99
IV.1. Créer les entités

 Le code vous permet d'abord de créer vos entités (classes) sans


utiliser de concepteur graphique ou de fichier .edmx.
 Si un champ s‟appelle « Id» » ou « [nom de la classe]Id » (non
sensible à la casse), Entity Framework l‟identifiera automatiquement
comme la clé primaire et le créera en auto-increment dans la BDD.

 Propriétés de navigation sont généralement définies en tant


que virtual afin qu‟ils peuvent tirer parti de certaines fonctionnalités
Entity Framework comme le chargement différé. (Quand l‟entité est lue
pour la première fois, les données associées ne sont pas récupérées. Toutefois, la
première fois que vous essayez d‟accéder à une propriété de navigation, les
données requises pour cette propriété de navigation sont récupérées
automatiquement.)

93/99
A. Utiliser les annotations pour les entités

 Comme nous l‟avions vu lorsque nous avons voulu vérifier la


cohérence des données saisies par l‟utilisateur, vous allez pouvoir
décrire votre modèle avec des annotations.
 Les annotations les plus importantes seront :
 [Index] : elle permet de s‟assurer qu‟une entrée est unique dans la table, et
ainsi accélérer fortement les recherches.
 [Key] : si votre clef primaire ne doit pas s‟appeler ID ou bien qu‟elle est plus
complexe, il faudra utiliser l‟attribut Key.
 [Table("personnes")] : indique que la table correspondante à cette entité sera
nommée personnes
 [Column("ID")] : permet d‟avoir un nom de colonne (ID) différent de celui de
l‟attribut
 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] : précise que la clé
primaire est Auto-Increment (autres valeurs possibles : None et computed)
 [MaxLength(20),MinLength(2)] : indique la longueur max et min de la chaîne de
caractère 94/99
B. Exemple d’entités

 Auteur.cs
public class Auteur
{ public int ID { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public virtual ICollection<Ouvrage> Ouvrages { get; set; } }

 Ouvrage.cs
public class Ouvrage
{[Key]
public String ISBN { get; set; }
public string Titre { get; set; }
public virtual Auteur Auteur { get; set; }
} 95/99
IV.2.Préparer le contexte de Code First
 Avant toute chose, il faut créer une classe XXXXXContext qui hérite
la classe DbContext [System.Data.Entity.DbContext]

 Cette classe est la classe principale utilisée pour se connecter et


interagir avec la base de données. Elle offre un ensemble de
méthode et d‟attribut

 Elle va représenter le contexte de persistance, c.-à-d. l'ensemble des


entités gérées par l'ORM. Elle doit dériver de la classe

 La classe DbSet représente une collection de toutes les entités dans


le contexte. Une entité représente une table ou une vue

 On trouvera généralement autant de [DbSet] que de tables dans la


base, un par table ; 96/99
A. Exemple de DbContext

public class EDM1CodFirst : DbContext


{ //nom de la BD
public EDM1CodFirst() : base("name=EDM1CodFirst")
{ }
public DbSet<Auteur> Auteurs { get; set; }
public DbSet<Ouvrage> Ouvrages { get; set; }
}

97/99
IV.3.Vérifier la configuration App.config

<?xml version="1.0" encoding="utf-8"?>


<configuration>
<startup><supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.6.1" />
</startup>
<connectionStrings>
<add name="EDM1CodFirst"
connectionString="data source=ASUS\SQLEXPRESS;
initial catalog=BDCodFirst;
integrated security=True;
MultipleActiveResultSets=True;
App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings></configuration>
98/99
IV.4. Générer la BD et manipuler les données CRUD

using (EDM1CodFirst db = new EDM1CodFirst())


{ Auteur a = new Auteur { Nom = "Khem", Prenom = "Aida" };
Ouvrage o = new Ouvrage { ISBN = "22222", Titre = "CSharp",
Auteur = a };
db.Auteurs.Add(a);
db.Ouvrages.Add(o);
db.SaveChanges();
dgvMedecins.DataSource = db.Auteurs.ToList();
dgvMedecins.Refresh();

L‟utilisation de Using permet d‟automatiser plusieurs


opérations telle que la fermeture de la connexion...
99/99