Некоторые таблицы, с которыми я работаю, имеют нулевые значения и выдают ошибки. До сих пор ive безуспешно пробовал несколько решений, позволяющих справиться с нулевыми значениями.

Вот примеры кода моих усилий;

If (r("datemodified").Equals(DBNull.Value)) Then
                datemodified = String.Empty
            Else
                datemodified = (r("datemodified"))
            End If

И;

If r.HasRows Then
                datemodified = (r("datemodified"))
            Else
                datemodified = String.Empty
            End If

И;

 If r("datemodified") = Nothing Then
                datemodified = String.Empty
            Else
                datemodified = (r("datemodified"))
            End If

И;

If r.IsDBNull("datemodified") Then
                datemodified = String.Empty
            Else
                datemodified = (r("datemodified"))

И через sql;

Select isnull(datemodified, '')

Конечным результатом является исключение IndexOutOfRangeException.

Вот sql;

select datemodified, maintainedby, email, hitcount from grouping where id = @footid

Ps, я выполнил запрос, и он работает нормально (т.е. все столбцы существуют)

4
Phil 9 Фев 2010 в 13:25
Datemodified (если я закомментирую эту строку, тогда она немедленно выбрасывает другую на следующую строку, которая поддерживается) Причина пустых значений в том, что когда люди обновляют страницы, они не всегда заполняют детали. Лично я бы запретил нули, но db унаследовал.
 – 
Phil
9 Фев 2010 в 13:32
Можете ли вы добавить свой SQL, который вы используете, к своему вопросу?
 – 
Kamal
9 Фев 2010 в 13:44
Я спросил о вашем SQL, потому что, как указала Косала, вы получите исключение IndexOutOfRange, если вы не укажете псевдоним столбца.
 – 
Kamal
9 Фев 2010 в 14:06

2 ответа

Лучший ответ

Для обработки нулевого значения в коде вы можете использовать метод IsDBNull:

Dim index As Integer = r.GetOrdinal("datemodified")
If r.IsDBNull(index) Then
   datemodified = String.Empty
Else
   datemodified = r(index)
End If

Чтобы обработать нулевое значение в SQL, вы должны дать полю имя, чтобы иметь возможность обращаться к нему по имени в средстве чтения данных:

select datemodified = isnull(datemodified, '')
5
Guffa 9 Фев 2010 в 13:33
Спасибо за помощь. После попытки обоих этих методов проблема все еще возникает.
 – 
Phil
9 Фев 2010 в 13:38
1
Тогда проблема в другом ... Вы вызываете Read перед попыткой получить данные от устройства чтения данных? Проверьте значение r.FieldCount, чтобы увидеть, действительно ли у вас есть какие-либо столбцы в результате, и r.GetOrdinal ("datemodified"), чтобы узнать, является ли поле одним из них.
 – 
Guffa
9 Фев 2010 в 15:47

Исключение IndexOutofRangeException связано с тем, что столбец, к которому вы пытаетесь получить доступ, не существует в наборе результатов.

Когда вы обращаетесь к порядковому номеру или столбцу через SqlDataReader, вы должны указать индекс столбца или имя столбца. В вашем сценарии вам необходимо указать псевдоним для возвращаемого столбца SQL.

SELECT ISNULL(datemodified, '') AS [datemodified]
2
Kosala Nuwan Perera 9 Фев 2010 в 13:56
Спасибо за помощь. После редактирования у меня есть; выберите ISNULL (datemodified, '') AS datemodified, supportedby, email, hitcount из группы, где id = @footid. К сожалению, исключение все еще происходит.
 – 
Phil
9 Фев 2010 в 14:05