none
Mensagem de erro "System.Data.OleDb.OleDbException: 'Nenhum valor foi fornecido para um ou mais parâmetros necessários.'" RRS feed

  • Pergunta

  • Olá, estou com dificuldades em resolver o problema da mensagem de erro acima, ja desconstruí o codigo para os termos mais básicos possíveis, ainda assim o erro aparece. Alguém consegue iluminar essa mente perturbada por gentileza?

    Já fiz uma busca pelo forum e encontrei a mesma duvida, porem mesmo aplicando as soluções informadas não obtive exito.

    Obrigado!

    Private Sub Atualizar()

            strNome = txtNome.Text
            strEndereco = txtEndereco.Text


            Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
                                                & "Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema" _
                                                & "\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb;" _
                                                & " Persist Security Info=True")

            Dim cmd As New OleDbCommand
            Dim sql As String = ("UPDATE CLIENTES SET [Endereco] = strEndereco WHERE [Nome] = strNome")

            'Abre, atualiza, e encerra a conexão 

            ConnectionString.Open()
            cmd = New OleDbCommand(sql, ConnectionString)
            cmd.Parameters.Add("Endereco", OleDbType.Variant).Value = strEndereco
            cmd.ExecuteNonQuery()
            ConnectionString.Close()

        End Sub

    

    segunda-feira, 25 de março de 2019 17:27

Todas as Respostas

  • Olá, Maldoram! Acredito que o erro esteja na substituição dos parâmetros na sql! Veja se o código abaixo funciona:

    Private Sub Atualizar()
    
            strNome = txtNome.Text
            strEndereco = txtEndereco.Text
    
    
            Dim databaseConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
                                                & "Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema" _
                                                & "\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb;" _
                                                & " Persist Security Info=True")
    
            Dim cmd As New OleDbCommand
            Dim sql As String = "UPDATE CLIENTES SET ENDERECO = @endereco WHERE NOME = @nome"
    
            'Abre, atualiza, e encerra a conexão 
    
            databaseConnection.Open()
            cmd = New OleDbCommand(sql, databaseConnection)
            cmd.Parameters.AddWithValue("@endereco", strEndereco)
            cmd.Parameters.AddWithValue("@nome", strNome)
            cmd.ExecuteNonQuery()
            ConnectionString.Close()
    
        End Sub


    “First do it, then do it right, then do it better.” - Addy Osmani

    segunda-feira, 25 de março de 2019 18:17
  • Caro Wallace, obrigado pela ajuda. O problema da mensagem resolveu, entendi qual era o erro, estava usando a variável na string de update, acho que era isso.

    O caso agora é que não está salvando os dados atualizado.

    Obrigado!

    segunda-feira, 25 de março de 2019 19:15
  • Que bom que conseguiu! Mas não está ocorrendo a atualização no banco de dados? Como se o comando não tivesse sido executado?

    “First do it, then do it right, then do it better.” - Addy Osmani

    segunda-feira, 25 de março de 2019 19:40
  • Isso mesmo, como se não tivesse sido executado. Não mudei nada no código que me enviou.
    segunda-feira, 25 de março de 2019 20:05
  • Mudou a variável "connectionString" na penultima linha? Eu esqueci de mudar para "databaseConnection" :D

    databaseConnection.Close()


    “First do it, then do it right, then do it better.” - Addy Osmani


    segunda-feira, 25 de março de 2019 20:11
  • Sim mudei. Está tudo aparentemente ok, não consigo enxergar o motivo de não atualizar os dados.
    segunda-feira, 25 de março de 2019 20:36
  • A query funciona quando é digitada direto no prompt do banco de dados? Pode ser que a clausula WHERE não esteja sendo satisfeita, ainda mais que o campo nome deve ser do tipo texto. O texto da variável strNome deve ser exatamente igual ao que tem na coluna "Nome" do banco de dados; letras maiúsculas, minúsculas e acentos devem ser iguais também

    “First do it, then do it right, then do it better.” - Addy Osmani

    segunda-feira, 25 de março de 2019 21:10
  • Olá, tenta o código...

    Dim sql As String = "UPDATE CLIENTES SET ENDERECO = '@endereco' WHERE NOME = '@nome'"
    

    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 26 de março de 2019 10:56
  • Olá Wallace,

    Não sei como que testa no prompt. De qualquer forma, revisei a query e fiz o código completo, com todos os campos. Estava usando somente aqueles dois campos para facilitar o entendimento, agora fiz com todos os campos e a clausula WHERE agora é pelo "Código" que é o campo chave da tabela. Ele tem o acento pois é o campo fornecido automaticamente pelo access, não quis mudar para evitar erros e mantive assim.

    Só para reforçar, tanto o codigo completo, como da forma que você me enviou inicialmente, o comportamento é o mesmo, não está salvando, por algum motivo o comportamento é esse, de como se não executasse.

    Obrigado, abs!

    Dim databaseConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
                                                & "Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema" _
                                                & "\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb;" _
                                                & " Persist Security Info=True")

            Dim cmd As New OleDbCommand
            Dim sql As String = "UPDATE CLIENTES SET NOME = @nome, ENDERECO = @endereco, COMPLEMENTO = @complemento" _
                                                                & "BAIRRO = @bairro, CIDADE = @cidade, UF = @uf, CEP = @cep" _
                                                                & "FONE = @fone, EMAIL = @email WHERE CÓDIGO = @código"

            'Abre, atualiza, e encerra a conexão 

            cmd = New OleDbCommand(sql, databaseConnection)
            cmd.Parameters.AddWithValue("@endereco", strEndereco)
            cmd.Parameters.AddWithValue("@nome", strNome)
            cmd.Parameters.AddWithValue("@complemento", strComplemento)
            cmd.Parameters.AddWithValue("@bairro", strBairro)
            cmd.Parameters.AddWithValue("@cidade", strCidade)
            cmd.Parameters.AddWithValue("@uf", strUF)
            cmd.Parameters.AddWithValue("@cep", strCEP)
            cmd.Parameters.AddWithValue("@fone", strFone)
            cmd.Parameters.AddWithValue("@email", strEmail)
            databaseConnection.Open()
            Dim x As Integer = cmd.ExecuteNonQuery()
            If x < 1 Then
                MessageBox.Show("Erro ao inserir!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                MessageBox.Show("Registro inserido com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

            databaseConnection.Close()

    terça-feira, 26 de março de 2019 13:25
  • Olá Leonardo,

    Obrigado pela resposta mas não funcionou também, retorna mensagem de erro na string do UPDATE.

    Abs!

    terça-feira, 26 de março de 2019 13:27
  • Olá, mas no código está faltando o adicionar o parâmetro do "código"...

    cmd.Parameters.AddWithValue("@código", VARIAVEL_DO_CODIGO);
    

    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 26 de março de 2019 13:43
  • Bem observado Leonardo, mas não adiantou. O erro permanece :(
    terça-feira, 26 de março de 2019 13:53
  • Olá, certo, outro ponto... ao concatenar o sql está faltando espaços... tenta o código...

    Dim sql As String = "UPDATE CLIENTES SET NOME = @nome, ENDERECO = @endereco, COMPLEMENTO = @complemento " _
                                                                & " BAIRRO = @bairro, CIDADE = @cidade, UF = @uf, CEP = @cep " _
                                                                & " FONE = @fone, EMAIL = @email WHERE CÓDIGO = @código "


    Se ajudou, marque como resposta! Obrigado.

    terça-feira, 26 de março de 2019 14:01
  • Leonardo não deu.

    Acredito que o erro está no total da programação.

    estou usando uma classe chamada "controle" que me permite incluir novos dados, depois construí comandos novamente para localizar os dados a serem alterados, e por fim tento fazer o update construindo novos comandos. Esta lambança deve estar conflitando em algum ponto.

    Fiz dessa forma por não saber como utilizar a classe para atualizar ou pesquisar. Na verdade, fiz curso de VB em 2004 eu acho, na ocasião utilizando o VB5 se não me engano, além de relembrar o que foi aprendido, tenho que lidar com as atualizações. Estou usando o visual studio Community 2017.

    Classe "controle"

    Imports System.Data.OleDb

    Public Class Controle
        Public DBCon As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb; Persist Security Info=True")

        Public Queryes As String

        Public DBcmd As OleDbCommand

        Public DBDA As OleDbDataAdapter

        Public DBDT As DataTable

        Public DBDS As New DataSet

        Public Paramns As New List(Of OleDbParameter)

        Public Sub ExecuteQuery(ByVal Query As String)

            Try
                DBCon.Open()

                DBcmd = New OleDbCommand(Query, DBCon)

                Paramns.ForEach(Sub(p) DBcmd.Parameters.Add(p))

                Paramns.Clear()

                DBDT = New DataTable

                DBDA = New OleDbDataAdapter(DBcmd)

                DBDA.Fill(DBDT)


            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

            If DBCon.State = ConnectionState.Open Then
                DBCon.Close()
                DBCon = Nothing
            End If

        End Sub

     Sub Pesquisar

            Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
                                                & "Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema" _
                                                & "\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb;" _
                                                & " Persist Security Info=True")

            Dim Query As String = ("SELECT * FROM CLIENTES WHERE CÓDIGO = @código")
            Dim Command As New OleDbCommand(Query, ConnectionString)
            Dim DataAdapter As New OleDbDataAdapter(Command)
            Dim DataTable As New DataTable
            Dim MyData As New DataSet

            Codigo = txtcodigo.Text

            Command.Parameters.Add("@código", OleDbType.Variant).Value = intCodigo

            ConnectionString.Open()

            DataAdapter.Fill(DataTable)

            txtCodigo.Text = DataTable.Rows(0)("Código").ToString
            txtClienteID.Text = DataTable.Rows(0)("ClienteID").ToString
            txtDataCadastro.Text = DataTable.Rows(0)("DataCadastro").ToString
            txtNome.Text = DataTable.Rows(0)("Nome").ToString
            txtEndereco.Text = DataTable.Rows(0)("Endereco").ToString
            txtComplemento.Text = DataTable.Rows(0)("Complemento").ToString
            txtBairro.Text = DataTable.Rows(0)("Bairro").ToString
            txtCidade.Text = DataTable.Rows(0)("Cidade").ToString
            txtUF.Text = DataTable.Rows(0)("UF").ToString
            txtEmail.Text = DataTable.Rows(0)("Email").ToString
            txtOBS.Text = DataTable.Rows(0)("OBS").ToString
            mtbCEP.Text = DataTable.Rows(0)("CEP").ToString
            mtbFone.Text = DataTable.Rows(0)("Fone").ToString
        

            ConnectionString.Close()

    e a sub de atualizar que ja foi colocada acima.

    terça-feira, 26 de março de 2019 17:10
  • Nesse trecho está faltando subtituir o parâmetro @código! No caso, na string SQL não há a necessidade do acento, pode deixar sem. 

    O ideal é que seja pelo código mesmo, já que deve ser sua chave primária da tabela, certo? Outra coisa, os demais campos estão sendo alterados pelo usuário da aplicação? Se não, não há a necessidade de colocar na query

    Dim databaseConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data " _
                                                & "Source=C:\Users\claud\Google Drive\Desenvolvimento\Sistema" _
                                                & "\LuminaGOS\LGOS\LuminaGOS\Lumina Gerenciador de OS\LuminaGOS.mdb;" _
                                                & " Persist Security Info=True")
    
            Dim cmd As New OleDbCommand
            Dim sql As String = "UPDATE CLIENTES SET NOME = @nome, ENDERECO = @endereco, COMPLEMENTO = @complemento" _
                                                                & "BAIRRO = @bairro, CIDADE = @cidade, UF = @uf, CEP = @cep" _
                                                                & "FONE = @fone, EMAIL = @email WHERE CÓDIGO = @codigo"
    
            'Abre, atualiza, e encerra a conexão 
    
            cmd = New OleDbCommand(sql, databaseConnection)
            
            'Precisa substituir o parametro @codigo
            cmd.Parameters.AddWithValue("@codigo", strCodigo)
            
            cmd.Parameters.AddWithValue("@endereco", strEndereco)
            cmd.Parameters.AddWithValue("@nome", strNome)
            cmd.Parameters.AddWithValue("@complemento", strComplemento)
            cmd.Parameters.AddWithValue("@bairro", strBairro)
            cmd.Parameters.AddWithValue("@cidade", strCidade)
            cmd.Parameters.AddWithValue("@uf", strUF)
            cmd.Parameters.AddWithValue("@cep", strCEP)
            cmd.Parameters.AddWithValue("@fone", strFone)
            cmd.Parameters.AddWithValue("@email", strEmail)
            databaseConnection.Open()
            Dim x As Integer = cmd.ExecuteNonQuery()
            If x < 1 Then
                MessageBox.Show("Erro ao inserir!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                MessageBox.Show("Registro inserido com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
    
            databaseConnection.Close()


    “First do it, then do it right, then do it better.” - Addy Osmani


    terça-feira, 26 de março de 2019 17:26
  • Obrigado Wallace, fiz essa correção mas o problema persiste. Estou revisando tudo novamente, caso eu encontre o erro eu posto a solução aqui.

    Obrigado.

    quarta-feira, 27 de março de 2019 14:24
  • Ok!! Faça um teste só para saber se a conexão com o banco de dados está ok: escreva uma SQL fixa no codigo. Exemplo:

    Dim sql As String = "UPDATE CLIENTES SET NOME = 'wallace' WHERE CÓDIGO = 1"


    “First do it, then do it right, then do it better.” - Addy Osmani

    quarta-feira, 27 de março de 2019 15:21
  • Boa noite.

    Já resolveu seu problema?

    Qual a mensagem exibida?

    Tente assim:

    Dim x As Integer = cmd.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao alterar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Elseif x = 0 Then

    MessageBox.Show("Nenhum dado alterado", My.Application.Info.Title, MessageBoxButtons.OK)

    Else MessageBox.Show(x.tostring & " registros alterados com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If


    MARIANO1776


    • Editado Mariano1776 segunda-feira, 8 de abril de 2019 23:41
    segunda-feira, 8 de abril de 2019 23:40