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

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

Query Notifications

 
#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();
}