2008-11-27 18 views
3

我有一個應用程序需要處理SQL Server數據庫和.NET代碼之間的非常大的字符串。我有一個LINQ查詢生成字符串時,它們保存數據庫,但當試圖創建字符串數據庫,該應用程序崩潰與OutOfMemoryException由於字符串的大小。在SQL Server和.NET代碼之間處理非常大的字符串+ LINQ

我需要做些什麼來使LINQ生成的代碼避免這種情況嗎?使用某種類型的壓縮可能是一種選擇,但是出於性能原因想要避免這種情況。

回答

1

你叫什麼「非常大」?弦是什麼? CLOB? BLOB? XML?

我懷疑你應該使用像ExecuteReader(),這(通過IDataReader)暴露在塊讀取這些列的方法:

 using (var reader = cmd.ExecuteReader(
      CommandBehavior.SequentialAccess)) { 
      char[] buffer = new char[8040]; // or some multiple (sql server page size) 
      while (reader.Read()) { 
       long dataOffset = 0, read; 
       while((read = reader.GetChars(colIndex, dataOffset, buffer, 0, buffer.Length)) > 0) { 
        // process "read"-many chars from "buffer" 
        dataOffset += read; 
       } 
      } 
     } 

顯然與XML你可能一個XmlReader通過cmd.ExecuteXmlReader()希望。

更新重新LINQ評論(現已刪除):

要直接從LINQ到SQL使用IDataReader,我希望你能得到的最接近的是ctx.GetCommand(),傳遞給它的查詢。如上所述,您將使用ExecuteReaderExecuteXmlReader。我對EF沒有太多瞭解......

如果您給出了一個失敗的查詢類型的示例,那麼可能會有一些技巧 - 例如,如果您正在過濾或選擇xml的子集,有些事情可以在SQL/XML中完成 - 可能是通過LINQ-to-SQL調用的UDF。

0

我還沒有測量字符串的大小,但他們很快達到.net限制。該信息是XML「存儲」在由LINQ查詢生成的XStreamingElement對象中。我會給你的IDataReader建議一個鏡頭,看看它是否能解決問題。基本上,我正在讀LINQ to SQL,是否有任何鉤子,所以我可以提供該IDataReader分塊代碼?

+0

注意我更新了dataOffset ...原來會繼續讀第一頁... – 2008-11-27 10:46:47

相關問題