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 ?

¿Fue útil?

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:

  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 hacerlos anulables (Of T). Para los tipos de referencia (String y Byte ()), esto significa permitir que el valor sea Nothing.
  2. 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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top