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.
Bulk Copy-Funktion von ADO.NET hilft Ihnen vielleicht dabei:
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%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.
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
schreibenKü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.
ausEs wird hässlich sein, aber es wird funktionieren.
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.
Tags und Links sql-server c# ado.net