none
Problemas ao atualizar base de dados access vb.net RRS feed

  • Pergunta

  • O objetivo é editar linhas de uma base de dados

    Seleciono a linha que pretendo editar da listview, altero os campos que pretendo editar dessa linha e clico no botão "Atualizar resultado" 

    O que acontece é que o resultado não atualiza e obtenho a seguinte mensagem proveniente da estrutura Try, "Não foi fornecido nenhum valor para um ou mais parâmetros necessários"

    As colunas da Database sao as seguintes, (ID*, Nome, Data da competição, Competição, Prova, Posição, Marca)

    *numeração automática

    O meu codigo é o seguinte:

    'atualizar database
        Private Sub Atualizar(ID As Integer)
            Dim sql As String = "UPDATE resultados SET ID='" & TextBoxID.Text & "',nome='" & TextBoxNome.Text & "',Datadacompetição='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',Competição='" & ComboBoxCompeticao.Text & "',prova='" & ComboBoxProva.Text & "',Posição='" & ComboBoxPosicao.Text & "',marca='" & TextBoxMarca.Text & "' WHERE ID='" & ID & "'"
            cmd = New OleDbCommand(sql, con)
            'Abre, atualiza, e encerra a conexão 
            Try
                con.Open()
                adapter = New OleDbDataAdapter(cmd)
                adapter.UpdateCommand = con.CreateCommand()
                adapter.UpdateCommand.CommandText = sql
                If (adapter.UpdateCommand.ExecuteNonQuery() > 0) Then
                    MsgBox("Resultados atualizados")
                    CleartextBoxes()
                End If
                con.Close()
                VerTabela()
            Catch ex As Exception
                MsgBox(ex.Message)
                con.Close()
            End Try

    Cumprimentos

    quinta-feira, 16 de fevereiro de 2017 14:02

Respostas

Todas as Respostas

  • Voce nao pode colocar o ID (que é numeraçao automatica) no SET. Se ele é chave primaria ele nao pode ser modificado.

    O correto seria:

          Dim sql As String = "UPDATE resultados SET nome='" & TextBoxNome.Text & "',Datadacompetição='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',Competição='" & ComboBoxCompeticao.Text & "',prova='" & ComboBoxProva.Text & "',Posição='" & ComboBoxPosicao.Text & "',marca='" & TextBoxMarca.Text & "' WHERE ID='" & ID & "'"

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 14:07
    Moderador
  • Persiste o mesmo erro, "Nao foi fornecido nenhum valor para um ou mais parametros necessários", isto mesmo que eu mude todos os campos
    quinta-feira, 16 de fevereiro de 2017 14:13
  • Adicione um messagebox ao seu codigo, como mostrado abaixo

      Private Sub Atualizar(ID As Integer)
            Dim sql As String = "UPDATE resultados SET nome='" & TextBoxNome.Text & "',Datadacompetição='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',Competição='" & ComboBoxCompeticao.Text & "',prova='" & ComboBoxProva.Text & "',Posição='" & ComboBoxPosicao.Text & "',marca='" & TextBoxMarca.Text & "' WHERE ID='" & ID & "'"
    
    MessageBox.Show(sql) ' exibir o conteudo do sql
    
            cmd = New OleDbCommand(sql, con)

    poste o resultado (um screenshot) aqui.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 14:37
    Moderador
  • https://social.msdn.microsoft.com/Forums/getfile/1003271

    Aqui está

    quinta-feira, 16 de fevereiro de 2017 14:51
  • Seu codigo esta confuso. Voce cria um OdbcComand e nao o usa.

    Tente deste jeito:

       Private Sub Atualizar(ID As Integer)
            Dim sql As String = "UPDATE resultados SET nome='" & TextBoxNome.Text & "',Datadacompetição='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',Competição='" & ComboBoxCompeticao.Text & "',prova='" & ComboBoxProva.Text & "',Posição='" & ComboBoxPosicao.Text & "',marca='" & TextBoxMarca.Text & "' WHERE ID='" & ID & "'"
    
            'Abre, atualiza, e encerra a conexão 
            Try
                con.Open()
                cmd = New OleDbCommand(sql, con)
                If (cmd.ExecuteNonQuery() > 0) Then
                    MsgBox("Resultados atualizados")
                    CleartextBoxes()
                End If
                con.Close()
                VerTabela()
            Catch ex As Exception
                MsgBox(ex.Message)
                con.Close()
            End Try
    
    

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 14:56
    Moderador
  • Eu ainda sou iniciante neste mundo da programação, é por isso que está tudo meio confuso

    Entretanto, o erro persiste, diz me a mesma coisa, mesmo que eu so mude por exemplo o nome, ou mude todos os campos

    quinta-feira, 16 de fevereiro de 2017 15:10
  • o erro nao esta no SQL. O erro esta mais abaixo. Sugiro remover o try

    Private Sub Atualizar(ID As Integer)
            Dim sql As String = "UPDATE resultados SET nome='" & TextBoxNome.Text & "',Datadacompetição='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',Competição='" & ComboBoxCompeticao.Text & "',prova='" & ComboBoxProva.Text & "',Posição='" & ComboBoxPosicao.Text & "',marca='" & TextBoxMarca.Text & "' WHERE ID='" & ID & "'"
    
            'Abre, atualiza, e encerra a conexão 
                con.Open()
                cmd = New OleDbCommand(sql, con)
                If (cmd.ExecuteNonQuery() > 0) Then
                    MsgBox("Resultados atualizados")
                    CleartextBoxes()
                End If
                con.Close()
                VerTabela()
    

    desta forma voce vai saber onde exatamente esta o erro.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 15:19
    Moderador
  • O programa diz que o erro está em *

    *If (cmd.ExecuteNonQuery() > 0) Then
                MsgBox("Resultados atualizados")
                CleartextBoxes()
            End If

    e como é de esperar, o erro é o mesmo que o anterior

    quinta-feira, 16 de fevereiro de 2017 15:30
  • poste a mensagem completa aqui e tambem a definiçao da tabela "resultados" (preciso ver como estao definidos os campos)


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quinta-feira, 16 de fevereiro de 2017 15:39
    Moderador
  • Suponho que a defeniçao da tabela "resultados" seja o seguinte codigo:

    Private Sub Os_meus_resultados_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'Configurar a List View
            ListView1.View = View.Details
            ListView1.FullRowSelect = True
            'Construir colunas
            ListView1.Columns.Add("ID", 75)
            ListView1.Columns.Add("Nome", 100)
            ListView1.Columns.Add("Data da competição", 100)
            ListView1.Columns.Add("Competição", 100)
            ListView1.Columns.Add("Prova", 100)
            ListView1.Columns.Add("Posição", 100)
            ListView1.Columns.Add("Marca", 100)
        End Sub

    O erro é este: https://social.msdn.microsoft.com/Forums/getfile/1003389


    quinta-feira, 16 de fevereiro de 2017 19:45
  • >Suponho que a defeniçao da tabela "resultados" seja o seguinte codigo:

    Nao.. eu preciso ver a definiçao no banco de dados (Voce esta usando Access certo?)

    Quanto a imagem eu preciso ver os detalhes, conforme mostrado na imagem abaixo:

    Voce tambem pode clicar no "Copy exception detail to the clipboard" e depois colar aqui.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 19:53
    Moderador
  • Sim, estou a trabalhar com o Access

    Aqui vai as fotos dos detalhes da base de dados e os detalhes do erro

    https://social.msdn.microsoft.com/Forums/getfile/1003394

    https://social.msdn.microsoft.com/Forums/getfile/1003395

    https://social.msdn.microsoft.com/Forums/getfile/1003396

    quinta-feira, 16 de fevereiro de 2017 20:04
  • Sim, estou a trabalhar com o Access

    Aqui vai as fotos dos detalhes da base de dados e os detalhes do erro

    https://social.msdn.microsoft.com/Forums/getfile/1003394

    https://social.msdn.microsoft.com/Forums/getfile/1003395

    https://social.msdn.microsoft.com/Forums/getfile/1003396

    https://social.msdn.microsoft.com/Forums/getfile/1003398
    quinta-feira, 16 de fevereiro de 2017 20:05
  • O problema é que voce definiu um campo com espaços: "Data da competição"

    Voc enao pode simplesmente remover os espaços e escrever: Datadacompetição

    Nao é o mesmo campo e por isso voce esta recebendo erro.

    O ideal é nao usar nem espaços e nem acentos nos nomes dos campos. Isso evita dor de cabeça.

    Caso queria a continuar a usar espaços , entao modifique  linha do sql colocando os campos entre [].

      Dim sql As String = "UPDATE resultados SET [nome]='" & TextBoxNome.Text & "',[Data da competição]='" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "',[Competição]='" & ComboBoxCompeticao.Text & "',[prova]='" & ComboBoxProva.Text & "',[Posição]='" & ComboBoxPosicao.Text & "',[marca]='" & TextBoxMarca.Text & "' WHERE [ID]='" & ID & "'"

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 16 de fevereiro de 2017 20:14
    Moderador
  • Antes de mais muito obrigado pela sua atenção e por me ter solucionado essa parte! De facto resultou e agr ja sei para a proxima

    Depois, novo erro, na estrutura IF do codigo:  

    System.Data.OleDb.OleDbException was unhandled
      ErrorCode=-2147217913
      HResult=-2147217913
      Message=Data type mismatch in criteria expression.
      Source=Microsoft Access Database Engine
      StackTrace:
           em System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
           em System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
           em System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
           em System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
           em System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
           em System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
           em Atletismo_design_.Os_meus_resultados.Atualizar(Int32 ID) em C:\Users\lenovo\Desktop\Projeto\Atletismo(design)\Atletismo(design)\Os meus resultados.vb:line 103
           em Atletismo_design_.Os_meus_resultados.ButtonAtualizar_Click(Object sender, EventArgs e) em C:\Users\lenovo\Desktop\Projeto\Atletismo(design)\Atletismo(design)\Os meus resultados.vb:line 112
           em System.Windows.Forms.Control.OnClick(EventArgs e)
           em System.Windows.Forms.Button.OnClick(EventArgs e)
           em System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           em System.Windows.Forms.Control.WndProc(Message& m)
           em System.Windows.Forms.ButtonBase.WndProc(Message& m)
           em System.Windows.Forms.Button.WndProc(Message& m)
           em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           em Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           em Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           em Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           em Atletismo_design_.My.MyApplication.Main(String[] Args) em :line 81
           em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           em System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           em System.Threading.ThreadHelper.ThreadStart()
      InnerException: 

    quinta-feira, 16 de fevereiro de 2017 20:24
  • Agora é o formato da data.

    No access datas tem que ser passadas entre #, deste jeito:

    ,[Data da competição]=#" & FormatDateTime(Datedacompetiçao.Value, DateFormat.ShortDate) & "#

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    quinta-feira, 16 de fevereiro de 2017 20:49
    Moderador
  • Bom dia,

    Devido a falta de interação do autor dessa pergunta,

    essa thread está sendo fechada. Caso o problema ainda

    esteja ocorrendo, favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 20 de fevereiro de 2017 12:56
    Moderador