Открыть набор записей в Access 2003/2007

прошли годы с тех пор, как я работал в Коде доступа, и это делает меня сертифицированно безумным.

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

вкратце:

Dim rsSystem As Recordset
Dim sSQL As String

sSQL = "SELECT * FROM Table"
Set rsSystem = CurrentDB.OpenRecordset(sSQL)

5 ответов


примеры здесь, для всех перестановок открытия " набора записей": http://www.vbexplorer.com/VBExplorer/vb_feature/june2000/Database_Beginner_ADO_DAO.asp

самый простой способ-использовать DAO в текущей базе данных. Мой VBA немного ржавый, но...

Dim db as DAO.Database
Dim rs as DAO.Recordset
Set db = CurrentDB
Set rs = DB.OpenRecordset("table or query name")

для ADO:

Dim rs As New ADODB.Recordset
rs.Open "tblPeople", CurrentProject.Connection, adOpenDynamic

если вы объявите просто Recordset не указывая, является ли это DAO или ADO, Access самостоятельно решит, будет ли это DAO или ADO, в зависимости от порядка ваших ссылок:

открыть окно кода, перейдите в инструменты - > ссылки, и посмотрите на список.
Это будет выглядеть примерно так:
Access references window

вы видите, что в этом примере есть ссылка на DAO ("библиотека объектов Microsoft DAO 3.6")и ADO ("данные Microsoft ActiveX Библиотека Объектов 2.5").

если вы объявляете свой набор записей без указания типа, Access выбирает первую из этих ссылок (=ту, которая больше в верхней части списка) и создает набор записей этого типа.
Таким образом, в этом примере это будет DAO.Recordset.

теперь вернемся к вашему вопросу:
Набор записей объявляется без указания типа.
Поэтому, если первая ссылка в код база данных доступа ADO, доступ создаст ADODB.Recordset.
Затем вы открываете его с помощью метода DAO, который ожидает DAO.Recordset, и именно поэтому вы получаете ошибку.

есть два способа решить вашу проблему:

  1. убедитесь, что в вашей базе данных Access есть только ссылка на ADO или DAO (но не оба), тогда вам не нужно указывать тип набора записей.
  2. если вам действительно нужны обе ссылки, всегда объявляйте свои наборы записей как DAO.Recordset или ADODB.Recordset чтобы убедиться, что это действительно того типа, который ожидает ваш код.

решите, хотите ли вы использовать ADO или DAO? Вот пример DAO (более родной для Access/Jet)

dim wrk as DAO.Workspace
dim db as DAO.Database

set wrk = DBEngine.Workspaces(0)
set db = wrk.OpenDatabase(CurrentDb.Name)
Dim rsSystem as DAO.Recordset

Dim sSQL As String

sSQL = "SELECT * FROM Table"
Set rsSystem = db.OpenRecordSet(sSQL, dbOpenDynaset)

exitRoutine:
If Not (db Is Nothing) Then
     db.Close
     Set db = Nothing
End If
Set wrk = Nothing

Не уверен, что вы хотите сделать с этим записей.


Dim rsSystem As Recordset

объектные модели ADO и DAO включают объекты набора записей. Их нельзя обменять.

поскольку вы не указали, какой вы хотите, ваш может быть набор записей ADO ... что объясняет ошибку несоответствия типов в методе OpenRecordset.

Set rsSystem = CurrentDB.OpenRecordset(sSQL)

этот метод возвращает Дао Recordset, поэтому сначала объявите rsSytem как таковой.

Dim rsSystem As DAO.Recordset

"таблица" - зарезервированное слово в SQL. Если вы должны назвать свою таблицу "table", то заключите ее в квадратные скобки: "SELECT * FROM [Table]".