Я пытаюсь импортировать данные из файла 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 по частям, любую идею?
Нет простой библиотеки, которая решит это для вас.
Вам нужно прочитать XML файл потоковым способом (Чтение Xml с XmlReader в С#), чтобы избежать загрузки всего XML файла, а затем для каждого элемента чтения добавьте их в список или DataTable, до 100 000 записей, затем BulkInsert, удалите/очистите все неиспользуемые объекты и продолжайте, пока весь файл не будет прочитан.
Кроме того, вызовы SqlCeBulkCopy должны быть завернуты в usings для утилизации неуправляемых ресурсов:
using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString))
{
bulkInsert.DestinationTableName = "testtable";
bulkInsert.WriteToServer(table);
}
DataTable.ReadXml()
как ограничить для примера 100000 записей? А потом начать с 100001?