-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
4

2 に答える 2

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

これにより、更新されたと思われる行数がわかります。

于 2012-10-17T02:49:43.660 に答える
0

おはようございます、

数時間のデバッグと www.bpforums.com の Brandon からの支援の後、次の解決策が見つかりました。クエリが正しく実行されるようになり、それに応じて DB が影響を受けます。

ソリューション:

Bradon @ bpforums.com は、ccID の DB の DataType が INT であることを指摘してくれました。そのため、listview selecteditem の値を整数に変換する必要がありました。次に、整数に変換する前に、 .ToStringの代わりに.textを呼び出して、インデックスの実際のテキスト値を取得する必要があることに気付きました。

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

@habibillah、@Laurence、@Adrian Cornish に感謝します。あなたは私を正しい方向に向けました。

于 2012-10-18T07:31:26.480 に答える