обработка данных dbnull в vb.net - PullRequest
       33

обработка данных dbnull в vb.net

69 голосов
/ 21 октября 2008

Я хочу создать отформатированный вывод данных, извлеченных из базы данных MS-Access и сохраненных в объекте / переменной DataTable , myDataTable. Однако некоторые поля в myDataTable содержат dbNull данные. Итак, следующий фрагмент кода VB.net выдаст ошибки, если значение любого из полей фамилия , intials или sID равно dbNull .

   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 без необходимости каждый раз проверять, являются ли данные dbNull, как в этот вопрос ?

Ответы [ 12 ]

125 голосов
/ 21 октября 2008

Единственный способ, которым я знаю, это проверить его, вы можете сделать комбинированный, хотя, чтобы облегчить его.

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

Я написал в VB, как будто это то, что вам нужно, даже если вы смешали языки.

Редактировать

Очищено для использования IsDbNull, чтобы сделать его более читабельным

32 голосов
/ 12 ноября 2009

Я устал от решения этой проблемы, поэтому я написал функцию 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 я просто указывал все как Объект. Но я предпочитаю универсальную версию.

8 голосов
/ 21 октября 2008

Вы также можете использовать методы Convert.ToString () и Convert.ToInteger () для эффективного преобразования элементов с нулевым БД.

5 голосов
/ 31 марта 2012

Вариация Код Стива Уортема , для номинального использования с 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)

3 голосов
/ 07 июня 2009

Microsoft предложила DBNull в .NET 1.0 для представления базы данных NULL. Тем не менее, это неудобство в использовании, потому что вы не можете создать строго типизированную переменную для хранения подлинного значения или нуля. Microsoft вроде как решила эту проблему в .NET 2.0 с помощью обнуляемых типов. Тем не менее, вы все еще застряли с большими кусками API, которые используют DBNull, и они не могут быть изменены.

Просто предложение, но то, что я обычно делаю, это:

  1. Все переменные, содержащие данные, считанные или записанные в базу данных, должны иметь возможность обрабатывать нулевые значения. Для типов значений это означает, что они должны иметь значение Nullable (Of T). Для ссылочных типов (String и Byte ()) это означает, что значение может иметь значение Nothing.
  2. Напишите набор функций для преобразования между «объектом, который может содержать DBNull» и «переменная .NET с нулевым значением». Оберните все вызовы API-интерфейсов в стиле DBNull в этих функциях, а затем представьте, что DBNull не существует.
2 голосов
/ 05 сентября 2012

Если вы используете настройку 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
1 голос
/ 27 ноября 2013
   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
1 голос
/ 21 октября 2008

Вы можете использовать функцию IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If
1 голос
/ 21 октября 2008

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

tmpStr = nameItem("lastname") + " " + nameItem("initials")

до

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

Для сравнения в операторе if myItem ("sID") = sID его необходимо изменить на

myItem("sID").Equals(sID)

Тогда код будет работать без ошибок времени выполнения из-за vbNull данных.

0 голосов
/ 26 сентября 2016

Я думаю, что это должно быть намного проще в использовании:

выберите ISNULL (сумма (поле), 0) из имени таблицы

Скопировано из: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

...