Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

vasco16

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

Mensagens Recomendadas

vasco16    0
vasco16

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bruno1234    20
bruno1234

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bruno1234    20
bruno1234

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bruno1234    20
bruno1234

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Cocolin    0
Cocolin

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:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ribeiro55    44
ribeiro55

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á

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vasco16    0
vasco16

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ribeiro55    44
ribeiro55

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bruno1234    20
bruno1234

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vbtipo    0
vbtipo

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade