Share via


Utilizzo delle stored procedure di inoltro di eventi

Notification Services include stored procedure per la raccolta di eventi che consentono di inoltrare eventi singoli o batch di eventi. Utilizzare queste stored procedure per inoltrare gli eventi utilizzando codice Transact-SQL. È possibile eseguire manualmente queste stored procedure, eseguire le stored procedure in un processo di Microsoft SQL Server Agent, oppure utilizzare le stored procedure all'interno di trigger in modo da eseguire la query in risposta a un inserimento o aggiornamento in un'altra tabella.

Inoltro dei dati degli eventi

Un set di stored procedure consente di aprire un batch di eventi, inoltrare singolarmente uno o più eventi e quindi chiudere il batch. Utilizzare le di stored procedure seguenti per inoltrare singoli eventi a un'applicazione Notification Services:

  • NSEventBeginBatchEventClassName utilizza il nome del provider di eventi che sta inoltrando i dati degli eventi come argomento di input e restituisce l'ID del nuovo batch di eventi.
  • NSEventWriteEventClassName aggiunge un singolo evento al batch di eventi. Questi argomenti di stored procedure sono l'ID del batch di eventi e un elenco di valori per i campi evento.
  • NSEventFlushBatchEventClassName chiude il batch di eventi e inoltra il set di eventi all'applicazione

Assicurarsi di eseguire tutte le stored procedure nella stessa transazione in modo che Notification Services apra il batch, inoltri gli eventi e quindi chiuda il batch in una transazione.

Per ulteriori informazioni ed esempi, vedere i seguenti argomenti relativi alle stored procedure:

Utilizzo di una query per raccogliere e inoltrare gli eventi

Per raccogliere gli eventi utilizzando un'istruzione SELECT, è possibile utilizzare la stored procedure NSEventSubmitBatchEventClassName. Questa stored procedure utilizza due query, una per la raccolta di eventi utilizzando una query definita dall'utente, e una query successiva alla raccolta (detta query post) da eseguire dopo la raccolta degli eventi. È possibile utilizzare questa query post per eseguire eventuali operazioni di pulizia necessarie, ad esempio modificare un campo di registrazione delle operazioni da "nuovo" a "raccolta eseguita" in modo da non raccogliere di nuovo gli stessi dati.

Per ulteriori informazioni e un esempio, vedere NSEventSubmitBatch<EventClassName> (Transact-SQL).

Utilizzo delle stored procedure di inoltro di eventi nelle applicazioni

È possibile eseguire le stored procedure di raccolta di eventi dall'interno di codice gestito e non gestito. Un modo comune per eseguire una stored procedure dall'interno di codice gestito è l'utilizzo di un oggetto SqlCommand. È possibile specificare una stored procedure e i relativi argomenti nell'oggetto SqlCommand e quindi eseguire la procedura utilizzando il relativo metodo ExecuteNonQuery.

Esempio: Aggiunta di un singolo evento

In questo esempio vengono utilizzati gli spazi dei nomi seguenti:

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

Esempio: Aggiunta di più eventi

In questo esempio vengono utilizzati gli spazi dei nomi seguenti:

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

Vedere anche

Altre risorse

Sviluppo di un provider di eventi personalizzato
Stored procedure di Notification Services (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005