Путаница в документации MySQL .NET Connector - PullRequest
2 голосов
/ 08 декабря 2010

Примеры MySQL 5.0 Connector.NET состояния:

GetBytes возвращает количество доступных байтов в поле.В большинстве случаев это точная длина поля.

Однако в документации MySQL 5.0 Connector.NET указано возвращаемое значение GetBytes в виде количества байтов, считанных вбуфер.

Для меня это совсем не одно и то же!

Несмотря на это, мой вопрос: какова самая читаемая конструкция для получения контента из источника данных в MemoryStreamобъект?Я использую возвращаемое значение из GetBytes для увеличения параметра индекса данных метода GetBytes, но, похоже, я продолжаю обгонять поле, потому что я получаю IndexOutOfRangeException брошенным.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Я согласен, что документация для MySqlDataReader оставляет желать лучшего.

Когда вы передаете null в качестве аргумента buffer, GetBytes возвращает общую длину поля.Когда вы передаете ненулевой аргумент buffer, GetBytes возвращает количество байтов, которые были записаны в буфер.

long length = yourReader.GetBytes(columnOrdinal, 0, null, 0, 0);
long offset = 0;
var buffer = new byte[4 * 1024];    // 4KB buffer
var ms = new MemoryStream();

while (length > 0)
{
    long bytesRead = yourReader.GetBytes(columnOrdinal, offset, buffer, 0,
                                         (int)Math.Min(length, buffer.Length));

    if (bytesRead > 0)
    {
        ms.Write(buffer, 0, (int)bytesRead);
        length -= bytesRead;
        offset += bytesRead;
    }
}
0 голосов
/ 07 ноября 2011

Я немного изменил код Люка (и проголосовал).Не сказать, что это лучше, просто по-другому.Работает только для полей менее 2 ГБ.

private static byte[] ReadBinaryField(MySqlDataReader reader, int fieldIndex)
{
    var remaining = (int)reader.GetBytes(fieldIndex, 0, null, 0, 0);
    var bytes = new byte[remaining];

    while (remaining > 0)
    {
        var offset = bytes.Length - remaining;
        var bytesRead = (int)reader.GetBytes(fieldIndex, offset, bytes, offset, remaining);
        if (bytesRead == 0)
        {
            // Hopefully this is impossible
            throw new Exception("Could not read the rest of the field.");
        }
        remaining -= bytesRead;
    }
    return bytes;
}

Вы можете сделать это методом расширения, если хотите.

...