2009-12-16 4 views
1

Je dois copier par programme (ADO.Net) les enregistrements d'une table dans une base de données vers une table d'une autre base de données sur un serveur différent. Ceci est très similaire à "How can I copy data records between two instances of an SQLServer database", sauf que je ne suis pas autorisé à créer un lien vers le serveur de destination, donc la réponse acceptée à cette question ne fonctionnera pas pour moi.Comment copier des enregistrements de données entre deux instances d'une base de données SQLServer?

Répondre

0

Voici comment je l'ai fait. Merci aux autres répondants pour l'inspiration. Le code qui génère les mappages n'est pas nécessaire si les schémas des deux tables sont identiques.

public void CopyTables(string sourceConnectionString, string destConnectionString) 
{ 
     string sql = "Select * From SourceTable"; 
     using (SqlConnection sourceConn = new SqlConnection(sourceConnectionString)) 
     using (SqlCommand sourceCmd = new SqlCommand(sql, sourceConn)) { 
      sourceConn.Open(); 

      using (SqlDataReader reader = sourceCmd.ExecuteReader()) 
      using (SqlBulkCopy copier = new SqlBulkCopy(destConnectionString)) { 
       copier.DestinationTableName = "DestinationTable"; 
       copier.BulkCopyTimeout = 300; 

       DataTable schema = reader.GetSchemaTable(); 
       copier.ColumnMappings.Clear(); 
       foreach (DataRow row in schema.Rows) { 
        copier.ColumnMappings.Add(row["ColumnName"].ToString(), row["ColumnName"].ToString()); 
       } 

       copier.WriteToServer(reader); 
      } 
     } 
    } 
} 
0

La classe SqlBulkCopy proposée par santiiii est très efficace, mais il crée une opération non-connecté. Je devais le faire une fois mais ma base de données cible participait à la réplication, j'avais donc besoin que l'opération soit entièrement enregistrée. Ce que j'ai essentiellement fini par faire était de sélectionner un ensemble de données de la base de données source.

Select * from SourceDatabaseTable where (some clause to get the right records) 

créer ensuite un ensemble de données vide de la table de destination avec cette déclaration

Select * from DestinationDatabaseTable where 1<>1 

Puis j'avais deux ensembles de données. Le premier avec les enregistrements que je voulais copier et le second qui est vide. Ensuite, je viens de faire une boucle foreach imbriquée pour copier les enregistrements d'un ensemble de données à l'autre. Voici le pseudo-code pour la fonction de copie de base:

foreach(datarow sourcedr in sourcetable) 
{ 
    datarow destdr = destdatatable.createrow(); 
    foreach(datacolumn in sourcedatatable) 
    { 
     destdr[datacolumn]=Sourcedr[datacolum]; 
    } 
} 

Enfin, je viens d'utiliser un adaptateur de données pour soumettre les modifications sur la base de données de destination.

Questions connexes