查询表达式中的语法错误(缺少运算符)“

Posted

技术标签:

【中文标题】查询表达式中的语法错误(缺少运算符)“【英文标题】:Syntax Error (Missing Operator) In Query Expression " 【发布时间】:2018-09-02 14:54:45 【问题描述】:

尝试编写一个 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 查询需要做的就是从“类”数据库中获取名字和姓氏,只要它们符合给定的标准,然后从所述数据库中获取名字和姓氏并匹配“学生”数据库。然后,它会显示在我程序的 datagridview 中。

我对SQL编码比较陌生,所以如果错误特别明显,我提前道歉!但是,我们非常感谢所有帮助。

【问题讨论】:

Table1 JOIN table2 on Table1.Field1 = Table2.Field1 AND Table1.Field1 = Table2.Field2 AND ....去掉第一个之后的ON 【参考方案1】:

你的 ON 太多了。将所有 AND ON 替换为 AND。

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)

您确实希望考虑使用参数化查询来避免注入攻击。

【讨论】:

再次,同样的,我得到“不支持加入表达式”。 抱歉,没有发现缺少的 WHERE 条件。试试修改后的版本。【参考方案2】:

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 的方式。很难看出您是否还有其他问题。如果它不起作用,请告诉我,我们会一起解决。


额外提示:调试 VBA 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 语句进行故障排除,这可能是最有用的一种调试技术
有关更多调试技术,请参阅Source。

更多信息:

MSDN:Perform Joins Using Access SQL

技术网: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 视图中)并尝试更改为设计模式。看看你能不能找出那里的错误。

【讨论】:

“不支持加入表达式”当我尝试使用该命令时得到。 查看我的答案的最底部。 设法从以前的解决方案中得到答案,结果我把我的参数误认为是我的 sql 代码。不过,谢谢你的帮助??

以上是关于查询表达式中的语法错误(缺少运算符)“的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 中的查询表达式中出现语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符)

语句中的查询表达式中的语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符) - ASP.NET

Access 2010:查询表达式中的语法错误(缺少运算符)

查询表达式“@ID = @@IDENTITY”中的语法错误(缺少运算符)