2009-06-10 32 views
1

私はこのクエリを持っている:C#を使用してデータベースから画像を読み込む?

SELECT PICTURE FROM LOGO WHERE LOGONO = ? 

( "PICTURE" は、SQL Serverのimage列である)

し、データを読み込むために、このコード:

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メソッドを呼び出す前にnullのカラムの値がある場合

コールこの方法は、(例えばは、GetByteは、などGETCHAR)がエラーを発生させる避けるために参照すること。

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

答えて

8

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

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

+0

DOH!コーヒータイム。 – ilitirit

0

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

if (reader[0] != null && reader[0] != DBNull.Value) 
{ 
} 
+0

試してみてください。幸運にも、不運にも。 – ilitirit

2

あなたはreader.Read()を呼び出さなかった。あなたが読者と一緒に作業しているので、単一のレコードに対してReadがtrueを返すか、whileループを使用してすべてのレコードを繰り返し処理するかをチェックする必要があります。

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

// or 

while (reader.Read()) 
{ 
    // handle each record 
} 
+0

+1明確な例 – RedFilter

1

は良くないです...

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

または多分ショートバージョン...

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

???

関連する問題