2009-02-19 22 views
7

Mit C# (vs2005) muss ich eine Tabelle von einer Datenbank in eine andere kopieren. Beide Datenbank-Engines sind SQL Server 2005. Für die entfernte Datenbank, die Quelle, habe ich nur Ausführungszugriff auf eine gespeicherte Prozedur, um die Daten zu erhalten, die ich lokal bringen muss.Kopieren von einer Datenbanktabelle in eine andere C#

Die lokale Datenbank habe ich mehr Kontrolle, da es von der [asp.net] -Anwendung verwendet wird, die eine lokale Kopie dieser Remote-Tabelle benötigt. Wir möchten es lokal für einfacheres Nachschlagen und verbindet sich mit anderen Tabellen usw.

Könnten Sie mir bitte eine effiziente Methode zum Kopieren dieser Daten in unsere lokale Datenbank erklären.

Die lokale Tabelle kann mit demselben Schema wie das entfernte erstellt werden, wenn es die Dinge einfacher macht. Die entfernte Tabelle hat 9 Spalten, von denen keine Identitätsspalten sind. Es gibt ungefähr 5400 Zeilen in der entfernten Tabelle, und diese Zahl wächst um ungefähr 200 pro Jahr. Also kein schnell wechselnder Tisch.

+0

(Ich habe den fehlenden DestinationTableName hinzugefügt ...) –

Antwort

10

Bulk Copy-Funktion von ADO.NET könnte Ihnen helfen, einen Blick auf das nehmen:

MSDN - Multiple Bulk Copy Operations (ADO.NET)

An example article

+0

Ich weiß nicht, dass dies ohne Select-Zugriff auf die Quelldatenbank funktionieren würde, aber es ist definitiv etwas zu untersuchen aufgrund seiner schiere Geschwindigkeit im Vergleich zu andere Methoden! –

2

Ich würde zuerst mit SQL Server Intergration Services (SSIS, geb. Data Transfer Services (DTS)) betrachten.

Es ist für das Verschieben/Vergleichen/Verarbeiten/Transformieren von Daten zwischen Datenbanken konzipiert, und IIRC ermöglicht einen beliebigen Ausdruck für die Quelle. Sie müssten es in Ihrer Datenbank installiert haben (sollte kein Problem sein, es ist Teil einer Standardinstallation).

Andernfalls eine Codelösung, angesichts der Datengröße (klein), ziehen Sie alle Daten aus dem System entfernen in eine interne Struktur, und dann nach Zeilen suchen, die nicht lokal zum Einfügen vorhanden sind.

+0

Ja eine sehr brauchbare Option und eine, die ich oft in der Vergangenheit benutzt habe. Für dieses spezielle Projekt wollte ich nicht die externe Abhängigkeit eines SSIS-Jobs. Ich bin neugierig, wie man alles im Code auf diesem einen behält. Vielen Dank für Ihre Antwort – Brettski

11

Vielleicht SqlBulkCopy; Verwenden Sie SqlCommand.ExecuteReader, um das Lesegerät zu erhalten, das Sie in dem Aufruf von SqlBulkCopy.WriteToServer verwenden. Das ist das Gleiche wie Bulk-Insert, also sehr schnell. Es sollte aussehen etwas wie (ungeprüft);

using (SqlConnection connSource = new SqlConnection(csSource)) 
using (SqlCommand cmd = connSource.CreateCommand()) 
using (SqlBulkCopy bcp = new SqlBulkCopy(csDest)) 
{ 
    bcp.DestinationTableName = "SomeTable"; 
    cmd.CommandText = "myproc"; 
    cmd.CommandType = CommandType.StoredProcedure; 
    connSource.Open(); 
    using(SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     bcp.WriteToServer(reader); 
    } 
} 
+0

Ah, sehr interessant, ich mag es. Wo definiere ich den Zielbefehl/wohin gehen die Daten mit der definierten Verbindung? Oder sollte ich SQLBulkCopy für meine Antwort lesen? – Brettski

+0

Hoppla - ja, ich habe den Tabellenname vergessen ;-p wird behoben ... –

1

Sie können sich wahrscheinlich nicht tun, aber wenn Sie können‘ t, tu es NICHT mit einem Programm. Wenn Sie mit jemandem sprechen können, der den Quellserver steuert, prüfen Sie, ob sie eine Art Export der Daten einrichten. Wenn die Daten so klein sind, wie Sie sagen, dann wäre xml oder csv output 100x besser als etwas in C# (oder einer anderen Sprache) zu schreiben.

Nehmen wir also an, sie können nicht exportieren, immer noch vermeiden, ein Programm zu schreiben. Sie sagen, Sie haben mehr Kontrolle über das Ziel. Können Sie ein SSIS-Paket einrichten oder einen Verbindungsserver einrichten? Wenn dies der Fall ist, können Sie die Daten viel einfacher migrieren.

Wenn Sie die Quelle als Verbindungsserver auf Nötigste einrichten Sie

TRUNCATE DestTable

INSERT INTO DestTable SELECT SourceTable.Star FROM [Source] ein kleines T-SQL-Batch schreiben. [Tabelle]

wäre nicht so schön wie SSIS (Sie haben mehr visuelle von dem, was passiert, aber die T-SQL oben ist ziemlich klar).

Da würde ich nicht die Programmierung Weg nehmen, um die beste Lösung, die ich geben könnte Sie wäre, wenn Sie unbedingt musste:

Verwenden SqlClient Namespace.

Erstellen Sie also 2 SqlConnections, 2 SqlCommands und rufen Sie die Instanz des 1 SqlReader ab.

Iterieren Sie durch den Quell-Reader und führen Sie den Ziel-SqlCommand-Insert für jede Iteration mit dem.

Es wird hässlich sein, aber es wird funktionieren.

0

Scheint nicht zu große Datenmenge zu sein, die Sie synchronisieren müssen. Unter den Bedingungen, die Sie beschrieben haben (nur SP, um auf die Remote-DB zuzugreifen und nichts anderes zu bekommen), können Sie sich für Marc Gravells Lösung entscheiden. Wenn die Daten nur wachsen können und vorhandene Daten nicht geändert werden können, können Sie die Datensatzanzahl auf der Remote- und internen DB vergleichen, um den Betrieb zu optimieren. wenn keine Änderung in der entfernten DB notwendig ist, muss nicht kopiert werden.

Verwandte Themen