обработка данных 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 ответов:
Единственный способ, который я знаю, это проверить его, вы можете сделать комбинированное если, хотя, чтобы сделать его легким.
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, и они не могут быть изменены.
Просто предположение, но обычно я делаю вот что:
- все переменные, содержащие данные, считываемые из или запись в базу данных должна быть способна обрабатывать значения null. Для типов значений это означает, что они могут быть обнулены (из T). Для ссылочных типов (String и Byte ()) это означает, что значение должно быть пустым.
- напишите набор функций для преобразования туда и обратно между "объектом, который может содержать 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 и преобразования в строку
- создайте событие проверки ячейки и запишите этот код
- Если Преобразовать.ToString (dgv.CurrentCell.Значение) = "" Тогда
- CurrentCell.Value = ""
- Конец, Если
Это безусловно Самый простой способ преобразовать
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