gestione dei dati dbnull in vb.net
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 ?
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:
- 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.
- 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
- crea l'evento di convalida della cella e scrivi questo codice
- Se Convert.ToString (dgv.CurrentCell.Value) = " " Poi
- CurrentCell.Value = " "
- 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