将大型 XML 文件导入 SQL 服务器 CE
Import large XML file into SQL Server CE
我尝试将数据从 XML 文件导入 SQL Server CE 数据库。我使用 ErikEJ SQL 服务器紧凑型批量插入库(来自 NuGet)this library on codeplex。我创建数据库和 table。然后我将 XML 读到 DataTable
并将这个 DataTable
导入到数据库 table。
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" in mscorlib.dll
如何解决这个问题?
更新:我知道这个错误是因为我使用了大 xml - 问题是如何优化这个算法,可能通过使用缓冲区或逐个读取 xml ,知道吗?
没有简单的库可以为您解决这个问题。
您需要以流方式读取 XML 文件 ( Reading Xml with XmlReader in C# ) 以避免加载整个 XML 文件,然后对于读取的每个元素将这些添加到列表中或 DataTable,最多说 100,000 个条目,然后 BulkInsert 那些,dispose/clear 所有未使用的对象并继续,直到读取整个文件。
此外,对 SqlCeBulkCopy 的调用应该包含在 usings 中以处理非托管资源:
using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString))
{
bulkInsert.DestinationTableName = "testtable";
bulkInsert.WriteToServer(table);
}
我尝试将数据从 XML 文件导入 SQL Server CE 数据库。我使用 ErikEJ SQL 服务器紧凑型批量插入库(来自 NuGet)this library on codeplex。我创建数据库和 table。然后我将 XML 读到 DataTable
并将这个 DataTable
导入到数据库 table。
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" in mscorlib.dll
如何解决这个问题?
更新:我知道这个错误是因为我使用了大 xml - 问题是如何优化这个算法,可能通过使用缓冲区或逐个读取 xml ,知道吗?
没有简单的库可以为您解决这个问题。
您需要以流方式读取 XML 文件 ( Reading Xml with XmlReader in C# ) 以避免加载整个 XML 文件,然后对于读取的每个元素将这些添加到列表中或 DataTable,最多说 100,000 个条目,然后 BulkInsert 那些,dispose/clear 所有未使用的对象并继续,直到读取整个文件。
此外,对 SqlCeBulkCopy 的调用应该包含在 usings 中以处理非托管资源:
using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString))
{
bulkInsert.DestinationTableName = "testtable";
bulkInsert.WriteToServer(table);
}