2012-02-07 139 views
1

我們正在從sql server數據庫中提取大量數據。它有大約25000行,2500列。要求是讀取數據並將其導出到電子表格,因此分頁不是一種選擇。當記錄較少時,它可以提取數據,但當它增長到我上面提到的大小時,就會拋出異常。當從數據庫中提取大量數據時,內存不足異常

public DataSet Exportexcel(string Username) 
{ 
    Database db = DatabaseFactory.CreateDatabase(Config); 
    DbCommand dbCommand = 
     db.GetStoredProcCommand("Sp_ExportADExcel"); 
    db.AddInParameter(dbCommand, "@Username", DbType.String, 
     Username); 
    return db.ExecuteDataSet(dbCommand); 
} 

請幫我解決這個問題。

+0

您可以通過提取僅1000行並檢查返回的DataSet的大小來計算數據集大小嗎?然後乘以25並檢查您的服務器是否有足夠的內存。注意ASP.NET,IIS和Windows Server體系結構可能會有一些限制,所以如果你遇到任何限制,那麼即使服務器有2TB的內存也無濟於事......但首先檢查你的實際數字... – 2012-02-07 11:52:48

+0

爲什麼不寫一個查詢來限制你從數據庫中獲取的行數。重複它,直到你將它們全部導出。 – onatm 2012-02-07 11:53:19

+2

您需要傳輸數據,將數據導出到脫機數據集,使用DataReader遍歷記錄集中的每一行,這樣您就不會一次吞下內存。 – Mantorok 2012-02-07 11:53:23

回答

3

要求讀取數據並將其導出到電子表格,因此 分頁不是選擇。

爲什麼不能在步驟讀取數據。而不是一次獲取所有記錄,爲什麼不每次都獲得有限數量的記錄並將它們寫入excel。繼續操作,直到處理完所有記錄

+0

這是我擁有的最後一個選項,因爲在這種情況下,我需要解析結果並逐個寫入excel。現在我直接將它綁定到gridview並將其呈現給電子表格 – Jeeva 2012-02-07 11:55:28

+0

所以你想要簡單的方法:)你應該提到這個問題。 – Reniuz 2012-02-07 11:58:57

+0

在我看來,在GridView中一次顯示25000條記錄是毫無意義的。我有一種感覺,你只是爲了出口到Excel而做這件事。 – 2012-02-07 12:00:45

0

您可以使用批處理邏輯獲取記錄分批說5000個記錄每次執行和結果存儲在一個臨時數據集,一旦所有的處理完成。將temp數據集中的數據轉儲到excel。

您可以使用C#BulkCopy類來達到此目的。

0

如果它足以在Excel中提供CSV數據,您可以使用批量複製

bcp "select col1, col2, col3 from database.schema.SomeTable" queryout "c:\MyData.txt" -c -t"," -r"\n" -S ServerName -T 

這是mangnitudes速度更快,具有小足跡。

0

你的問題純粹是由於你試圖一次性提取如此多的數據。 您可以通過在執行查詢的計算機中安裝更多內存來解決此問題,但這只是一個陷阱。

您最好在步驟中檢索這些數據量。

你可以很容易地讀取數據回來行和進出口行/添加在CSV格式的文件,這可能都在一個存儲過程來完成。

你不說你用的是什麼數據庫,但處理如此大量的數據是什麼樣的數據庫引擎的設計,以應付。

除了在C#代碼中處理大量數據對象時,最好使用泛型進行研究,因爲這不會像類那樣強加對象實例化,因此減少了內存佔用量。