2015-04-03 88 views
1

我嘗試將數據從XML文件導入到SQL Server CE數據庫中。我使用ErikEJ SQL Server Compact Bulk Insert Library(來自NuGet)this library on codeplex。我創建數據庫和表。然後我將XML讀取到DataTable並將此DataTable導入到數據庫表中。將大型XML文件導入到SQL Server CE中

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

可能重複[當仍然有足夠的內存免費「System.OutOfMemoryException的」被拋出(HTTP:/ /stackoverflow.com/questions/1153702/system-outofmemoryexception-was-thrown-when-there-is-still-plenty-of-memory-fr) – 2015-04-03 06:48:04

回答

1

沒有簡單的庫文件可以解決這個問題。

您需要以流式方式(Reading Xml with XmlReader in C#)讀取XML文件以避免加載整個XML文件,然後對每個元素進行讀取,將這些元素添加到List或DataTable中,最多稱爲100,000個條目,然後BulkInsert這些元素,處置/清除所有未使用的對象並繼續,直到整個文件被讀取。

此外,調用SqlCeBulkCopy應該被包裹在usings處置非託管資源:

using (SqlCeBulkCopy bulkInsert = new SqlCeBulkCopy(connString)) 
{ 
    bulkInsert.DestinationTableName = "testtable"; 
    bulkInsert.WriteToServer(table); 
} 
+0

Thk,但如果我使用'DataTable.ReadXml()'如何限制考試100000條目?然後從100001開始? – e1s 2015-04-03 07:54:49

+0

不使用DataTable.ReadXml,但使用xmlreader並將每行讀取1行添加到DataTable或List ,並計算您添加的數量。當你達到100000時,然後運行blukcopy,然後繼續... – ErikEJ 2015-04-03 08:23:54