次の方法で共有


イベント送信ストアド プロシージャの使用

Notification Services には、1 つのイベントまたはイベント バッチの送信を可能にするイベント コレクション ストアド プロシージャが用意されています。Transact-SQL コードを使用してイベントを送信する場合に、これらのストアド プロシージャを使用します。これらのストアド プロシージャは、手動または Microsoft SQL Server エージェント ジョブで実行できます。また、これらのプロシージャをトリガで使用すると、他のテーブルに対する挿入または更新に応じてクエリを実行できます。

イベント データの送信

一連のストアド プロシージャを使用すると、イベント バッチを開き、1 つ以上のイベントを個別に送信してから、イベント バッチを閉じることができます。次のストアド プロシージャを使用して、Notification Services アプリケーションに個々のイベントを送信します。

  • NSEventBeginBatchEventClassName は、イベント データを送信するイベント プロバイダの名前を入力引数として受け取り、新規イベント バッチのバッチ ID を返します。
  • NSEventWriteEventClassName は、イベント バッチに 1 つのイベントを追加します。これらのストアド プロシージャの引数は、イベント バッチの ID とイベント フィールドの値の一覧です。
  • NSEventFlushBatchEventClassName は、イベント バッチを閉じて、イベント セットをアプリケーションに送信します。

これらのストアド プロシージャは同じトランザクション内で実行してください。これによって、Notification Services によるバッチの開始、イベントの送信、およびバッチの終了が 1 つのトランザクション内で実行されます。

詳細と例については、ストアド プロシージャに関する次のトピックを参照してください。

クエリを使用したイベントの収集および送信

SELECT ステートメントを使用してイベントを収集する場合は、NSEventSubmitBatchEventClassName ストアド プロシージャを使用します。このストアド プロシージャでは 2 つのクエリが使用されます。1 つはイベントの収集に使用するユーザー定義のクエリで、もう 1 つはイベントを収集してから実行する収集後クエリ (ポスト クエリ) です。このポスト クエリを使用して、追跡フィールドを "new" から "collected" へ変更するなどの必要なクリーンアップを実行すると、同じデータが再度収集されることはありません。

詳細と例については、「NSEventSubmitBatch<EventClassName> (Transact-SQL)」を参照してください。

アプリケーションでのイベント送信ストアド プロシージャの使用

マネージ コード内およびアンマネージ コード内の両方から、イベント コレクション ストアド プロシージャを実行できます。マネージ コード内からストアド プロシージャを実行する一般的な方法は、SqlCommand オブジェクトを使用する方法です。ストアド プロシージャとその引数は、SqlCommand オブジェクトで指定した後、ExecuteNonQuery メソッドを使用して実行できます。

1 つのイベントを追加する例

この例では、次の名前空間を使用します。

public bool EventSPs()
{ 
    // These variables would normally be defined for
    // the class. They would be set based on the values
    // provided by the args argument of the Initialize method.
    string instanceName = "Tutorial";
    string applicationName = "Weather";
    string eventClassName = "WeatherEvents";
    string eventProviderName = "WeatherSPs";

    bool returnValue = true;
    SqlConnection databaseConnection = null;

    try
    {
        // Set the connection to SQL Server.
        databaseConnection = new SqlConnection();
        // Build the connection string.
        StringBuilder connectBuilder = new StringBuilder();
        connectBuilder.Append("Integrated Security=SSPI;");
        connectBuilder.Append("Data Source=MyServer;");
        connectBuilder.Append("Initial Catalog=TutorialWeather");
        databaseConnection.ConnectionString =
            connectBuilder.ToString();
        // Open the connection.
        databaseConnection.Open();

        // Use NSEventBeginBatchEventClassName
        // to create a new event batch and return the ID.
        SqlCommand databaseCommand = new SqlCommand(string.Format
            ("\"NSEventBeginBatch{0}\"", eventClassName));
        databaseCommand.Connection = databaseConnection;
        databaseCommand.CommandType = CommandType.StoredProcedure;
        databaseCommand.Parameters.AddWithValue
            ("@ProviderName", eventProviderName);
        SqlParameter storedProcParameter =
            databaseCommand.Parameters.Add
            ("@EventBatchId", SqlDbType.BigInt);
        storedProcParameter.Direction = ParameterDirection.Output;
        databaseCommand.ExecuteNonQuery();
        long eventBatchId =
            (long)databaseCommand.Parameters["@EventBatchId"].Value;

        // Use NSEventWriteEventClassName
        // to write the event to the database.
        databaseCommand.Parameters.Clear();
        databaseCommand.CommandText =
            string.Format("\"NSEventWrite{0}\"", eventClassName);
        databaseCommand.Parameters.AddWithValue("@EventBatchId", 
            eventBatchId);
        databaseCommand.Parameters.AddWithValue("@City", "Redmond");
        databaseCommand.Parameters.AddWithValue("@Date", "4/5/05");
        databaseCommand.Parameters.AddWithValue("@Low", 50.0);
        databaseCommand.Parameters.AddWithValue("@High", 55.5);
        databaseCommand.Parameters.AddWithValue("@Forecast", 
            "Partly cloudy");
        Console.WriteLine(databaseCommand.CommandText);
        databaseCommand.ExecuteNonQuery();

        // Use NSEventFlushBatchEventClassName
        // to commit the event batch.
        databaseCommand.Parameters.Clear();
        databaseCommand.CommandText =
            string.Format("\"NSEventFlushBatch{0}\"", eventClassName);
        databaseCommand.Parameters.AddWithValue("@EventBatchId", 
            eventBatchId);
        long eventsSubmitted = (long)databaseCommand.ExecuteScalar();
    }
    catch(SqlException ex)
    {
        Console.WriteLine(ex);
    }
    finally
    {
        if (null != databaseConnection)
        {
            databaseConnection.Close();
            databaseConnection = null;
        }
    }
    return true;
}

複数のイベントを追加する例

この例では、次の名前空間を使用します。

  • System
  • System.Text
  • System.Data
  • System.Data.SqlClient
  • Microsoft.SqlServer.NotificationServices
public bool EventQuery()
{
    // These variables would normally be defined for
    // the class. They would be set based on the values
    // provided by the args argument of the Initialize method.
    string instanceName = "Tutorial";
    string applicationName = "Weather";
    string eventClassName = "WeatherEvents";
    string eventProviderName = "WeatherSPs";

    StringBuilder builder =
        new StringBuilder("SELECT City, GetDate() AS Date, ");
    builder.Append("Low, High, Forecast ");
    builder.Append("FROM dbo.WeatherData;");
    string eventsQuery = builder.ToString();

    bool returnValue = true;
    SqlConnection databaseConnection = null;

    try
    {

        // Set the connection to SQL Server.
        databaseConnection = new SqlConnection();
        // Build the connection string.
        StringBuilder connectBuilder = new StringBuilder();
        connectBuilder.Append("Integrated Security=SSPI;");
        connectBuilder.Append("Data Source=MyServer;");
        connectBuilder.Append("Initial Catalog=TutorialWeather");
        databaseConnection.ConnectionString =
            connectBuilder.ToString();
        // Open the connection.
        databaseConnection.Open();

        // Use NSEventSubmitBatchEventClassName
        // to create and submit a batch of events.
        SqlCommand databaseCommand = new SqlCommand(string.Format
            ("\"NSEventSubmitBatch{0}\"", eventClassName));
        databaseCommand.Connection = databaseConnection;
        databaseCommand.CommandType = CommandType.StoredProcedure;
        databaseCommand.Parameters.AddWithValue
            ("@ProviderName", eventProviderName);
        databaseCommand.Parameters.AddWithValue("@EventsQuery", 
            eventsQuery);
        databaseCommand.Parameters.AddWithValue("@PostQuery", " ");
        long eventsInBatch = (long)databaseCommand.ExecuteScalar();
    }
    catch (SqlException ex)
    {
        Console.WriteLine(ex);
    }
    finally
    {
        if (null != databaseConnection)
        {
            databaseConnection.Close();
            databaseConnection = null;
        }
    }
    return true;
}

参照

その他の技術情報

カスタム イベント プロバイダの開発
Notification Services ストアド プロシージャ (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手