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


Я хочу, чтобы генерировать некоторые форматированный вывод данных, извлекаемых из MS-Access базы данных и хранится в Объект DataTable объект/переменную, myDataTable. Однако некоторые поля в myDataTable cotain dbNull data. Итак, следующее 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 66

12 ответов:

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

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

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

Edit

Очищен для использования 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 () прошла через несколько капитальных ремонтов за эти годы. До дженериков я просто указывал все как объект. Но я предпочитаю общий вариант.

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

Вариация кода Стива Уортема, который будет использоваться номинально с типами, допускающими обнуление:

    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. Тем не менее, это боль в заднице, чтобы использовать, потому что вы не можете создать строго типизированную переменную для хранения подлинного значения или null. Microsoft вроде как решила эту проблему в .NET 2.0 с помощью nullable типов. Тем не менее, вы все еще застряли с большими кусками API, которые используют DBNull, и они не могут быть изменены.

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

  1. все переменные, содержащие данные, считываемые из или запись в базу данных должна быть способна обрабатывать значения null. Для типов значений это означает, что они могут быть обнулены (из T). Для ссылочных типов (String и Byte ()) это означает, что значение должно быть пустым.
  2. напишите набор функций для преобразования туда и обратно между "объектом, который может содержать DBNull"и" nullable .NET variable". Оберните все вызовы API в стиле DBNull в этих функциях, а затем сделайте вид, что 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

Для сравнения вif оператор 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 и преобразования в строку

  1. создайте событие проверки ячейки и запишите этот код
  2. Если Преобразовать.ToString (dgv.CurrentCell.Значение) = "" Тогда
  3. CurrentCell.Value = ""
  4. Конец, Если

Это безусловно Самый простой способ преобразовать DBNull в строку. Фокус в том, что вы не можете использовать функцию TRIM (которая была моей первоначальной проблемой) при обращении к полям из базы данных:

Перед (произведенная ошибка msg):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

После (больше нет ошибки msg : -)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))

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

Выберите ISNULL (sum (field), 0) из tablename

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