2009-06-10 42 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]; 

???