如何在VB.net中解决此MySQL Select语句错误?

时间:2012-09-30 11:44:24

标签: mysql vb.net

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

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

这是抛出的VB异常:

  

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

这是我的代码:

    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

1 个答案:

答案 0 :(得分:1)

在此声明中:

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

某些条款之间没有空格,例如cc_master.customer_accountNumberWHERE。结果字符串将如下所示:

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 injection attacks.如果你使用普通的旧ADO.NET,至少你应该使用parameterized queries。更进一步,您可能希望查看LINQ to SQL或Entity Framework之类的内容,它抽象出自动生成的代码背后的数据库访问,该代码在幕后为您进行参数化。