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

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
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
-
-
-
-
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
- Editado wallacemariadeandrade segunda-feira, 25 de março de 2019 20:12
-
-
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
-
-
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() -
-
-
-
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.
-
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 SubSub 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.
-
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
- Editado wallacemariadeandrade terça-feira, 26 de março de 2019 17:29
-
-
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
-
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