MySqlDataReader Ошибка буфера GetBytes...
Я обнаружил любопытную причуду реализации MySqlDataReader.GetBytes и просто удивляюсь, хорошо ли это известно, поскольку я не могу найти какие-либо статьи об этом в сети.
Если вы будете следовать примеру кода для SqlDataReader и применить его к MySqlDataReader, он не будет работать... если только количество байтов в записи, которую вы получаете, не делится буфером. Так, например, если вы находитесь на последней итерации цикла и осталось только 100 байтов, но он пытается прочитать еще 1024 байта, тогда MySqlDataReader завершится с ошибкой и выдаст исключение. SqlDataReader не будет.
Если я не делаю что-то не так?
D.
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;
}