2009-12-16 4 views
1

Мне нужно программно (ADO.Net) копировать записи из таблицы в одной базе данных в таблицу в другой базе данных на другом сервере. Это очень похоже на "How can I copy data records between two instances of an SQLServer database", за исключением того, что мне не разрешено создавать ссылку на целевой сервер, поэтому принятый ответ на этот вопрос не будет работать для меня.Как копировать записи данных между двумя экземплярами базы данных SQLServer

ответ

0

Вот как я это сделал. Спасибо другим респондентам за вдохновение. Код, который создает сопоставления, не требуется, если схемы двух таблиц идентичны.

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

Класс SqlBulkCopy предложенный santiiii очень эффективен, но он создает не-авторизовались операции. Я должен был сделать это один раз, но моя целевая база данных участвовала в репликации, поэтому мне потребовалась полная регистрация операции. То, что я, по сути, делал, это выбор набора данных из исходной базы данных.

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

Затем создать пустой набор данных из таблицы назначения с этим утверждением

Select * from DestinationDatabaseTable where 1<>1 

Тогда у меня было два набора данных. Первый с записями, которые я хотел скопировать, а второй - пустым. Затем я просто сделал вложенный цикл foreach, чтобы скопировать записи из одного набора данных в другой. Вот псевдокод для функции основной копии:

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

Наконец, я просто использовал адаптер данных представить изменения в целевой базе данных.

Смежные вопросы