我发现了一个奇怪的MySqlDataReader.GetBytes实现的怪癖,只是想知道这是否众所周知,因为我似乎无法在网上找到任何关于它的文章。
如果您按照SqlDataReader的代码示例并将其应用于MySqlDataReader它将无法工作...除非您正在检索的记录中的字节数完全可被缓冲区整除。因此,例如,如果您处于循环的最后一次迭代并且只剩下100个字节,但它尝试读取另外1024个字节,那么MySqlDataReader将失败并抛出异常。 SqlDataReader不会。
除非我做错了什么?
d。
答案 0 :(得分: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;
}