MS Access 2007,针对表检查当前用户

时间:2011-08-23 15:55:21

标签: sql ms-access vba ms-access-2007

我们有一个简单的访问数据库,并且希望表单上的按钮仅供选定的员工使用。 (该按钮有一个与之相关的事件)。我想存储允许员工的用户名单击单独表中的按钮。

我想做的是,执行一个简单的查询以查看表中是否存在用户名,并根据结果设置按钮的启用状态。

我的背景是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。

有人可以提供一些指示吗?

3 个答案:

答案 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
...
相关问题