Вопрос

Я хочу сгенерировать форматированный вывод данных, полученных из базы данных 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, и они не могут быть изменены.

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

<Ол>
  • Все переменные, содержащие данные, считанные или записанные в базу данных, должны иметь возможность обрабатывать нулевые значения. Для типов значений это означает, что они должны иметь значение Nullable (Of T). Для ссылочных типов (String и Byte ()) это означает, что значение может иметь значение Nothing.
  • Напишите набор функций для преобразования вперед и назад между объектом ", который может содержать DBNull " и «переменная .NET с нулевым значением». Оберните все вызовы 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
    

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

    <Ол>
  • создайте событие проверки ячейки и напишите этот код
  • Если Convert.ToString (dgv.CurrentCell.Value) = " " Тогда
  • CurrentCell.Value = " "
  • End If
  • Это 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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top