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