C# – Linq

Ceci est un exemple implémentant un exemple d'accès à une base de données Access 2003 à travers Linq en C#. Une grande partie de l'expérimentation est l'oeuvre de Jean-Noël Guilbault, étudiant en session 5 d'informatique de gestion à l'automne 2009 au Collège Lionel-Groulx. Ses informations provenaient de http://msdn.microsoft.com/en-us/library/bb425822.aspx. Vous pourrez comparer par vous-mêmes avec des programmes équivalents dans les langages que vous connaissez.

Au préalable, il faut intégrer une référence à l'assemblage System.Data.

//
// D'après les expérimentations de Jean-Noël Guilbault
//
//Documentation : 
//

/*
 * IMPORTANT : Les exemples sur MSDN utilisent un constructeur de DataContext exclusif à SQLServer, on doit donc remplacer la ligne :
 * 
 * DataContext db = new DataContext
 *   ("c:\\...\\TestBD.mdb");
 *   
 * par :
 * 
 * IDbConnection connection = new System.Data.OleDb.OleDbConnection
 *    ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\...\\TestBD.mdb;");
 *  connection.Open();
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//
// À AJOUTER!!!
//
using System.Data;
using System.Data.Linq;         // << Pour DataContext; ajouter une référence sur l'assemblage du même nom
using System.Data.Linq.Mapping; // << pour les balises [Table] et [Column]

//
// L'exemple qui suit présume une base de données Test.mdb (format Access 2003) contenant une table Livres,
// laquelle utilise au moins un champ Id (une clé primaire) et un champ Titre (du texte).
//
namespace ExempleLinqAccess
{

Ensuite, de petites classes servant de représentation interne pour chaque élément pertinent de la BD dans le programme doivent être définies.

// ...
   //
   // On commence par implanter une class conteneur pour recevoir les données d'une table. Bien que la
   // classe serve d'abord de conteneur, il est parfaitement légal d'inclure variables, méthodes et autres
   //
   [Table(Name = "Livres")] // << Le nom est le nom exact de la table, ce qui permet d'avoir un nom de classe différent.
   public class Livre
   {
      [Column(IsPrimaryKey = true)] // << Une balise Column pour chaque variable correspondante à une colonne.
      public int Id;
      [Column]
      public string Titre;
   }

Par la suite, le travail est relativement simple...

// ...
   class Program
   {
      static void Main(string[] args)
      {
         IDbConnection connexion = new System.Data.OleDb.OleDbConnection
            ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Mr_Roy\\Code\\Code C#\\420KEL\\ExempleLinqAccess\\ExempleLinqAccess\\bin\\Debug\\Test.mdb;");
         connexion.Open();

         DataContext db = new DataContext(connexion);

         //
         //On peut demander au DataContext d'envoyer ses logs à l'écran.
         // db.Log = Console.Out; // << pour débugger
         //
         Table<Livre> livres = db.GetTable<Livre>();

         //
         // Aller chercher tous les éléments de la table.
         //
         IQueryable<Livre> LivreQuery =
             from Bouqins in livres
             select Bouqins;

         foreach (Livre bouqin in LivreQuery)
            Console.WriteLine("Id: {0}, Titre: \"{1}\"", bouqin.Id, bouqin.Titre);

         //
         // Une petite patch pour empêcher la console de se fermer par elle-même...
         //
         Console.ReadLine();
      }
   }
}

Lectures complémentaires

Quelques liens pour enrichir le propos.


Valid XHTML 1.0 Transitional

CSS Valide !