обробка даних dbnull у vb.net


75

Я хочу сформувати певний відформатований вивід даних, отриманих із бази даних MS-Access та збережених у об'єкті / змінній DataTable , myDataTable. Однак деякі поля в myDataTable містять дані dbNull . Таким чином, наступний фрагмент коду VB.net дасть помилки , якщо значення будь-якого з полів LastName , 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, як у цьому питанні ?

Відповіді:


135

Єдиний спосіб, про який я знаю, - це перевірити його, якщо ви хочете зробити це комбінованим, це можна зробити просто.

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

Я писав у VB, оскільки саме так виглядає, що вам потрібно, навіть якщо ви змішали мови.

Редагувати

Очищено для використання IsDbNull, щоб зробити його більш читабельним


Дякую за вашу відповідь. Думаю, це виглядає як змішана розмова через те, як я кодував коментарі "//" замість галочок для коментарів VB.net?
Азім

Так! І == у порівнянні
Мітчел Селлерз

Я думаю, що я зафіксував код у питанні як чистий код VB.Net. Дякую за відповіді.
Азім

Через 10 років. "+" також. : P
Джонні Прескотт,

У DataRowкласі є свій IsNullметод. Цей код також не компілюється з Option Strict On.
jmcilhinney

34

Мені набридло мати справу з цією проблемою, тому я написав функцію 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 я просто вказував все як Об'єкт. Але я набагато віддаю перевагу загальній версії.


2
+1 працює дуже добре, я назвав його IsNull () відповідно до SQL Server.
Лазлов

5
Я вважаю за краще зробити другу змінну необов’язковою, щоб підпис був таким: Public Shared Function NotNull(Of T)(ByVal Value As T, Optional ByVal DefaultValue As T = Nothing) As Tі його можна викликати як If NotNull(myItem("sID")) = sID Thenабо як зазначено вище.
Даніель

Не працює для мене за допомогою VS 2008: спробував використовувати цей метод із згенерованим набором даних dataTable і не працював. NotNull(rw.computer)не вдається, оскільки код Dataset.Designer.vb намагається перетворити на рядок перед передачею як аргумент. Я припускаю, що це буде працювати із загальним DataTable.
D_Bester

Помістіть це, коли використовується ціле число, що має значення NULL: Public Function NotNull (ByVal value As Integer?) As Integer Return NotNull (value, 0) End Function
Richard Griffiths

Я люблю цей метод. Стислий та ефективний. +1
Джессіка

10

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


6

Варіація коду Стіва Уортема , яка буде використовуватися номінально з 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

Microsoft придумала DBNull в .NET 1.0 для представлення бази даних NULL. Однак використовувати це ззаду, бо ви не можете створити сильно набрану змінну для зберігання справжнього значення або null. Корпорація Майкрософт вирішила цю проблему в .NET 2.0 типовими типами. Однак ви все ще застрягли у великих фрагментах API, які використовують DBNull, і їх неможливо змінити.

Просто пропозиція, але я зазвичай роблю це:

  1. Усі змінні, що містять дані, прочитані з бази даних або записані в базу даних, повинні мати можливість обробляти нульові значення. Для типів значень це означає зробити їх Nullable (Of T). Для посилальних типів (String та Byte ()) це означає, що значення має бути рівним Nothing.
  2. Напишіть набір функцій для перетворення туди-сюди між "об'єктом, який може містити DBNull" і "змінною .NET, що обнуляється". Оберніть усі виклики API-стилів DBNull у ці функції, а потім зробіть вигляд, що DBNull не існує.

2

Ви можете використовувати функцію IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

2

Якщо ви використовуєте налаштування 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

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

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

до

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

Для порівняння в , якщо заяву myItem ( «Sid») = Sid , воно повинно бути зміна

myItem("sID").Equals(sID)

Тоді код працюватиме без помилок під час виконання через дані vbNull .


1
   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

0

Привіт, друзі

Це найкоротший спосіб перевірити db Null у DataGrid і перетворити на рядок

  1. створити подію перевірки комірки та написати цей код
  2. Якщо Convert.ToString (dgv.CurrentCell.Value) = "" Тоді
  3. CurrentCell.Value = ""
  4. Завершити якщо

0

Це НАДАЛЬШЕ найпростіший спосіб перетворити 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"))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.