Cours Du Langage de Programmation C# (CSharp)
Cours Du Langage de Programmation C# (CSharp)
PLAN DU COURS
Historique du langage de programmation C#
Première partie : Les fondamentaux du langage C#
Chapitre 1. Les types primitifs
Chapitre 2. Les structures de contrôles et itératives
Chapitre 3. Les entrées/sorties
Chapitre 4. Accès aux données
Deuxième partie : La programmation web
Chapitre 5. Technologie du web
Chapitre 6. Framework ASP.NET
Chapitre 7. La technologie MVC
Chapitre 8. Le routing
Chapitre 9. La réactivité avec jquery et ajax
Langage de programmation 4 « LWEB3 » |2
INTRODUCTION
Le langage C# est apparu en 2000, langage conçu par le danois Anders Hejlsberg.
En octobre 1996, Microsoft, débauche Anders Hejlsberg de la société Borland. Dans la
foulée, Microsoft débauche une trentaine d’autres développeurs de Borland. Chez
Microsoft, Anders conçoit d’abord WFC (Windows Foundation Classes), c’est-à-dire les
classes Java pour interface graphique Windows. Le but était de permettre aux
programmeurs en Visual J++ (la version Microsoft du compilateur Java) de développer des
applications professionnelles dignes de ce nom. En effet, à l’époque, n’étaient disponibles
pour le développement Windows en Java que les classes AWT (Abstract Window Toolkit)
de Sun, des classes qui ne pouvaient satisfaire que des développeurs vraiment peu
exigeants (classes d’ailleurs aujourd’hui largement délaissées au profit de Swing). Les
relations entre Anders Hejlsberg et la communauté « officielle » de Java devaient vite
s’envenimer, car les classes WFC, bien que nettement plus professionnelles que ce qui
était à l’époque disponible en provenance de Sun, étaient propres à Windows et
incompatibles avec les autres systèmes, donc non conformes à la philosophie Java.
Dans la foulée, un nouveau langage était créé sous le nom de code COOL (pour
C-like Object Oriented Language). Le nom définitif devait être C#, langage qui est devenu,
et de loin, le premier langage de développement dans le monde Microsoft.
En juin 2000, Microsoft annonce, en même temps que la disparition de Visual J++
de sa gamme de produits, l’arrivée de l’architecture .NET et du langage C# dont Anders
Hejlsberg est le principal concepteur. Un an plus tard, Visual J++ fait néanmoins sa
réapparition (sous le nom de Visual J#) sans toutefois attirer les projecteurs, quasiment
dans l’indifférence. Visual J# est aujourd’hui abandonné, faute de combattants.
Pourquoi ce nom de C# ? Le C évidemment pour attester de l’appartenance au
monde C et C++. Et le # (croisillon) ? En notation musicale américaine, # indique « un ton
au-dessus ». On peut aussi voir dans # quatre + disposés en carré, ce qui évoque C++++,
à la signification évidente pour les programmeurs.
.NET constitue-t-il une révolution dans la manière de concevoir et d’utiliser les
programmes ? La réponse est incontestablement affirmative pour la manière de concevoir
et d’écrire des programmes : les programmeurs C++ habitués au développement à la dure
avec MFC découvriront, surtout s’ils passent au C# (ce qui constitue un jeu d’enfant pour
eux), la facilité de Delphi et du véritable développement à partir de briques logicielles. Les
programmeurs en Visual Basic découvriront un environnement de développement
entièrement orienté objet, comparable à l’orientation objet du C++ et du C# (et sans rien à
avoir à envier à ces deux géants). Dans tous les cas, le développement d’applications Web
Langage de programmation 4 « LWEB3 » |3
et surtout de services Web s’avère bien plus facile. Écrire une application Web devient en
effet presque aussi simple que l’écriture d’une application Windows.
Langage de programmation 4 « LWEB3 » |4
PREMIERE PARTIE
Le type char représente une instance d’un caractère Unicode de 16 bits. Il est donc
possible d’affecter une valeur à un type char en utilisant la valeur numérique du caractère
Unicode qui consiste à fournir un caractère sous forme hexadécimale de 4 chiffres :
Char c = ‘\u0061’ ; // équivalent à : c = ‘a’ ;
Une variable de type string est assignée avec une chaine de caractères placée
entre des guillemets doubles :
string s = "Ma chaîne";
{
Lundi,
Mardi,
Mercredi,
Jeudi,
Vendredi,
Samedi,
Dimanche
}
int[] Tab ;
maCollection.Add(new object()) ;
maCollection.Insert(0,”ABC”);
La collection de type ArrayList contient des objets de type object. Il est possible
d’insérer plusieurs types d’objets différents. Cela implique que, lors de la récupération,
l’objet doit être converti explicitement :
string s = (string)maCollection[0] ;
Le principal intérêt des collections est de pouvoir réaliser une boucle de tous les
membres grâce à l’instruction foreach :
forach (objet o in maCollection)
Lorsque vous utilisez cette syntaxe, il faut vous assurer que tous les membres ont
le même type que la variable d’itération et si ce n’est pas le cas, le corps de la boucle doit
comporter un processus pour tester le type de l’objet :
forach (objet o in maCollection)
if(o.GetType() == typeof(string))
Langage de programmation 4 « LWEB3 » | 10
Les objets d’accès avec la boucle foreach sont en lecture seule. Pour créer une
boucle sur une collection afin d’en modifier les membres, il faut utiliser une boucle for.
Les opérateurs
1. Les opérateurs de calcul
Comme en mathématique, les opérateurs de calcul aident à effectuer le calcul.
Addition : elle est réalisée avec l’opérateur +
a+b
Soustraction : -
a-b
Multiplication : *
a*b
Division : /
a/b
modulo : %
a%b
2. Les opérateurs d’assignation
Ils permettent d’assigner une valeur à une variable. L’opérateur utilisé est =
a = b // On assigne à la variable a la valeur b.
Il est possible de combiner l’assignation et le calcul :
x += 5 => x = x + 5
x -=5 => x = x – 5
3. Les opérateurs de comparaison
Ils sont utilisés dans le cadre de décisions au sein d’instruction de contrôle.
1. == détermine si deux valeurs sont égales ;
Ex : x == y, va renvoyer une valeur True (vraie) sir x est égale à y
2. != détermine si deux valeurs sont différentes
x != y, cette expression renvoie la valeur True si x est différente de y
3. >, cet opérateur détermine si la valeur à sa gauche est supérieure à la valeur
de droite
x > y, true si la valeur de la variable x est supérieure à la variable y
Langage de programmation 4 « LWEB3 » | 12
Syntaxe
switch (expression)
{
Case expression ou constance :
Instructions
[instruction de saut]
[default :
Instructions ]
}
La boucle for contient une série d’instructions qui seront exécutées plusieurs fois suivant
les paramètres d’initialisation, d’expression et de pas. L’initialisation est la déclaration
et l’affectation d’une variable de type numérique. A chaque passage dans la boucle, la
variable est incrémentée de la valeur du pas et l’expression est évaluée afin de déterminer
si les instructions doivent être exécutées ou non.
Exemple d’utilisation :
int somme=0;
for (int i; i<4;i++)
{
somme +=i;
}
// somme=6;
B) Boucle while
Synthase
while (expression)
{
instructions
}
La boucle while permet d’exécuter une série d’instructions tant que l’expression
évaluée est vraie.
int i=0;
while (I < 4)
{
i++;
}
// i=3;
C) Boucle do while
Synthase
do
{
instructions
}
while (expression) ;
Langage de programmation 4 « LWEB3 » | 16
La boucle do while est similaire à la boucle while dans le sens où les instructions
de la boucle sont exécutées si l’évaluation de l’expression vraie. La différence entre les
deux boucles réside dans le fait que la boucle do while effectue la vérification de
l’expression après l’exécution des instructions. Cette boucle garantit que les instructions
seront exécutées au moins une fois.
int i=0;
do
{
i--;
}
while (i >= 0)
// i=-1;
D) Boucle foreach
Synthase
foreach(type nom in object)
{
instructions
}
Les boucles foreach sont utiles pour parcourir les tableaux, les collections et tous
les types énumérables. L’instruction déclare un type et parcourir l’objet passé en
paramètre pour le type donné. La boucle s’exécute tant qu’il y a des éléments dans l’objet.
string nom = “alphonse”;
string son_nom=””;
foreach(char c in nom)
{
Son_nom += c ;
}
// son_nom = “alphonse”;
Il est clair que la variable nom de type string est une collection de type char. La boucle
foreach les prend un par un et les affecte à la variable c de type char. La variable peut
ensuite être utilisée dans le corps de la boucle.
Langage de programmation 4 « LWEB3 » | 17
b) Continue
L’instruction continue permet d’arrêter l’exécution du corps d’une boucle et de
passer à la prochaine évaluation :
for (int i = 0; I < 10;i++)
{
if (i > 5)
{
Continue;
}
}
// i = 5, le corps de la boucle a été exécuté 10 fois
c) goto
L’instruction goto permet de transférer l’exécution à un bloc d’instructions. Cette
instruction est héritée des anciens langages procéduraux tels que le basic. Une instruction
goto est suivie par le nom d’une étiquette et l’exécution du code est transférée à celle-ci.
L’étiquette est définie dans le code par un nom suivi du caractère deux points :
Langage de programmation 4 « LWEB3 » | 18
int i = 0 ;
ajout :
i++;
if (i < 5)
{
goto ajout;
}
// i = 5
d) return
L’instruction return est utilisée au sein d’une fonction et permet de définir la valeur
de retour de celle-ci :
e) throw
L’instruction throw permet de lever des exceptions. L’exécution est immédiatement
interrompue et la nature de l’erreur est passée à l’appelant dans la pile d’appel jusqu’à être
interceptée et traitée :
throw new Exception ();
Langage de programmation 4 « LWEB3 » | 19
using System;
namespace TypeClass
{
class Program
{
class PointC
{
// membres privés = inaccessibles depuis l'extérieur
de //l'objet (encapsulés)
private int X;
private int Y; // en revanche, les méthodes sont
//publiques
public void SetXY(int pX,int pY)
{
X = pX; Y = pY;
}
public void GetXY(out int pX, out int pY)
{
pX = X; pY = Y;
}
public string ToString()
{
return "(" + X.ToString() + "," + Y.ToString()
+ ")";
}
}
static void Main(string[] args)
{
PointC p3 = new PointC();
PointC p4 = new PointC();
p3.SetXY(2, 3);
p4.SetXY(6, 1);
Console.WriteLine(p3.ToString()); //affiche état de
p3
Console.WriteLine(p4.ToString()); //affiche état de
p4
int x, y;
p3.GetXY(out x, out y); // obtient l'état de l'objet
p3
Console.WriteLine("x={0} y={1}",x,y); // p3.X = 4;
// IMPOSSIBLE → p3.X n'est pas accessible
}
}
}
Qu'est-ce que l'instanciation ? C'est le fait de créer un objet (une instance d'une
classe). Un type classe décrit les caractéristiques d'un ensemble d'objets. Un objet est une
instance particulière d'un ensemble potentiellement infini d'objets ayant les mêmes
Langage de programmation 4 « LWEB3 » | 21
méthodes et les mêmes attributs. Pour illustrer, Etre Humain représente une classe
d’“objets“ dont les attributs et les méthodes sont nombreux (couleur des yeux, des
cheveux, langue(s) parlée(s), taille, poids, marcher, manger, parler …). Chacun d'entre
nous est une instance de la classe Etre Humain avec ses propres valeurs d'attribut (brun,
yeux marrons, …). De même Voiture est une classe d'objets dont les attributs sont par
exemple le nombre de portes, la couleur, la puissance, la motorisation, la cylindrée, les
dimensions …
La voiture Renault Clio II 1.6 16V immatriculée FR 425 TZ est une instance de la
classe Voiture.
Dans l'exemple précédent, p3 et p4 désignent deux instances (deux objets) de la
classe PointC.
L'écriture de classes en C#
1. Namespaces
Le mot clé namespace définit un espace de nommage. Ceci permet de
structurer/hierarchiser les types et de lever d'éventuels conflits de noms. On peut avoir un
même nom de type dans différents namespaces. Ci-dessous, on définit une classe A dans
différents namespaces. Il s'agit donc de classes différentes, même si elles ont même nom.
Les namespaces peuvent être imbriqués. Le nom explicite du type A du namespace
EspaceA est EspaceA.A.
Langage de programmation 4 « LWEB3 » | 22
Directive using
Cette directive permet d'importer un namespace. Cela signifie que s'il n'y a pas
d'ambiguité, les noms de types seront automatiquement préfixés par le namespace. On
allège ainsi l'écriture des noms de type. Par exemple, la classe Console (I/O) dépend du
namespace System. Le nom complet de cette classe est donc System.Console.
L'utilisation devrait donc s'écrire System.Console.WriteLine("Hello!"); Ce qui signifie “appel
de la méthode WriteLine du type Console du namespace System”.
En important ce namespace (en début de fichier) avec le mot clé using, on peut
simplifier l'écriture.
Langage de programmation 4 « LWEB3 » | 23
2. Accessibilité
Les membres définis au sein des types peuvent avoir un niveau d'accessibilité
parmi
public : membre (donnée ou fonction) accessible par tous
private : membre accessible seulement par une méthode d'un objet de la classe
protected : membre accessible par une méthode d'un objet de la classe ou par une
méthode d'un objet d'une classe dérivée (voir plus tard la dérivation) C'est grâce à ces
modificateurs d'accès que l'on assure l'encapsulation des données. Tous les membres
(attributs, méthodes ...) doivent être déclarés avec un niveau d'accessibilité. Par défaut,
un membre est privé. Il y a aussi des modificateurs d'accès spécifiques (non expliqué dans
ce support)
internal : accès autorisé pour l'assemblage courant
protected internal : assemblage courant + sous classes Ci-dessous un exemple
de classe (reference_type) MaClasse et son utilisation dans le programme. Notons qu'il
est possible aussi de donner une initialisation des attributs pour les types class. Ce n'est
pas autorisé pour les types struct.
Surcharge des méthodes
Surcharger les méthodes, c'est définir plusieurs méthodes ayant le même nom mais
des signatures différentes :
dont le nombre de paramètres est diffèrent
le type des paramètres est différent
les paramètres peuvent aussi avoir même type même nombre mais différer
du mode de passage de paramètre (par valeur ou par référence)
En revanche, le type de retour d'une fonction ne fait pas partie de la signature. On
ne peut pas déclarer deux fonctions qui ne diffèrent que par le type de retour.
Objet courant (référence this)
Dans une méthode, on appelle Objet Courant l'objet sur lequel est appelée la
méthode.
Dans l'exemple ci-dessous, quand on invoque obj1.Compare(obj2), l'objet courant
est obj1. Dans une méthode, on peut désigner l'objet courant par la référence this. Notons
que par défaut dans une méthode, quand on désigne un attribut sans préfixer par une
référence d'objet, il s'agit d'un attribut de l'objet courant.
Langage de programmation 4 « LWEB3 » | 24
using System;
namespace ObjCourant
{
class MaClasse
{
private int _val;
public MaClasse(int v) // constructeur (cf section suivante)
{ _
val = v; // équivaut à
this._val=v;
}
public bool Compare(MaClasse obj)
{
return _val == obj._val; // équivaut à return
this._val==_obj.val;
}
}
class Program
{
static void Main()
{
MaClasse obj1 = new MaClasse(12); // 2 instances
//différentes
MaClasse obj2 = new MaClasse(14);
Console.WriteLine("obj1 et obj2 ont le même état ? =
{0}", obj1.Compare(obj2));
}
}
}
using System;
namespace SyntaxeCSharp
{
class MaClasse // classe avec 3 constructeurs = 3 façons d'initialiser
{
private string _nom;
private int _val;
public MaClasse() // constructeur C1) sans argument
{
_nom = "Nestor";
_val = 12;
}
public MaClasse(int val) // constructeur C2) avec un argument
{
_val = val;
_nom = "Nestor";
}
public MaClasse(int val, string nom) // constructeur C3)
{
_val = val;
_nom = nom;
}
}
class Program
{
static void Main(string[] args)
{
MaClasse m1 = new MaClasse(); // utilise C1)
MaClasse m2 = new MaClasse(23); // utilise C2)
MaClasse m3 = new MaClasse(17,"Paul");// utilise C3)
}
}
}
Les instructions de cette clause sont, tant qu’il n’y a pas d’erreur, exécutées
normalement en séquence. Dès qu’une erreur est détectée par le système ou par une
méthode (qui lève une exception en cas d’erreur), un objet de la classe Exception (dans
l’espace de noms System) ou d’une classe dérivée de celle-ci est automatiquement créé
et le programme rentre tout aussi automatiquement dans le bloc catch associé au bloc try :
Langage de programmation 4 « LWEB3 » | 27
using System;
class Program
{
static void Main()
{
int a=10, b=0, c;
try
{
Console.WriteLine ("Avant division");
c = a/b;
Console.WriteLine ("Après division : c vaut " +
c);
}
catch (Exception exc)
{
Console.WriteLine("Erreur sur opération
arithmétique");
}
}
}
Comme pour le groupe try, les accolades sont obligatoires dans le groupe catch
même si celui-ci ne contient qu’une seule instruction. Le groupe catch pourrait même ne
contenir aucune instruction : cas où l’on se contente d’intercepter l’erreur, sans action
spéciale (le programme se poursuit comme si rien ne s’était passé. On ferme tout
simplement les yeux sur le problème, ce qui n’est évidemment pas sans danger. Comme
nous n’avons pas fait ici usage de l’objet Exception passé au catch, nous aurions pu ne
pas donner de nom à l’argument Exception.
Analysons le déroulement du programme précédent. Le programme entre dans le
bloc try qui contient notamment une instruction à risque, à savoir une division. Après un
premier affichage (aucun problème ne peut survenir à ce stade), le programme est
suspendu lors de l’exécution de c = a/b qui provoque une division par zéro mais il n’est
pas éjecté du système. On a en effet effectué une tentative d’exécution mais nous avons
prévu une possibilité d’erreur (puisque nous sommes dans un groupe try). Suite à la
division par zéro, le contrôle est automatiquement transféré au bloc catch, sans exécuter
le second WriteLine. Si toutes les instructions du bloc try avaient été exécutées sans erreur
(dans le cas où b aurait été différent de zéro), le bloc catch n’aurait pas été exécuté. À
l’intérieur des parenthèses d’une clause catch, on doit trouver un objet de la classe
Exception ou d’une classe dérivée de celle-ci. Un nom d’objet est souvent spécifié en
argument, de manière à obtenir des informations complémentaires au sujet de l’erreur (par
exemple le champ Message de la classe Exception qui décrit clairement l’erreur, voir une
explication plus complète ainsi que les autres propriétés à la fin de ce chapitre). Plusieurs
Langage de programmation 4 « LWEB3 » | 28
blocs catch peuvent être spécifiés pour prendre en compte plusieurs erreurs possibles.
Dans l’exemple suivant, différentes erreurs peuvent être générées en fonction des
contenus de i et j : division par zéro (ArithmeticException) et accès à un tableau en dehors
de ses bornes (IndexOutOfRangeException).
Le groupe finally
Un troisième bloc peut être spécifié : le bloc finally. Les instructions du bloc finally
sont toujours exécutées, quel que soit le cheminement du programme (l’exécution sans
problème et donc complète dans le groupe try ou l’entrée suite à une erreur dans le catch).
On est ainsi sûr de libérer dans tous les cas les ressources qui viennent d’être allouées.
Si plusieurs blocs catch peuvent être associés à un bloc try, un seul bloc finally peut être
associé à un bloc try. Comme pour les groupes try et catch, les accolades sont obligatoires
dans un groupe finally.
using System;
class Program
{
static void Main()
{
try
{
Console.WriteLine("Début du try de Main");
f();
Console.WriteLine("Fin du try de Main");
}
catch (Exception)
{
Console.WriteLine("Erreur");
}
}
static void f()
{
int a=10;
int[] t = new int[3];
..... // une ou plusieurs instructions initialisant i et j
try
{
Console.WriteLine("Début du try de f");
t[i] = a/j;
Console.WriteLine("Fin du try de f");
}
finally
{
Console.WriteLine("Finally de f");
}
}
}
Langage de programmation 4 « LWEB3 » | 29
Méthode Description
GetDrives Retourne un tableau d’objets DriveInfo correspondant aux
lecteurs de la machine sur laquelle est exécutée
l’instruction
AvailableFreeSpace Indique la quantité d’espace libre sur le lecteur en octets
DriveFormat Indique le format du système de fichiers du lecteur (NTFS,
FAT32, CDFS, …)
DriveType Indique le type du lecteur
IsReady Indique si le lecteur est prêt à être utilisé
Name Indique le nom du lecteur (lettre d’accès)
Création du fichier
La création d’un fichier retourne un objet du type FileStream associe. L’écriture de
données dans ce flux entraînera l’écriture dans le fichier. Exécuter la méthode d’un fichier
sur un fichier déjà existant écrasera l’ancien fichier.
FileStream fileStream=File.Create(@"C:\Lweb3\test.txt") ;
Suppression
Comme pour Directory et DirectoryInfo, la suppression d’un fichier se fait avec la méthode
Delete. Si le fichier qui est tenté d’être supprimé n’existe pas, aucune expression n’est
levée.
Copie et déplacement des fichiers
Pour la classe File la copie se fait avec la méthode Copy et le déplacement avec la
méthode Move tandis que pour la classe FileInfo la copie est réalisée par la méthode
CopyTo et le déplacement par MoveTo.
File.Copy(@"C:\Lweb3\test.txt",@"C:\ test.txt")
File.Move (@"C:\Lweb3\test.txt",@"C:\ test.txt")
Langage de programmation 4 « LWEB3 » | 32
While ( !stream.EndOfStream)
{
string s=stream.ReadLine() ;
}
La méthode ReadToEnd retourne un objet de type string contenant la totalité du
fichier entre la position du curseur et la fin du fichier.
Après les opérations de lecture sur le fichier, l’objet StreamReader doit fermer avec
la méthode Close()
Ecriture dans un fichier texte
a) Avec la classe File
Plusieurs méthodes dont exposées par la classe File pour l’écriture dans un fichier
texte.
WriteAllText : La méthode WriteAllText prend en paramètre le chemin du fichier
et le contenu à écrire.
File.WriteAllText(@"C:\ test.txt”,”Texte à écrire”)
La accepte une surcharge pour préciser le type d’encodage
File.WriteAllText(@"C:\ test.txt”,”Texte à écrire”,Encoding.ASCII)
b) Ecriture avec la classe StreamWriter
L’écriture avec streamwriter implique d’instancier un nouvel objet streamwriter, en
lui passant en paramètre le fichier à écrire, et faire appel aux méthodes nécessaires pour
l’écriture des données.
StreamWriter stream= new Stream (@"C:\ test.txt”) ;
Les méthodes à utiliser sont Write et WriteLine.
Sérialisation et désérialisation
La sérialisation et la désérialisation sont utiles lorsque nous souhaitons envoyées
vers une autre application les données relatives à des objets. La sérialisation convertit un
objet en un flux. Il est ainsi possible d’enregistrer ce flux dans un fichier ou de le
transmettre à une autre application.
La récupération de ce flux et sa transformation en objet sont appelées la
désérialisation.
Langage de programmation 4 « LWEB3 » | 35
Pour qu’une classe soit sérialisable elle doit être précédée de l’attribut [serializable]
sans quoi le compilateur va générer une erreur.
Le framework .Net nous offre deux techniques de sérialisation :
La sérialisation binaire : Elle crée une copie exacte de l’objet sérialisé ;
La sérialisation XML : crée une représentation des propriétés et des champs
publics uniquement.
Nous allons nous intéresser à la première technique, la sérialisation binaire.
Les bases
Comme dit précédemment, la classe sérialisable doit être marquée par m’attribut
[Serializable] sans quoi une exception de type SerializationException.
La sérialisation utilise un formateur binaire du type BinaryFormatter de l’espace de
noms System.Runtime.Serialization.Formatters.Binary. Pour effectuer la transformation, il
suffit pour cela d’appeler la méthode Serialize de cet objet en lui passant en paramètre le
flux dans lequel écrire les données et l’objet à sérialiser.
Soit à sérialiser la classe Etudiant ci-après :
public class Etudiant
{
public Matricule ;
public NomEtudiant ;
public Adresse ;
}
1) Ajout de l’attribut serialisable à la classe Etudiant
[Serializable]
public class Etudiant
{
public Matricule ;
public NomEtudiant ;
public Adresse ;
}
Langage de programmation 4 « LWEB3 » | 36
Sérialisation Xml
Xml (Extensible Markup Language) est un langage de balisage. Il est utilisé pour
faciliter l’échange automatique des contenus entre systèmes d’information hétérogènes.
La sérialisation Xml contrairement à la sérialisation binaire ne sérialise que les
éléments dont la portée est définie publique. Elle ne concerne pas également des objets
graphiques (images, …).
Etapes
1) Rendre la classe sérialisable
2) Créer un flux vers un fichier devant contenir les données à sérialiser
3) Instancier la classe Xmlserializer qui se trouve dans l’espace de nom
System.Xml.Serialization
4) Appeler la méthode Serialise pour sérialiser ou Deserialize pour désérialiser
niveau de la source de données afin d'une part de charger le DataSet avec des
données, et d'autre part afin de répercuter dans la source de données les
modifications apportées aux données contenues dans le DataSet.
Outre les objets ci-hauts présentés, un fournisseur de données .NET Framework
contient également les classes répertoriées dans le tableau suivant.
Object Description
Transaction
Inscrit des commandes dans des transactions au niveau de la
source de données. La classe de base pour tous les
objets Transaction est la classe DbTransaction . ADO.NET
fournit aussi la prise en charge pour les transactions à l'aide
des classes dans l'espace de noms System.Transactions .
CommandBuilder
Objet d'assistance qui génère automatiquement les
propriétés de commande d'un DataAdapter ou dérive les
informations sur les paramètres à partir d'une procédure
stockée et remplit la collection Parameters d'un objet Command .
La classe de base pour tous les objets CommandBuilder est la
classe DbCommandBuilder .
ConnectionStringBuilder
Objet d'assistance qui offre une manière simple de créer et
de gérer le contenu de chaînes de connexion utilisées par les
objets Connection . La classe de base pour tous les
objets ConnectionStringBuilder est la
classe DbConnectionStringBuilder .
Parameter
Définit les paramètres des valeurs d'entrée, de sortie et de
retour pour les commandes et les procédures stockées. La
classe de base pour tous les objets Parameter est la
classe DbParameter .
Exception
Retourné en cas d'erreur au niveau de la source de données.
Pour une erreur rencontrée sur le client, les fournisseurs de
données .NET Framework lèvent une exception .NET
Framework. La classe de base pour tous les
objets Exception est la classe DbException .
Error
Expose les informations provenant d'un avertissement ou
d'une erreur retournée par une source de données.
ClientPermission
Fourni pour les attributs de sécurité d'accès du code du
fournisseur de données .NET Framework. La classe de base
pour tous les objets ClientPermission est la
classe DBDataPermission .
Langage de programmation 4 « LWEB3 » | 40
B. Le DataSet
Le DataSet ADO.NET est explicitement conçu pour un accès aux données
indépendamment de toute source de données. Il peut donc être utilisé avec plusieurs
sources de données différentes, utilisé avec des données XML ou utilisé pour gérer des
données locales de l'application. Le DataSet contient une collection d’un ou plusieurs
objets DataTable constitués de lignes et de colonnes de données, ainsi que des
informations concernant les contraintes de clé primaire, de clé étrangère et des
informations relationnelles sur les données contenues dans les objets DataTable.
Langage de programmation 4 « LWEB3 » | 41
Cette requête retourne une liste d’objets de type Etudiants ayant la valeur L2 pour
la propriété promotion et les ordonne par la propriété matricule.
Une requête LINQ doit commencer par la clause from et finir par la clause select
ou group. Et peut comprendre entre ces deux clauses des clauses where, orderby ou join
ou encore des clauses from supplémentaires.
Il existe plusieurs domaines d'applications pour LINQ :
Linq To Entities ou Linq To SQL qui utilisent ces extensions de langage sur
les bases de données.
Linq To XML qui utilise ces extensions de langage pour travailler avec les
fichiers XML.
Linq To Object qui permet de travailler avec des collections d'objets en
mémoire.
3.2.2.1. Les opérateurs de requêtes
A. Filtrer
Where
Comme avec sql, la méthode permet une collection selon un ou plusieurs critères.
var query = from ms in Etudiant
where ms.Matricule==”788523”
select ms;
L’expression ci-haut sélectionne dans la collection Etudiant la ou les lignes dont la
propriété matricule est égale à 788523.
Skip et Take
Ces deux méthodes sont utilisées pour effectuer la pagination des résultats. La
méthode Skip permet d’ignorer un certain nombre d’éléments. Quant à la méthode Take,
elle permet de spécifier le nombre d’éléments à retourner.
var query = (from ms in Etudiant
where ms.Matricule==”788523”
select ms)
.Skip(5)
.Take(10);
Langage de programmation 4 « LWEB3 » | 43
A. Ordonner
OrderBy
La méthode permet d’ordonner les éléments suivant un ou plusieurs critères
spécifiés.
var query = from ms in Etudiant
orderby ms.Matricule
select ms;
ThenBy
Dans le cas où plus d’un critère de tri doit être utilisé, on fait recours aux méthodes
ThenBy et ThenByDescending.
C. Ordonner
Cette méthode permet de regrouper les résultats en se basant sur la valeur d’une
clé.
var query = from ms in Etudiant
group ms by ms.promotion into g
select new
{
Matricule=g.Matricule,
Nom=g.Nom,
Adresse=g.Adresse
};
D. Join
La clause join permet de faire une jointure de deux sources basée sur un critère
spécifique.
Langage de programmation 4 « LWEB3 » | 44
ENTITY FRAMEWORK
C’est un ORM (Objet Relationnal Mapping) puissant fourni par Microsoft. Il permet
d’interagir avec la base de données sans avoir besoin d’utiliser du SQL.
Avec EF on peut gérer la structure de la base de données en se servant de
migration.
Procédure :
Package nuget :
Créer une classe DbContext, classe d’interaction avec la base de données
Overrider la méthode OnConfiguring pour spécifier la chaîne de connexion,
Lire et écrire dans la BDD à l’aide d’EF Core,
dotnet add package Microsoft.EntityFrameWorkCore.SqlServer
Créer une nouvelle classe MyDbContext qui héritera de la classe DbContext
public class MonDbContext : DbContext
{
public DbSet<TableName> Personnes {get ; set ;}=default ;
protected override void OnConfiguring(DbContextOptionsBuilder
optionsBuilder)
{
optionBuilder.UserSqlServer(“stringConnection”);
base.OnConfiguting(optionsBuilder);
}
}
Langage de programmation 4 « LWEB3 » | 45