2016-06-07 3 views
1

Ich habe viele Tutorials gesehen, die über die Verwendung des WCF SQL-Adapters in einem BizTalk-Empfangs-Port zum Einlesen von Daten aus einer SQL Server-Datenbank gehen . Ich konnte jedoch keine Ressourcen finden, die zeigen, wie diese Art von Operation am besten zu handhaben ist, wenn die Daten, mit denen Sie arbeiten, eine Eins-zu-viele-Beziehung haben.BizTalk WCF SQL Adapter: Wie Sie Datensätze aus einer Datenbank mit 1: n-Beziehungen erhalten

Zum Beispiel sagen, ich habe eine Datenbank mit drei Tabellen: Team, Player und Sponsor. Die Tabelle Team befindet sich in einer Eins-zu-Viele-Tabelle mit den Tabellen Player und Sponsor. Grundsätzlich kann ein Team viele Spieler haben, aber ein Spieler kann nur zu einem Team gehören. Ebenso kann ein Team mehrere Sponsoren haben, aber ein Sponsor wird nur ein Team unterstützen.

Ich möchte, dass meine BizTalk-Anwendung nach neuen Teamdatensätzen mit allen zugehörigen Daten fragt. Wenn ein neues Team hinzugefügt wird, möchte ich eine gespeicherte Prozedur verwenden, um dieses Team sowie alle Spieler und Sponsoren für dieses Team einzuladen. Die XSD für das resultierende XML wird natürlich mehrere Player- und Sponsor-Datensätze zulassen.

Ich könnte technisch FOR XML PATH verwenden, um die gesamte XML-Struktur innerhalb der gespeicherten Prozedur zu sammeln und diese an die BizTalk-Anwendung zurückzugeben, aber diese Vorgehensweise würde zu einer unnötig komplizierten gespeicherten Prozedur führen. (Ich arbeite nicht wirklich mit so einer kleinen Datenbankstruktur. Das war nur ein Beispiel für die Einfachheit.)

Das bringt mich zu meiner eigentlichen Frage: Was sind einige bewährte Methoden zum Abrufen von Datensätzen in einem -to-many Beziehung von einer Datenbank, um eine vollständig realisierte XML-Nachricht zu erstellen, die ich in meiner BizTalk-Anwendung verwenden kann?

Gibt es eine Möglichkeit, dies zu tun, nur mit einer gespeicherten Prozedur und dem WCF SQL-Adapter? Die einzige Lösung, die ich mir ausgedacht habe, ist, für jede Tabelle eine separate gespeicherte Prozedur zu verwenden und dann eine Map oder Orchestrierung zu verwenden, um die verschiedenen Teile in mein kanonisches Schema zu bringen. Vielleicht ist das in der Tat der beste Ansatz, aber ich würde gerne wissen, ob es etwas sehr Einfaches gibt, das mir fehlt.

+0

Ich habe noch nicht mit BizTalk gearbeitet, also könnte das Unsinn sein ... Da Sie sich immer für den gesamten Baum interessieren, würde ich vorschlagen, eine 'VIEW' zu erstellen (oder noch besser: eine' Inline-Funktion mit Parametern "), wo Sie' INNER JOIN's verwenden, um Ihre Tabellen zu binden und einen flachen Satz zurückzugeben. Es sollte einfach sein, den Rest auf Anwendungsebene zu erledigen ... – Shnugo

+0

* Sehr wichtige Fragen: 1. Willst du einen Top-Level-Datensatz eins nach dem anderen abrufen, wie ein einzelnes Team oder ein Batch, wie viele Teams? 2. Wie weit geht die 1 zu viele Hierarchie hin. 1 Level wäre Team-> Spieler. 2 Levels wären Team-> Spieler-> Tore. –

+0

1. Ich bin nicht wirklich an eine der beiden Vorgehensweisen gebunden, aber da jeder Datensatz separat behandelt wird, möchte ich ihn einzeln abrufen, wenn möglich, anstatt ihn zu mischen. Wenn sich das Chargen- und Debattieren als einfacher erweist, kann ich sicherlich auf diesen Ansatz eingewirkt werden. 2. Ich werde tatsächlich an zwei getrennten, aber ähnlichen Anwendungen arbeiten. In einem wird der eine zu vielen 1 Level tief sein. In der anderen wird es 2 Ebenen tief sein. Ich beginne mit der 1-Level-Anwendung und gehe zum nächsten, wenn es fertig ist. – NspectorHector

Antwort

3

Ihre gespeicherte Prozedur sollte in etwa so aussehen.

SELECT [TeamName] 
FROM [Team] 
WHERE [TeamID] = @NewTeamID 

SELECT [PlayerName] 
FROM [Player] 
WHERE [TeamID] = @NewTeamID 

SELECT [SponsorName] 
FROM [Sponsor] 
WHERE [TeamID] = @NewTeamID 

erzeugen dann das Schema aus, dass über Adapter-Service Konsumieren. Sie erhalten ein Schema mit drei Datensatzsätzen, die Sie dann einem schöneren Schema zuordnen können.

+0

Super, danke Dijkgraaf! Nach etwas Versuch und Irrtum konnte ich es zur Arbeit bringen. Hier sind einige Dinge, die Sie beachten sollten, damit andere Fehler bekommen. Eine Sache, der ich nicht genügend Aufmerksamkeit schenkte, war, dass ich Joins hatte, die Spalten mit demselben Namen enthielten.Wie Sie vielleicht vermutet haben, musste ich meine Anfrage etwas umgestalten, um dies zu vermeiden. Die andere Sache war, dass ich auch temporäre Tabellen in meiner Abfrage hatte, was andere Probleme verursachte. Weitere Informationen hierzu finden Sie auf dieser Seite: http://thoughtsofmarcus.blogspot.com/2010/11/calling-stored-procedures-from-biztalk.html – NspectorHector

Verwandte Themen