Чтение изображения из базы данных с использованием C #? - PullRequest
1 голос
/ 10 июня 2009

У меня есть этот запрос:

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 («Нет данных для строки / столбца») всегда выдается в read.IsDBNull (0), когда столбец содержит ноль.

MSDN говорит:

Вызовите этот метод, чтобы проверить, есть ли значения столбцов с нулем, прежде чем вызывать типизированные методы get (например, GetByte, GetChar и т. Д.), Чтобы избежать возникновения ошибки.

Как я могу проверить, что столбец не содержит ноль, не вызывая исключение? Я поступаю неправильно?

Ответы [ 4 ]

8 голосов
/ 10 июня 2009

Вам нужно вызвать ридер. Чтение () перед доступом к любым данным. Из документов MSDN для чтения:

Позиция DataTableReader по умолчанию перед первой записью. Поэтому вы должны вызвать Read, чтобы начать доступ к любым данным.

2 голосов
/ 10 июня 2009

Вы не вызывали читателя. Читать (). Поскольку вы работаете с читателем, вам нужно либо проверить, возвращает ли Read значение true для отдельной записи, либо использовать цикл while для перебора всех записей.

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

// or

while (reader.Read())
{
  // handle each record
}
1 голос
/ 06 января 2012

не лучше ...

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

или, возможно, короткая версия ...

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

???

0 голосов
/ 10 июня 2009

Я всегда использую следующую проверку, и она, кажется, всегда работала для меня.

if (reader[0] != null && reader[0] != DBNull.Value)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...