Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

9 août 2007 4 09 /08 /août /2007 01:30
SqlDependency –avec application windows form

L’intérêt de SqlDependency est de le coupler avec l’utilisation d’un cache :
-          On stocke des données en provenance d’une base SQL Server (avec une durée et une date d’expiration)
-          Le rôle de SqlDependency est de vider le cache en cas de modification en base de données (de façon à avoir toujours des données à jour)
Ici je ne montre pas le couplage avec un cache mais simplement l’utilisation de SqlDependency
public delegate void ChangedEventHandler();
 
public class ContactDAO
    {
        public event ChangedEventHandler Changed;
 
        private static string connectionString = "Server=.;Database=ContactDB;Integrated Security=SSPI";
        private SqlConnection sqlConnection = null;
 
        public ContactDAO()
        {
            SqlDependency.Stop(connectionString);
            SqlDependency.Start(connectionString);
            sqlConnection = new SqlConnection(connectionString);
        }
        ~ContactDAO()
        {
            SqlDependency.Stop(connectionString);
        }
        //
        public DataTable GetContacts()
        {
            try
            {
                DataTable dataTable = new DataTable();
 
                // IMPORTANT : spécifier le nom des colonnes (ne pas utiliser *)!!
                SqlCommand sqlCommand = new SqlCommand(@"SELECT ContactName FROM dbo.[Contact]", sqlConnection);
                sqlCommand.Notification = null;
 
                SqlDependency sqlDependency = new SqlDependency(sqlCommand);
                sqlDependency.OnChange += new OnChangeEventHandler(OnChanged);
 
                if (sqlConnection.State == ConnectionState.Closed)
                    sqlConnection.Open();
  
             // Autre point important : il faut obligatoirement exécuter la commande (du sqldependency)
                dataTable.Load(sqlCommand.ExecuteReader(CommandBehavior.CloseConnection));
                return dataTable;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        // evenement
        void OnChanged(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency sqlDependency = sender as SqlDependency;
            sqlDependency.OnChange -= OnChanged;
 
            if (Changed != null)
                Changed();
       }
}
 
Code de la form
   ContactDAO contactDAO = new ContactDAO();
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                SqlClientPermission sqlClientPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
                sqlClientPermission.Demand();
                contactDAO.Changed += new ChangedEventHandler(contactDAO_Changed);
                dataGridView1.DataSource = contactDAO.GetContacts();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        void contactDAO_Changed()
        {
            MessageBox.Show("données modifiées");
            // évite les opérations inter threads
            ISynchronizeInvoke iSynchronizeInvoke = (ISynchronizeInvoke)this;
            if (iSynchronizeInvoke.InvokeRequired)
            {
                ChangedEventHandler changed = new ChangedEventHandler(contactDAO_Changed);
                iSynchronizeInvoke.BeginInvoke(changed, null);
                return;
            }
            // rechargement
            dataGridView1.DataSource = contactDAO.GetContacts();
        }
A savoir :
Le fonctionnement de SqlDependency est un peu différent de SqlCacheDependency(ASP.NET)
> En effet pour le web,un trigger est créé sur les tables (par l’intermediaire de l’utilitaire aspnet_regsql.exe), ces triggers appelent à chaque ajout,modification,suppression une procédure stockée qui met à jour une table contenant le nom de la table ayant  été modifié,l’index (changeId) est alors incrémenté ce qui permettra de constater la modification des données lors de la « boucle » (ou timer) qui s’execute pour tester les modifications(on le constate très facilement avec Sql Server Profiler)
>avec SqlDependency un service et une queue sont générées automatiquement dès la création d’une dépendance
Avant
 sqldependency1.jpg
Après création d’une dépendance
sqldependency2.jpg

Partager cet article

Repost 0
Published by Romagny13 - dans ADO.NET
commenter cet article

commentaires