2009-01-22 51 views
3

我必須從SQL中獲取DataTable,然後將其轉換爲XML(我不能使用SQL XML)並保存到文件中。問題是該文件將爲5 GB,並且我沒有足夠的內存將其全部下載,並將其全部內存轉換爲XML。我知道我應該可以使用DataReader將數據轉換並以塊的形式推送到文件流,但我不知道如何真正做到這一點。我怎樣才能做到以下幾點?在.NET中,將數據從SQL流式傳輸到文件

  1. 連接到SQL服務器異步
  2. 調用存儲過程異步
  3. 讀取來自DataReader的數據異步
  4. 從DataReader按XML數據轉換並保存到異步文件

這一切都必須是異步的,因爲它在一個處理多個請求的服務器上,我們不能爲每個請求設置一個線程阻塞。

+0

什麼類型的服務器處理多個請求? ASP.NET? Windows服務? – Kev 2009-01-23 01:27:13

回答

2

爲什麼你需要異步做什麼?這可能表現更好,但會更復雜。

做的簡單的方法:

  • 執行查詢以獲得一個DataReader
  • 創建的XmlWriter寫入文件
  • 嘗試讀取一行
    • 如果有沒有更多的行了,你就完成了。 (確保你關閉了寫入器/連接等)
    • 如果你得到一行,把它寫入XmlWriter(添加一個元素或任何你需要做的)。
  • 返回上一步。
+0

我需要它全部是異步的,以便我沒有爲每個請求阻塞線程。線程數可能會很大,我需要處理大量的請求。 – skb 2009-01-22 22:44:45

1

是否有很少的大行(BLOB)或許多小行?對於大型的BLOB,這兩篇文章包含從C#處理以流方式的SQL Server的BLOB所需的代碼:

第一個處理普通的BLOB,第二個處理FILESTREAM BLOB。

對於很多小行來說,您不需要任何特別的東西,只需打開一個閱讀器並開始流式傳輸到您的XmlWriter。唯一可以異步的部分是初始查詢執行,一旦結果開始回來,你的回調將完成,讀取結果SqlDataReader是一個同步操作。這意味着一個線程在結果讀取和XML文件寫入的整個過程中都被阻塞,簡直沒有ADO.Net API可以避免這個問題。你擔心這可能會導致問題(它會),但我必須問:爲什麼你的系統在XML文件中進行如此大的下載?你是否想將結果序列化回HTTP響應?

相關問題