manuseamento de dados DbNull em vb.net
Pergunta
Eu quero gerar alguma saída formatada de dados recuperados de um banco de dados MS-Access e armazenados em um DataTable objeto / variável, myDataTable. No entanto, alguns dos campos em COTAIN myDataTable DBNULL de dados. Então, o seguinte trecho de código VB.net vai dar erros se o valor de qualquer um dos campos sobrenome , intials ou 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
Então, como faço para obter o código acima para o trabalho quando os campos podem conter DBNULL sem ter que verificar cada vez que se os dados forem DBNULL como em esta questão ?
Solução
A única maneira que eu conheço é teste para ele, você pode fazer um combinado de se embora para tornar mais fácil.
If NOT IsDbNull(myItem("sID")) AndAlso myItem("sID") = sId Then
'Do success
ELSE
'Failure
End If
eu escrevi em VB que é o que parece que você precisa, mesmo que você línguas mistas.
Editar
Limpo até o uso IsDBNull para torná-lo mais legível
Outras dicas
Eu cansei de lidar com este problema, então eu escrevi uma função NotNull () para ajuda-me para fora.
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
função Meu NotNull () passou por um par de revisões ao longo dos anos. Antes de genéricos, eu simplesmente especificado tudo como um objeto. Mas eu prefiro muito mais a versão genérica.
Você também pode usar o Convert.ToString () e Convert.To Integer () para itens converso com DB nulo de forma eficaz.
Uma variação no código do Steve Wortham , para ser usado nominalmente com 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 exemplo.
mynullable = GetNullable(Of Integer?)(myobj)
Você pode, então, consulta mynullable
(por exemplo, mynullable.HasValue
)
Microsoft surgiu com DBNull em .NET 1.0 para representar NULL banco de dados. No entanto, é uma dor no traseiro de usar, porque você não pode criar uma variável fortemente tipado para armazenar um valor genuíno ou nulo. tipo Microsoft de resolvido esse problema no .NET 2.0 com tipos anuláveis. No entanto, você ainda está preso com grandes pedaços de API que o uso DBNull, e eles não podem ser alterados.
Apenas uma sugestão, mas o que eu normalmente faço é esta:
- Todas as variáveis ??que contêm dados lidos ou gravados em um banco de dados deve ser capaz de lidar com valores nulos. Para tipos de valores, isso significa fazer-lhes Nullable (Of T). Para tipos de referência (string e Byte ()), isso significa permitindo que o valor a ser nada.
- Escreva um conjunto de funções para converter e para trás entre "objeto que pode conter DBNull" e "variável .NET anulável". Envolva todas as chamadas para APIs DBNull de estilo nessas funções, em seguida, fingir que DBNull não existe.
Se você estiver usando uma configuração de BLL / DAL tentar o IIF ao ler no objeto na 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
Você pode usar a função IsDBNull:
If IsDbNull(myItem("sID")) = False AndAlso myItem("sID")==sID Then
// Do something
End If
Para as linhas contendo cordas, eu posso convertê-los para strings na mudança
tmpStr = nameItem("lastname") + " " + nameItem("initials")
para
tmpStr = myItem("lastname").toString + " " + myItem("intials").toString
Para a comparação no se declaração myItem ( "sID") = sID , ele precisa ser alterado para
myItem("sID").Equals(sID)
Em seguida, o código será executado sem erros de execução devido ao vbNull de dados.
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
Olá amigos
Este é o método mais curto para verificar db nulo no DataGrid e convertido para string
- criar o evento validar celular e escrever este código
- Se Convert.ToString (dgv.CurrentCell.Value) = "" Então
- CurrentCell.Value = ""
- End If
Esta é por FAR a maneira mais fácil para converter DBNull
a uma corda.
O truque é que você não pode usar a função TRIM
(que era o meu problema inicial) quando se refere aos campos do banco de dados:
ANTES (produzido msg de erro):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(TRIM(myReader("Prov_Num"))), "", TRIM(myReader("Prov_Num")))
AFTER (não mais msg de erro :-)):
Me.txtProvNum.Text = IIf(Convert.IsDBNull(myReader("Prov_Num")), "", myReader("Prov_Num"))
Eu acho que isso deve ser muito mais fácil de usar:
select ISNULL (soma (campo), 0) from tablename
Copiado de: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ