【问题标题】:[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '='[Microsoft][ODBC SQL Server Driver][SQL Server]'=' 附近的语法不正确
【发布时间】:2017-08-26 03:56:53
【问题描述】:

我已经开始在页面上遇到错误,并且正在努力找出导致此问题的原因。我在 Stack Overflow 上搜索了同样的错误消息,发现有些人也得到了它,但那里的解决方案与我的非常不同。这是我收到的错误消息:

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序错误“80040e14”

[Microsoft][ODBC SQL Server Driver][SQL Server]'=' 附近的语法不正确。

/test-page.asp,第 97 行

这与该 .asp 页面上的这一行有关:

set rsMainContact=oConn.execute 
    ("SELECT * FROM tbl_individual WHERE individual_id="&iMainContact)

现在奇怪的是,页面实际上提供了正确的数据,它从该表中获取了它需要的所有数据。这就是为什么我不明白为什么会出现问题。

此外,当我使用 MSSQL 中的“SELECT * FROM tbl_individual WHERE individual_id="&iMainContact" 语句运行查询时,将 &iMainContact 替换为实际变量,它工作得非常好。

有人知道为什么会出现这个错误吗?

如果您想知道各种变量的来源,那么这也是页面中的一些相关代码:

SET rsOrganisationPendingOrganic=Server.CreateObject("ADODB.RecordSet")
rsOrganisationPendingOrganic.CursorType=3
rsOrganisationPendingOrganic.Open sSQL, oConn
iOrganisationPendingOrganicCount=rsOrganisationPendingOrganic.RecordCount

iMainContact=rsOrganisationPendingOrganic("organisation_maincontact")

【问题讨论】:

  • 请使用参数而不是连接 SQL 查询文本并阅读 SQL 注入。
  • 嘿@lad2025,谢谢。 “参数而不是连接 SQL 查询文本”是什么意思。您的意思是使用“&iMainContact”以外的其他方式引用变量吗?
  • 你的 asp 页面上的那一行代码是像你这里的 2 行,还是只有一行,问题中的格式将它分成了 2 行?如果是 2 行,则需要使用 vbscript 字符串连接来连接它们。见Breaking a String Across Multiple Lines 还有individual_id 是什么类型?它是字符串还是整数/数字?如果是后者,那么就可以了,前者并且您忘记了围绕该值的引号。确实,除非您想处理可能的 sql 注入攻击并手动转义所有字符串值,否则您需要使用参数
  • 出错时iMainContact的值是多少?

标签: sql sql-server asp-classic


【解决方案1】:

如果在错误发生之前运行以下代码,您很可能没有 iMainContact 的值:

SET rsOrganisationPendingOrganic=Server.CreateObject("ADODB.RecordSet") 
rsOrganisationPendingOrganic.CursorType=3

rsOrganisationPendingOrganic.Open sSQL, oConn
iOrganisationPendingOrganicCount=rsOrganisationPendingOrganic.RecordCount

iMainContact=rsOrganisationPendingOrganic("organisation_maincontact")

您可以通过在执行失败的 sql 之前将 sql 写到屏幕上来证明这一点:

Response.Write "SELECT * FROM tbl_individual WHERE individual_id=" & iMainContact
Response.End

我也1000%同意lad2025,使用参数化查询来防范sql injection

【讨论】:

  • 嗨乔希,感谢您的帮助。我可能对我的第一篇文章感到困惑,但基本上你刚刚发布的 RecordSet 代码是第一个,然后定义了 iMainContact 变量,然后是包含错误消息的 SQL 查询。这不是正确的顺序吗?
  • 您是否正在为变量 iMainContact 赋值?把 sql 写到屏幕上会得到什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多