在SQL Server和.NET代码之间处理非常大的字符串+ 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