我尝试将数据从XML文件导入SQL Server CE数据库。我使用ErikEJ SQL Server Compact Bulk Insert Library(来自NuGet)this library on 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
上收到此错误:
mscorlib.dll中的“System.OutOfMemoryException”
如何解决这个问题?
更新:我知道这个错误是因为我使用大型xml - 问题是如何优化这个算法,mayby使用缓冲区或读取xml的部分,任何想法?
答案 0 :(得分:1)
没有简单的图书馆会为你解决这个问题。
您需要以流式方式(Reading Xml with XmlReader in C#)读取XML文件以避免加载整个XML文件,然后对于每个元素读取将这些添加到List或DataTable,最多说100,000个条目,然后BulkInsert那些,处理/清除所有未使用的对象并继续,直到整个文件被读取。
此外,对SqlCeBulkCopy的调用应包含在使用中以处置非托管资源:
using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString))
{
bulkInsert.DestinationTableName = "testtable";
bulkInsert.WriteToServer(table);
}