2

MySQL5.0Connector.NETの例は次のように述べています。

GetBytesは、フィールドで使用可能なバイト数を返します。ほとんどの場合、これはフィールドの正確な長さです。

ただし、MySQL 5.0 Connector.NETのドキュメントGetBytesには、バッファに読み込まれたバイト数としての戻り値が記載されています。

私にとって、これはまったく同じことではありません!

MemoryStreamとにかく、私の質問は、データソースからオブジェクトにコンテンツを取得するための最も読みやすい構造は何ですか?からの戻り値を使用しGetBytesてメソッドのデータインデックスパラメーターをインクリメントしていますが、スローされるGetBytesため、フィールドをオーバーランし続けているようです。IndexOutOfRangeException

4

2 に答える 2

5

私は、のドキュメントが多くの要望を残していることに同意しMySqlDataReaderます。

引数nullとして渡すと、フィールドの全長を返します。null以外の引数を渡すと、バッファに書き込まれたバイト数を返します。bufferGetBytesbufferGetBytes

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;
    }
}
于 2010-12-08T15:44:56.107 に答える
0

私はルークのコードを少し変更しました(そして賛成しました)。それが良いと言っているのではなく、ただ違うだけです。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;
}

必要に応じて、拡張メソッドにすることもできます。

于 2011-11-07T00:58:41.660 に答える