Freigeben über


Verwenden von gespeicherten Prozeduren der Ereignisübermittlung

Von Notification Services werden gespeicherte Prozeduren der Ereignisauflistung bereitgestellt, die es Ihnen ermöglichen, einzelne Ereignisse oder Ereignisbatches zu übermitteln. Verwenden Sie diese gespeicherten Prozeduren zum Übermitteln von Ereignissen mithilfe von Transact-SQL-Code. Sie können diese gespeicherten Prozeduren manuell ausführen, Sie können die gespeicherten Prozeduren in einem Microsoft SQL Server-Agentauftrag ausführen oder in Triggern verwenden, sodass die Abfrage als Antwort auf eine Einfügung oder Aktualisierung in einer anderen Tabelle ausgeführt wird.

Übermitteln von Ereignisdaten

Eine Gruppe von gespeicherten Prozeduren ermöglicht es Ihnen, einen Ereignisbatch zu öffnen, eine oder mehrere Ereignisse einzeln zu übermitteln und den Ereignisbatch anschließend wieder zu schließen. Verwenden Sie zum Übermitteln einzelner Ereignisse an eine Notification Services-Anwendung die folgenden gespeicherten Prozeduren:

  • NSEventBeginBatchEventClassName übernimmt den Namen des Ereignisanbieters, der die Ereignisdaten als Eingabeargument übermittelt, und gibt die Batch-ID des neuen Ereignisbatches zurück.
  • NSEventWriteEventClassName fügt dem Ereignisbatch ein einzelnes Ereignis hinzu. Als Argumente der gespeicherten Prozeduren werden die Ereignisbatch-ID und eine Liste von Werten für die Ereignisfelder verwendet.
  • NSEventFlushBatchEventClassName schließt den Ereignisbatch und übermittelt die Gruppe von Ereignissen an die Anwendung.

Stellen Sie sicher, dass alle gespeicherten Prozeduren in derselben Transaktion ausgeführt werden, sodass der Batch in einer Transaktion von Notification Services geöffnet wird, die Ereignisse übermittelt werden und anschließen der Batch geschlossen wird.

Weitere Informationen und Beispiele finden Sie in den folgenden Themen zu gespeicherten Prozeduren:

Verwenden einer Abfrage zum Erfassen und Übermitteln von Ereignissen

Wenn Sie Ereignisse mithilfe einer SELECT-Anweisung erfassen möchten, können Sie die gespeicherte Prozedur NSEventSubmitBatchEventClassName verwenden. Von dieser gespeicherten Prozedur werden zwei Abfragen verwendet: eine Abfrage zum Erfassen von Ereignissen mithilfe einer von Ihnen definierten Abfrage, und eine Abfrage, die nach der Erfassung von Ereignissen ausgeführt wird (sie wird als nachfolgende Abfrage bezeichnet). Sie können diese nachfolgende Abfrage zum Ausführen von erforderlichen Cleanupvorgängen verwenden, z. B. das Ändern eines Nachverfolgungsfeldes von "neu" zu "erfasst", sodass dieselben Daten nicht noch einmal erfasst werden.

Weitere Informationen und ein Beispiel finden Sie unter NSEventSubmitBatch<EventClassName> (Transact-SQL).

Verwenden der gespeicherten Prozeduren der Ereignisübermittlung in Anwendungen

Die gespeicherten Prozeduren der Ereignisauflistung können sowohl in verwaltetem als auch in nicht verwaltetem Code ausgeführt werden. Das SqlCommand-Objekts wird häufig verwendet, um eine gespeicherte Prozedur innerhalb von verwaltetem Code auszuführen. Sie können eine gespeicherte Prozedur und ihre Argumente im SqlCommand-Objekt angeben und dann die Prozedur ausführen, indem Sie die entsprechende ExecuteNonQuery-Methode verwenden.

Beispiel: Hinzufügen eines einzelnen Ereignisses

In diesem Beispiel werden die folgenden Namespaces verwendet:

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;
}

Beispiel: Hinzufügen mehrerer Ereignisse

In diesem Beispiel werden die folgenden Namespaces verwendet:

  • 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;
}

Siehe auch

Andere Ressourcen

Entwickeln eines benutzerdefinierten Ereignisanbieters
Gespeicherte Prozeduren in Notification Services (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005