загрузка данных из XML в SQL
От: Yanish  
Дата: 22.12.05 11:38
Оценка:
поделитесь опытом!!!

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

// схема документа используемая при загрузке
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
     <xsd:element name="Customer">
       <xsd:complexType>
           <xsd:attribute name="ID" type="xsd:integer" />
       <xsd:attribute name="Cod" type="xsd:integer" />
       <xsd:attribute name="Date" type="xsd:float" />
       </xsd:complexType>
  </xsd:element>
</xsd:schema>


// сам документ важно количество записей, т.к. их много
<ROOT>
 <Customer ID="1" Cod="1" Date="38157"/>
 <Customer ID="2" Cod="2" Date="38250"/>
 ......
 <Customer ID="1000" Cod="2"/>
  ....
 <Customer ID="1000000" Cod="2" Date="38311"/>
</ROOT>


Пробовал:
Delphi: — через Ole объекты: SQLXML 3.0
  cmd := CreateOleObject('ADODB.Command');
  conn := CreateOleObject('ADODB.Connection');
  strmIn := CreateOleObject('ADODB.Stream');
  strmOut := CreateOleObject('ADODB.Stream');

  // Open a connection to the instance of SQL Server.
  conn.Provider := 'SQLOLEDB';
  conn.Open('server=(local); database=database; uid=UserName; pwd=pwd; ');
  conn.Properties('SQLXML Version') := 'SQLXML.3.0';
  cmd.ActiveConnection := conn;
  strmin.Open;
  strmin.position := 0;
  strmin.Charset := 'Windows-1251';
  strmin.Type := 2;
  strmin.LoadFromFile('Test.xml');
  cmd.Dialect := '{5d531cb2-e6ed-11d2-b252-00c04f681b71}';

  cmd.CommandStream := strmIn;

// Execute the command, open the return stream, and read the result.
  strmOut.Open;
  cmd.Properties('Output Stream') := strmOut;
  cmd.Properties('Output Encoding') := 'Windows-1251';
  strmOut.Charset := 'Windows-1251';
  strmOut.Type := 2;
  cmd.Execute(,,1024);
  strmOut.Position := 0;
  strmOut.SaveToFile(c:\error.xml', 2);
  cmd := NULL;
  strmout := NULL;
  strmin := NULL;
  conn := NULL;
end;


Delphi: — SQLXMLBulkLoad с помощью схем

var
  objBL: OleVariant;
begin              
  objBL := CreateOleObject('SQLXMLBulkLoad.SQLXMLBulkLoad.3.0');
  objBL.ConnectionString := 'provider=SQLOLEDB.1;data source=localhost;database=database;uid=UserName;pwd=pwd';
  objBL.ErrorLogFile := 'c:\error.log';
  objBL.Execute('c:\SampleSchema.xml', 'c:\Test.xml');
  objBL := NULL;
end;


О ТОМ ЧТОБЫ ЧЕРЕЗ ПАРСЕР "SAX" ИЛИ "DOM" ОТКРЫВАТЬ ФАЙЛ XML И РЕЧИ НЕ МОЖЕТ ИДТИ, Т.К. В РЕЗУЛЬТАТЕ ДЛЯ ВСТАВКИ НУЖНО ФОРМИРОВАТЬ СКРИПТЫ "INSERT INTO", А НА ЭТО ЕЩЁ БОЛЬШЕ ВРЕМЕНИ УХОДИТ.... ДО СКОНЧАНИЯ ВЕКА МОЖНО ЖДАТЬ !!!

В общем кто сталкивался с проблемой оптимизации работы связки SQL и XML отзовитесь ...
Re: загрузка данных из XML в SQL
От: Аноним  
Дата: 22.12.05 15:39
Оценка:
Здравствуйте, Yanish, Вы писали:

Y>поделитесь опытом!!!


Y>с помощью чего и быстро, что самое главное т.к. много данных грузить надо, можно загрузить данные в БД SQL. Мои попытки увенчались провалом .... т.к. загрузка по моим расчетам примерно сутки ... а это критично...


Насколько знаю, MS SQL Server сам умеет обращаться с XML как с базой данных (начиная с 2000 версии, кажется). Так что просто попробуй подцепиться к XML-файлу как к базе данных и набросай какой-нибудь скриптик для переброски данных и замерь скорость. Сам я это никогда не пробовал, но теоретически это должно быть максимально быстро, ибо данные будут пересекать границы процессов по минимуму (хотя как устроена конкретная реализация — , можно попробовать и на 2005 версии, результаты сравнить)
Re: загрузка данных из XML в SQL
От: Аноним  
Дата: 28.12.05 12:50
Оценка:
Здравствуйте, Yanish, Вы писали:

> В РЕЗУЛЬТАТЕ ДЛЯ ВСТАВКИ НУЖНО ФОРМИРОВАТЬ СКРИПТЫ "INSERT INTO",


С какой стати ?

Другой вопрос — это объемы данных. В форуме rsdn.xml кажется обсуждали SAM и DOM на огромных объемах данных, и что-то там не срасталось. Правда там нужен был доступ к произвольному месту многогигабайтного файла.
Если нужно поток прогнать с начала и до конца — SAX м.б. и подходит.
Вот только с какой стати нужно формировать для каждой строчки отдельный insert ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.