2013-12-20 17 views
1

я получил 2 формы ... Dress_Price для отображения базы данных формы данных (MS Access 2007) другая форма, Edit_Dress является редактирование и обновление базы данных ..Данные не обновляются правильно

код успешно обновил данные на основе изменений от формы Edit_Dress .. но есть 2 проблемы -

  1. dgvCustomerDressPrice не обновляемых после обновления ..

  2. там добавляется к записи после обновленного «пространство».

    до того значения цены обновления

    Dress_Name = "Смокинг" Dress_Price = "150"

    после значения цены обновления

    Dress_Name = "Смокинг" Dress_Price = "250"

«пространство» постоянно добавляется каждый раз, когда я обновляю запись ... поэтому функция поиска не работает должным образом из-за пространства.

код на Dress_Price: -

Private Sub Dress_Price_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
       con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\annonymous\Documents\Visual Studio 2012\Projects\TMS Final\TMS Final\db\db_TMS.accdb" 
       con.Open()   

    dgvCustomerDressPrice()   
End Sub 

Private Sub dgvCustomerDressPrice() 

     Dim ds As New DataSet 
     Dim dt As New DataTable 
     ds.Tables.Add(dt) 
     Dim da As New OleDb.OleDbDataAdapter 

     da = New OleDb.OleDbDataAdapter("SELECT * FROM tbl_dress", con) 

     da.Fill(dt) 

     dgvDressPrice.DataSource = dt.DefaultView 

     dgvDressPrice.SelectionMode = DataGridViewSelectionMode.FullRowSelect 
     con.Close() 
    End Sub 

Private Sub btnEditDress_Click(sender As Object, e As EventArgs) Handles btnEditDress.Click 

     If dgvDressPrice.Rows.Count > 0 Then ' when user click a row, any query for database will based on Order_ID 

      If dgvDressPrice.SelectedRows.Count > 0 Then 

       Dim intDressID As Integer = dgvDressPrice.SelectedRows(0).Cells("Dress_ID").Value 


       Try 
        If Not con.State = ConnectionState.Open Then 
         con.Open() 
        End If 

        Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM tbl_dress WHERE Dress_ID =" & intDressID, con) 
        ' the record that will be edited is based on the Customer_ID of particular row clicked 

        Dim dt As New DataTable 

        da.Fill(dt) 

        Edit_Dress.txtDressID.Text = intDressID 
        Edit_Dress.txtDressName.Text = dt.Rows(0).Item("Dress_Name") 
        Edit_Dress.txtDressPrice.Text = dt.Rows(0).Item("Dress_Price") 
        ' pass the data from tbl_user into each represented field 

       Catch ex As Exception 
        MessageBox.Show("Failed to edit data ! System eror : " & ex.ToString, "Eror !", MessageBoxButtons.OK) 
       End Try 
      End If 
     End If 
     Edit_Dress.Show() 
    End Sub 

Private Sub txtSearch_TextChanged(sender As Object, e As EventArgs) Handles txtSearch.TextChanged 
     If Not con.State = ConnectionState.Open Then 
      con.Open() 
     End If 

     Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM tbl_dress WHERE Dress_Name like '" & txtSearch.Text & "%' ", con) 

     Dim dt As New DataTable 
     da.Fill(dt) 

     dgvCustomerDressPrice().DataSource = dt 

     con.Close() 
    End Sub 

код на Edit_Dress: -

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click 
     con = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\annonymous\Documents\Visual Studio 2012\Projects\TMS Final\TMS Final\db\db_TMS.accdb") 

     Try 
      If con.State = ConnectionState.Closed Then 
       con.Open() 
      End If 

      Dim intDressID As Integer 
      intDressID = Convert.ToInt32(txtDressID.Text) 
      intDressID = Integer.Parse(txtDressID.Text) 

      Dim intDressPrice As Integer 
      intDressPrice = Convert.ToInt32(txtDressPrice.Text) 
      intDressPrice = Integer.Parse(txtDressPrice.Text) 

      Dim query As String = "UPDATE tbl_dress SET Dress_Name = ' " & txtDressName.Text & " ' , Dress_Price = ' " & intDressPrice & " ' WHERE Dress_ID = " & intDressID & " " 

      Dim cmd As New OleDb.OleDbCommand(query, con) 

      cmd.ExecuteNonQuery() 

      MessageBox.Show("Data updated !", "", MessageBoxButtons.OK, MessageBoxIcon.Information) 

      Dress_Price.RefreshPriceList() 

      con.Close() 

      Me.Close() 
     Catch ex As Exception 
      MessageBox.Show("Failed to save into database ! System eror : " & ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End Try 
    End Sub 

ответ

2

Глядя на ваш метод UPDATE ясно, почему у вас есть пространство добавляется каждый раз. Вы помещаете его в строку обновления.

Dim query As String = "UPDATE tbl_dress SET Dress_Name = ' " & _ 
                 ^here 
         txtDressName.Text & " ' , Dress_Price = ' " & _ 
              ^here    ^here 
         intDressPrice & " ' WHERE Dress_ID = " & intDressID & " " 
             ^here 

Часть из простой ошибки, которая может быть исправлена ​​при удалении пространства, это неправильный способ создания команды обновления. Вы должны использовать параметризованный запрос

Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click 
    con = New OleDb.OleDbConnection(.....) 
    Try 
     If con.State = ConnectionState.Closed Then 
     con.Open() 
     End If 

     Dim intDressID As Integer 
     intDressID = Convert.ToInt32(txtDressID.Text) 

     Dim intDressPrice As Integer 
     intDressPrice = Convert.ToInt32(txtDressPrice.Text) 

     Dim query As String = "UPDATE tbl_dress SET Dress_Name = ?, Dress_Price = ? " & _ 
          "WHERE Dress_ID = ?" 
     Dim cmd As New OleDb.OleDbCommand(query, con) 
     cmd.Parameters.AddWithValue("@p1", txtDressName.Text) 
     cmd.Parameters.AddWithValue("@p2", intDressPrice) 
     cmd.Parameters.AddWithValue("@p3", intDressID) 
     cmd.ExecuteNonQuery() 
     ..... 
+0

Всегда используйте параметризованные запросы. Их легче понять, и у вас нет проблем с кавычками и другими обязательными символами для дат или десятичных знаков. Но самое главное - проблема Sql Injection. См. [SqlInjection] (http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work) или здесь для [Параметризированных запросов] (http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html) – Steve

+0

непонятный вопрос .. как я могу получить свой отзыв, кроме вопроса? ?? Мне нужно отправить изображение. Я видел, как много людей получили тонны репутации .. вам платят за это? oO – WaN

+0

:-) Вы должны просто попытаться ответить на вопросы – Steve

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