1

私はこのクエリを持っています:

SELECT PICTURE FROM LOGO WHERE LOGONO = ?

(「PICTURE」はSQL Serverの画像列です)

そして、データを読み取るためのこのコード:

using (DbDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)
    {
        if (!reader.IsDBNull(0))
        {
            byte[] buffer = new byte[8000];
            while (reader.GetBytes(0, 0, buffer, 0, 8000) > 0)
                picture.AddRange(buffer);
        }
     }
}

問題は、InvalidOperationException(「行/列のデータが存在しません」)が、列にnullが含まれている場合、常にreader.IsDBNull(0)ステートメントでスローされることです。

MSDNによると:

エラーが発生しないように、型指定されたgetメソッド(たとえば、GetByte、GetCharなど)を呼び出す前に、このメソッドを呼び出してnull列値があるかどうかを確認してください。

例外をトリガーせずに列にnullが含まれていないことを確認するにはどうすればよいですか?私はこれについて間違った方法で行っていますか?

4

4 に答える 4

8

リーダーに電話する必要があります。データにアクセスする前にRead() 。読むためのMSDNドキュメントから:

DataTableReaderのデフォルトの位置は、最初のレコードの前です。したがって、データへのアクセスを開始するには、Readを呼び出す必要があります。

于 2009-06-10T17:16:04.973 に答える
2

reader.Read()を呼び出さなかった。リーダーを使用しているため、単一のレコードに対してReadがtrueを返すかどうかを確認するか、whileループを使用してすべてのレコードを反復処理する必要があります。

if (reader.Read())
{
  // handle single record
}

// or

while (reader.Read())
{
  // handle each record
}
于 2009-06-10T17:17:20.883 に答える
1

良くないです...

if (!reader.IsDBNull(#))
{...}

またはおそらく短いバージョン...

reader.IsDBNull(#) ? [default] : [value];

???

于 2012-01-05T22:46:51.097 に答える
0

私はいつも次のチェックを使用していますが、それはいつも私のために働いたようです。

if (reader[0] != null && reader[0] != DBNull.Value)
{
}
于 2009-06-10T17:14:28.720 に答える