MySQL .NET Connector文档混乱

时间:2010-12-08 14:52:40

标签: .net mysql blob mysql-connector

MySQL 5.0 Connector.NET Examples州:

  

GetBytes返回字段中的可用字节数。在大多数情况下,这是该领域的确切长度。

但是,MySQL 5.0 Connector.NET Documentation列出了GetBytes的返回值,作为读入缓冲区的字节数。

对我而言,这根本不是一回事!

无论如何,我的问题是:将数据源中的内容转换为MemoryStream对象的最可读构造是什么?我正在使用GetBytes的返回值来递增GetBytes方法的数据索引参数,但看起来我一直在超越该字段,因为我被抛出了IndexOutOfRangeException

2 个答案:

答案 0 :(得分:4)

我同意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;
    }
}

答案 1 :(得分:0)

我稍微修改了Luke的代码(和upvoted)。不是说它更好,只是不同。仅适用于小于2GB的字段。

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

如果您愿意,可以将其作为扩展方法。