Usuário com melhor resposta
Problemas ao atualizar base de dados access vb.net

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 TryCumprimentos
Respostas
-
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
----------------------------------------------------------
- Editado William John Adam TrindadeModerator sexta-feira, 17 de fevereiro de 2017 09:51
- Marcado como Resposta Robson William SilvaModerator segunda-feira, 20 de fevereiro de 2017 12:56
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
----------------------------------------------------------
-
-
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
----------------------------------------------------------
-
-
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
----------------------------------------------------------
-
-
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
----------------------------------------------------------
-
-
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
----------------------------------------------------------
- Editado William John Adam TrindadeModerator quinta-feira, 16 de fevereiro de 2017 15:41
-
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 SubO erro é este: https://social.msdn.microsoft.com/Forums/getfile/1003389
-
>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
----------------------------------------------------------
-
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
-
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
-
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
----------------------------------------------------------
-
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:
-
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
----------------------------------------------------------
- Editado William John Adam TrindadeModerator sexta-feira, 17 de fevereiro de 2017 09:51
- Marcado como Resposta Robson William SilvaModerator segunda-feira, 20 de fevereiro de 2017 12:56
-
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.