2009-06-10 44 views
1

我有此查詢:使用C#從數據庫讀取圖像?

SELECT PICTURE FROM LOGO WHERE LOGONO = ? 

( 「圖片報」 在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函數,等等),以避免引發錯誤。

如何在不觸發異常的情況下檢查列是否不包含空值?我是否以錯誤的方式解決了這個問題?

回答

8

您需要致電讀者。 Read()訪問任何數據之前。從MSDN文檔中閱讀:

DataTableReader的默認位置在第一條記錄之前。因此,您必須調用Read才能開始訪問任何數據。

+0

DOH!咖啡時間。例如 – ilitirit 2009-06-10 17:17:53

0

我總是使用以下檢查,它似乎一直爲我工作。

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

試過了。不幸的是,沒有運氣。 – ilitirit 2009-06-10 17:16:20

2

您沒有調用reader.Read()。由於您使用的是閱讀器,因此您需要檢查Read是否爲單個記錄返回true,或者使用while循環遍歷所有記錄。

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

// or 

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

+1 – RedFilter 2009-06-10 17:19:07

1

是不是更好?

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

或者是短版...

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

???