locked
Nenhum valor foi fornecido para um ou mais parâmetros necessários. RRS feed

  • Pergunta

  • Ao clicar no botão "Próximo" aparece o seguinte erro:
    Nenhum valor foi fornecido para um ou mais parâmetros necessários.
    Este erro está relacionado à linha em negrito abaixo. Alguém pode solucionar este problema?
    Imports System.Data.OleDb
    Public Class frmAgenda
        Private Sub frmAgenda_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim con As New OleDbConnection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"
            con.Open()
            Dim comando As New OleDbCommand
            comando.CommandText = "SELECT TOP 1 * FROM tb_dados ORDER BY Nome"
            comando.CommandType = CommandType.Text
            comando.Connection = con
            Dim leitor As OleDbDataReader
            leitor = comando.ExecuteReader()
            leitor.Read()
            Me.txtNome.Text = leitor("Nome").ToString
            Me.mskCelular.Text = leitor("Celular").ToString
            Me.mskTelefone.Text = leitor("Telefone").ToString
           
        End Sub
        Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click
            Dim con As New OleDbConnection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"
            Dim comando As New OleDbCommand
            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = @Nome ORDER BY id"
            comando.CommandType = CommandType.Text
            comando.Connection = con
            Dim param1 As New OleDbParameter("@Nome", OleDbType.VarChar)
            param1.Value = txtNome.Text
            comando.Parameters.Add(param1)
            Dim leitor As OleDbDataReader
            con.Open()
            leitor = comando.ExecuteReader()
            leitor.Read()
            con.Close()
        End Sub
        
    End Class
    terça-feira, 20 de dezembro de 2011 03:09

Respostas

  • Através da video aula 24 do curso Visual Basic Avançado da Treinamentos TI, aprendi que o código fica da seguinte forma:

     

     

     

    Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click

            Me.Tb_dadosBindingSource.MoveNext()

        End Sub


        Private Sub btnAnterior_Click(sender As System.Object, e As System.EventArgs) Handles btnAnterior.Click

            Me.Tb_dadosBindingSource.MovePrevious()

        End Sub

    sexta-feira, 23 de dezembro de 2011 04:34

Todas as Respostas

  • Olá Anderson,

    Tente fazer assim:

    Dim con As New OleDbConnection
    con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"
    Dim comando As New OleDbCommand
    comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY id"
    comando.CommandType = CommandType.Text
    comando.Connection = con
    
    Dim leitor As OleDbDataReader
    con.Open()
    leitor = comando.ExecuteReader()
    leitor.Read()
    con.Close()

    Se o erro continuar provavelmente seu problema esta em algum dos nomes de alguma das colunas

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 20 de dezembro de 2011 11:04
    Moderador
  • Continua o mesmo erro.

    Notei que o formulário está sendo carregado com ordenação by Nome e botão Próximo  está ordenando by id. Há algum problema nesta diferença? 

     

    Agora o meu código está assim:

     

    Imports System.Data.OleDb

     

    Public Class frmAgenda

     

        Private Sub frmAgenda_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

            Dim con As New OleDbConnection

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"

            con.Open()

            Dim comando As New OleDbCommand

            comando.CommandText = "SELECT TOP 1 * FROM tb_dados ORDER BY Nome"

            comando.CommandType = CommandType.Text

            comando.Connection = con

     

            Dim leitor As OleDbDataReader

            leitor = comando.ExecuteReader()

            leitor.Read()

            Me.txtNome.Text = leitor("Nome").ToString

            Me.mskCelular.Text = leitor("Celular").ToString

            Me.mskTelefone.Text = leitor("Telefone").ToString

     

     

        End Sub

     

        Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click

     

            Dim con As New OleDbConnection

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"

            Dim comando As New OleDbCommand

            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY id"

            comando.CommandType = CommandType.Text

            comando.Connection = con

     

            Dim leitor As OleDbDataReader

            con.Open()

            leitor = comando.ExecuteReader()

            leitor.Read()

            con.Close()

     

        End Sub

     

     

    End Class

    terça-feira, 20 de dezembro de 2011 20:59
  • Olá Anderson,

    Diante disso, parece que existe algo errado em sua tabela ou com os nomes dos campos de sua tabela.

    Vc realmente possui uma coluna chamada Id?

    Não, o order by não influenciaria isso, a menos que estive com um nome errado de uma coluna atrelado a ele.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    terça-feira, 20 de dezembro de 2011 22:50
    Moderador
  • Desculpe-me por todo esse transtorno, pois sou iniciante.

     

    Eu não tinha atentado para este detalhe.

     

    Pensei que "id" era alguma espécie de comando, não notei que era uma referência genérica.

     

    O campo de numeração automática do meu banco de dados chama-se "Código".

     

    Os outros campos são: "Nome", "Telefone" e "Celular". Como fica o código do botão "próximo" e do botão "anterior"?

     

    Obrigado.

     

    Tenha um ótimo final de ano.



    quarta-feira, 21 de dezembro de 2011 05:58
  • Estou respondendo do celular,então não poderei posta todo o código, mas é só vc substituir no comando SQL o ORDER BY ID por ORDER BY CÓDIGO.

     

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quarta-feira, 21 de dezembro de 2011 10:33
    Moderador
  •  

    Fiz a alteração. Parou de dar o erro. Mas, ao clicar no botão Próximo, não acontece nada, não mostra o próximo registro.Em relação ao botão anterior, como ficaria o código? Meu código está assim:

     

    Imports System.Data.OleDb

     

    Public Class frmAgenda

     

        Private Sub frmAgenda_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

            Dim con As New OleDbConnection

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"

            con.Open()

            Dim comando As New OleDbCommand

            comando.CommandText = "SELECT TOP 1 * FROM tb_dados ORDER BY Nome"

            comando.CommandType = CommandType.Text

            comando.Connection = con

     

            Dim leitor As OleDbDataReader

            leitor = comando.ExecuteReader()

            leitor.Read()

            Me.txtNome.Text = leitor("Nome").ToString

            Me.mskCelular.Text = leitor("Celular").ToString

            Me.mskTelefone.Text = leitor("Telefone").ToString

     

     

        End Sub

     

        Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click

     

            Dim con As New OleDbConnection

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"

            Dim comando As New OleDbCommand

            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY Código"

            comando.CommandType = CommandType.Text

            comando.Connection = con

     

            Dim leitor As OleDbDataReader

            con.Open()

            leitor = comando.ExecuteReader()

            leitor.Read()

            con.Close()

     

        End Sub

     

     

    End Class

     


    quarta-feira, 21 de dezembro de 2011 14:03
  • Faltou atribuir os valores ao campo:

            Dim con As New OleDbConnection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"
            Dim comando As New OleDbCommand
            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY Código"
            comando.CommandType = CommandType.Text
            comando.Connection = con
             Dim leitor As OleDbDataReader
            con.Open()
            leitor = comando.ExecuteReader()
            leitor.Read()
    
            con.Close()
            Me.txtNome.Text = leitor("Nome").ToString
            Me.mskCelular.Text = leitor("Celular").ToString
            Me.mskTelefone.Text = leitor("Telefone").ToString
    


    Acredito que exista um outro tópico com esta mesma pergunta, não?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quarta-feira, 21 de dezembro de 2011 15:41
    Moderador
  • Agora o erro é o seguinte:

    No data exists for the row/column.

    e remete para a linha em negrito a seguir:

     

     

    Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click

     

            Dim con As New OleDbConnection

            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"

            Dim comando As New OleDbCommand

            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY Código"

            comando.CommandType = CommandType.Text

            comando.Connection = con

            Dim leitor As OleDbDataReader

            con.Open()

            leitor = comando.ExecuteReader()

            leitor.Read()

     

            con.Close()

            Me.txtNome.Text = leitor("Nome").ToString

            Me.mskCelular.Text = leitor("Celular").ToString

            Me.mskTelefone.Text = leitor("Telefone").ToString

     

        End Sub

    quarta-feira, 21 de dezembro de 2011 21:44
  • Olá Anderson,

    Isso acontece quando a sua consulta não retorna nenhum registro e vc executa um comando de leitura do datareader.

    Tente fazer assim:

    Dim con As New OleDbConnection
    
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='|DataDirectory|\Banco de Agenda.accdb'"
    
            Dim comando As New OleDbCommand
    
            comando.CommandText = "SELECT TOP 1 * FROM tb_dados WHERE Nome = '" & txtNome.Text & "' ORDER BY Código"
    
            comando.CommandType = CommandType.Text
    
            comando.Connection = con
    
            Dim leitor As OleDbDataReader
    
            con.Open()
    
            leitor = comando.ExecuteReader()
    
    If (leitor.HasRows) Then
            leitor.Read() 
            Me.txtNome.Text = leitor("Nome").ToString
            Me.mskCelular.Text = leitor("Celular").ToString
            Me.mskTelefone.Text = leitor("Telefone").ToString
    End If
    
    con.Close()
    

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quinta-feira, 22 de dezembro de 2011 00:44
    Moderador
  • Parou de dar erro, mas, ao clicar no botão próximo, não acontece nada, não mostra o próximo registro.
    quinta-feira, 22 de dezembro de 2011 02:27
  • Isso acontece pois nenhum registro esta sendo encontrado no banco devido o parâmetro que esta passando em sua consulta.

    Acedito que vc deve rever a lógica de sua aplicação.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique

    quinta-feira, 22 de dezembro de 2011 02:29
    Moderador
  • Parou de dar erro, mas, ao clicar no botão próximo, não acontece nada, não mostra o próximo registro.


    Se voce quer movimentar registo, nao podes usar apenas o datareader, este control nao tem propiedades movelast, movenext.

    Nao como no Visual Basic. Exite um novo control Chamado, BindingSource. Este control permite movimentar registos como no antigo Visual Basic.

    Dim Ligar_Text As New BindingSource.

     


    One word frees us of all the weight and pain of life: that word is love.
    quinta-feira, 22 de dezembro de 2011 06:43
  • Olá Anderson,

    Veja o exemplo que coloquei neste link: https://skydrive.live.com/#cid=7DECE45BBF0DB70F&id=7DECE45BBF0DB70F!660

    Ele se chama WindowsPreviousNext.zip

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quinta-feira, 22 de dezembro de 2011 11:35
    Moderador
  • Através da video aula 24 do curso Visual Basic Avançado da Treinamentos TI, aprendi que o código fica da seguinte forma:

     

     

     

    Private Sub btnProximo_Click(sender As System.Object, e As System.EventArgs) Handles btnProximo.Click

            Me.Tb_dadosBindingSource.MoveNext()

        End Sub


        Private Sub btnAnterior_Click(sender As System.Object, e As System.EventArgs) Handles btnAnterior.Click

            Me.Tb_dadosBindingSource.MovePrevious()

        End Sub

    sexta-feira, 23 de dezembro de 2011 04:34