mardi 26 juin 2012

ADO.NET - Mode connecté

Une application "Console" va illustrer les principes de base d'une application ADO.NET en mode connecté. Dans cette solution nous allons d'abord ajouter le fichier C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Samples\Northwind.sdf. SQL Server Compact est une base de données orientée fichier, installable facilement sous forme d'une DLL et idéale pour les applications de bureau qui nécessitent une base de données locale. Le fichier App.config ajouté également à la solution, va alors indiquer les informations de connection à ce fichier base de données :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Data" connectionString="Data Source=Northwind.sdf" providerName="System.Data.SqlServerCe.3.5"/>
  </connectionStrings>
</configuration>
Bien que la plupart des exemples simples ne montrent pas cette approche, pour faciliter le plus possible une adaptation à d'autres bases de données, la connection sera créée en utilisant une "fabrique" qui va permettre de créer une connection dont le type dépend de la valeur de l'attribut providerName présente dans le fichier de configuration ci-dessus. On retrouvera donc dans le code suivant :
  • Le constructeur Data initialise un accès au fichier de configuration et la fabrique correspondant à ce fournisseur.
  • La méthode GetConnection initialise la connection à la base de données.
  • La méthode GetCommand s'appuie sur cette méthode pour initialiser une commande SQL paramétrée.
  • La méthode ExecuteReader s'appuie sur la méthode précédente pour initialiser le "lecteur" qui permettra de lire les données en provenance de la base
ce qui donne donc au final le code suivant :
using System;
using System.Configuration;
using System.Data.Common;
namespace ConsoleApplication1.App
{
    class Data
    {
        private const string ConnectionStringName="Data";
        private ConnectionStringSettings connectionSettings;
        private DbProviderFactory factory;
        public Data()
        {
            // Lecture du fichier de configuration
            connectionSettings=System.Configuration.ConfigurationManager.ConnectionStrings[ConnectionStringName];
            // "Fabrique" pour le fournisseur indiqué
            factory = DbProviderFactories.GetFactory(connectionSettings.ProviderName);
        }
        private DbConnection GetConnection()
        {
            // Créer et ouvrir une connexion
            DbConnection cnn = factory.CreateConnection();
            cnn.ConnectionString = connectionSettings.ConnectionString;
            cnn.Open();
            return cnn;
        }
        public DbCommand GetCommand(string commandText,params object[] values)
        {
            // Créer une commande paramétrée
            DbConnection cnn = GetConnection();
            DbCommand cmd = cnn.CreateCommand();
            cmd.CommandText = commandText;
            for (int i = 0; i < values.Length; i++)
            {
                DbParameter prm = cmd.CreateParameter();
                prm.ParameterName = i.ToString();
                prm.Value = values[i];
                cmd.Parameters.Add(prm);
            }
            return cmd;
        }
        public DbDataReader ExecuteReader(string commandText,params object[] values)
        {
            // Créer un "lecteur"
            DbCommand cmd = GetCommand(commandText,values);
            DbDataReader dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
            return dataReader;
        }
    }
}
Cette classe peut alors être utilisée par le code principal qui modifie le libellé en ajoutant ou supprimant une lettre "z" finale :
using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var Data= new App.Data();
            var cmd = Data.GetCommand("UPDATE Categories SET [Category Name]=@0 WHERE [Category ID]=@1", "", 0);
            var rdr = Data.ExecuteReader("SELECT [Category ID],[Category Name] FROM Categories ORDER BY [Category Name]");
            while (rdr.Read())
            {
                var value=rdr.GetString(1);
                value=value.EndsWith("z")?value.Substring(0,value.Length-1):value+"z";
                cmd.Parameters[0].Value = value;
                cmd.Parameters[1].Value = rdr.GetInt32(0);
                Console.WriteLine(rdr.GetString(1)+", "+cmd.ExecuteNonQuery()+", "+value);
            }
            rdr.Close();
            cmd.Dispose();
            Console.ReadKey();
        }
    }
}
Cet exemple permet de voir rapidement les bases de l'utilisation du mode connecté qui permet de "consommer" immédiatement les données en provenance de la base. Nous allons voir maintenant rapidement le mode déconnecté.

Aucun commentaire:

Enregistrer un commentaire