Jump to content
Sign in to follow this  
Bessa

[Resolvido] Guardar Alterações (Após ter Editado)

Recommended Posts

Bessa

Boas Pessoal!

Estou aqui com um problema...E é a Mensagem de erro que mais me tem atormentado hoje! :dontgetit:

Após fazer as alterações que quero nos devidos campos, dá este problema! [De referir que tenho testado até só mudando o conteúdo da ListBox, tipo, apagando um item e adicionando outro, e dá este prob na mesma]

Dá no Código:

Dim x As Integer = command.ExecuteNonQuery()

Não foi fornecido nenhum valor para um ou mais parâmetros necessários.

SIM, eu SEGUI-ME pelo artigo da WIKI - http://wiki.portugal-a-programar.org/dev_net:vb.net:access

Aqui está o código, penso que não falhei em nada, em comparação com da Wiki...A Não ser na nova parte que adicionei, que foi o LIKE.

Experimentei colocar da seguinte forma e deu erro, por isso, tinha posto como na origem:

 Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] = @artigo_escolhido LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo"

O Código...

Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb")

        connection.Open()

        Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] = @artigo_escolhido LIKE '" & Artigo_escolhidoComboBox.Text & "' AND fase_artigo LIKE '" & fase_artigo.Text & "'"

        For i As Integer = 0 To Ferramentas_corte_selecListBox.Items.Count - 1

            Dim command As New OleDbCommand(sql, connection)

            If i <= Ferramentas_posic_selecListBox.Items.Count - 1 Then

                command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text
                command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text
                command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text
                command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text
                command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text

                command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString()
                command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = Ferramentas_posic_selecListBox.Items(i).ToString()
                command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString()
                command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString()
                command.Parameters.Add("@x_ferr_pos", OleDbType.Integer).Value = X_ferr_posListBox.Items(i).ToString()
                command.Parameters.Add("@y_ferr_pos", OleDbType.Integer).Value = Y_ferr_posListBox.Items(i).ToString()
                command.Parameters.Add("@z_ferr_pos", OleDbType.Integer).Value = Z_ferr_posListBox.Items(i).ToString()

            Else

                command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text
                command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text
                command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text
                command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text
                command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text

                command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString()
                command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString()
                command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString()
                command.Parameters.Add("@x_ferr_pos", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@y_ferr_pos", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@z_ferr_pos", OleDbType.VarChar).Value = "-"

            End If

            Dim x As Integer = command.ExecuteNonQuery()

            If x < 1 Then
                MessageBox.Show("Erro ao actualizar", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                MessageBox.Show("Actualizado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        Next
        connection.Close()

em que parte do código, me estou a enterrar?

Até deixei a parte final da Instrução SQL, como ficou resolvido no outro problema de hoje, mas agora não funciona neste caso. :)

Obrigado desde já.

Share this post


Link to post
Share on other sites
Caça

Achas que isto está bem?

WHERE [artigo_escolhido] = @artigo_escolhido LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Bessa

Por essa razão deixei como tinha antes:

Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] = @artigo_escolhido LIKE '" & Artigo_escolhidoComboBox.Text & "' AND fase_artigo LIKE '" & fase_artigo.Text & "'"

Está bem à mostra o código que tenho atualmente... :confused::)

E é verdade que estava errado, mas tenho de tentar as possibilidades que imagino.

O problema é que mesmo assim não dá.

Share this post


Link to post
Share on other sites
Caça

Não é isso, ou tens

WHERE [artigo_escolhido] = @artigo_escolhido

ou

WHERE [artigo_escolhido] LIKE @artigo_escolhido

isto é que não

WHERE [artigo_escolhido] = @artigo_escolhido LIKE @artigo_escolhido


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Bessa

Obrigado.

Como tenho 2, coloquei com um "AND"... 🤔

 ... [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo.Text"

No Entanto, dá sempre o mesmo problema. 🤔

Share this post


Link to post
Share on other sites
Caça

Tens a certeza que todos os campos estão preenchidos?

Eu desconfio deste

command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString()


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Bessa

Os campos estão todos preenchidos, incluindo a ListBox, no entanto, quando fiz um BreakPoint, nos códigos das ListBox, como Por exemplo,  "Ferramentas_posic_selecListBox.Items(i).ToString()", aparece "System.Windows.Forms.ListBox.ObjectCollection". :)

Mas estar Preenchidos, estão.

Não estou a ver é qual parte do código está a provocar isto. :dontgetit:

Share this post


Link to post
Share on other sites
bioshock

Não são precisos breakpoints, tens é de nos dizer qual é o erro que dá.

Mostra o teu código actual.

Edit: E o que disseste no último post não é um erro, está correcta a informação.

Share this post


Link to post
Share on other sites
Bessa

É praticamente igual ao que está no Main Post. Aqui fica:  :)

Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb")

        connection.Open()

Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo.Text"

        For i As Integer = 0 To Ferramentas_corte_selecListBox.Items.Count - 1

            Dim command As New OleDbCommand(sql, connection)

            If i <= Ferramentas_posic_selecListBox.Items.Count - 1 Then

                command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text
                command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text
                command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text
                command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text
                command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text

                command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString()
                command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = Ferramentas_posic_selecListBox.Items(i).ToString()
                command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString()
                command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString()
                command.Parameters.Add("@x_ferr_pos", OleDbType.Integer).Value = X_ferr_posListBox.Items(i).ToString()
                command.Parameters.Add("@y_ferr_pos", OleDbType.Integer).Value = Y_ferr_posListBox.Items(i).ToString()
                command.Parameters.Add("@z_ferr_pos", OleDbType.Integer).Value = Z_ferr_posListBox.Items(i).ToString()

            Else

                command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text
                command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text
                command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text
                command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text
                command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text

                command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString()
                command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString()
                command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString()
                command.Parameters.Add("@x_ferr_pos", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@y_ferr_pos", OleDbType.VarChar).Value = "-"
                command.Parameters.Add("@z_ferr_pos", OleDbType.VarChar).Value = "-"

            End If

            Dim x As Integer = command.ExecuteNonQuery()

            If x < 1 Then
                MessageBox.Show("Erro ao actualizar", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
            Else
                MessageBox.Show("Actualizado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

        Next
        connection.Close()

Share this post


Link to post
Share on other sites
Bessa

Sim, foi o que já tinha falado acima. Fico agora sem saber qual o correto.  :confused:

Tinha assim:

Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] = @artigo_escolhido LIKE '" & Artigo_escolhidoComboBox.Text & "' AND fase_artigo LIKE '" & fase_artigo.Text & "'"

Depois coloquei assim a sugestão do Caça (apesar de ainda não saber se o AND está correto):

Dim sql As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo.Text"

Deixa-me adivinhar, errei nos dois?  B)

É que eu realmente necessito de filtrar através daqueles dois dados, para que ele edite de acordo com a respetiva Fase do Artigo e Operação do artigo escolhido. :)

Share this post


Link to post
Share on other sites
Caça

Não reparaste? Estás a misturar as coisas

@fase_artigo.Text


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Bessa

My BAD.  😳 Como não vi isso!

Obrgdo!

Mas mesmo mudando e tirando o ".Text", dá o mesmo erro.  :(

Share this post


Link to post
Share on other sites
Bessa

Porque está no 1º Post.  :) Pensava que tinhas visto, sorry.

O erro Dá no Código:

command.ExecuteNonQuery()

Não foi fornecido nenhum valor para um ou mais parâmetros necessários.

Share this post


Link to post
Share on other sites
bioshock

Já agora, vê se começas a sintetizar as tuas queries porque para nós torna-se complicado ler uma query que tem de width 500px..

Em vez de:

Dim query As String = "UPDATE associar_ferramentas SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, [gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, [diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_corte] = @x_ferr_corte, [y_ferr_corte] = @y_ferr_corte, [z_ferr_corte] = @z_ferr_corte WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo.Text"

Podes ter:

Dim query As Sring = "UPDATE associar_ferramentas " & _ 
"SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, " & _
"fase_artigo] = @fase_artigo, [programa] = @programa " & _ 
"WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo"
                                  

Vi agora a tua resposta. Isso é muito simples. Lê o que te é dito! Já falamos disto inúmeras vezes.

O que acabei de escrever de certa forma está relacionado com esse erro.

É de difícil interpretação a tua query com tal tamanho, faz como eu sugeri.

Share this post


Link to post
Share on other sites
Bessa

Já mude. Tks. :)

Só que agora com isto, dá este erro:

Erro de sintaxe na instrução UPDATE.

Experimentei pôr [ e nada.

Mas tenho de criar um DataSet agora? É que o erro que deu agora, foi com isso, mas este não é consulta de dados. 🤔

Share this post


Link to post
Share on other sites
bioshock

Queres um Dataset para quê? Os Datasets são utilizados para ler informações provenientes de algum sistema de armazenamento de dados, não são utilizados para inserir/actualizar/eliminar dados.

Dá esse erro porque a tua query está mal formada.

Dim query As String = "UPDATE Clientes " & _ 
"SET [Nome] = @Nome, [Empresa] = @Empresa " & _ 
"WHERE ID = @IDCliente"

Esse é um exemplo correcto de uma instrução de actualização de dados. Basta te esqueceres de uma virgula e/ou de parêntesis e é-te logo apresentada essa mensagem. Tem também atenção aos espaços em branco a mais que possas colocar sem intenção.

Daí eu te ter dito para colocares a query da forma que exemplifiquei pois fica muito mais perceptível tanto para ti como para nós.

Share this post


Link to post
Share on other sites
Bessa

Já revi a Query:

        Dim sql As String = "UPDATE associar_ferramentas " & _
        "SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo, [fase_artigo] = @fase_artigo, [programa] = @programa, " & _
        "[gfh] = @gfh, [ferramentas_corte_selec] = @ferramentas_corte_selec, [ferramentas_posic_selec] = @ferramentas_posic_selec, [comprimento_ferr_corte] = @comprimento_ferr_corte, " & _
        "[diametro_ferr_corte] = @diametro_ferr_corte, [x_ferr_pos] = @x_ferr_pos, [y_ferr_pos] = @y_ferr_pos, [z_ferr_pos] = @z_ferr_corte " & _
        "WHERE [artigo_escolhido] LIKE @artigo_escolhido AND [fase_artigo] LIKE @fase_artigo "

Mas o Erro Não foi fornecido nenhum valor para um ou mais parâmetros necessários. persiste.

Verifiquei os espaços, as aspas, os campos e os &, acho que não falha nada.

Share this post


Link to post
Share on other sites
bioshock

Feito isso, conta quantas instruções indicaste na tua query (conta as palavras com "@" atrás), de seguida vais contar quantos parâmetros deste nos teus comandos para parametrizar.

Exemplo:

Dim query As String = "(.....) ...SET [artigo_escolhido] = @artigo_escolhido, [operacao_artigo] = @operacao_artigo"

= 2 instruções (@artigo_escolhido e @operacao_artigo)

Agora verificamos os parâmetros dos comandos:

command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text
command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text

= 2 parâmetros (@artigo_escolhido e @operacao_artigo)

Ok, bingo! Os nomes coincidem, está tudo correcto, têm de funcionar!

Posso-te garantir que o problema advém do que acabei de dizer. Ou os nomes estão trocado ou tens nomes a mais/a menos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.