Импорт большого XML-файла в SQL Server CE

1

Я пытаюсь импортировать данные из файла XML в базу данных SQL Server CE. Я использую ErikEJ SQL Server Compact Bulk Insert Library (из NuGet) эту библиотеку на codeplex. Я создаю базу данных и таблицу. Затем я читаю XML в DataTable и импортирую таблицу DataTable в таблицу DB.

DataSet ds = new DataSet();
ds.ReadXml("myxml.xml");
DataTable table = new DataTable();
table = ds.Tables[0];
String connString = @"Data Source = test.sdf";
SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString);
bulkInsert.DestinationTableName = "testtable";
bulkInsert.WriteToServer(table);

Он работает с небольшим xml, но когда я использую большой xml (более 1gb), я получаю эту ошибку в ReadXml:

"System.OutOfMemoryException" в файле mscorlib.dll

Как это исправить?

update: Я знаю, что эта ошибка, потому что я использую большой xml-вопрос, как оптимизировать этот алгоритм, может использовать буфер или прочитать xml по частям, любую идею?

Теги:
sql-server-ce

1 ответ

1
Лучший ответ

Нет простой библиотеки, которая решит это для вас.

Вам нужно прочитать XML файл потоковым способом (Чтение Xml с XmlReader в С#), чтобы избежать загрузки всего XML файла, а затем для каждого элемента чтения добавьте их в список или DataTable, до 100 000 записей, затем BulkInsert, удалите/очистите все неиспользуемые объекты и продолжайте, пока весь файл не будет прочитан.

Кроме того, вызовы SqlCeBulkCopy должны быть завернуты в usings для утилизации неуправляемых ресурсов:

using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString))
{
   bulkInsert.DestinationTableName = "testtable";
   bulkInsert.WriteToServer(table);
}
  • 0
    Спасибо, но если я использую DataTable.ReadXml() как ограничить для примера 100000 записей? А потом начать с 100001?
  • 0
    Не используйте DataTable.ReadXml, но используйте xmlreader и добавьте 1 строку на чтение в DataTable или List <T> и посчитайте, сколько вы добавили. Когда вы достигнете 100000, запустите blukcopy и продолжайте ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню