2012-10-17 81 views
-1

晚上好,我的數據庫沒有被更新,我的代碼有什麼問題?

我正在使用下面的代碼來更新我的MySQL數據庫中的值。在運行時,代碼無錯地執行,但是,當我查看數據庫時記錄沒有受到影響。有人能告訴我我做錯了什麼嗎?謝謝。

我最近教了自己如何使用參數,所以也許我可能會做錯了 - 不知道。

這裏是我的代碼:

Private Sub updateCard() 
    Call encryptCard() 
    Dim ConnectionString As String = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password) 
    Dim myQuery As String = "UPDATE cc_master " & _ 
          "SET ccType = @ccType, ccNumber = @ccNumber, ccExpireMonth = @ccExpireMonth, " & _ 
          "ccExpireYear = @ccExpireYear, ccCode = @ccCode, ccAuthorizedUseStart = @ccAuthorizedUseStart, " & _ 
          "ccAuthorizedUseEnd = @ccAuthorizedUseEnd, ccZipcode = @ccZipcode, dateModified = @dateModified, modifiedBy = @modifiedBy " & _ 
          "WHERE ccID = @ccID" 

    Using dbConn As New MySqlConnection(ConnectionString) 
     Using dbComm As New MySqlCommand() 
      With dbComm 
       .Connection = dbConn 
       .CommandType = CommandType.Text 
       .CommandText = myQuery 
       .Parameters.AddWithValue("@ccID", ListViewCard.SelectedItems(0).ToString) 
       .Parameters.AddWithValue("@ccType", ComboBoxCardType.Text) 
       .Parameters.AddWithValue("@ccNumber", encryptedCard) 
       .Parameters.AddWithValue("@ccExpireMonth", TextBoxExpireMonth.Text) 
       .Parameters.AddWithValue("@ccExpireYear", TextBoxExpireYear.Text) 
       .Parameters.AddWithValue("@ccCode", TextBoxCVV2.Text) 
       .Parameters.AddWithValue("@ccAuthorizedUseStart", Format(DateTimePickerStartDate.Value, "yyyy-MM-dd HH:MM:ss")) 
       .Parameters.AddWithValue("@ccAuthorizedUseEnd", Format(DateTimePickerEndDate.Value, "yyyy-MM-dd HH:MM:ss")) 
       .Parameters.AddWithValue("@ccZipcode", TextBoxZipCode.Text) 
       .Parameters.AddWithValue("@dateModified", Format(DateTime.Now, "yyyy-MM-dd HH:MM:ss")) 
       .Parameters.AddWithValue("@modifiedBy", FormLogin.TextBoxUsername.Text) 
      End With 

      Try 
       dbConn.Open() 
       dbComm.ExecuteNonQuery() 
       MessageBox.Show("Card info SUCCESSFULLY updated!") 
      Catch ex As Exception 
       MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _ 
            vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.") 
      End Try 
     End Using 
    End Using 

End Sub 
+0

你可以檢查'ListViewCard.SelectedItems(0).ToString()'產生一個存在於'cc_master'表中的ccID嗎?我也會爲此創建一個參數。 – Laurence

+1

爲什麼您對所有更新值使用查詢參數,而不是where條件? **你也需要參數化!** –

+0

謝謝,但我確實證實了ccID確實存在。實際上,Listview中的數據是從數據庫中提取的。 –

回答

3

嘗試改變dbComm.ExecuteNonQuery()成爲:

Try 
    Dim affectedRow As Integer 
    dbConn.Open() 
    affectedRow = dbComm.ExecuteNonQuery() 
    if affectedRow > 0 then 
     MessageBox.Show("Card info SUCCESSFULLY updated!") 
    else 
     MessageBox.Show("No data to be updated!") 
    End If 
Catch ex As Exception 
    .... 
    .... 
End Try 

,將告訴你多少行理應更新。

+0

謝謝,但我不確定我是否遵循。你想讓我簡單地用你的建議來替換整條線嗎? –

+0

@KismetAgbasi,看看編輯答案 – Habibillah

+0

謝謝,我按照你的建議做了,並且評估了else語句。這意味着我的代碼有問題,所以沒有行受到影響。回到繪圖板....... –

0

早上好,

幾個小時的調試和布蘭登在www.bpforums.com一些援助後,下面的解決方案被發現。該查詢現在可以正確執行,並且DB也會相應地受到影響

解決方案:

Bradon @ bpforums.com向我指出的是,在我的數據庫爲CCID的數據類型爲INT - 正因爲如此,我需要到ListView selectedItem屬性的值轉換爲整數。然後我意識到我需要調用.text而不是.ToString以獲得索引的實際文本值,然後才能將其轉換爲整數。

.Parameters.AddWithValue("@ccID", CInt(ListViewCard.SelectedItems(0).Text)) 

謝謝@habibillah,@勞雷斯和@阿德里安康沃爾。你指出我正確的方向。