Access VBA:无法在SQL查询中组合变量和字符串

Access VBA:无法在SQL查询中组合变量和字符串,sql,string,ms-access,vba,Sql,String,Ms Access,Vba,我有一个用户列表(作为字符串变量),并希望使用它作为SQL选择第一项代码的标准(一次一个用户)。因此,我将SQL查询作为一个字符串,以便稍后在代码中运行它 我试过这个: strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = '" strSQL = strSQL & strUserName & "' ORDER BY ID DESC" 例如,如果strUserName=“A-user”,根据“快速观察…”,我只

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

我试过这个:

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = '" 
strSQL = strSQL & strUserName & "' ORDER BY ID DESC"
例如,如果strUserName=“A-user”,根据“快速观察…”,我只得到这个SQL字符串:

SQL字符串中根本不包括带有“ORDER BY ID DESC”的部分

对于使用
“Set rst=CurrentDb.OpenRecordset(strSQL)”
运行SQL查询,我得到以下错误:

运行时错误“3075”: 查询表达式“Item.User=”A-User“中的语法错误(缺少运算符)


我如何解决这个问题?

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

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

我不知道您的代码是如何触发3075错误的。但是,我将使用参数查询。这样可以避免SQL语句中引用值的问题

Dim qdf作为DAO.QueryDef
Dim rs作为DAO.Recordset
Dim strSelect As字符串
Dim strUserName作为字符串
strUserName=“A-user”
strSelect=“从[Item]中选择前1个i.代码作为i,其中i.用户=[which_User]按i.ID说明排序”
设置qdf=CurrentDb.CreateQueryDef(vbNullString,strSelect)
qdf.Parameters(“哪个用户”).Value=strUserName
Set rs=qdf.OpenRecordset

请显示更多的代码,因为字符串的串联应该根据当前显示的代码工作。但是,像这样构建SQL语句是SQL注入的经典方式……但是根据DAXaholic上面的评论,请注意使用这种方法的SQL注入。我尝试了以下解决方案,但没有任何帮助:(在我的strSQL中,
&“&”按ID DESC;“
排序的顺序仍然被切断!也许您在变量名
strSQL
中有一个输入错误?请注意,我的示例在第一行分配变量,然后在第二行附加到变量(即变量出现在
=
符号的两侧第二行)。谢谢!关于您的回答,我还有一些问题。
strSelect=“从[Item]中选择TOP 1 I.code,因为I.User=[which_User]按I.ID排序。
将给我一个SQL字符串,其中包含SQL中的固定/非变量[which_User],对吗?。以及
qdf.参数(“which_User”).Value=strUserName
会更改上面SQL字符串中的固定[which_user]吗?我应该在双引号中输入什么而不是“which_user”?[which_user]SQL字符串中的变量?Thank!
哪个用户是参数。查询参数只不过是在运行查询时必须提供的值的占位符。如果将
SELECT
语句粘贴到新Access查询的SQL视图中,然后运行该查询,则更有意义:
选择TOP 1 i.code从[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
[哪个用户]应该是用户对吗?这样strSelect将是
strSelect=“从[Item]中选择前1个i.code作为i,其中i.user='A_user'按i.ID排序,在“qdf.OpenRecordSet”之前,对吗?对不起,我真的是个新手:)不,这是不正确的。但我现在不确定如何处理。您是否按照我昨天的建议在Access查询设计器中测试了查询?是的,我测试了。当我运行查询时,会弹出一个输入框,我必须为您使用的参数插入用户名。在将正确的用户名插入该框并单击“确定”后,我会得到正确的结果。它是否与我的用户名有关,即使用此函数获取的Windows用户名:
Private Declare函数apiGetUserName Lib“advapi32.dll”Alias uu“GetUserNameA”(ByVal lpBuffer为字符串,nSize为长)只要
到目前为止,我仍然停留在
设置rs=qdf.OpenRecordset
上。代码在那里出错(错误13,类型不匹配)
strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = " 
strSQL = strSQL & """" & strUserName & """" & " ORDER BY ID DESC;"