在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(),传递给它的查询。如上所述,您将使用ExecuteReaderExecuteXmlReader。我对EF没有太多了解......

如果您给出了一个失败的查询类型的示例,那么可能会有一些技巧 - 例如,如果您正在过滤或选择xml的子集,有些事情可以在SQL/XML中完成 - 可能是通过LINQ-to-SQL调用的UDF。

我还没有测量字符串的大小,但他们很快达到.net限制。该信息是XML“存储”在由LINQ查询生成的XStreamingElement对象中。我会给你的IDataReader建议一个镜头,看看它是否能解决问题。基本上,我正在读LINQ to SQL,是否有任何钩子,所以我可以提供该IDataReader分块代码?

+0

注意我更新了dataOffset ...原来会继续读第一页... – 2008-11-27 10:46:47