2

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

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

除非我做错了什么?

D.

4

1 回答 1

4

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

// 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;
}
于 2011-10-09T11:13:09.413 回答