manejo de datos dbnull en vb.net
Pregunta
Quiero generar una salida con formato de datos recuperados de una base de datos de MS-Access y almacenados en un objeto / variable DataTable , myDataTable. Sin embargo, algunos de los campos en los datos de myDataTable cotain dbNull . Por lo tanto, el siguiente fragmento de código de VB.net generará errores si el valor de cualquiera de los campos lastname , intials o sID es 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
Entonces, ¿cómo consigo que el código anterior funcione cuando los campos pueden contener dbNull sin tener que comprobar cada vez si los datos son dbNull como en esta pregunta ?
Solución
La única forma que conozco es probarlo, puedes hacer una combinación si así fuera para hacerlo más fácil.
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
'Do success
ELSE
'Failure
End If
Escribí en VB ya que es lo que parece que necesitas, aunque hayas mezclado idiomas.
Editar
Se limpió para usar IsDbNull para hacerlo más legible
Otros consejos
Me cansé de lidiar con este problema, así que escribí una función NotNull () para ayudarme.
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
Uso:
If NotNull(myItem("sID"), "") = sID Then
' Do something
End If
La función Mi NotNull () ha pasado por un par de revisiones a lo largo de los años. Antes de Generics, simplemente especificaba todo como un Objeto. Pero prefiero la versión genérica.
También puedes usar los métodos Convert.ToString () y Convert.To Integer () para convertir elementos con DBnull de manera efectiva.
Una variación en código de Steve Wortham , que se utilizará nominalmente con los tipos 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
por ejemplo
mynullable = GetNullable(Of Integer?)(myobj)
Luego puede consultar mynullable
(por ejemplo, mynullable.HasValue
)
Microsoft creó DBNull en .NET 1.0 para representar la base de datos NULL. Sin embargo, usarlo por detrás es un problema porque no puede crear una variable de tipo fuerte para almacenar un valor genuino o nulo. Microsoft resolvió ese problema en .NET 2.0 con tipos anulables. Sin embargo, aún estás atascado con grandes trozos de API que usan DBNull y no se pueden cambiar.
Solo una sugerencia, pero lo que normalmente hago es esto:
- Todas las variables que contienen datos leídos o escritos en una base de datos deben poder manejar valores nulos. Para los tipos de valor, esto significa hacerlos anulables (Of T). Para los tipos de referencia (String y Byte ()), esto significa permitir que el valor sea Nothing.
- Escriba un conjunto de funciones para convertir una y otra vez entre " objeto que puede contener DBNull " y la variable .NET anulable " ;. Envuelva todas las llamadas a las API de estilo DBNull en estas funciones, luego simule que DBNull no existe.
Si está utilizando una configuración BLL / DAL, pruebe el iif cuando esté leyendo el objeto en el 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
Puedes usar la función IsDbNull:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
Para las filas que contienen cadenas, puedo convertirlas en cadenas como en el cambio
tmpStr = nameItem("lastname") + " " + nameItem("initials")
a
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
Para la comparación en la declaración if myItem (" sID ") = sID , debe cambiarse a
myItem("sID").Equals(sID)
Luego, el código se ejecutará sin ningún error de tiempo de ejecución debido a los datos de 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
Hola amigos
Este es el método más corto para verificar db Null en DataGrid y convertir a cadena
- cree el evento de validación de celda y escriba este código
- Si Convert.ToString (dgv.CurrentCell.Value) = " " Entonces
- CurrentCell.Value = " "
- Fin If
Esta es A DISTANCIA la forma más fácil de convertir DBNull
en una cadena.
El truco es que usted NO PUEDE usar la función TRIM
(que fue mi problema inicial) al referirse a los campos de la base de datos:
ANTES (mensaje de error producido):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))
DESPUÉS (no más mensajes de error :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
Creo que esto debería ser mucho más fácil de usar:
seleccione ISNULL (suma (campo), 0) de tablename
Copiado de: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ