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 ?

Foi útil?

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:

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

  1. criar o evento validar celular e escrever este código
  2. Se Convert.ToString (dgv.CurrentCell.Value) = "" Então
  3. CurrentCell.Value = ""
  4. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top