Empfangen von Abrufdaten geänderten Nachrichten von SQL Server mithilfe des WCF-Kanalmodells
Sie können den SQL-Adapter so konfigurieren, dass er regelmäßige Datenänderungsmeldungen für SQL Server Tabellen oder Sichten empfängt. Sie können eine Abruf-Anweisung angeben, die der Adapter ausführt, um die Datenbank abzufragen. Die Abruf-Anweisung kann eine SELECT-Anweisung oder eine gespeicherte Prozedur sein, die ein Resultset zurückgibt.
Weitere Informationen dazu, wie der Adapter Abrufe unterstützt, finden Sie unter Unterstützung für eingehende Anrufe mithilfe von Abrufen.
Wichtig
Wenn Sie mehrere Abrufvorgänge in einer einzelnen Anwendung verwenden möchten, müssen Sie eine InboundID-Verbindungseigenschaft als Teil des Verbindungs-URI angeben, um sie eindeutig zu machen. Die von Ihnen angegebene eingehende ID wird dem Vorgangsnamespace hinzugefügt, um sie eindeutig zu machen.
In diesem Thema wird die Abfrage veranschaulicht.
Um zu veranschaulichen, wie der SQL-Adapter das Empfangen von Datenänderungsmeldungen unterstützt, erstellen Sie in diesem Thema eine .NET-Anwendung für den Abrufvorgang . Geben Sie für dieses Thema PolledDataAvailableStatement wie folgt an :
SELECT COUNT(*) FROM Employee
PolledDataAvailableStatement muss ein Resultset zurückgeben, in dem die erste Zelle einen positiven Wert enthält. Wenn die erste Zelle keinen positiven Wert enthält, führt der Adapter die Abruf-Anweisung nicht aus.
Führen Sie im Rahmen der Abruf-Anweisung die folgenden Vorgänge aus:
Wählen Sie alle Zeilen aus der Tabelle Employee aus.
Führen Sie eine gespeicherte Prozedur (MOVE_EMP_DATA) aus, um alle Datensätze aus der Tabelle Employee in eine EmployeeHistory-Tabelle zu verschieben.
Führen Sie eine gespeicherte Prozedur (ADD_EMP_DETAILS) aus, um der Tabelle Employee einen neuen Datensatz hinzuzufügen. Bei diesem Verfahren werden der Name, die Bezeichnung und das Gehalt des Mitarbeiters als Parameter verwendet.
Um diese Vorgänge auszuführen, müssen Sie Folgendes für die PollingStatement-Bindungseigenschaft angeben:
SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000
Nachdem die Abruf-Anweisung ausgeführt wurde, werden alle Datensätze aus der Tabelle Employee ausgewählt, und die Nachricht von SQL Server wird empfangen. Sobald die MOVE_EMP_DATA gespeicherten Prozedur vom Adapter ausgeführt wird, werden alle Datensätze in die Tabelle EmployeeHistory verschoben. Anschließend wird die ADD_EMP_DETAILS gespeicherten Prozedur ausgeführt, um der Tabelle Employee einen neuen Datensatz hinzuzufügen. Die nächste Abrufausführung gibt nur einen einzelnen Datensatz zurück. Dieser Zyklus wird fortgesetzt, bis Sie den Kanallistener schließen.
Konfigurieren einer Abrufabfrage mit den SQL-Adapterbindungseigenschaften
In der folgenden Tabelle sind die SQL-Adapterbindungseigenschaften zusammengefasst, die Sie zum Konfigurieren des Adapters für den Empfang von Datenänderungsmeldungen verwenden. Sie müssen diese Bindungseigenschaften als Teil der .NET-Anwendung zum Abrufen angeben.
Binding-Eigenschaft | BESCHREIBUNG |
---|---|
InboundOperationType | Gibt an, ob Sie den eingehenden Vorgang "Polling", "TypedPolling" oder " Notification " ausführen möchten. Der Standardwert ist Polling. |
PolledDataAvailableStatement | Gibt die SQL-Anweisung an, die der Adapter ausführt, um zu bestimmen, ob Daten zum Abruf verfügbar sind. Die SQL-Anweisung muss ein Resultset zurückgeben, das aus Zeilen und Spalten besteht. Nur wenn eine Zeile verfügbar ist, wird die für die Bindungseigenschaft PollingStatement angegebene SQL-Anweisung ausgeführt. |
PollingIntervalInSeconds | Gibt das Intervall in Sekunden an, in dem der SQL-Adapter die anweisung ausführt, die für die Bindungseigenschaft PolledDataAvailableStatement angegeben ist. Der Standardwert ist 30 Sekunden. Das Abrufintervall bestimmt das Zeitintervall zwischen aufeinander folgenden Umfragen. Wenn die Anweisung innerhalb des angegebenen Intervalls ausgeführt wird, wartet der Adapter auf die verbleibende Zeit im Intervall. |
PollingStatement | Gibt die SQL-Anweisung an, die die SQL Server Datenbanktabelle abruft. Sie können eine einfache SELECT-Anweisung oder eine gespeicherte Prozedur für die Abruf-Anweisung angeben. Der Standardwert ist NULL. Sie müssen einen Wert für PollingStatement angeben, um die Abfrage zu aktivieren. Die Abrufanweisung wird nur ausgeführt, wenn Daten für den Abruf verfügbar sind, was durch die Bindungseigenschaft PolledDataAvailableStatement bestimmt wird. Sie können eine beliebige Anzahl von SQL-Anweisungen angeben, die durch ein Semikolon getrennt sind. |
PollWhileDataFound | Gibt an, ob der SQL-Adapter das Abrufintervall ignoriert und kontinuierlich die SQL-Anweisung ausführt, die für die Bindungseigenschaft PolledDataAvailableStatement angegeben ist, wenn Daten in der abgerufenen Tabelle verfügbar sind. Wenn in der Tabelle keine Daten verfügbar sind, wird der Adapter zurückgesetzt, um die SQL-Anweisung im angegebenen Abrufintervall auszuführen. Die Standardeinstellung lautet false. |
Eine ausführlichere Beschreibung dieser Eigenschaften finden Sie unter Informationen zum BizTalk-Adapter für SQL Server Eigenschaften der Adapterbindung. Eine vollständige Beschreibung der Verwendung des SQL-Adapters zum Abfragen SQL Server finden Sie im weiteren Verlauf dieses Themas.
Verwenden der Abrufanforderungsnachricht
Der Adapter ruft den Abrufvorgang für Ihren Code auf, um die SQL Server-Datenbank abzufragen. Das heißt, der Adapter sendet eine Abfrageanforderungsnachricht, die Sie über ein IInputChannel-Kanal-Shape erhalten. Die Abfrageanforderungsnachricht enthält das Resultset der Abfrage, die von der PollingStatement-Bindungseigenschaft angegeben wird. Sie können die Abrufnachricht auf zwei Arten nutzen:
Um die Nachricht mithilfe des Knoten-Wert-Streamings zu nutzen, müssen Sie die WriteBodyContents-Methode für die Antwortnachricht aufrufen und ihr einen XmlDictionaryWriter übergeben, der knotenwertbasiertes Streaming implementiert.
Um die Nachricht mithilfe des Knotenstreamings zu nutzen, können Sie GetReaderAtBodyContents für die Antwortnachricht aufrufen, um einen XmlReader abzurufen.
Informationen zu den in diesem Thema verwendeten Beispielen
In den Beispielen in diesem Thema wird die Tabelle Employee abgerufen. Im Beispiel werden auch die MOVE_EMP_DATA und ADD_EMP_DETAILS gespeicherte Prozedur verwendet. Mit den Beispielen wird ein Skript zum Generieren dieser Artefakte bereitgestellt. Weitere Informationen zu den Beispielen finden Sie unter Beispiele für den SQL-Adapter. Ein Beispiel, Polling_ChannelModel, das auf diesem Thema basiert, wird auch mit den SQL-Adapterbeispielen bereitgestellt.
Empfangen eingehender Nachrichten für Den Abrufvorgang mithilfe des WCF-Kanalmodells
Dieser Abschnitt enthält Anweisungen zum Schreiben einer .NET-Anwendung (Kanalmodell) zum Empfangen eingehender Abrufnachrichten mithilfe des SQL-Adapters.
So empfangen Sie Abrufnachrichten vom SQL-Adapter
Erstellen Sie ein Microsoft Visual C#-Projekt in Visual Studio. Erstellen Sie für dieses Thema eine Konsolenanwendung.
Fügen Sie im Projektmappen-Explorer Verweis auf
Microsoft.Adapters.Sql
,Microsoft.ServiceModel.Channels
,System.ServiceModel
undSystem.Runtime.Serialization
hinzu.Öffnen Sie die Datei Program.cs, und fügen Sie die folgenden Namespaces hinzu:
Microsoft.Adapters.Sql
System.ServiceModel
System.ServiceModel.Description
System.ServiceModel.Channels
System.Xml
Geben Sie einen Verbindungs-URI an. Weitere Informationen zum Adapterverbindungs-URI finden Sie unter Erstellen des SQL Server Verbindungs-URI.
Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?");
Erstellen Sie eine instance von SqlAdapterBinding, und legen Sie die Bindungseigenschaften fest, die zum Konfigurieren des Abrufs erforderlich sind. Sie müssen mindestens die Bindungseigenschaften InboundOperationType, PolledDataAvailableStatement und PollingStatement festlegen. Weitere Informationen zu Bindungseigenschaften, die zum Konfigurieren der Abrufe verwendet werden, finden Sie unter Unterstützung für eingehende Aufrufe mithilfe von Abrufen.
SqlAdapterBinding binding = new SqlAdapterBinding(); binding.InboundOperationType = InboundOperation.Polling; binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE"; binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";
Erstellen Sie eine Bindungsparameterauflistung, und legen Sie die Anmeldeinformationen fest.
ClientCredentials credentials = new ClientCredentials(); credentials.UserName.UserName = "<Enter user name here>"; credentials.UserName.Password = "<Enter password here>"; BindingParameterCollection bindingParams = new BindingParameterCollection(); bindingParams.Add(credentials);
Erstellen Sie einen Kanallistener, und öffnen Sie ihn. Sie erstellen den Listener, indem Sie die IInputChannel-Methode BuildChannelListener<> für sqlAdapterBinding aufrufen.
IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams); listener.Open();
Rufen Sie einen IInputChannel-Kanal ab, indem Sie die AcceptChannel-Methode auf dem Listener aufrufen und öffnen.
IInputChannel channel = listener.AcceptChannel(); channel.Open();
Rufen Sie Receive im Kanal auf, um die nächste POLLINGSTMT-Nachricht vom Adapter abzurufen.
Message message = channel.Receive();
Verwenden Sie das resultset, das vom POLLINGSTMT-Vorgang zurückgegeben wird. Sie können die Nachricht entweder mit einem XmlReader oder einem XmlDictionaryWriter verwenden.
XmlReader reader = message.GetReaderAtBodyContents();
Schließen Sie den Kanal, wenn Sie die Verarbeitung der Anforderung abgeschlossen haben.
channel.Close()
Wichtig
Sie müssen den Kanal schließen, nachdem Sie die Verarbeitung des POLLINGSTMT-Vorgangs abgeschlossen haben. Wenn Sie den Kanal nicht schließen, kann sich dies auf das Verhalten Ihres Codes auswirken.
Schließen Sie den Listener, wenn Sie mit dem Empfang von Datenänderungsmeldungen fertig sind.
listener.Close()
Wichtig
Durch das Schließen des Listeners werden keine Kanäle geschlossen, die mit dem Listener erstellt wurden. Sie müssen jeden mit dem Listener erstellten Kanal explizit schließen.
Beispiel
Das folgende Beispiel zeigt eine Abfrage, die die Employee-Tabelle ausführt. Die Abruf-Anweisung führt die folgenden Aufgaben aus:
Wählt alle Datensätze aus der Tabelle Employee aus.
Führt die MOVE_EMP_DATA gespeicherten Prozedur aus, um alle Datensätze aus der Employee-Tabelle in die EmployeeHistory-Tabelle zu verschieben.
Führt die ADD_EMP_DETAILS gespeicherten Prozedur aus, um der Tabelle Employee einen einzelnen Datensatz hinzuzufügen.
Die Abrufnachrichten werden unter
C:\PollingOutput.xml
gespeichert.
using System;
using Microsoft.Adapters.Sql;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
using System.Xml;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Sample started. This sample will poll 5 times and will perform the following tasks:");
Console.WriteLine("Press any key to start polling...");
Console.ReadLine();
IChannelListener<IInputChannel> listener = null;
IInputChannel channel = null;
try
{
TimeSpan messageTimeout = new TimeSpan(0, 0, 30);
SqlAdapterBinding binding = new SqlAdapterBinding();
binding.InboundOperationType = InboundOperation.Polling;
binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM EMPLOYEE";
binding.PollingStatement = "SELECT * FROM Employee;EXEC MOVE_EMP_DATA;EXEC ADD_EMP_DETAILS John, Tester, 100000";
Uri ConnectionUri = new Uri("mssql://mysqlserver//mydatabase?");
ClientCredentials credentials = new ClientCredentials();
credentials.UserName.UserName = "<Enter user name here>";
credentials.UserName.Password = "<Enter password here>";
BindingParameterCollection bindingParams = new BindingParameterCollection();
bindingParams.Add(credentials);
listener = binding.BuildChannelListener<IInputChannel>(ConnectionUri, bindingParams);
listener.Open();
channel = listener.AcceptChannel();
channel.Open();
Console.WriteLine("Channel and Listener opened...");
Console.WriteLine("\nWaiting for polled data...");
Console.WriteLine("Receive request timeout is {0}", messageTimeout);
// Poll five times with the specified message timeout
// If a timeout occurs polling will be aborted
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Polling: " + i);
Message message = null;
XmlReader reader = null;
try
{
//Message is received so process the results
message = channel.Receive(messageTimeout);
}
catch (System.TimeoutException toEx)
{
Console.WriteLine("\nNo data for request number {0}: {1}", i + 1, toEx.Message);
continue;
}
// Get the query results using an XML reader
try
{
reader = message.GetReaderAtBodyContents();
}
catch (Exception ex)
{
Console.WriteLine("Exception :" + ex);
throw;
}
XmlDocument doc = new XmlDocument();
doc.Load(reader);
using (XmlWriter writer = XmlWriter.Create("C:\\PollingOutput.xml"))
{
doc.WriteTo(writer);
Console.WriteLine("The polling response is saved at 'C:\\PollingOutput.xml'");
}
// return the cursor
Console.WriteLine();
// close the reader
reader.Close();
message.Close();
}
Console.WriteLine("\nPolling done -- hit <RETURN> to finish");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
}
}
finally
{
// IMPORTANT: close the channel and listener to stop polling
if (channel != null)
{
if (channel.State == CommunicationState.Opened)
channel.Close();
else
channel.Abort();
}
if (listener != null)
{
if (listener.State == CommunicationState.Opened)
listener.Close();
else
listener.Abort();
}
}
}
}
}
Weitere Informationen
Entwickeln von SQL-Anwendungen mithilfe des WCF-Kanalmodells