Jump to content

A conversão do tipo 'DBNull' para o tipo 'String' não é válida.


vasco16

Recommended Posts

Pessoal quero apresentar registos de uma BD num datagrid só que tenho o problema de alguns campos estarem vazios, por isso obtenho este erro:

A conversão do tipo 'DBNull' para o tipo 'String' não é válida.

estou a fazer da seguinte forma:

Dim db As New OleDb.OleDbConnection(bd1.My.Settings.ligacaoBD)
        ' LIGAR A BD
        db.Open()

        ' ACESSO AOS DADOS
        Dim comandosql = "Select ID_PERDIDO,DATA,TURNO,PRODUTO,DESCRICAO,FUNCIONARIO,DATA_SAIDA,RESPONSAVEL_SAIDA,ABATIDO,N_CARTAO,CLIENTE,CONTACTO,ENTREGUE from addperdidos where ABATIDO = 'SIM' or ENTREGUE = 'SIM'"
        Dim cmd As New OleDb.OleDbCommand(comandosql, db)

        Dim dtr As OleDb.OleDbDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

        ' CRIAÇÃO DE COLUNAS NO DATAGRIDVIEW
        Dim num_campos As Integer
        Dim campo As String

        DataGridView3.Columns.Clear()
        DataGridView3.RowHeadersVisible = False

        Dim idx As Integer
        num_campos = dtr.FieldCount
        For idx = 0 To num_campos - 1
            campo = dtr.GetName(idx)
            DataGridView3.Columns.Add(campo, campo)

        Next
        DataGridView3.Columns.Item(0).Width = 50
        DataGridView3.Columns.Item(1).Width = 50
        DataGridView3.Columns.Item(2).Width = 50
        DataGridView3.Columns.Item(3).Width = 50
        DataGridView3.Columns.Item(4).Width = 254
        DataGridView3.Columns.Item(5).Width = 50
        DataGridView3.Columns.Item(6).Width = 50
        DataGridView3.Columns.Item(7).Width = 50
        DataGridView3.Columns.Item(8).Width = 50
        DataGridView3.Columns.Item(9).Width = 50
        DataGridView3.Columns.Item(10).Width = 50
        DataGridView3.Columns.Item(11).Width = 50
        DataGridView3.Columns.Item(12).Width = 50

        ' CARREGAR OS DADOS
        Dim idx_linha As Integer
        idx_linha = 0

        While dtr.Read()
            Dim linha As New DataGridViewRow()
            DataGridView3.Rows.Add(linha)
            DataGridView3.Rows(idx_linha).Cells(0).Value = dtr.Item(0)
            DataGridView3.Rows(idx_linha).Cells(1).Value = RTrim(dtr.Item(1))
            DataGridView3.Rows(idx_linha).Cells(2).Value = RTrim(dtr.Item(2))
            DataGridView3.Rows(idx_linha).Cells(3).Value = RTrim(dtr.Item(3))
            DataGridView3.Rows(idx_linha).Cells(4).Value = RTrim(dtr.Item(4))
            DataGridView3.Rows(idx_linha).Cells(5).Value = RTrim(dtr.Item(5))
            DataGridView3.Rows(idx_linha).Cells(6).Value = RTrim(dtr.Item(6))
            DataGridView3.Rows(idx_linha).Cells(7).Value = RTrim(dtr.Item(7))
            DataGridView3.Rows(idx_linha).Cells(8).Value = RTrim(dtr.Item(8))
            DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))
            DataGridView3.Rows(idx_linha).Cells(10).Value = RTrim(dtr.Item(10))
            DataGridView3.Rows(idx_linha).Cells(11).Value = RTrim(dtr.Item(11))
            DataGridView3.Rows(idx_linha).Cells(12).Value = RTrim(dtr.Item(12))


            idx_linha = idx_linha + 1

        End While
        ' AJUSTE DAS COLUNAS DO DATAGRIDVIEW
        DataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        ' FECHAR A BD
        dtr.Close()
Link to comment
Share on other sites

Isso é pq estás a tentar converter para String um campo q vem a null na base de dados, e isso não é possivel.

Antes de fazeres estas afectações:

DataGridView3.Rows(idx_linha).Cells(1).Value = RTrim(dtr.Item(1))

deves primeiro verificar se dtr.Item(1) é diferente de dbnull

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Isso é pq estás a tentar converter para String um campo q vem a null na base de dados, e isso não é possivel.

Antes de fazeres estas afectações:

DataGridView3.Rows(idx_linha).Cells(1).Value = RTrim(dtr.Item(1))

deves primeiro verificar se dtr.Item(1) é diferente de dbnull

assim:

If DataGridView3.Rows(idx_linha).Cells(9).Value <> DBNull Then

                DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

            Else

                DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

            End If

Link to comment
Share on other sites

Esta afectação n deve ser necessária:

DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

E tens a condição ao contrário, a certa é: se for diferente de dbnull afectas com o valor, caso contrário n afectas.

Mas de resto parece-me bem.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Esta afectação n deve ser necessária:

DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

E tens a condição ao contrário, a certa é: se for diferente de dbnull afectas com o valor, caso contrário n afectas.

Mas de resto

parece-me bem.

tentei assim:

If not IsDBNull(DataGridView3.Rows(idx_linha).Cells(9).Value) Then

                DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

            Else

                DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

            End If

ele deixa-me passar os registos em brancos mas mostra-me todos os registos em branco, ou seja, os registos que têm dados aparece sem nada.

Link to comment
Share on other sites

A condição mais uma vez não é essa.

A condição é:

if dtr.Item(9) <> dbnull.value

      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

else

      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

A condição mais uma vez não é essa.

A condição é:

if dtr.Item(9) <> dbnull.value

      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

else

      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

acho que nao dá para usar esse operador..

EDIT:

pois como calculava, não dá para usar esses operadores. tentei isto:

If Not (dtr.Item(9).DBNull.Value) Then

                DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

            Else

                DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

            End If

mas sem sucesso.

Link to comment
Share on other sites

E o q é q acontece qd dizes sem sucesso?

Dá erro de sintaxe, ou seja, nao aceita o operador <> nem como fiz:

If Not (dtr.Item(9).DBNull.Value) Then

                DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

            Else

                DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

            End If

[/Quote]

PS: obrigado pela atenção 👍

Link to comment
Share on other sites

E aceita != ?

Senão tens ainda o método object.Equals

Desde q consigas fazer a comparação.

o operador != tambem nao funciona, tenho ideia que esse é usado em linguagens como c++.

Em relação ao método object.equals:

If Not dtr.Item(9).Equals(DBNull.Value) Then

                DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

            Else

                DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

            End If

já aparenta funcionar.

Obrigado.

Link to comment
Share on other sites

Bons dias! 🙂

Ora bem, eu ainda sou um iniciante por estas andanças mas corrijam-me se estiver errado:

Isto -

if dtr.Item(9) <> dbnull.value
      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))
else
      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

não é o mesmo que isto? -

if dtr.Item(9) = dbnull.value
      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing
else
      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

Experimentem e digam alguma coisa.

👍

Link to comment
Share on other sites

Bons dias! 🙂

Ora bem, eu ainda sou um iniciante por estas andanças mas corrijam-me se estiver errado:

Isto -

if dtr.Item(9) <> dbnull.value
      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))
else
      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing

não é o mesmo que isto? -

if dtr.Item(9) = dbnull.value
      DataGridView3.Rows(idx_linha).Cells(9).Value = Nothing
else
      DataGridView3.Rows(idx_linha).Cells(9).Value = RTrim(dtr.Item(9))

Experimentem e digam alguma coisa.

👍

em termos de lógica é, mas não se pode usar operadores do tipo "<>; =" para comparar o db.null.

Link to comment
Share on other sites

Em VB.NET, == e != correspondem, respectivamente, a:

= e <> (igual a e diferente de)

ou

Is e IsNot (é e não é)

Podes também usar negação:

If Not bláblá Is bláblá

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Provavelmente a mesma lógica de o "sim" não se dizer "SIM" em todas as línguas do mundo.

Não te sei dar um porquê em concreto.

O símbolo de diferente, por exemplo, não tenho lembrança de o ver correctamente em nenhuma linguagem de programação.

Se bem me lembro das aulas de matemática, o diferente era representado por , mas como podes deduzir, seria um pouco chato (ou até ridículo) para os programadores worldwide usarem para operadores, símbolos que não constam do layout do teclado. Talvez seja por isso...

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

E o vb .net evoluiu do <>.

Isso é mentira, não foi o vbnet que evoluiu, mas sim, do basic para visual basic e esse operador simplesmente não existe. Tinhamos que dar uma volta ao código para conseguir fazer aquilo que queriamos.

Lema: Se eu não saber de alguma coisa não se preocupem porque tento sempre ajudar alguma coisita, nem que seja, por palpites/sugestões.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.