2009-02-19 8 views
7

Utilisation de C# (vs2005) J'ai besoin de copier une table d'une base de données à une autre. Les deux moteurs de base de données sont SQL Server 2005. Pour la base de données distante, la source, j'ai seulement accès à une procédure stockée pour obtenir les données que je dois apporter localement.Copie d'une table de base de données dans une autre C#

La base de données locale est mieux contrôlée car elle est utilisée par l'application [asp.net] qui nécessite une copie locale de cette table distante. Nous aimerions qu'il soit local pour faciliter la recherche et se joint à d'autres tables, etc.

Pourriez-vous m'expliquer une méthode efficace pour copier ces données dans notre base de données locale.

La table locale peut être créée avec le même schéma que la table distante, si cela simplifie les choses. La table distante a 9 colonnes, dont aucune n'est une colonne d'identité. Il y a environ 5400 lignes dans la table distante, et ce nombre augmente d'environ 200 par an. Donc, pas une table qui change rapidement.

+0

(J'ai ajouté le DestinationTableName manquant ...) –

Répondre

10

fonction Bulk Copie ADO.NET peut vous aider à prendre un coup d'oeil à ce:

MSDN - Multiple Bulk Copy Operations (ADO.NET)

An example article

+0

Je ne sais pas que cela fonctionnerait sans accès sélectif sur la base de données source, mais il est certainement quelque chose à étudier en raison de sa vitesse par rapport à Autres méthodes! –

2

Je voudrais d'abord regarder à l'aide de SQL Server Intergration Services (SSIS, DTS).

Il est conçu pour déplacer/comparer/traiter/transformer des données entre des bases de données, et IIRC permet une expression arbitraire pour la source. Vous en auriez besoin installé sur votre base de données (ne devrait pas être un problème, il fait partie d'une installation par défaut).

Sinon, une solution de code, compte tenu de la taille des données (petite), extrait toutes les données du système de suppression dans une structure interne, puis recherche les lignes qui n'existent pas localement à insérer.

+0

Oui une option très viable et un que j'ai souvent utilisé dans le passé. Pour ce projet particulier, je ne voulais pas la dépendance externe d'un travail SSIS. Je suis curieux de savoir comment garder tout dans le code sur celui-ci. Merci pour votre réponse – Brettski

11

Peut-être SqlBulkCopy; utilisez SqlCommand.ExecuteReader pour obtenir le lecteur que vous utilisez dans l'appel à SqlBulkCopy.WriteToServer. C'est la même chose que le bulk-insert, donc très rapide. Il devrait ressembler quelque chose comme (non testé);

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, très intéressant, j'aime ça. Où puis-je définir la commande cible/où les données vont avec la connexion définie? Ou devrais-je lire sur SQLBulkCopy pour ma réponse? – Brettski

+0

Oups - oui, j'ai oublié le nom de la table ;-p va corriger ... –

1

Vous ne pouvez probablement pas le faire, mais si vous le pouvez » t, NE PAS le faire avec un programme. Si vous avez un moyen de parler à quelqu'un qui contrôle le serveur source, voyez s'il va mettre en place une sorte d'exportation des données. Si les données sont aussi petites que vous le dites, alors la sortie xml ou csv serait 100x meilleure que d'écrire quelque chose en C# (ou n'importe quelle langue). Donc, supposons qu'ils ne peuvent pas exporter, encore, évitez d'écrire un programme. Vous dites que vous avez plus de contrôle sur la destination. Pouvez-vous configurer un package SSIS ou configurer un serveur lié? Si c'est le cas, vous aurez beaucoup plus de facilité à migrer les données.

Si vous configurez au strict minimum la source en tant que serveur lié, vous pouvez écrire un petit t-sql lot

TRUNCATE DestTable

INSERT INTO DestTable SELECT SourceTable.Star DE [SourceServer]. [Schéma]. [Table]

ne serait pas aussi bien que SSIS (vous avez plus visuel de ce qui se passe, mais le t-sql ci-dessus est assez clair).

Depuis que je ne prendrais pas la route de la programmation, la meilleure solution que je pourrais vous donner serait, si vous deviez absolument:

Utiliser l'espace de noms SqlClient. Créez donc 2 SqlConnections, 2 SqlCommands et récupérez l'instance de 1 SqlReader. Effectuez une itération à travers le lecteur source et exécutez l'insertion SqlCommand de destination pour chaque itération avec le.

Ça va être moche, mais ça va marcher.

0

Il ne semble pas y avoir une énorme quantité de données à synchroniser. Dans les conditions que vous avez décrites (seulement SP pour accéder à la BD distante et aucun moyen d'obtenir autre chose), vous pouvez opter pour la solution de Marc Gravell. Dans le cas où les données ne peuvent que croître et que les données existantes ne peuvent pas être modifiées, vous pouvez comparer le nombre d'enregistrements sur la base de données distante et interne afin d'optimiser le fonctionnement; si aucun changement dans la base de données distante n'a pas besoin de copier.

Questions connexes