2015-05-30 3 views
1

я отслеживаю все инструкции, которые я могу видеть в Интернете, в том числе MSDN: https://msdn.microsoft.com/en-us/library/ms233819.aspxOleDbException при попытке обновить базу данных доступа

Unfortunatelly, никаких вопросов, сколько я изменить код, он всегда возвращают мне ошибка: «В System.Data.dll произошла первая случайная ошибка типа« System.Data.OleDb.OleDbException », и обновление не выполняется. Это мой код:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Dim connect3 As New OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;" & "Data Source =C:\Users\Fernando\Documents\Visual Studio 2012\Projects\Agenda_DP\Agenda_DP\AgendaDP.accdb") 
    connect3.Open() 
    Dim cmd3 As OleDbCommand = connect3.CreateCommand() 
    cmd3.CommandText = "UPDATE Temas SET [Numero] = @p1, [Tema] = @p2, [Observacoes] = @p3 WHERE [Numero] = @1" 
    cmd3.Parameters.AddWithValue("@p1", Me.ComboBox1.Text) 
    cmd3.Parameters.AddWithValue("@p2", Me.ComboBox2.Text) 
    cmd3.Parameters.AddWithValue("@p3", Me.TextBox3.Text) 
    cmd3.ExecuteNonQuery() 
    connect3.Close() 
End Sub 

Я не понимаю, почему это происходит.

Это когда-либо случалось с кем-либо? Как вы это решили? Может ли кто-нибудь помочь мне с этой проблемой?

+0

' "UPDATE Temas SET [Numero] = @ p1 [Tema] = @ p2, [Observacoes] = @ p3 WHERE [Numero] = @ 1"' - что @ 1? –

ответ

1

При использовании System.Data.OleDb параметры являются чисто позиционными и их имена не имеют значения. Таким образом, вы не можете использовать одно и то же имя параметра дважды и .Add его только один раз; вам придется .Add его дважды.

Однако в вашем случае у вас [Numero] в вашем предложении WHERE, поэтому нет необходимости устанавливать его значение. Вы можете просто сделать

cmd3.CommandText = "UPDATE Temas SET [Tema] = ?, [Observacoes] = ? WHERE [Numero] = ?" 
cmd3.Parameters.AddWithValue("?", Me.ComboBox2.Text) ' Tema 
cmd3.Parameters.AddWithValue("?", Me.TextBox3.Text) ' Observacoes 
cmd3.Parameters.AddWithValue("?", Me.ComboBox1.Text) ' Numero 
cmd3.ExecuteNonQuery() 
+1

Мне все еще нравится использовать имена, хотя они работают только как напоминание для меня. :) – Fionnuala

+1

@Fionnuala Честно говоря, я тоже. Однако в подобных случаях использование '?' Является хорошим визуальным напоминанием о том, что «имена» параметров ничего не означают для OleDb. –

Смежные вопросы