我有一個應用程序需要處理SQL Server數據庫和.NET代碼之間的非常大的字符串。我有一個LINQ查詢生成字符串時,它們保存到數據庫,但當試圖創建字符串從數據庫,該應用程序崩潰與OutOfMemoryException由於字符串的大小。在SQL Server和.NET代碼之間處理非常大的字符串+ LINQ
我需要做些什麼來使LINQ生成的代碼避免這種情況嗎?使用某種類型的壓縮可能是一種選擇,但是出於性能原因想要避免這種情況。
我有一個應用程序需要處理SQL Server數據庫和.NET代碼之間的非常大的字符串。我有一個LINQ查詢生成字符串時,它們保存到數據庫,但當試圖創建字符串從數據庫,該應用程序崩潰與OutOfMemoryException由於字符串的大小。在SQL Server和.NET代碼之間處理非常大的字符串+ LINQ
我需要做些什麼來使LINQ生成的代碼避免這種情況嗎?使用某種類型的壓縮可能是一種選擇,但是出於性能原因想要避免這種情況。
你叫什麼「非常大」?弦是什麼? 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()
,傳遞給它的查詢。如上所述,您將使用ExecuteReader
或ExecuteXmlReader
。我對EF沒有太多瞭解......
如果您給出了一個失敗的查詢類型的示例,那麼可能會有一些技巧 - 例如,如果您正在過濾或選擇xml的子集,有些事情可以在SQL/XML中完成 - 可能是通過LINQ-to-SQL調用的UDF。
我還沒有測量字符串的大小,但他們很快達到.net限制。該信息是XML「存儲」在由LINQ查詢生成的XStreamingElement對象中。我會給你的IDataReader建議一個鏡頭,看看它是否能解決問題。基本上,我正在讀LINQ to SQL,是否有任何鉤子,所以我可以提供該IDataReader分塊代碼?
注意我更新了dataOffset ...原來會繼續讀第一頁... – 2008-11-27 10:46:47