• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

vasco16

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

23 mensagens neste tópico

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()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E aceita != ?

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

Desde q consigas fazer a comparação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

:thumbsup:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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á

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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á

exacto, mas existe algum lógica para os operadores nao serem todos iguais em todas as linguagens?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A diferença entre o C# ter != e o VB .net ter <> são razões históricas.

O C# apareceu como uma evolução de linguagens q sempre usaram o !=.

E o vb .net evoluiu do <>.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora