2

MySqlDataReader.GetBytes実装の奇妙な癖を見つけましたが、ネット上でそれに関する記事を見つけることができないようであるため、これがよく知られているのかどうか疑問に思っています。

SqlDataReaderのコード例に従い、それをMySqlDataReaderに適用すると、機能しません...取得するレコードのバイト数がバッファーで正確に割り切れない限り。したがって、たとえば、ループの最後の反復で、残りが100バイトしかないが、さらに1024バイトを読み取ろうとしている場合、MySqlDataReaderは失敗し、例外をスローします。SqlDataReaderはしません。

私が何か間違ったことをしていない限り?

D。

4

1 に答える 1

4

バッファサイズ全体を読み取るのではなく、最大でバッファサイズだけでなく、最大で残っていると思われるサイズも要求します。正直なところ、とにかく固定サイズではなく、正確に正しいサイズのバッファを作成することもできます。

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

ただし、より小さなバッファが必要な場合(たとえば、一度に1つのバッファを処理する場合)、次を使用できます。

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;
}
于 2011-10-09T11:13:09.413 に答える