如何在VB.net中解决此MySQL Select语句错误?
我使用下面的代码试图从两个表中检索数据,并用这些信息填充一个组合框。然后,当用户从ComboBox中选择一个值时,我想用从DB中检索到的与ComboBox值匹配的数据填充表单上的所有控件(目前还不知道如何执行此操作) 注意:错误中显示的1090是我从InputBox控件收到的帐号,然后将TextboxAccount.Text值设置为该帐号。所以我不确定这是否是我的问题所在 下面是抛出的VB异常:如何在VB.net中解决此MySQL Select语句错误?,mysql,vb.net,Mysql,Vb.net,我使用下面的代码试图从两个表中检索数据,并用这些信息填充一个组合框。然后,当用户从ComboBox中选择一个值时,我想用从DB中检索到的与ComboBox值匹配的数据填充表单上的所有控件(目前还不知道如何执行此操作) 注意:错误中显示的1090是我从InputBox控件收到的帐号,然后将TextboxAccount.Text值设置为该帐号。所以我不确定这是否是我的问题所在 下面是抛出的VB异常: Private Sub RetrieveMySQLdata() Try
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,你的回答帮助了我。我添加了一个空格,例外情况消失了。但是组合框中没有填充我想要的信息。也许我应该为此打开另一个问题,嗯@