Фрагментированная массовая загрузка XML в SQL Server на C#

У меня есть XML, содержащий информацию, полученную в результате сканирования систем в разных доменах. XML соответствует таблицам в базе данных, которые вложены следующим образом:

Domains
   Computers
      Volumes
          Folders
              Files

Моя цель - загрузить XML в соответствующие таблицы. Поскольку один единственный XML-файл был бы настолько большим, что его нельзя было бы загрузить в базу данных, мне пришлось разбить его на несколько частей меньшего размера. Как я могу отформатировать XML-файлы, чтобы загрузчик знал, что один файл является продолжением последнего файла, и он не генерировал дополнительные ключи для уже добавленного родительского узла. Есть ли у кого-нибудь опыт в этом? Это самый быстрый способ загрузки? Огромное спасибо! Вот код, который я использую для загрузки xml:

        static void BulkLoadXML()
    {
        try
        {
            string sPath = @"C:\XMLFiles\";


            string FileName, xsdPath, xmlPath;
            FileName = "TestAuto";

            xmlPath = sPath + FileName + ".xml";
            xsdPath = sPath + FileName + ".xsd";

            SQLXMLBULKLOADLib.SQLXMLBulkLoad4 objBL = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4();

            objBL.ConnectionString = @"Provider=sqloledb; server=srv1;database=MyTest;User ID=sa;Password=psw;Connection Timeout=60";

            objBL.ErrorLogFile = "error.xml";
            objBL.KeepIdentity = false;

            objBL.Execute(xsdPath, xmlPath);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.Read();
        }
        Console.Read();
    }

person Nicole    schedule 10.07.2014    source источник


Ответы (2)


Возможно, здесь нужна объемная вставка? Я думаю, что в С# вам даже не нужно сначала писать в текстовый файл. Используйте XMLReader, чтобы получить XML в память, а затем массово вставить его. Прочитайте следующую запись в блоге для получения информации о массовой вставке в C#: http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx< /а>

person Robbie Boucher    schedule 10.07.2014
comment
Спасибо! Я добавляю код C/, который использую. Как вы упомянули, я не создавал текстовый файл. Однако у меня есть файлы XML, которые мне нужно загрузить. - person Nicole; 10.07.2014

Я провел много исследований, и вот идея, которая частично решает проблему:

http://rakeshbajania.wordpress.com/2011/01/01/prevent-duplicate-entry-when-using-sqlbulkcopy/

Итак, идея состоит в том, чтобы определить уникальный индекс для таблиц и установить для IGNORE_DUP_KEY значение ON. Единственная проблема в том, что БД возвращает ошибку и не загружает дочерние узлы. В конце концов, я решил создать временные таблицы, которые загружаются чанками xml один за другим и очищать их после отправки их записей в основные таблицы с помощью хранимых процедур.

person Nicole    schedule 11.07.2014