2015-01-17 6 views
-1

У меня есть форма, которая имеет несколько полей. И эта форма может добавлять, редактировать, сохранять и обновлять записи. Но кнопка «Обновить» дает мне ошибку «Неустранимая ошибка во время выполнения команды», которая я не знаю, как найти ошибку в моих кодах. Вот мои коды.Неустранимая ошибка при выполнении команды (MySQL, VBNET)

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 
    conn = New MySqlConnection 
    conn.ConnectionString = "server=localhost; userid=root; password=root; database=dbase" 

    Try 

     conn.Open() 
     Sql = "UPDATE dbase.tblfacultyinfo SET firstname = @firstname, " & _ 
             "middlename = @middlename," & _ 
             "lastname = @lastname," & _ 
             "gender = @gender," & _ 
             "birthdate = @birthdate," & _ 
             "age = @age," & _ 
             "emailAdd = @emailAdd," & _ 
             "contact_mobileno = @contact_mobileno," & _ 
             "contact_telno = @contact_telno," & _ 
             "homeadd_houseno = @homeadd_houseno," & _ 
             "homeadd_street = @homeadd_street," & _ 
             "homeadd_brgy = @homeadd_brgy," & _ 
             "homeadd_town = @homeadd_town," & _ 
             "tersiary_schoolname = @tersiary_schoolname," & _ 
             "tersiary_address = @tersiary_address," & _ 
             "tersiary_degree = @tersiary_degree," & _ 
             "tersiary_batch = @tersiary_batch," & _ 
             "secondary_schoolname = @secondary_schoolname," & _ 
             "secondary_address = @secondary_address," & _ 
             "secondary_batch = @secondary_batch" & _ 
             "WHERE facultyNo = @facultyNo" 
     With cmd 
      .Connection = conn 
      .CommandText = Sql 
      .CommandType = CommandType.Text 
      .Parameters.AddWithValue("@facultyNo", txtFacultyNo.Text) 
      .Parameters.AddWithValue("@firstname", txtFirstname.Text) 
      .Parameters.AddWithValue("@middlename", txtMiddlename.Text) 
      .Parameters.AddWithValue("@lastname", txtLastname.Text) 
      .Parameters.AddWithValue("@gender", cbGender.Text) 
      .Parameters.AddWithValue("@birthdate", dtpBirthdate.Value) 
      .Parameters.AddWithValue("@age", txtAge.Text) 
      .Parameters.AddWithValue("@emailAdd", txtEmailAdd.Text) 
      .Parameters.AddWithValue("@contact_mobileno", txtContact_Mobile.Text) 
      .Parameters.AddWithValue("@contact_telno", txtContact_Tel.Text) 
      .Parameters.AddWithValue("@homeadd_houseno", txtHomeAdd_HouseNo.Text) 
      .Parameters.AddWithValue("@homeadd_street", txtHomeAdd_Street.Text) 
      .Parameters.AddWithValue("@homeadd_brgy", txtHomeAdd_Brgy.Text) 
      .Parameters.AddWithValue("@homeadd_town", txtHomeAdd_Town.Text) 
      .Parameters.AddWithValue("@tersiary_schoolname", txtTersiary_Schoolname.Text) 
      .Parameters.AddWithValue("@tersiary_address", txtTersiary_Add.Text) 
      .Parameters.AddWithValue("@tersiary_degree", txtTersiary_Degree.Text) 
      .Parameters.AddWithValue("@tersiary_batch", cbBatchTer.Text) 
      .Parameters.AddWithValue("@secondary_schoolname", txtSecondary_Schoolname.Text) 
      .Parameters.AddWithValue("@secondary_address", txtSecondary_Add.Text) 
      .Parameters.AddWithValue("@secondary_batch", cbBatchSec.Text) 
     End With 
     dr = cmd.ExecuteReader 
     MsgBox("Data Updated", vbInformation, "Successfully Update Record") 
     conn.Close() 


    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
    Finally 
     conn.Dispose() 
     buttons("ResetButtons") 
     DataGridView1.Enabled = True 
    End Try 
End Sub 

любая помощь приветствуется. Thx заранее.

+0

сначала удалите все эти вары и обновите только одно имя. и посмотреть, работает ли он. – Banana

+0

Вы используете AddWithValue. Это означает, что DataType переданного параметра решен, глядя на тип данных переданного значения. Все ваши параметры создаются с помощью Strings. Вы уверены, что все поля базы данных принимают строки? – Steve

+0

также, пожалуйста, напишите объявление своей таблицы – Banana

ответ

2

В вашем синтаксисе есть ошибка. Между последним параметром и предложением WHERE пробел отсутствует.

"secondary_batch = @secondary_batch" & _ 
" WHERE facultyNo = @facultyNo" 
^

Это простая опечатка, но я также предлагаю избегать использования AddWithValue.

AddWithValue определяет тип данных передаваемого параметра, рассматривая тип данных переданного значения. Поскольку все ваши параметры создаются с использованием строк, все поля вашей таблицы должны иметь возможность принимать строки как значения или кого-то между вашим кодом и база данных должна иметь возможность конвертировать из строки в ожидаемый тип данных.

В этой статье 'Can we stop using AddWithValue() already?' объясняется, почему следует избегать AddWithValue (или, по крайней мере, использоваться с особой осторожностью).

Например, ваше поле Age, вероятно, является числовым полем данных. Таким образом, вместо того, чтобы AddWithValue я хотел бы использовать

Dim age as Integer 
if Int32.TryParse(txtAge.Text, age) = False Then 
    // Error message and exit from the save 
.... 

cmd.Parameters.Add(New SqlParameter("@age", SqlDbType.Int)).Value = age 

Таким образом, можно точно указать тип данных параметра, и вы будете передавать правильное значение для вашего DataTable поля

+0

Вау, я никогда не осознавал этого раньше. Так что иногда это имеет какое-то значение. В любом случае, спасибо большое. И используя Addwithvalue? Да, мне так надоело. – Fvcundo

1

Эта ошибка чаще всего вызвана недостающее или неправильно записанные объявления параметров, например. @FirstName ошибочно записано как @FirtName.

Убедитесь, что все параметры, объявленные в запросе SQL, объявлены в объявлении параметра AddwithValue. (Это помогает подсчитать запрос и Addwithvalues).

Лучшее решение для Visual Studio для предоставления информации о недостающем параметре. Используйте блок Try-Catch. В блоке catch используйте Messagebox.show(ex.Innerexception.Message) вместо Messagebox.show(ex.message). Это покажет точный параметр, который отсутствует, например. ниже.

Try 
     conCommand.Parameters.Addwithvalue("@FirstName", txtFirstName.text) 
     conCommand.Parameters.Addwithvalue("@MiddleName", txtMiddleName.text) 
     conCommand.Parameters.Addwithvalue("@LastName", txtLastName.text) 
     conCommand.Parameters.Addwithvalue("@PhoneNo", txtPhoneno.text) 
catch ex as exception   
Messagebox.show(ex.innerexception.Message) 
End Try 
+0

использовать 'conCommand.prepare()' in try block. Исключение просто бросается при вызове функции подготовки или выполнения не в функции addWithValue. – MohaMad