Как я могу скопировать записи данных между двумя экземплярами базы данных SQLServer - PullRequest
1 голос
/ 16 декабря 2009

Мне нужно программно (ADO.Net) копировать записи из таблицы в одной базе данных в таблицу в другой базе данных на другом сервере. Это очень похоже на «Как я могу скопировать записи данных между двумя экземплярами базы данных SQLServer» за исключением того, что мне не разрешено создавать ссылку на целевой сервер, поэтому принятый ответ на этот вопрос не будет работа для меня.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2009

Класс 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];
   }
}

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

0 голосов
/ 18 декабря 2009

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

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 голосов
/ 16 декабря 2009

Вы можете использовать SqlBulkCopy класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...