Как выполнить динамический SQL-запрос к MS Access 2003 через VBA? - PullRequest
3 голосов
/ 25 сентября 2008

Это супер базовый вопрос, но я пытаюсь выполнить запрос, который строю, используя некоторые значения формы для базы данных MS Access, в которой находится форма. Не думаю, что мне нужно пройти ADO формально, но, может быть, я делаю.

В любом случае, помощь будет полезна. Извините за то, что я n00b. ;)

Ответы [ 4 ]

3 голосов
/ 25 сентября 2008

Вы можете использовать следующий код DAO для запроса БД доступа:

Dim rs As DAO.Recordset
Dim db As Database

Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Attendance WHERE ClassID = " & ClassID)

do while not rs.EOF
  'do stuff
  rs.movenext
loop

rs.Close
Set rs = Nothing

В моем случае ClassID - это текстовое поле в форме.

0 голосов
/ 30 сентября 2008

Вот на всякий случай, если вы хотели версию ADO:

Dim cn as new ADODB.Connection, rs as new ADODB.RecordSet
Dim sql as String

set cn = CurrentProject.Connection
sql = "my dynamic sql string"

rs.Open sql, cn ', Other options for the type of recordset to open, adoOpenStatic, etc.

While Not rs.EOF
  'do things with recordset
  rs.MoveNext   ' Can't tell you how many times I have forgotten the MoveNext. silly.
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

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

0 голосов
/ 26 сентября 2008

Ответы, которые вам дали и которые вы, кажется, принимаете в цикле через набор записей DAO. Как правило, это очень неэффективный метод выполнения текста. Например, это:

  Set db = CurrentDB()
  Set rs = db.OpenRecordset("[sql]")
  If rs.RecordCount > 0
     rs.MoveFirst
     Do While Not rs.EOF
       rs.Edit
       rs!Field = "New Data"
       rs.Update
       rs.MoveNext
     Loop 
  End If
  rs.Close
  Set rs = Nothing
  Set db = Nothing

будет намного менее эффективным, чем:

  UPDATE MyTable SET Field = "New Data"

, который можно запустить с:

  CurrentDb.Execute "UPDATE MyTable SET Field = 'New Data'"

Очень редко случается, что нужно циклически проходить через набор записей, и в большинстве случаев обновление SQL будет на несколько порядков быстрее (а также приведет к тому, что на данные будут удерживаться более короткие блокировки чтения / записи страницы).

0 голосов
/ 25 сентября 2008

Это то, что я в итоге придумал, что на самом деле работает.

Dim rs As DAO.Recordset
Dim db As Database

Set db = CurrentDB
Set rs = db.OpenRecordset(SQL Statement)

While Not rs.EOF
    'do stuff
Wend

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