3

こんばんは、

MySQLデータベースのレコードを更新する試みとして以下を使用していますが、レコードが更新されておらず、例外もキャッチされていません。あなたの助けをいただければ幸いです:

dbConn = New MySqlConnection("Server=" & FormLogin.ComboBoxServerIP.SelectedItem & ";Port=3306;Uid=trojan;Password=horse;Database=accounting")
    Try
        If dbConn.State = ConnectionState.Open Then
            dbConn.Close()
        Else
            Try
                dbConn.Open()
                Dim dbAdapter As New MySqlDataAdapter("UPDATE customer " & _
                                                      "SET accountNumber= '" & TextBoxAccount.Text & "', nameLAST='" & TextBoxLastName.Text & "', nameFIRST='" & TextBoxFirstName.Text & "'" & _
                                                      "nameSALUTATION='" & ComboBoxSalutation.SelectedItem & "', nameCOMPANY='" & TextBoxCompanyName.Text & "', addressSTREET='" & TextBoxAddress1.Text & "'" & _
                                                      "addressSTREET1='" & TextBoxAddress2.Text & "', addressCITY='" & TextBoxCity.Text & "', addressSTATE='" & ComboBoxState.SelectedItem & "'" & _
                                                      "addressZIPCODE='" & MaskedTextBoxZip.Text & "', phone='" & MaskedTextBoxPhone.Text & "', fax='" & MaskedTextBoxFax.Text & "', email='" & TextBoxEmail.Text & "'" & _
                                                      "WHERE accountNumber='" & TextBoxAccount.Text & "';", dbConn)
            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
            MessageBox.Show("Customer account SUCCESSFULLY updated!")
            Call lockForm()
        End If
    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
    Call lockForm()
    dbConn.Close()
4

2 に答える 2

3

MySQLCommandの代わりに使用してくださいMySQLDataAdapter。それでもコードはSQLインジェクションに対して脆弱であるため、ADONetを使用する目的を無効にしています。パラメータ化してください。以下は、コードから変更されたコードです。Using-End Usingオブジェクトの廃棄を適切に処理するために使用します。

Dim ConnectionString As String ="Server=" & FormLogin.ComboBoxServerIP.SelectedItem & ";Port=3306;Uid=trojan;Password=horse;Database=accounting"
Dim iQuery As String = "UPDATE customer " & _
                       "SET accountNumber = @accountNumber, nameLAST = @nameLAST, nameFIRST = @nameFIRST, " & _
                       "    nameSALUTATION = @nameSALUTATION, nameCOMPANY = @nameCOMPANY, addressSTREET = @addressSTREET, " & _
                       "    addressSTREET1 = @addressSTREET1, addressCITY = @addressCITY, addressSTATE =  @addressSTATE, " & _
                       "    addressZIPCODE = @addressZIPCODE, phone = @phone, fax = @fax, email = @email               " & _
                       "WHERE accountNumber = @accountNumber"

Using dbConn As New MySqlConnection(ConnectionString)
    Using dbComm As New MySQLCommand()
        With dbComm
            .Connection = dbConn
            .CommandType = CommandType.Text
            .CommandText = iQuery
            .Parameters.AddWithValue("@accountNumber", TextBoxAccount.Text )
            .Parameters.AddWithValue("@nameLAST", TextBoxLastName.Text)
            .Parameters.AddWithValue("@nameFIRST", TextBoxFirstName.Text)
            .Parameters.AddWithValue("@nameSALUTATION", ComboBoxSalutation.SelectedItem)
            .Parameters.AddWithValue("@nameCOMPANY", TextBoxCompanyName.Text)
            .Parameters.AddWithValue("@addressSTREET", TextBoxAddress1.Text)
            .Parameters.AddWithValue("@addressSTREET1", TextBoxAddress2.Text)
            .Parameters.AddWithValue("@addressCITY", TextBoxCity.Text)
            .Parameters.AddWithValue("@addressSTATE", ComboBoxState.SelectedItem)
            .Parameters.AddWithValue("@addressZIPCODE", MaskedTextBoxZip.Text)
            .Parameters.AddWithValue("@phone", MaskedTextBoxPhone.Text)
            .Parameters.AddWithValue("@fax", MaskedTextBoxFax.Text)
            .Parameters.AddWithValue("@email", TextBoxEmail.Text)
        End With
        Try
            dbConn.Open
            dbComm.ExecuteNonQuery()

            MessageBox.Show("Customer account SUCCESSFULLY updated!")
            Call lockForm()
        Catch( ex as MySQLException)
            MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _
                                vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.")
        Finally
            dbConn.Close()
        End Try
    End Using
End Using
于 2012-09-14T00:41:06.603 に答える
1

この場合、MySQLDataAdapterを使用しようとしている方法で使用できないため、ExecuteNonQueryを使用します。また、SQLインジェクション攻撃にさらされる可能性があるため、パラメータを使用してください。そして最後に、更新したい行を見つけるためにそれを使用しているので、accountNumberを更新する必要はありません!

于 2012-09-13T22:36:32.850 に答える