2009-12-30 25 views
5

Ich habe distributive DB-Architektur, wo Daten in mehreren SQL-Servern gespeichert ist.Abfrage mehrere Datenbanken mit einzelnen ado.net Abfrage

Wie kann ich wählen/aktualisieren/löschen, indem Sie eine einzige Abfrage ausführen. zum Beispiel "Select * from employees" sollte Daten aus allen Datenbanken zurückgeben, die ich habe.

Wie kann man einzelne Abfragen schreiben, die über mehrere SQL-Server laufen und eine einzige konsolidierte Sicht auf meinen Webserver bekommen.

HINWEIS: Da die Anzahl der SQL-Server in unterschiedlichen Zeiten ändern kann, damit ich etwas sucht, bin anders als verknüpfte Abfragen, da die verknüpften Abfragen in großem Umfang die Verwaltung (nach oben oder unten) ist ein großer Schmerz

+0

per Transaktion ich implizit auswählen/aktualisieren/löschen durch Ausführen einer einzigen Abfrage. Beispiel: "Wählen Sie * von Mitarbeitern" sollte Daten aus allen drei Datenbanken zurückgeben. – user72486

Antwort

3

Verwendung TransactionScope.

Wenn Sie Verbindungen zu verschiedenen Servern innerhalb des Bereichs öffnen, wird die Transaktion an eine verteilte Transaktion weitergeleitet.

Beispiel:

using (TransactionScope scope = new TransactionScope()) 
{ 
    conn1.Open(); //Open connection to db1 
    conn2.Open(); //Open connection to db2 

    // Don't forget to commit the transaction so it won't rollback 
    scope.Complete() 
} 
+0

BTW, es ist 'Complete()', nicht 'Commit()' –

+0

Danke für die Korrektur. Fest. – Oded

+0

nach Transaktion ich implizit auswählen/aktualisieren/löschen durch Ausführen einer einzelnen Abfrage. Beispiel: "Wählen Sie * von Mitarbeitern" sollte Daten aus allen drei Datenbanken zurückgeben. – user72486

6

Um zu verschiedenen Datenbanken/Verbindungen zu sprechen, werden Sie über TransactionScope eine verteilte Transaktion benötigen; Glücklicherweise ist dies eigentlich leichter als db-Transaktionen (auch wenn Sie einen Verweis auf System.Transactions.dll benötigen):

using(TransactionScope tran = new TransactionScope()) { 
    // lots of code talking to different databases/connections 
    tran.Complete(); 
} 

Zusätzlich TransactionScope Nest natürlich und SqlConnection einträgt automatisch, es ist wirklich einfach zu bedienen .

+0

Es ist erwähnenswert, dass für die Verwendung verteilter Transaktionen mit TransactionScope, müssen Sie Windows 2000 oder höher und haben die Microsoft Distributed Transaction Controller ((MSDTC) Dienst läuft –

+0

per Transaktion implizit Auswählen/Aktualisieren/Löschen durch Ausführen einer einzelnen Abfrage, zB "Auswahl * von Mitarbeitern" sollte Daten aus allen drei Datenbanken zurückgeben – user72486

0

Die beste Lösung ist hier, ein virtuelles DBMS zu verwenden, um Ihre mehreren Back-Ends in ein einziges scheinbares Backend zu migrieren - so geht Ihre Anfrage zum virtuellen DBMS, das es dann entsprechend an die tatsächlichen Datenspeicher weiterleitet.

OpenLink Virtuoso ist eine Option. Virtuoso öffnet Verbindungen zu jeder ODBC-zugänglichen (einschließlich JDBC-zugreifbaren, über eine ODBC-zu-JDBC-Brücke) Datenquelle.

Ihre datenverbrauchenden Anwendungen können nach Bedarf über ODBC, JDBC, OLE-DB oder ADO.NET eine Verbindung mit Virtuoso herstellen. Alle remote verbundenen Objekte (Tabellen, Views, Stored Procedures usw.) sind über alle Datenzugriffsmechanismen verfügbar.

Während Sie mit den anderen hier beschriebenen Techniken ähnliche Ergebnisse erzielen können, müssen Sie den Endbenutzer über die Back-End-Datenstrukturen informieren und die Abfragen selbst optimieren. Mit Virtuoso wird ein integrierter kostenbasierter Optimierer Abfragen neu schreiben, um die schnellstmöglichen Ergebnisse mit dem geringstmöglichen Netzwerkverkehr auf der Grundlage des virtuellen Schemas zu liefern, das beim Verknüpfen der Remote-Objekte erstellt wird.

Ich hoffe, das hilft!

Ted

ObDisclaimer: Ich arbeite für Open Software, aber nicht direkt von jedem profitieren Auswahl unserer Produkte zu verwenden.

+0

Sie sollten Ihre Zugehörigkeit offenlegen, wenn Sie Produkte von Ihrem Arbeitgeber empfehlen . –

0

Sie können mit einer einzigen Abfrage nicht das tun, wonach Sie suchen, es sei denn, Sie möchten einen Intermediär irgendeiner Art einfügen, z. B. eine SQL Express-Instanz, die die anderen Server unterstützt, möglicherweise mit SQL CLR . Aber das ist chaotisch.

Es wäre viel einfacher, einfach eine Reihe von asynchronen Anfragen auszugeben und dann die Antworten in eine einzelne DataTable (oder gleichwertig) zusammenzuführen, wenn sie ankommen. Durch die Verwendung systemeigener ADO.NET-Stil-Async-Aufrufe können alle Abfragen parallel ausgeführt werden. Sie müssen natürlich eine Sperre verwenden, während Sie die Daten in einer einzigen DataTable lesen.

Verwandte Themen