Скопировать из одной таблицы базы данных в другую с#

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

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

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

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

5 ответов


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

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

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


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

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);
    }
}

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

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

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


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

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

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

усечь DestTable

вставить в DestTable Выберите SourceTable.Звезда из [сервере sourceserver заданы].[Схема.][Таблица]

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

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

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

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

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

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


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