MySQL .NET Connector文档混淆
MySQL 5.0 Connector.NET示例指出:
GetBytes返回字段中可用字节的数量。 在大多数情况下,这是该领域的确切长度。
但是,MySQL 5.0 Connector.NET文档列出GetBytes
的返回值作为读入缓冲区的字节数。
对我来说,这根本不是一回事!
无论如何,我的问题是:从数据源获取内容到MemoryStream
对象的最可读构造是什么? 我使用GetBytes
的返回值来增加GetBytes
方法的数据索引参数,但看起来我保持溢出该字段,因为我得到IndexOutOfRangeException
被抛出。
我同意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;
}
}
我稍微修改了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;
}
如果你喜欢的话,你可以把它做成扩展方法。
链接地址: http://www.djcxy.com/p/60965.html