MS Access 2007, проверка текущего пользователя по таблице - PullRequest
1 голос
/ 23 августа 2011

У нас есть база данных простого доступа, и мы хотели бы, чтобы кнопка в форме была доступна только для выбора сотрудников. (С кнопкой связано событие). Я хотел бы сохранить имена пользователей, которым разрешено нажимать на кнопку, в отдельной таблице.

Что я хотел бы сделать, это выполнить простой запрос, чтобы увидеть, существует ли имя пользователя в таблице, и установить включенное состояние кнопки в зависимости от результата.

Мой опыт работы с C # и SQL Server, но VBA и доступ являются новыми для меня, и я думаю, что я борюсь с причудами этой среды.

Я получил имя пользователя, вошедшего в систему, в строке fOSUserName через вызов GetUserNameA в advapi32.dll, но я борюсь с простейшими запросами, чтобы определить, существует ли имя пользователя в таблице.

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 ]

3 голосов
/ 23 августа 2011

Когда вы продолжаете строку в 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 голос
/ 23 августа 2011

Похоже, ваш объект [USERS] - это не таблица, а запрос (с параметром). Кроме того, если у вас возникла синтаксическая ошибка, такая как «& _» (неверно), а не «& _» (допустимо), ваша база данных не будет компилироваться. Таким образом, если таблица относится к запросу, используйте следующее:

...
Dim rs As Recordset
Dim qdf As QueryDef

Set qdf = CurrentDb.QueryDefs("Users")
qdf.Parameters("UserNameParameter") = fOSUsername
Set rs = qdf.OpenRecordset
...
1 голос
/ 23 августа 2011

Я не совсем знаком с тем, как вы его используете, но я всегда делал это так:


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


...