Как вставить 61000 объектов данных в SQL Server 2005? - PullRequest
0 голосов
/ 09 июля 2009

Я пытаюсь вставить 61 000+ объектов, полученных с помощью удаленного вызова, в базу данных SQL Server 2005 самым быстрым способом. Есть предложения?

Я смотрел на использование SQLBulkCopy, но у меня возникли некоторые проблемы, связанные с получением правильного формата данных, поскольку я не начинаю с DataTable, а вместо этого имею список объектов. Так что, если ответы могут содержать примеры кода, которые будут оценены.

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

Редактировать ...

@ JP - это то, что будет выполняться каждую ночь как запланированное пакетное задание с приложением IIS ASP.NET.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 июля 2009

Если это то, что вы делаете один раз или только периодически, вы должны посмотреть на использование SSIS (это в основном DTS на стероидах). Вы можете создать пакет, который получает данные из одного источника данных и вставляет их в другой. Есть также функции для остановки / запуска и отслеживания миграции. Без более подробной информации о вашей ситуации я не могу предоставить код, но в SSIS существует множество примеров кода. Вы можете узнать больше и поиграть с SSIS в Virtual Labs .

1 голос
/ 09 июля 2009

Если вы собираетесь использовать класс SQLBulkCopy , я бы предложил создать пользовательский класс, который реализует IDataReader , который будет отвечать за сопоставление 61000 объектов исходных данных с соответствующими столбцами. в целевой таблице, а затем с помощью этого пользовательского класса в качестве параметра метода SQLBulkCopy WriteToServer.

Единственная хитрая часть будет реализовывать интерфейс IDataReader в вашем классе. Но даже это не должно быть слишком сложным. Просто помните, что ваша цель состоит в том, чтобы этот класс отображал ваши 610000 объектов данных на имена столбцов. И что ваш класс будет вызываться классом SQLBulkCopy для предоставления данных. Остальные должны собраться довольно легко.

 class CustomReaderClass : IDataReader
 {
    // make sure to implement the IDataReader inferface in this class

    // and a method to load the 61 000 data objects
    void Load()
    { 
       // do whatever you have to do here to load the data..
       //  with the remote call..?!
    }
 }

 //.. later you use it like so

 SQLBulkCopy  bulkCopyInstance;
 CustomReaderClass aCustomReaderClass = new aCustomReaderClass();
 aCustomReaderClass.Load();

 // open destination connection
 //  .. and create a new instance of SQLBulkCopy with the dest connection
 bulkCopyInstance.WriteToServer(aCustomReaderClass);

 // close connection and you're done!

Я надеюсь, что приведенный выше "псевдокод" имеет некоторый смысл ..

0 голосов
/ 09 июля 2009

@ У Miky D был правильный подход, но я хотел бы расширить детали. Реализация IDataReader не так уж сложна.

Чтобы заставить IDataReader работать с массовым инсертером, вам нужно взглянуть на реализацию:

  • Dispose ();
  • FieldCount {
  • объект GetValue (int i);
  • GetSchemaTable ();
  • Read ();

Остальные могут быть заглушками, которые генерируют NotImplementedExceptions, см. Этот пример

Получение таблицы схемы также довольно просто . Просто выберите одну строку из целевой таблицы и вызовите GetSchemaTable ().

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

Пара БОЛЬШИХ предостережений при таком подходе:

  1. Какие методы для реализации не документированы в SQLBulkCopy
  2. С учетом этого в более поздних версиях фреймворка / исправлений или пакета обновлений вы можете сломаться. Поэтому, если бы у меня был критически важный код, я бы взял кусочек и реализовал весь интерфейс.

Я думаю, что очень плохо, что SQLBulkCopy не имеет дополнительного минимального интерфейса для массовой вставки данных, IDataReader - это просто жир.

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