обработка данных dbnull в vb.net
Вопрос
Я хочу сгенерировать форматированный вывод данных, полученных из базы данных MS-Access и сохраненных в Таблица данных объект/переменная, myDataTable.Однако некоторые поля в myDataTable содержат дбНулл данные.Итак, следующий фрагмент кода VB.net выдаст ошибки, если значение любого из полей фамилия, инициалы, или Сид является дбНулл.
dim myDataTable as DataTable
dim tmpStr as String
dim sID as Integer = 1
...
myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
...
For Each myItem As DataRow In myDataTable.Rows
tmpStr = nameItem("lastname") + " " + nameItem("initials")
If myItem("sID")=sID Then
' Do something
End If
' print tmpStr
Next
Итак, как мне заставить приведенный выше код работать, когда поля могут содержать дбНулл без необходимости каждый раз проверять, являются ли данные dbNull, как в этот вопрос?
Решение
Единственный способ, который я знаю, - это проверить его, хотя вы можете сделать комбинированный вариант, чтобы упростить задачу.
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
'Do success
ELSE
'Failure
End If
Я писал на VB, так как похоже это то, что вам нужно, хоть вы и смешали языки.
Редактировать
Исправлено использование IsDbNull, чтобы сделать его более читабельным.
Другие советы
Мне надоело решать эту проблему, поэтому я написал функцию NotNull(), которая поможет мне.
Public Shared Function NotNull(Of T)(ByVal Value As T, ByVal DefaultValue As T) As T
If Value Is Nothing OrElse IsDBNull(Value) Then
Return DefaultValue
Else
Return Value
End If
End Function
Использование:
If NotNull(myItem("sID"), "") = sID Then
' Do something
End If
Моя функция NotNull() за прошедшие годы претерпела несколько изменений.До появления Generics я просто указывал все как объект.Но я предпочитаю общую версию.
Вы также можете использовать методы Convert.ToString () и Convert.ToInteger () для эффективного преобразования элементов с нулевым БД.
Вариация на Код Стива Уортама, номинально использоваться с nullable
типы:
Private Shared Function GetNullable(Of T)(dataobj As Object) As T
If Convert.IsDBNull(dataobj) Then
Return Nothing
Else
Return CType(dataobj, T)
End If
End Function
например
mynullable = GetNullable(Of Integer?)(myobj)
Затем вы можете запросить mynullable
(например., mynullable.HasValue
)
Microsoft предложила DBNull в .NET 1.0 для представления базы данных NULL. Тем не менее, это неудобство в использовании, потому что вы не можете создать строго типизированную переменную для хранения подлинного значения или нуля. Microsoft вроде как решила эту проблему в .NET 2.0 с помощью обнуляемых типов. Тем не менее, вы все еще застряли с большими кусками API, которые используют DBNull, и они не могут быть изменены.
Просто предложение, но я обычно делаю вот что:
<Ол>Если вы используете настройку BLL / DAL, попробуйте iif при чтении объекта в DAL
While reader.Read()
colDropdownListNames.Add(New DDLItem( _
CType(reader("rid"), Integer), _
CType(reader("Item_Status"), String), _
CType(reader("Text_Show"), String), _
CType( IIf(IsDBNull(reader("Text_Use")), "", reader("Text_Use")) , String), _
CType(reader("Text_SystemOnly"), String), _
CType(reader("Parent_rid"), Integer)))
End While
Вы можете использовать функцию IsDbNull:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
Для строк, содержащих строки, я могу преобразовать их в строки, как при изменении
tmpStr = nameItem("lastname") + " " + nameItem("initials")
к
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
Для сравнения в если заявление myItem("sID")=sID, его необходимо изменить на
myItem("sID").Equals(sID)
Тогда код будет работать без каких-либо ошибок во время выполнения из-за vbNull данные.
VB.Net
========
Dim da As New SqlDataAdapter
Dim dt As New DataTable
Call conecDB() 'Connection to Database
da.SelectCommand = New SqlCommand("select max(RefNo) from BaseData", connDB)
da.Fill(dt)
If dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) = "" Then
MsgBox("datbase is null")
ElseIf dt.Rows.Count > 0 And Convert.ToString(dt.Rows(0).Item(0)) <> "" Then
MsgBox("datbase have value")
End If
Здравствуйте, друзья
Это самый короткий способ проверить значение db Null в DataGrid и преобразовать его в строку
<Ол> Это BY FAR самый простой способ конвертировать DBNull
в строку.
Хитрость в том, что вы НЕ МОЖЕТЕ использовать функцию TRIM
(которая была моей первоначальной проблемой) при обращении к полям из базы данных:
ПЕРЕД (выдается сообщение об ошибке):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))
ПОСЛЕ (больше сообщений об ошибках :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
Я думаю, это должно быть намного проще в использовании:
выберите ISNULL (сумма (поле), 0) из имени таблицы
Скопировано из: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ р>