1

我有这个查询:

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(“行/列不存在数据”)总是在 reader.IsDBNull(0) 语句中抛出,当列包含 null 时。

MSDN说:

在调用类型化的 get 方法(例如,GetByte、GetChar 等)之前调用此方法以查看是否有空列值,以避免引发错误。

如何在不触发异常的情况下检查该列是否不包含 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 回答