【问题标题】:Handling very large strings between SQL Server and .NET code +LINQ在 SQL Server 和 .NET 代码 +LINQ 之间处理非常大的字符串
【发布时间】:2008-11-27 10:23:32
【问题描述】:

我有一个应用程序需要处理 SQL Server 数据库和 .NET 代码之间的非常大的字符串。我有一个 LINQ 查询,它在将字符串保存到 to 数据库时生成字符串,但是当尝试从数据库创建字符串 from 时,应用程序因 OutOfMemoryException 而崩溃字符串的大小。

我必须做些什么来让 LINQ 生成的代码避免这种情况吗?使用某种压缩可能是一种选择,但出于性能原因希望避免这种情况。

【问题讨论】:

    标签: .net sql-server linq string


    【解决方案1】:

    什么叫“非常大”?什么是字符串?克洛布?斑点? 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,您可能需要通过 cmd.ExecuteXmlReader() 获得 XmlReader

    更新了关于 LINQ 的评论(现已删除):

    要直接从 LINQ-to-SQL 使用 IDataReader,我希望您能得到最接近的是 ctx.GetCommand(),并传递一个查询。然后,您将使用 ExecuteReaderExecuteXmlReader 如上所述。我对 EF 了解不多……

    如果你给出一个查询失败类型的例子,可能会有一些技巧——例如,如果你正在过滤或选择 xml 的子集,你可以在 SQL/XML 中做一些事情——也许在通过 LINQ-to-SQL 调用的 UDF 中。

    【讨论】:

      【解决方案2】:

      我没有测量字符串的大小,但它们很快就达到了 .Net 的限制。信息以 XML 形式“存储”在 LINQ 查询生成的 XStreamingElement 对象中。我将试一试您的 IDataReader 建议,看看它是否能解决问题。基本上,我正在使用 LINQ to SQL 进行回读,是否有任何钩子可以提供 IDataReader 分块代码?

      【讨论】:

      • 注意我更新了重新dataOffset...原来会继续阅读第一页...
      猜你喜欢
      • 2013-08-05
      • 2020-08-23
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多