Открыть набор записей в Access 2003/2007 - PullRequest
7 голосов
/ 17 мая 2011

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

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

Суть этого:

Dim rsSystem As Recordset
Dim sSQL As String

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

Что в святом аду мне не хватает?

Заранее спасибо.

Ответы [ 5 ]

7 голосов
/ 17 мая 2011

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

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

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

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

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

Есть два способа решения вашей проблемы:

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

Примеры здесь для всех перестановок открытия «набора записей»: 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
2 голосов
/ 17 мая 2011
Dim rsSystem As Recordset

Обе модели ADO и DAO включают объекты Recordset.Вы не можете поменять их местами.

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

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

Dim rsSystem As DAO.Recordset
2 голосов
/ 17 мая 2011

Решите, хотите ли вы использовать 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

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

1 голос
/ 04 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...