【问题标题】:What is the max length that BitConverter.ToString(byte[]) can handle from a SQL SMO query?BitConverter.ToString(byte[]) 可以从 SQL SMO 查询处理的最大长度是多少?
【发布时间】:2017-02-01 19:41:51
【问题描述】:

我将数据从 SQL Server 2012 表中提取到 SQL SMO 表中,然后循环遍历结果集。执行以下命令时,我在运行时收到内存不足错误:

let data = dr["Data"] == DBNull.Value ? "NULL" : "convert(varbinary(max), '0x" + BitConverter.ToString((byte[])dr["Data"]).Replace("-", "") + "')"

在遇到 DATALENGTH([Data]) 约为 15MB(15127052 字节)的行之前,它不会引发错误。

是否存在 BitConverter.ToString(byte[]) 可以处理的最大二进制数据大小?

【问题讨论】:

  • BitConverter 在从 15MB 文本文件中读取数据时是否存在类似问题? (如果这真的以任何方式涉及数据库方面,只是试图充实。)
  • 不知道,没试过。
  • 我建议这样做是因为您的问题可能与更广泛的受众相关(例如在 Stack Overflow 上),而不仅仅是我们的数据库疯子。这可能意味着更快或更好的答案。我认为,隔离它会很有用,这样您就可以确定这是 SMO 的问题还是 BitConverter 或 ToString() 的一般问题。
  • 我刚刚尝试了一个 ~22MB 的文本文件,它能够被打开、读取和转换。代码:byte[]缓冲区; FileStream fs = File.Open("C:\\Users\\wayne.pfeffer\\Downloads\\TextFile.txt", FileMode.Open);缓冲区=新字节[fs.Length]; fs.Read(buffer, 0, (int) fs.Length);字符串 s = BitConverter.ToString(buffer);

标签: sql-server-2012 smo


【解决方案1】:

它实际上与 SMO 和数据库完全无关,而且与 string.Replace() 函数的明显限制有关。我破解了 LINQ 代码,以便逐步操作数据,发现当我尝试执行s.Replace("-", "") 时,会出错。在 Stack Exchange 上挖掘了一下后,我发现:Does string.Replace(string, string) create additional strings? 应用我在那里找到的内容,我将代码从使用字符串更改为使用 StringBuilder,然后使用 StringBuilder.Replace(string, string) 函数并且它可以工作。显然因为string.Replace(string, string) 创建了源字符串的副本,所以肯定存在某种内存限制,但由于 StringBuilder 对原始字符串而不是副本进行操作,因此该限制不适用。

最后代码看起来像这样:

StringBuilder sb = new StringBuilder(dr["Data"] == DBNull.Value ? "NULL" : BitConverter.ToString((byte[])dr["Data"]));

sb.Replace("-", "");

感谢您对此的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2011-12-01
    • 2019-09-03
    • 2011-03-06
    • 2011-06-23
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多