【问题标题】:MySqlDataReader GetBytes buffer issue...MySqlDataReader GetBytes 缓冲区问题...
【发布时间】:2012-08-08 14:52:15
【问题描述】:

我发现了 MySqlDataReader.GetBytes 实现的一个奇怪的怪癖,只是想知道这是否众所周知,因为我似乎无法在网上找到任何关于它的文章。

如果您遵循 SqlDataReader 的代码示例并将其应用于 MySqlDataReader,它将无法工作...除非您正在检索的记录中的字节数完全可以被缓冲区整除。因此,例如,如果您正在进行循环的最后一次迭代,并且只剩下 100 个字节,但它试图读取另外 1024 个字节,那么 MySqlDataReader 将失败并引发异常。 SqlDataReader 不会。

除非我做错了什么?

D.

【问题讨论】:

  • GetBytes 效果很好,不需要所有的转换。

标签: c# mysql mysqldatareader


【解决方案1】:

而不是读取整个缓冲区大小,只要求最多缓冲区大小,但最多也就是你认为剩下的。老实说,您不妨创建一个大小正好合适的缓冲区,而不是一个固定大小的缓冲区。

// I assume this works for MySqlDataReader too...
int length = (int)reader.GetBytes(column, 0, null, 0, 0);
byte[] buffer = new byte[length];
int index = 0;

while (index < length)
{
    int bytesRead = (int)reader.GetBytes(column, index,
                                    buffer, index, length - index);
    index += bytesRead;
}

但如果您想要一个较小的缓冲区(例如,如果您一次处理一个缓冲区),您可以使用:

int length = (int)reader.GetBytes(column, 0, null, 0, 0);
byte[] buffer = new byte[length];
int index = 0;

while (index < length)
{
    int bytesRead = (int)reader.GetBytes(column, index, buffer, 0, 
                                    Math.Max(buffer.Length, length - index));
    // Process the buffer, up to value bytesRead
    // ...
    index += bytesRead;
}

【讨论】:

  • 我不明白的是 GetBytes 的方法对 fieldOffset 采用 long 但对 bufferoffset 采用 int?在处理非常大的二进制对象时,这肯定会导致问题吗?
  • @David:如果你想要一次超过 2^31 个字节,那肯定是个问题——但是这个接口可以让你从一个 巨大的 i> blob,但仍然限制您使用 .NET 数组类型,这些类型被限制(至少在某些地方 - 它是不一致的)索引的有符号 32 位整数。
  • 所以换句话说,如果我在数据库记录中存储超过 2147483647 字节的内容,我可能会遇到其他问题 :)
  • @David:不,你可以存储那么多——但你不能将它作为一个数组放入.NET进程中,仅此而已。例如,您可以在数据库中有一个 10GB 的文件,然后一次取出 1MB 来写入本地磁盘。
  • @Jon:我必须添加一些演员表,并将byte index = 0; 更改为int index = 0;,这样它才能工作。虽然,您可能想分别处理fieldOffsetbufferoffset(如果长度> int.MaxValue 并使用buffer.Length,我只是抛出一个异常)。感谢您的出色回答 (+1)。
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多