MySqlDataReader Ошибка буфера GetBytes ... - PullRequest
2 голосов
/ 09 октября 2011

Я обнаружил любопытную причуду реализации MySqlDataReader.GetBytes и просто удивляюсь, хорошо ли это известно, поскольку я не могу найти какие-либо статьи об этом в сети.

Если вы будете следоватьПример кода для SqlDataReader и применение его к MySqlDataReader, которое не будет работать ... если только число байтов в записи, которую вы получаете, не делится в буфере.Так, например, если вы находитесь на последней итерации цикла и осталось только 100 байтов, но он пытается прочитать еще 1024 байта, MySqlDataReader завершится с ошибкой и выдаст исключение.SqlDataReader не будет.

Если я что-то не так делаю?

D.

1 Ответ

4 голосов
/ 09 октября 2011

Вместо того, чтобы читать весь размер буфера, попросите только максимум размер буфера, но также и самое большее, что, как вы считаете, осталось.Если честно, вы могли бы также создать буфер точно правильного размера, а не фиксированного размера в любом случае.

// 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;
}
...