valores utilice tipos tipo que puede otros objeto net isdbnull error convertir acepte vb.net dbnull

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 ?



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:

  1. 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.
  2. 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

  1. crear el evento de validación de celda y escribir este código
  2. Si Convert.ToString (dgv.CurrentCell.Value) = "" Entonces
  3. CurrentCell.Value = ""
  4. 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