2016-01-07 2 views
0

Что я хочу сделать, сначала проверьте, существует ли идентификационный номер, а затем, если он существует, выполните процесс обновления, но проблема в том, что он не обновляется. В чем проблема ?Не удается обновить данные в базе данных mySQL

sqlconn = New MySqlConnection 
sqlconn.ConnectionString = "server=localhost;userid=root;password='';database=innovative" 
Try 
    sqlconn.Open() 
    query = "SELECT Full_Name FROM employee WHERE ID='" & txt_id_number.Text & "'" 
    cmd = New MySqlCommand(query, sqlconn) 
    reader = cmd.ExecuteReader 
    If reader.HasRows = False Then 
     MsgBox("Invalid ID number please secure that the ID number is already Exist" & vbNewLine & "TAKE NOTE:" & vbNewLine & "You cannot update or change the existing ID number for it is the primary Key for the Employee, If you want to Change it, its better to delete the Employee then add it again." & vbNewLine & "Other than that you can change the Full name, age, contact and etc.", vbCritical) 

    Else 
     reader.Close() 
     sqlconn.Open() 
     query1 = "UPDATE employee SET Full_Name ='" & txt_fullname.Text & "', Employee_Type='" & txt_employee_type.Text & "', Age='" & txt_age.Text & "',Sex='" & cb_sex.Text & "', Status='" & txt_status.Text & "', Contact ='" & txt_contact.Text & "',E_mail='" & txt_email.Text & "' WHERE ID = '" & txt_id_number.Text & "'" 
     cmd = New MySqlCommand(query1, sqlconn) 
     reader1 = cmd.ExecuteReader 
     MsgBox(txt_fullname.Text & " was successfully updated", vbInformation) 
     txt_age.Text = "" 
     txt_contact.Text = "" 
     txt_email.Text = "" 
     txt_employee_type.Text = "" 
     txt_fullname.Text = "" 
     txt_id_number.Text = "" 
     txt_status.Text = "" 
     cb_sex.Text = "" 
     add_employee() 
    End If 
    sqlconn.Close() 
Catch ex As Exception 
Finally 
    sqlconn.Dispose() 
End Try 
+0

Объект считывателя используется для запроса базы данных для операторов Update, Insert & Delete, которые вы хотите выполнитьNonQuery. –

+1

Вы также можете избавиться от запроса, ища действительный идентификатор и вернуть количество строк, обновленных при выполнении инструкции обновления. Если возвращается 0, то условие WHERE не обнаружило строк для обновления. Все, что больше 0, означает, что условие WHERE было выполнено. Кроме того, вы должны прекратить соединять значения в ваши инструкции и использовать параметры как для защиты ваших SQL-операторов, так и для облегчения вашей жизни, когда дело доходит до того, как можно обернуть поля на основе их типа. –

+0

Этот код является безумным, уязвимым для SQL-инъекций. –

ответ

0
Imports MySql.Data.MySqlClient 

Public Class Form1 
    Private sqlconn As MySqlConnection 
    Private query, query1 As String 
    Private cmd As MySqlCommand 
    Private reader As MySqlDataReader 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     sqlconn = New MySqlConnection 
     sqlconn.ConnectionString = "server=localhost;userid=root;password='';database=innovative" 
     Try 
      sqlconn.Open() 
      query = "SELECT Full_Name FROM employee WHERE ID='" & txt_id_number.Text & "'" 
      cmd = New MySqlCommand(query, sqlconn) 
      reader = cmd.ExecuteReader 
      If reader.HasRows = False Then 
       MsgBox("Invalid ID number please secure that the ID number is already Exist" & vbNewLine & "TAKE NOTE:" & vbNewLine & "You cannot update or change the existing ID number for it is the primary Key for the Employee, If you want to Change it, its better to delete the Employee then add it again." & vbNewLine & "Other than that you can change the Full name, age, contact and etc.", vbCritical) 
      Else 
       query1 = "UPDATE employee SET Full_Name = @txt_fullname, Employee_Type=txt_employee_type, [email protected]_age'" 
     cmd = New MySqlCommand(query1, sqlconn) 
     cmd.CommandType = CommandType.Text 
     cmd.Parameters.Add("@txt_fullname", SqlDbType.VarChar, 255).Value = txt_fullname.Text 
     cmd.Parameters.Add("@txt_employee_type", SqlDbType.VarChar, 255).Value = txt_employee_type.Text 
     cmd.Parameters.Add("@txt_age", SqlDbType.VarChar, 255).Value = txt_age.Text 
     cmd.Parameters.Add("") 
     cmd.ExecuteNonQuery() 
       MsgBox(txt_fullname.Text & " was successfully updated", vbInformation) 
       txt_age.Text = "" 
       txt_contact.Text = "" 
       txt_email.Text = "" 
       txt_employee_type.Text = "" 
       txt_fullname.Text = "" 
       txt_id_number.Text = "" 
       txt_status.Text = "" 
       cb_sex.Text = "" 
       add_employee() 
      End If 
      sqlconn.Close() 
      reader.Close() 
     Catch ex As Exception 
     Finally 
      sqlconn.Dispose() 
     End Try 
    End Sub 
End Class 
+0

правильный ... вы не можете используйте cmd.ExecuteReader для выполнения транзакции без запроса. Вы используете Reader только когда вы извлекаете данные, а не когда вы вставляете, обновляете или удаляете. – DiscipleMichael

+0

Да, этот код небезопасен, этот сейф. – Mysta

+0

Пожалуйста, объясните, почему ** ваш ответ работает. – cybermonkey

0

Три вещи, чтобы изменить.

  1. Использование cmd. ExecuteNonQuery для вставки или обновления запросов.
  2. Не использовать соединительные провода. Open снова, когда он не закрыт; Он возвращает сообщение «Соединение уже открыто», и выполнение завершится, чтобы заблокировать блок. Именно поэтому ваш код не работал.
  3. Parameterize Запросы на безопасность и литье под давлением.

Счастливое кодирование!

+0

Чтобы добавить к пункту 2): Если в любой момент вашего кода вы не можете быть уверены в статусе соединения (открыть/закрыть), вы можете проверить 'if sqlconn.State = ConnectionState.Open' перед попыткой открыть снова. – DiscipleMichael

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