обработка данных в значение dbnull vb.net



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

568   12  

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.

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

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

  1. все переменные, содержащие данные, считываемые или записываемые в базу данных, должны иметь возможность обрабатывать значения null. Для типов значений это означает, что они обнуляются (из T). Для ссылочных типов (String и Byte ()) это означает, что значение должно быть Nothing.
  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

Для сравнения в если сообщении 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 и преобразования в string

  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

Comments

    Ничего не найдено.