Visual C++ .NET/Database ADO.net/SqlDependency

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Query Notifications

<source lang="csharp">

  1. include "stdafx.h"

using namespace System; using namespace System::Data; using namespace System::Threading; using namespace System::Data::SqlClient; ref class MyNotification { public:

   MyNotification(String^ connectionString, String^ sql)
   {
       ConnectionString = connectionString;
       Sql = sql;
       SqlDependency::Start(ConnectionString);
       SyncHandle = gcnew AutoResetEvent(true);
       ChargeNotification();
   }
   void OnChangedHandler(Object^ caller, SqlNotificationEventArgs^ e)
   {
       if ( e->Source == SqlNotificationSource::Data &&
           e->Type == SqlNotificationType::Change &&
           (e->Info == SqlNotificationInfo::Delete ||
           e->Info == SqlNotificationInfo::Insert ||
           e->Info == SqlNotificationInfo::Update) ){
           Console::WriteLine(e->Info.ToString());
           ChargeNotification();
       }
   }
   void ChargeNotification()
   {
       SqlConnection^ connection = gcnew SqlConnection(ConnectionString);
       connection->Open();
       SqlCommand^ WatchCommand = gcnew SqlCommand(Sql, connection);
       SqlDependency^ myDependency = gcnew SqlDependency(WatchCommand);
       myDependency->OnChange += gcnew OnChangeEventHandler(this, &MyNotification::OnChangedHandler);
       SqlDataReader^ myReader = WatchCommand->ExecuteReader();
       myReader->Close();
       SyncHandle->Set();
   }
   void Wait()
   {
       SyncHandle->Reset();
       SyncHandle->WaitOne();
   }
   String^ ConnectionString;
   String^ Sql;
   AutoResetEvent^ SyncHandle;

}; void main() {

       SqlConnection^ myConnection = nullptr;
       SqlConnectionStringBuilder^ connectionBuilder = gcnew SqlConnectionStringBuilder();        
       connectionBuilder->DataSource = "localhost\\sqlexpress";
       connectionBuilder->InitialCatalog = "myCatalog";
       connectionBuilder->IntegratedSecurity = true;
       myConnection = gcnew SqlConnection(connectionBuilder->ToString());
       myConnection->Open();
       
       MyNotification^ commandNotification = gcnew MyNotification(myConnection->ConnectionString,"SELECT ID, Song FROM dbo.Music");
       SqlCommand^ testCommand = gcnew SqlCommand("INSERT INTO Music(Song) VALUES("T")",myConnection);
       testCommand->ExecuteNonQuery();
       commandNotification->Wait();
       testCommand->CommandText ="UPDATE Music SET Song="T" WHERE Song="T"";
       testCommand->ExecuteNonQuery();
       commandNotification->Wait();
       testCommand->CommandText = "DELETE FROM Music WHERE Song="T"";
       testCommand->ExecuteNonQuery();
       commandNotification->Wait();
       myConnection->Close();

}

 </source>