我们有一个简单的访问数据库,并且希望表单上的按钮仅供选定的员工使用。 (该按钮有一个与之相关的事件)。我想存储允许员工的用户名单击单独表中的按钮。
我想做的是,执行一个简单的查询以查看表中是否存在用户名,并根据结果设置按钮的启用状态。
我的背景是C#和SQL Server,但VBA和访问对我来说是新的,我认为我正在努力应对这种环境的怪癖。
我通过调用advapi32.dll中的GetUserNameA获得了字符串fOSUserName
中已登录用户的用户名,但我正在努力解决最简单的查询以确定用户名是否存在于表
Dim strSQL As String
Dim intResult As Integer
Dim db As DAO.Database
Dim rs As Recordset
Set db = CurrentDb
strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" & _
fOSUsername & "'"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
If Not rs.EOF Then
intResult = rs.Fields(0)
Else
intResult = 0
End If
rs.Close
db.Close
这在db.OpenRecordset
给我错误
运行时错误'3061':
参数太少。预计1。
有人可以提供一些指示吗?
答案 0 :(得分:3)
在VBA中继续行时,在行继续符(“_”)之前需要一个空格。所以不要这样:
strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" &_
fOSUsername & "'"
使用此:
strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" & _
fOSUsername & "'"
然而,正如@Igor Turman所指出的,在下划线字符之前缺少空格应该会触发编译错误。因此,我不确定发生了什么,但建议您无论如何都要修复它以避免混淆。
我建议不要打开记录集,然后从该记录集中读取值,而只需使用DCount()函数即可处理。
Dim strCriteria As String
strCriteria = "[USERS].[NAME] = '" & fOSUsername & "'"
Debug.Print "strCriteria: '" & strCriteria & "'"
If DCount("*", "USERS", strCriteria) = 0 Then
Debug.Print "not found"
Else
Debug.Print "found"
End IF
如果缺少参数错误是因为USERS是查询而不是表,您可以要求DCount()使用表。或者修复查询。
答案 1 :(得分:1)
我对你使用它的方式并不完全熟悉,但我总是这样做:
Dim sSQL As String
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[your access db file path and name];Persist Security Info=False"
sSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" &_
fOSUsername & "'"
Set rs = New ADODB.Recordset
rs.Open sSQL, cn
If Not rs.EOF Then
intResult = rs.Fields(0)
Else
intResult = 0
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
答案 2 :(得分:1)
听起来你的[USERS]对象不是一个表而是Query(带参数)。此外,如果您遇到类似'& _'(无效)的语法错误,而不是'& _'(有效),您的数据库无法编译。因此,如果您的情况是表格与查询,请使用以下内容:
...
Dim rs As Recordset
Dim qdf As QueryDef
Set qdf = CurrentDb.QueryDefs("Users")
qdf.Parameters("UserNameParameter") = fOSUsername
Set rs = qdf.OpenRecordset
...