TL;DR
String.IsNullOrEmpty()
проверяет только значения Empty ([blank]
, т.е. ''
или ""
) или Null
, но не проверяет DBNull
, если какое-либо поле, поступающее из базы данных, имеет значение DBNull, это вызовет ошибку.
IsDBNull()
проверяет наличие DBNull
(это не то же самое, что Null
)
.ToString
преобразует DBNull
в пустую строку, то есть ''
Подробности
Рассмотрите следующий пример таблицы SQL (используя SQL Server в качестве основы)
Структура таблицы:
Column_Name Type and Size Other Properties
---------------- ------------- ----------------------
Company_ID int IDENTITY(1,1) NOT NULL
Company_Name nvarchar (50) NOT NULL
Company_Address nvarchar (50) NULL
ВСТАВИТЬ операторы:
INSERT [tbl_company] ([Company_Name], [Company_Address]) VALUES ('ABC', 'QWERT')
INSERT [tbl_company] ([Company_Name], [Company_Address]) VALUES ('ASD', ' ')
INSERT [tbl_company] ([Company_Name], [Company_Address]) VALUES ('XYZ', '')
INSERT [tbl_company] ([Company_Name]) VALUES ('PQR')
Данные таблицы:
Company_ID Company_Name Company_Address
----------- ---------------- ---------------
1 ABC QWERT
2 ASD [SPACE]
3 XYZ [BLANK]
4 PQR NULL
Тестирование Company_Address с помощью IsNullOrEmpty() и IsDBNull() с использованием SqlDataReader (r):
Company_ID IsNullOrEmpty(r("Company_Address")) IsDBNull(r("Company_Address"))
---------- ----------------------------------- ------------------------------
1 False False
2 False False
3 True False
4 ERROR True
А теперь конкретно по вопросу
Что здесь пытается сделать OP, давайте рассмотрим все утверждения по одному.
Оператор IIF с IsNullOrEmpty (неверно)
txtCompany.Text = IIf(String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company")).ToString, "", dtSample.Rows(grdInfo.SelectedIndex).Item("Company"))
В этом операторе OP получает доступ к значению как dtSample.Rows(grdInfo.SelectedIndex).Item("Company")
и проверяет его с помощью IsNullOrEmpty()
, а затем преобразует результат IsNullOrEmpty в строку, используя .ToString
, то есть IsNullOrEmpty(value).ToString()
. Если значение равно DBNull, оно всегда будет возвращать ошибку. Правильный способ его использования
IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString)
См. последнюю часть Company")).ToString
и Company").ToString)
, просто случай НЕУМЕСТНОГО ")"
Второе (IIF с IsDBNull) и третье (IF с IsNullOrEmpty) операторы OP верны
txtCompany.Text = IIf(IsDBNull(dtSample.Rows(grdInfo.SelectedIndex).Item("Company")).ToString, "", dtSample.Rows(grdInfo.SelectedIndex).Item("Company"))
If String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString) = True Then
txtCompany.Text = ""
Else
txtCompany.Text = dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString
End If
Что касается второго оператора, OP правильно упорядочивает параметры, то есть первое поле Company
преобразуется в строку с использованием dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString
. Это преобразует любую строку DBNull в пустую строку, а затем проверяет IsNullOrEmpty
. Теперь, когда значение уже преобразовано в EmptyString, оно не выдаст никакой ошибки.
Старые обсуждения с ОП
Разница очевидна в вашем тексте. Ваше первое утверждение:
txtCompany.Text = IIf(String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company")).ToString, "", dtSpecifierRebate.Rows(grdInfo.SelectedIndex).Item("Company"))
а второй
If String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString) = True Then
Теперь разбейте их на части, первое утверждение (IIF)
String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company")).ToString
'Item("Company")).ToString
И вторая часть (IF)
String.IsNullOrEmpty(dtSample.Rows(grdInfo.SelectedIndex).Item("Company").ToString)
'Item("Company").ToString)
Нашли отличия?
В первом операторе вы преобразуете результат IsNullOrEmpty в строку
Во втором вы преобразуете .Item("Company") в строку а потом сравниваем.
Если .Item("Company")
возвращает DBNull
, то IsNullOrEmpty завершается ошибкой, поскольку .Item("Company") возвращает тип DBNull, тогда как IsNullOrEmpty проверяет null
IsDBNull работал, потому что он проверяет DBNull.
Все точки неуместной скобки ")" Это опечатка
Что касается использования вами этих операторов:
Если и IIF нужно проверять результаты как логические, а не как строки
Лучше рекомендуется удалить часть ToString ваших операторов.
person
haraman
schedule
15.10.2015
NULL
, system.dbnull .. что мне не ясно, так это разница между String.IsNullOrEmpty и IsDBNull в моем приведенном выше сценарии. - person japzdivino   schedule 13.10.2015