【问题标题】:Access VBA: Cannot combine variable and string in SQL queryAccess VBA:无法在 SQL 查询中组合变量和字符串
【发布时间】:2016-07-14 07:51:39
【问题描述】:

我有一个用户列表(作为字符串变量),并希望将其用作我的 SQL 选择第一项代码的条件(一次一个用户)。因此,我将 SQL 查询作为字符串稍后在代码中运行。

我试过了:

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = '" 
strSQL = strSQL & strUserName & "' ORDER BY ID DESC"

如果以strUserName = "A-user"为例,我只得到这个SQL字符串,根据"Quick Watch...":

SELECT TOP 1 Item.Code FROM Item WHERE Item.User = 'A-user

"' ORDER BY ID DESC" 的部分根本不包含在 SQL 字符串中!

对于使用 "Set rst = CurrentDb.OpenRecordset(strSQL)" 运行 SQL 查询,我收到此错误:

运行时错误“3075”: 查询表达式 'Item.User = "A-user"

中的语法错误(缺少运算符)

我该如何解决这个问题?

【问题讨论】:

  • 请显示更多您的代码,因为您的字符串连接应该根据当前显示的代码工作。但是,像这样构建 SQL 语句是 SQL 注入的经典方式……

标签: sql string ms-access vba


【解决方案1】:

我看不出您的代码是如何触发 3075 错误的。但是,我会改用参数查询。这样您就可以避免 SQL 语句中的引用值出现问题。

Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSelect As String
Dim strUserName As String

strUserName = "A-user"
strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID DESC"
Set qdf = CurrentDb.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("which_user").Value = strUserName
Set rs = qdf.OpenRecordset

【讨论】:

  • 谢谢!关于你的回答,我还有一些问题。 strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID 会给我一个 SQL 字符串,其中包含 SQL 中的固定/非变量 [which_user],对吗? qdf.Parameters("which_user").Value = strUserName 会改变上面 SQL 字符串中的固定 [which_user] 吗?我在双引号中而不是“which_user”中添加了什么? SQL 字符串中的 [which_user] 变量?谢谢!
  • which_user 是一个参数。查询参数只不过是运行查询时必须提供的值的占位符。如果将 SELECT 语句粘贴到新 Access 查询的 SQL 视图中,然后运行该查询,则应该更有意义:SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID DESC
  • 感谢 HansUp。我的问题是我无法将变量“which_user”参数插入/更改到strSelect中。所以我的 SQL 字符串实际上仍然是strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID。 [which_user] 应该是 A_user 对吗?这样 strSelect 将在“qdf.OpenRecordSet”之前为strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = 'A_user' ORDER BY i.ID,对吗?对不起,我真的是新手:)
  • 不,这不正确。但我不确定现在如何处理这个问题。您是否按照我昨天的建议在 Access 查询设计器中测试了查询?
  • 是的,我做到了。当我运行查询时,会弹出一个输入框,我必须为参数 which_user 插入一个用户名。在该框中插入正确的用户名并单击“确定”后,我得到了正确的结果。是不是和我的用户名有关系,就是用这个函数获取的Windows用户名:Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _ "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 现在我还是卡在Set rs = qdf.OpenRecordset。代码在那里遇到错误(错误 13,类型不匹配)
【解决方案2】:

Access 有时会抱怨使用单引号。并且还在语句的末尾添加一个分号。尝试将代码更改为此(双引号用额外的双引号转义:

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = " 
strSQL = strSQL & """" & strUserName & """" & " ORDER BY ID DESC;"

【讨论】:

  • 但是根据上面 DAXaholic 的评论,请注意使用这种方法的 SQL 注入
  • 我已经尝试了这些解决方案,但没有帮助 :( fontstuff.com/access/acctut15.htm 我的 strSQL 中的 & """" & " ORDER BY ID DESC;" 仍然被切断!
  • 也许您在变量名strSQL 中有错字?另请注意,我的示例在第一行分配变量,然后 追加 到第二行的变量(即变量出现在第二行 = 符号的两侧)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多