Я предлагаю вам добавить оператор Debug.Print в ваш код следующим образом:
query = "SELECT [Unique_ID] from tblPatients WHERE [Unique_ID] =" & id
Debug.Print "query: " & query
Причиной такого предложения является то, что Debug.Print напечатает ваш оператор SQL в Immediate Window.(Вы можете использовать сочетание клавиш Ctrl + g, чтобы попасть в окно «Немедленно».) Затем вы можете просмотреть завершенную строку, которую вы просите использовать OpenRecordset.Часто просто видя эту строку (а не пытаясь представить, как она должна выглядеть), вы сможете определить проблему.Если нет, вы можете скопировать строку из окна Immediate и вставить ее в представление SQL нового запроса ... конструктор запросов может помочь вам точно определить синтаксические ошибки ... или в этом случае, я думаю, он может предупредить вас о том, какиеэлемент в вашем запросе, который механизм базы данных не распознает, и поэтому он должен быть параметром.И если этот шаг по-прежнему не решает проблему, вы можете вставить строку в свой вопрос о переполнении стека.
Наконец, я думаю, что у вас может быть логическая ошибка с IsNull (rs) ... потому что rsбыл объявлен набором записей, он никогда не будет нулевым.В следующем примере инструкция SELECT не возвращает записей.И оператор Debug.Print сообщает IsNull(rs): False
как до, так и после OpenRecordset.
Public Sub RecordsetIsNeverNull()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSql As String
strSql = "SELECT * FROM tblFoo WHERE 1 = 2;"
Set db = CurrentDb
Debug.Print "IsNull(rs): " & IsNull(rs)
Set rs = db.OpenRecordset(strSql)
Debug.Print "IsNull(rs): " & IsNull(rs)
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
Редактировать : в соответствии с Имена проблем и зарезервированные слова в Access , query - слово, зарезервированное для доступа.На самом деле я не думаю, что это является причиной вашей проблемы, но предлагаю вам все равно ее изменить ... возможно strQuery .