Выполнить динамический SQL-запрос к MS Access 2003

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

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

Можете ли вы указать, изменяете ли вы данные в базе данных или считываете их для отображения? Мне нужно знать, прежде чем голосовать за один из ответов :)

MarkJ 16.03.2009 14:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
13 541
4

Ответы 4

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

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 - это текстовое поле в форме.

Я бы принял этот ответ, за исключением того, что блок If не работает как исключение (я не думаю). Стоит If Not rs.EOF Then?

Tim Visher 25.09.2008 23:04

Я отредактировал его, включив в него «not rs.EOF» и rs.movenext.

jinsungy 26.09.2008 17:56

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

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

Вам понадобится оператор rs.Movenext, если вы хотите перебирать записи в наборе записей, предполагая, что SQL вернет несколько строк.

jinsungy 26.09.2008 17:57

Сохраните себе набор и используйте CurrentDb.OpenRecordset (). Нет необходимости делать отдельный объект базы данных.

Brettski 30.09.2008 05:12

Я думаю, что пример кода должен использовать лучшие практики, а CurrentDB.OpenRecordset () в DAO может оставить явную ссылку на объект зависшей. Во-вторых, в качестве образца кода это место, где вы открываете базу данных разные, чем текущую, так что в качестве образца кода я думаю, что это лучше.

David-W-Fenton 18.03.2009 03:29

Ответы, которые вам были даны и которые, похоже, вы принимаете, проходят через набор записей 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 будет на несколько порядков быстрее (а также приведет к удержанию гораздо более коротких блокировок чтения / записи на страницах данных).

Что ж, вопрос на самом деле не говорит о том, что обновление выполняется. Может быть, данные будут выводиться на дисплей?

MarkJ 16.03.2009 14:24

Дисплей в чем? Форма? Если так, то это не лучший способ сделать это. Если в отчете это В самом деле, не лучший способ это сделать. Для меня «выполнить запрос» означает «обновить данные с помощью запроса», но, возможно, я неправильно читаю OP.

David-W-Fenton 18.03.2009 03:31

На самом деле они сказали «выполнить запрос»: большой вопрос = большая разница. Запрос (маленький q) - это SQL DML SELECT, который предварительно подразумевает набор записей. Запрос (большой Q) - это объект MS Access (не Jet, не ACE), который может содержать любой оператор SQL: SELECT / INSERT / UPDATE / DELETE SQL DML, даже SQL DDL или SQL DCL.

onedaywhen 19.03.2009 11:38

Вот на всякий случай, если вам нужна версия 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 часто работает лучше.

Я обнаружил, что DAO быстрее работает с базами данных формата Access 97, а ADO - с Access 2000 и выше. Думаю, это разница между jet 3.5 и jet 4.0.

MarkJ 16.03.2009 14:21

Другие вопросы по теме