vb.net - utilice - string dbnull
manejando los datos de dbnull en vb.net (12)
Quiero generar alguna salida formateada de datos recuperados de una base de datos MS-Access y almacenados en un objeto / variable DataTable , myDataTable. Sin embargo, algunos de los campos en myDataTable cotain dbNull data. Por lo tanto, el siguiente fragmento de código de VB.net dará 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 hago para que el código anterior funcione cuando los campos pueden contener dbNull sin tener que verificar cada vez si los datos son dbNull como en esta pregunta ?
Creo que esto debería ser mucho más fácil de usar:
seleccione ISNULL (suma (campo), 0) de nombre de tabla
Copiado de: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ
Esta es, con mucho, la forma más fácil de convertir DBNull
en una cadena. El truco es que NO PUEDE usar la función TRIM
(que era mi problema inicial) cuando se refiere 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 mensaje de error :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
La única forma que conozco es probarla, pero puedes hacer una combinación para facilitarla.
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
''Do success
ELSE
''Failure
End If
Escribí en VB porque es lo que parece que necesitas, aunque hayas mezclado idiomas.
Editar
Limpiar para usar IsDbNull para hacerlo más legible
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
Mi función 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.
Microsoft creó DBNull en .NET 1.0 para representar la base de datos NULL. Sin embargo, es difícil de usar porque no se puede crear una variable fuertemente tipada para almacenar un valor genuino o nulo. Microsoft resolvió ese problema en .NET 2.0 con tipos anulables. Sin embargo, aún está atascado con grandes fragmentos de API que usan DBNull y no se pueden modificar.
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 convertirlos en Nullable (De T). Para tipos de referencia (String y Byte ()), esto significa permitir que el valor sea Nothing.
- Escriba un conjunto de funciones para convertir hacia adelante y hacia atrás entre "objeto que puede contener DBNull" y "variable .NET anulable". Ajustar todas las llamadas a las API de estilo DBNull en estas funciones, luego pretender que DBNull no existe.
Para las filas que contienen cadenas, puedo convertirlas en cadenas como en 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)
Entonces, el código se ejecutará sin errores de tiempo de ejecución debido a los datos vbNull .
Puede usar la función IsDbNull:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
Si está utilizando una configuración BLL / DAL pruebe el iif al leer 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
También puede usar los métodos Convert.ToString () y Convert.ToInteger () para convertir elementos con DB nulo efectivamente.
Una variación en el código de Steve Wortham, para ser utilizado nominalmente con tipos que aceptan nulos:
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
p.ej
mynullable = GetNullable(Of Integer?)(myobj)
A continuación, puede consultar mynullable, por ejemplo, mynullable.HasValue
Hola amigos
Este es el método más corto para verificar db Null en DataGrid y convertir a cadena
- crear el evento de validación de celda y escribir este código
- Si Convert.ToString (dgv.CurrentCell.Value) = "" Entonces
- CurrentCell.Value = ""
- Terminara si
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