Копировать из одной таблицы базы данных в другую C # - PullRequest
8 голосов
/ 19 февраля 2009

Используя C # (vs2005) мне нужно скопировать таблицу из одной базы данных в другую. Оба ядра базы данных - SQL Server 2005. Для удаленной базы данных, источника, у меня есть только доступ к хранимой процедуре, чтобы получить данные, которые мне нужно доставить локально.

Локальная база данных, которой я больше управляю, так как она используется приложением [asp.net], которому требуется локальная копия этой удаленной таблицы. Мы хотели бы, чтобы он был локальным для более удобного поиска и объединения с другими таблицами и т. Д.

Не могли бы вы объяснить мне эффективный метод копирования этих данных в нашу локальную базу данных.

Локальная таблица может быть создана с той же схемой, что и удаленная, если это упрощает ситуацию. Удаленная таблица имеет 9 столбцов, ни один из которых не является столбцом идентификаторов. В удаленной таблице приблизительно 5400 строк, и это число увеличивается примерно на 200 в год. Так что не быстро меняющийся стол.

Ответы [ 5 ]

11 голосов
/ 19 февраля 2009

Возможно SqlBulkCopy; используйте SqlCommand.ExecuteReader, чтобы получить читатель, который вы используете при вызове SqlBulkCopy.WriteToServer. Это то же самое, что и групповая вставка, поэтому очень быстрая. Это должно выглядеть что-то как (не проверено);

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);
    }
}
10 голосов
/ 19 февраля 2009

Функция группового копирования ADO.NET может помочь вам взглянуть на это:

MSDN - Операции с несколькими копиями (ADO.NET)

Пример статьи

2 голосов
/ 19 февраля 2009

Сначала я хотел бы взглянуть на использование служб интеграции SQL Server (службы SSIS, ранее - Data Transfer Services (DTS)).

Он предназначен для перемещения / сравнения / обработки / преобразования данных между базами данных, а IIRC допускает произвольное выражение для источника. Вам нужно, чтобы он был установлен в вашей базе данных (это не должно быть проблемой, это часть установки по умолчанию).

В противном случае решение кода, учитывая размер данных (маленький), вытягивает все данные из системы удаления во внутреннюю структуру и затем ищет строки, которые не существуют локально для вставки.

1 голос
/ 19 февраля 2009

Вы, вероятно, не можете сделать это, но если вы не можете, НЕ делайте этого с программой. Если у вас есть возможность поговорить с кем-то, кто контролирует исходный сервер, посмотрите, не настроит ли он какой-либо вид экспорта данных. Если данные настолько малы, как вы говорите, то вывод xml или csv будет в 100 раз лучше, чем запись чего-либо на c # (или любом другом языке).

Итак, давайте предположим, что они не могут экспортировать, тем не менее, избегайте написания программы. Вы говорите, что имеете больше контроля над пунктом назначения. Можете ли вы настроить пакет служб SSIS или настроить связанный сервер? Если это так, вам будет гораздо проще перенести данные.

Если вы установите исходный источник как связанный сервер, вы можете написать небольшой пакет t-sql для

TRUNCATE DestTable

INSERT INTO DestTable ВЫБЕРИТЕ SourceTable.Star FROM [SourceServer]. [Схема]. [Таблица]

не так хорош, как SSIS (у вас есть более ясное представление о том, что происходит, но приведенный выше t-sql довольно ясен).

Поскольку я не выбрал бы маршрут программирования, лучшее решение, которое я мог бы дать вам, было бы, если бы вам абсолютно необходимо было:

Использовать пространство имен SqlClient.

Итак, создайте 2 SqlConnections, 2 SqlCommands и получите экземпляр 1 SqlReader.

Выполните итерацию в исходной программе чтения и выполните целевую вставку SqlCommand для каждой итерации с помощью.

Это будет некрасиво, но это сработает.

0 голосов
/ 19 февраля 2009

Похоже, вам не нужно огромное количество данных для синхронизации. В условиях, которые вы описали (только SP для доступа к удаленной БД и никакой возможности получить что-либо еще), вы можете воспользоваться решением Marc Gravell. В случае, если данные могут только расти, а существующие данные не могут быть изменены, вы можете сравнить количество записей на удаленной и внутренней БД для оптимизации работы; если нет изменений в удаленной БД, копировать не нужно.

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