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

如何在VB.net中解决此MySQL Select语句错误?,mysql,vb.net,Mysql,Vb.net,我使用下面的代码试图从两个表中检索数据,并用这些信息填充一个组合框。然后,当用户从ComboBox中选择一个值时,我想用从DB中检索到的与ComboBox值匹配的数据填充表单上的所有控件(目前还不知道如何执行此操作) 注意:错误中显示的1090是我从InputBox控件收到的帐号,然后将TextboxAccount.Text值设置为该帐号。所以我不确定这是否是我的问题所在 下面是抛出的VB异常: Private Sub RetrieveMySQLdata() Try

我使用下面的代码试图从两个表中检索数据,并用这些信息填充一个组合框。然后,当用户从ComboBox中选择一个值时,我想用从DB中检索到的与ComboBox值匹配的数据填充表单上的所有控件(目前还不知道如何执行此操作)

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

下面是抛出的VB异常:

    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
“您的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
在本声明中:

dbQuery = "SELECT *" & _
          "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
          "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"
某些子句之间没有空格,例如
cc\u master.customer\u accountNumber
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查询是一个非常糟糕的主意。如果您使用的是普通的旧ADO.NET,那么至少您应该使用它。作为进一步的研究,您可能希望了解像LINQ to SQL或实体框架这样的东西,它在自动生成的代码后面抽象数据库访问,这些代码在幕后为您参数化。

在这句话中:

dbQuery = "SELECT *" & _
          "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber" & _
          "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'"
某些子句之间没有空格,例如
cc\u master.customer\u accountNumber
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查询是一个非常糟糕的主意。如果您使用的是普通的旧ADO.NET,至少您应该使用它。作为进一步的研究,您可能需要研究类似LINQ to SQL或实体框架的东西,它抽象数据库访问ss隐藏自动生成的代码,可在后台为您参数化。

打印(或以某种方式显示)在执行语句之前,应该很清楚问题出在哪里,谢谢你的帮助。根据下面David的回答,我发现我在WHERE语句之前缺少了一个空格。所以我修复了它。但是现在组合框不会显示查询结果,我对此非常恼火……哈哈。打印(或以某种方式显示)在执行语句之前,应该很清楚问题出在哪里,谢谢你的帮助。根据下面David的回答,我发现我在WHERE语句之前缺少了一个空格。所以我修复了它。但是现在组合框不会显示查询结果,我对此非常恼火……哈哈。谢谢大卫,你的回答帮了我的忙。我添加了一个空格,例外情况消失了。但是组合框中没有填充我想要的信息。也许我应该为此打开另一个问题,嗯?@KismetAgbasi:作为另一个问题确实会更好,因为以这种方式更改当前问题会使现有的re无效赞助商。很抱歉,我想补充一点——同时——我知道SQL注入攻击的可能性。不幸的是,我还不太了解如何很好地使用LINQ或实体框架。我也只是在学习如何使用参数,我在实现上很挣扎。所以现在,因为应用程序只在内部使用,而不是c连接到互联网,我感到有点安全。此外,我的用户不太懂电脑(他们知道完成工作的最低限度——因此我确信他们不会很快注入我的服务器)@KismetAgbasi:无论是恶意还是意外,漏洞仍然是一个漏洞。我强烈建议学习SQL注入的基础知识,并将其作为一种习惯来防止它。即使你在统计上是安全的,最好是明确安全的。学习和采用更好的编码习惯总是一件好事,如果不是为了提高自己的技能和职业发展。你说得对,大卫-我实际上正在学习。我在应用程序的其他地方使用了参数化查询,但这是在本网站上其他人的帮助下完成的,我无法通读以真正理解他们是如何做到的。但我正在积极学习,希望不会o很快完全了解如何使用这些技术,那么我就会像你指出的那样明显安全。谢谢David,你的回答帮助了我。我添加了一个空格,例外情况消失了。但是组合框中没有填充我想要的信息。也许我应该为此打开另一个问题,嗯@