1

我正在使用以下代码尝试从两个表中检索数据并使用该信息填充 ComboBox。然后,当用户从 ComboBox 中选择一个值时,我想使用从 DB 中检索到的与 ComboBox 的值匹配的数据填充表单上的所有控件(仍然没有弄清楚如何做到这一点)。

注意: 错误中显示的 1090 是我从 InputBox 控件接收的帐号,然后将 TextboxAccount.Text 值设置为它。所以我不确定这是否是我的问题所在。

这是抛出的VB异常:

“您的 SQL 语法有错误;请查看与您的 MySQL 版本相对应的手册,以在第 1 行的 'customer.accountNumber = '1090” 附近使用正确的语法”

这是我的代码:

    Private Sub RetrieveMySQLdata()

    Try
        'FOR MySQL DATABASE USE
        Dim dbConn As New MySqlConnection
        Dim dbQuery As String = ""
        Dim dbCmd As New MySqlCommand
        'Dim dbData As MySqlDataReader
        Dim dbAdapter As New MySqlDataAdapter
        Dim dbTable As New DataTable
        If dbConn.State = ConnectionState.Closed Then
            'dbConn = New MySqlConnection
            dbConn.ConnectionString = 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)
            dbConn.Open()
        End If

        dbQuery = "SELECT *" & _
                   "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
                   "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"
        With dbCmd
            .CommandText = dbQuery
            .Connection = dbConn
        End With
        With dbAdapter
            .SelectCommand = dbCmd
            .Fill(dbtable)
        End With
        Dim i As Integer
        For i = 0 To dbTable.Rows.Count - 1
            ComboBoxCard.ValueMember = "cc_Number"

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

1 回答 1

1

在本声明中:

dbQuery = "SELECT *" & _
          "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
          "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"

某些子句之间没有空格,例如cc_master.customer_accountNumberand WHERE。结果字符串将如下所示:

SELECT *FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumberWHERE customer.accountNumber = 'SOME SQL INJECTABLE STRING'

作为 MySQL 语法错误消息的一般提示,当您看到如下消息时:

“您的 SQL 语法有错误;请查看与您的 MySQL 版本相对应的手册,以在第 1 行的 'customer.accountNumber = '1090” 附近使用正确的语法”

您应该在“接近”的部分之前查找语法错误查询解析器从头到尾读取,并在发现无法解释的内容时抛出错误。通常它无法解释的第一件事是它在错字/错误之后看到的第一件事。

另请注意,使用字符串连接对于构建 SQL 查询是一个非常糟糕的主意。它让您对SQL 注入攻击敞开大门。 如果您使用的是普通的旧 ADO.NET,那么至少您应该使用参数化查询。作为更进一步的步骤,您可能想要研究 LINQ to SQL 或实体框架之类的东西,它们在自动生成的代码背后抽象了数据库访问,这些代码在幕后为您进行了参数化。

于 2012-09-30T11:53:28.220 回答