Kopieren von einer Datenbanktabelle in eine andere C #

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.

Die lokale Datenbank hat mehr Kontrolle, da sie von der [asp.net] Anwendung verwendet wird, die eine lokale Kopie dieser entfernten 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.

    
Brettski 19.02.2009, 15:09
quelle

5 Antworten

10
Die

Bulk Copy-Funktion von ADO.NET hilft Ihnen vielleicht dabei:

MSDN - Mehrere Massenkopiervorgänge (ADO.NET)

Ein Beispielartikel

    
Canavar 19.02.2009, 15:29
quelle
11

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

%Vor%     
Marc Gravell 19.02.2009 15:27
quelle
2

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

Es wurde für das Verschieben / Vergleichen / Verarbeiten / Transformieren von Daten zwischen Datenbanken entwickelt, und IIRC erlaubt 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 zieht eine Codelösung angesichts der Datengröße (klein) alle Daten aus dem Löschsystem in eine interne Struktur und sucht dann nach Zeilen, die nicht lokal zum Einfügen vorhanden sind.

    
Richard 19.02.2009 15:23
quelle
1

Sie können das wahrscheinlich nicht, aber wenn Sie nicht können, tun Sie 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, trotzdem vermeiden Sie es, 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 mindestens die Quelle als Verbindungsserver einrichten, können Sie einen kleinen T-SQL-Stapel nach

schreiben

Kürzen Sie die Zieltabelle

INSERT in ZielTabelle SELECT SourceTable.Star VON [SourceServer]. [Schema]. [Tabelle]

wäre nicht so schön wie SSIS (Sie haben mehr visuelle Informationen darüber, was gerade passiert, aber das obige t-sql ist ziemlich klar).

Da ich den Programmierweg nicht nehmen würde, wäre die beste Lösung, die ich Ihnen geben könnte, wenn Sie unbedingt müssen:

Verwenden Sie den SqlClient-Namespace.

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

Iteriere durch den Quell-Reader und führe den Ziel-SqlCommand-Insert für jede Iteration mit dem.

aus

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

    
aWpTiMuS 19.02.2009 15:32
quelle
0

Es scheint sich nicht um eine riesige Datenmenge zu handeln, 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 und vorhandene Daten nicht geändert werden können, können Sie die Anzahl der Datensätze auf der entfernten und der internen DB vergleichen, um den Betrieb zu optimieren. Wenn keine Änderung in der Remote-DB notwendig ist, muss nicht kopiert werden.

    
Dan 19.02.2009 16:02
quelle

Tags und Links