我正在使用以下代码尝试从两个表中检索数据并使用该信息填充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
答案 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_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查询。它让你大开SQL injection attacks.如果你使用普通的旧ADO.NET,至少你应该使用parameterized queries。更进一步,您可能希望查看LINQ to SQL或Entity Framework之类的内容,它抽象出自动生成的代码背后的数据库访问,该代码在幕后为您进行参数化。