Ошибка run-time error 3021

Ежик_из_тумана
Дата: 14.03.2016 20:20:24
Здравствуйте.

Пытаюсь сделать проверку логина и пароля в Access через VBA с использованием запросов.
Нужно чтобы выводило по логину и паролю получало id.

По нажатию на кнопку авторизации должна происходить проверка. Если логин и пароль есть в таблице Пользователи, то авторизация проходит успешно, но если логин или пароль с ошибкой, то при выполнении SQL запроса через VBA выскакивает ошибка "Run-time error 3021, Текущая запись отсутствует".

Пытался бороться с ней проверяя значение rst!result_2, но возникает тогда другая ошибка - Run-time error '424', Object required

Помогите пожалуйста разобраться.

Dim rst As DAO.Recordset
Dim log As String
Dim pass As String

        log = Me.username
        pass = Me.password
        
        Set rst = CurrentDb.OpenRecordset("SELECT Пользователи.id AS result_2 FROM Пользователи WHERE Пользователи.Логин = '" & log & "' AND Пользователи.Пароль='" & pass & "';")
        'выше возникает ошибка 3021, а ниже проверка и если она присутствует, то выдает ошибку 
            If (rst!result_2 Is EOL) Then
                t_ans = 0
                MsgBox "Ошибка авторизации"
            Else
                t_ans = rst!result_2
            End If
            
            rst.Close
        Set rst = Nothing
\\\\
Дата: 14.03.2016 20:35:54
Ежик_из_тумана, а это чего?
            If (rst!result_2 Is EOL) Then
Ежик_из_тумана
Дата: 14.03.2016 21:10:16
А это я бессилия экспериментировал и забыл вернуть. Просто не первый день пытаюсь решить в чём проблема, а опыта нету. Там у меня должно быть If rst!result_2 Is Empty - таким образом с помощью условного оператора я пытаюсь проверить выводит ли он id или пуст.
В любом случае хоть там Is Null, хоть Is Empty, хоть Is Empty стоит - всегда возникает ошибка 424.
Если проверки этой нет то выполнение этого кода останавливается на строчке с SQL запросом:
Set rst = CurrentDb.OpenRecordset("SELECT Пользователи.id AS result_2 FROM Пользователи WHERE Пользователи.Логин = '" & log & "' AND Пользователи.Пароль='" & pass & "';")
и выдает ошибку 3021.
mds_world
Дата: 14.03.2016 21:35:35
If rst.EOF Then
Ежик_из_тумана
Дата: 15.03.2016 04:13:40
mds_world,

Огромное спасибо !
Оно работает!
MrShin
Дата: 15.03.2016 06:05:29
Или
If rst.Recordcount=0 then
\\\\
Дата: 15.03.2016 06:21:07
MrShin, при некоторых условиях будет неверный результат, поэтому лучше проверять EOF/BOF.
MrShin
Дата: 15.03.2016 06:44:36
Сразу после создания рекордсета? Можно поподробнее, что там может возникнуть?
Всю жизнь этим пользуюсь, никогда проблем не было.
Если рекордсетом уже пользовались, то да, полагаться на это нельзя
\\\\
Дата: 15.03.2016 08:12:33
MrShin
Сразу после создания рекордсета? Можно поподробнее, что там может возникнуть?

    With CurrentProject.Connection.Execute("ЗапросИлиТаблица")'получаем набор только для чтения и только вперёд
        Debug.Print .RecordCount
        .Close
    End With
'выведет -1

Обсуждалось неоднократно на форуме.
MrShin
Если рекордсетом уже пользовались, то да, полагаться на это нельзя
а вот это почему?
MrShin
Дата: 15.03.2016 09:36:59
\\\\,
У ADO свои заморочки, есть такое - в некоторых случаях типа этого счетчик не определен, пока не попросили первую строку. В DAO, которым пользуется автор, такого нет:
With CurrentDb.OpenRecordset("Table1")
    Debug.Print .RecordCount
    .Close
End With

дает >=1 для не пустых запросов

\\\\
а вот это почему?

Пока писал, какая-то проблема крутилась в голове, сейчас не смог вспомнить ничего, что обнуляло бы Recordcount. Так что и дальше можно пользоваться