尝试编写SQL查询,其中我使用内部联接从一个表中获取数据并在另一个表中显示匹配的内容,但是我在查询中收到错误'语法错误(缺少运算符)表达"'。不知道我在哪里出错,但是我已经插入了我正在使用的代码,看起来对我来说是正确的。
顺便说一下,代码是作为VB程序的一部分编写的,因此SQL代码旁边还有额外的代码。
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [classes] INNER JOIN [students] ON classes.StudentForename = students.Forename AND ON classes.StudentSurname = students.Surname AND ON classes.TeacherName ='" & personloggedon.Text & "' AND ON classes.Day ='" & System.DateTime.Now.DayOfWeek.ToString & "' AND ON classes.Period ='" & attendance_reg_periodComboBox.Text & "'", con)
我也试图再次使用以下代码,但是没有工作。
Dim cmd as OleDbCommand = New OleDbCommand("SELECT [Forename], [Surname] FROM [classes] INNER JOIN [students] ON classes.StudentForename = students.Forename AND ON classes.StudentSurname = students.Surname AND ON classes.TeacherName ='" & personloggedon.Text & "' AND ON classes.Day ='" & System.DateTime.Now.DayOfWeek.ToString & "' AND ON classes.Period ='" & attendance_reg_periodComboBox.Text & "'", con)
我所有的SQL查询需要做的是从#34;类"中取出名字和姓氏。数据库,只要它们符合给定的标准,然后从所述数据库中获取的名字和姓氏,并匹配"学生"数据库。然后,它会显示在我的程序的datagridview中。
我对SQL编码比较新,所以如果错误特别明显,我会提前道歉!但是,非常感谢所有帮助。
答案 0 :(得分:4)
你有太多的ON。只用AND替换所有AND ON。
Dim cmd as OleDbCommand = New
OleDbCommand("SELECT [Forename], [Surname] FROM
[classes] INNER JOIN [students] ON
classes.StudentForename = students.Forename AND
classes.StudentSurname = students.Surname WHERE
classes.TeacherName ='" & personloggedon.Text & "'
AND classes.Day ='" &
System.DateTime.Now.DayOfWeek.ToString & "' AND
classes.Period ='" &
attendance_reg_periodComboBox.Text & "'", con)
您确实希望使用参数化查询来避免注入攻击。
答案 1 :(得分:1)
ON
每次加入仅使用一次。
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [classes] INNER JOIN [students] ON classes.StudentForename = students.Forename AND classes.StudentSurname = students.Surname AND classes.TeacherName ='" & personloggedon.Text & "' AND classes.Day ='" & System.DateTime.Now.DayOfWeek.ToString & "' AND classes.Period ='" & attendance_reg_periodComboBox.Text & "'", con)
这是一种非常不寻常(和杂乱)的方式来调用SQL。很难看出你是否还有其他问题。如果它不起作用,请告诉我们,我们会一起弄明白。
如果在包含(或引用)复杂SQL字符串的行上收到VBA运行时错误,确定问题的确切位置可能会非常棘手。
与对任何代码进行问题排查一样,流程是 简化 ,以消除可能的罪魁祸首。
尝试执行以下程序时,我们会得到一个 使用
OpenRecordSet
方法行的运行时错误:Public Function SQLTest() Dim strSQL As String strSQL = "SELECT * FROM tblMain" & _ "ORDER BY [TableID]" Debug.Print strSQL CurrentDb.OpenRecordset strSQL End Function
为了帮助确定问题,我们可以稍微修改代码 添加一行将打印SQL字符串值的行 即时窗口。
(使用 Ctrl + G 查看即时窗口。)
Public Function SQLTest() Dim strSQL As String strSQL = "SELECT * FROM tblMain" & _ "ORDER BY [TableID]" Debug.Print strSQL CurrentDb.OpenRecordset strSQL End Function
现在,看看输出(在即时窗口中):
SELECT * FROM tblMainORDER BY [TableID] ↗↖
很容易看出我们在表名之间缺少一个空格 和
ORDER BY
子句,这很容易修复:strSQL = "SELECT * FROM tblMain " & _ "ORDER BY [TableID]"
- 这是用于对VBA中的SQL语句进行故障排除的可能最有用的调试技术。
TechNet: SQL Joins
尝试此操作进行问题排查:
Debug.Print "SELECT * FROM [classes] INNER JOIN [students] ON classes.StudentForename = students.Forename AND classes.StudentSurname = students.Surname AND classes.TeacherName ='" & personloggedon.Text & "' AND classes.Day ='" & System.DateTime.Now.DayOfWeek.ToString & "' AND classes.Period ='" & attendance_reg_periodComboBox.Text & "'"
Stop
将该代码放在之前问题行。当代码停止点击 Ctrl + G 以查看即时窗口时。
将SQL复制并粘贴到新的查询窗口(在SQL视图中),然后尝试更改为设计模式。看看你是否可以识别那里的错误。