Domanda

Voglio generare un output formattato dei dati recuperati da un database MS-Access e archiviati in un oggetto / variabile DataTable , myDataTable. Tuttavia, alcuni dei campi nei dati myDataTable cotain dbNull . Pertanto, il seguente frammento di codice VB.net genererà errori se il valore di uno dei campi cognome , intials o sID è 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

Quindi, come faccio a far funzionare il codice sopra quando i campi possono contenere dbNull senza dover controllare ogni volta se i dati sono dbNull come in questa domanda ?

È stato utile?

Soluzione

L'unico modo che conosco è di provarlo, puoi fare un combinato se per renderlo facile.

If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
   'Do success
ELSE
   'Failure
End If

Ho scritto in VB poiché è quello di cui hai bisogno, anche se hai mescolato le lingue.

Modifica

Ripulito per usare IsDbNull per renderlo più leggibile

Altri suggerimenti

Mi sono stancato di affrontare questo problema, quindi ho scritto una funzione NotNull () per aiutarmi.

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

Utilizzo:

If NotNull(myItem("sID"), "") = sID Then
  ' Do something
End If

La mia funzione NotNull () ha subito un paio di revisioni nel corso degli anni. Prima di Generics, ho semplicemente specificato tutto come un oggetto. Ma preferisco di gran lunga la versione generica.

Puoi anche usare i metodi Convert.ToString () e Convert.ToInteger () per convertire elementi con DB null in modo efficace.

Una variante di codice di Steve Wortham , da utilizzare nominalmente con i tipi 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

per es.

mynullable = GetNullable(Of Integer?)(myobj)

Puoi quindi eseguire una query su mynullable (ad es. mynullable.HasValue )

Microsoft ha creato DBNull in .NET 1.0 per rappresentare il database NULL. Tuttavia, è una seccatura da usare perché non è possibile creare una variabile fortemente tipizzata per archiviare un valore autentico o null. Microsoft ha risolto il problema in .NET 2.0 con tipi nullable. Tuttavia, sei ancora bloccato con grossi pezzi di API che utilizzano DBNull e non possono essere modificati.

Solo un suggerimento, ma quello che faccio normalmente è questo:

  1. Tutte le variabili contenenti dati letti o scritti in un database dovrebbero essere in grado di gestire valori null. Per i tipi di valore, ciò significa renderli Nullable (Of T). Per i tipi di riferimento (String e Byte ()), ciò significa consentire che il valore sia Nothing.
  2. Scrivi una serie di funzioni per convertire avanti e indietro tra " oggetto che può contenere DBNull " e "nessuna variabile .NET nullable". Avvolgi tutte le chiamate alle API di stile DBNull in queste funzioni, quindi fai finta che DBNull non esista.

Se si utilizza un'impostazione BLL / DAL, provare l'if durante la lettura dell'oggetto nel 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

È possibile utilizzare la funzione IsDbNull:

  If  IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
    // Do something
End If

Per le righe che contengono stringhe, posso convertirle in stringhe come cambiando

tmpStr = nameItem("lastname") + " " + nameItem("initials")

a

tmpStr = myItem("lastname").toString + " " + myItem("intials").toString

Per il confronto nell'istruzione if myItem (" sID ") = sID , deve essere modificato in

myItem("sID").Equals(sID)

Quindi il codice verrà eseguito senza errori di runtime a causa dei dati 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

Ciao amici

Questo è il metodo più breve per controllare db Null in DataGrid e convertirlo in stringa

  1. crea l'evento di convalida della cella e scrivi questo codice
  2. Se Convert.ToString (dgv.CurrentCell.Value) = " " Poi
  3. CurrentCell.Value = " "
  4. Termina se

Questo è DI PIÙ il modo più semplice per convertire DBNull in una stringa. Il trucco è che NON PUOI utilizzare la funzione TRIM (che era il mio problema iniziale) quando ti riferisci ai campi del database:

PRIMA (messaggio di errore prodotto):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))

DOPO (niente più messaggi di errore :-)):

Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))

Penso che dovrebbe essere molto più facile da usare:

  

seleziona ISNULL (somma (campo), 0) da tablename

Copiato da: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top