Light-electric.com

IT Журнал
17 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba access execute

Vba access execute

Описание
Выполняет запрос на изменение или инструкцию SQL для указанного объекта Connection или Database.

Параметры
объект
Объектная переменная, представляющая объект Connection или Database, для которого будет выполнен запрос.
запрос
Объектная переменная, представляющая объект QueryDef, свойство SQL которого содержит выполняемую инструкцию SQL.
источник
Выражение или переменная типа String, содержащая инструкцию SQL или значение свойства Name объекта QueryDef.
параметры
Необязательный. Константа или комбинация констант, определяющая характеристики целостности данных, как описано в разделе «Значения».

  • dbDenyWrite — Запрет доступа на запись для других пользователей (в рабочей области ядра Microsoft Jet).
  • dbInconsistent — (Значение по умолчанию). Выполнение несогласованных обновлений (в рабочей области ядра Microsoft Jet).
  • dbConsistent — Выполнение согласованных обновлений (в рабочей области ядра Microsoft Jet).
  • dbSQLPassThrough — Выполнение запроса к серверу SQL. Инструкция SQL передается для обработки на базу данных ODBC (в рабочей области ядра Microsoft Jet).
  • dbFailOnError — Отмена всех внесенных изменений при возникновении ошибки (в рабочей области ядра Microsoft Jet).
  • dbSeeChanges — Возникновение ошибки при выполнении, если во время сеансе редактирования данные изменены другим пользователем (в рабочей области ядра Microsoft Jet).
  • dbRunAsync — Асинхронное выполнение запроса (только для объектов Connection и QueryDef в рабочей области ODBCDirect).
  • dbExecDirect — Выполнение инструкции без предварительного вызова функции API ODBC SQLPrepare (только для объектов Connection и QueryDef в рабочей области ODBCDirect).

Замечания
Метод Execute определен только для запросов на изменение. При попытке применить метод Execute к запросу другого типа возникает ошибка. Поскольку запрос на изменение не возвращают записей, при вызове метода Execute Recordset объект не возвращается. (Выполнение запроса к серверу SQL в рабочей области ODBCDirect не приводит к возвращению ошибки в случае, когда объект Recordset не возвращается).
Свойство RecordsAffected объекта Connection, Database или QueryDef позволяет определить число записей, измененных в результате последнего вызова метода Execute. Например, в свойстве RecordsAffected регистрируется число записей, удаленных, обновленных или вставленных при выполнении запроса на изменение. При запуске объекта Querydef с помощью метода Execute число измененных записей регистрируется в свойстве RecordsAffected объекта Querydef.
В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке — даже если не удается изменить или удалить ни одну из записей. Поэтому всегда следует использовать параметр dbFailOnError при запуске с помощью метода Execute запроса на обновление или удаление записей. Данный параметр задает генерирование ошибки выполнения и позволяет отменить все успешно проведенные изменения, если какие-либо из записей оказались заблокированными и не допускают изменения или удаления.
Для достижения максимальной производительности в рабочей области Microsoft Jet, особенно в многопользовательской среде, следует применять вложенные в транзакции вызовы метода Execute. Сначала следует применить метод BeginTrans к текущему объекту Workspace, затем вызвать метод Execute, после чего завершить транзакцию с помощью метода CommitTrans объекта Workspace. Такая последовательность позволяет сохранить изменения на диске и обеспечивает снятие любых блокировок, которые могли быть установлены во время выполнения запроса.
В рабочей области ODBCDirect необязательная константа dbRunAsync задает выполнение запроса в асинхронном режиме. Для того чтобы определить, выполняется ли в данный момент запрос в асинхронном режиме, следует проверить значение свойства StillExecuting объекта, для которого был вызван метод Execute. Чтобы прекратить выполнение метода Execute, вызванного в асинхронном режиме, следует использовать метод Cancel method.

Пример
Следующая программа демонстрирует метод Execute при запуске объектов QueryDef и Database. Для выполнения этой процедуры требуются процедуры ExecuteQueryDef и PrintOutput.

Как послать запрос к базе на VBA Access

Данный урок посвящен SQL запросам к базе данных на VBA Access. Мы рассмотрим, как на VBA осуществляется запросы INSERT, UPDATE, DELETE к базе данных, а также научимся получать конкретное значение из запроса SELECT.

Те, кто программируют на VBA Access и работая при этом с базой данных SQL сервера, очень часто сталкиваются с такой простой и нужной задачей как посыл SQL запроса к базе данных, будь то INSERT, UPDATE или простой SQL запрос SELECT. А так как мы начинающие программисты мы тоже должны уметь это делать, поэтому сегодня займемся именно этим.

Мы уже затрагивали тему получения данных с SQL сервера, где как раз на VBA писали код для получения этих данных, например в статье про Выгрузку данных в текстовый файл из MSSql 2008 или также немного затрагивали в материале Выгрузка данных из Access в шаблон Word и Excel, но так или иначе там мы рассматривали это поверхностно, а сегодня предлагаю поговорить об этом чуть более подробней.

Примечание! Все примеры ниже рассмотрены с использованием ADP проекта Access 2003 и базы данных MSSql 2008. Если Вы не знаете что вообще такое ADP проект то это мы рассматривали в материале Как создать и настроить ADP проект Access

Исходные данные для примеров

Допустим, у нас есть таблица test_table, которая будет содержать номера и названия месяцев в году (запросы выполнены с использованием Management Studio)

Как я уже сказал, мы будем использовать ADP проект, настроенный на работу с MS SQL 2008, в котором я создал тестовую форму и добавил кнопку start с подписью «Выполнить», которая нам понадобится для тестирования нашего кода, т.е. весь код мы будем писать в обработчике события «Нажатие кнопки».

Запросы к базе INSERT, UPDATE, DELETE на VBA

Чтобы долго не тянуть сразу приступим, допустим, нам нужно добавить строку в нашу тестовую таблицу (код прокомментирован)/

В данном случае запрос выполняется с использованием текущих параметров подключения к базе данных. Можем проверить, данные добавились или нет.

Как видим, данные вставились.

Для того чтобы удалить одну строку пишем вот такой код.

Если мы проверим, то увидим, что нужная строка удалилась.

Для обновления данных записываем в переменную sql_query запрос update, надеюсь, смысл понятен.

Читать еще:  Remote access server

Запрос SELECT к базе на VBA

Здесь дела обстоят чуть интересней, чем с остальными конструкциями SQL.

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

Здесь мы уже используем циклы VBA Access для того чтобы перебрать все значения в нашем наборе записей.

Но, достаточно часто бывает необходимо получить не все значения из набора записей, а всего лишь одно, например, название месяца по его коду. И для этого использовать цикл как-то накладно, поэтому мы можем просто написать запрос, который вернет всего одно значение и обращаться именно к нему, например, получим название месяца по коду 5

Для универсальности здесь мы уже обратились не по имени ячейки, а по ее индексу, т.е. 0, а это самое первое значение в Recordset, в итоге мы получили значение «Май».

Как видите, все достаточно просто. Если Вам достаточно часто требуется получать конкретное значение из базы (как в последнем примере), то рекомендую вывести весь код в отдельную функцию (Как написать функцию на VBA Access 2003) с одним входящим параметром, например, код месяца (если рассматривать наш пример) и просто, где необходимо вывести это значение, вызывать нужную нам функцию с нужным параметром и все, этим мы значительно уменьшим код VBA и улучшим восприятие нашей программы.

Заметка! Если Вас интересует SQL и T-SQL, рекомендую пройти наши курсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать с использованием языка T-SQL в Microsoft SQL Server.

Выполнение SQL запросов к текущей базе данных в среде VBA (Access)

В Microsoft Office Access поддерживается выполнение SQL запросов к текущей базе данных из программного кода на VBA. Рассмотрим, как это можно использовать при разработке приложений баз данных.

Так как запрос выполняется к той же самой базе данный в которой выполняется модуль VBA, для выполнения SQL запроса нет необходимости работать со стандартными в подобных случаях интерфейсами ADO, ODBC и т.д. Всё можно сделать при помощи объектной модели Access.

Как известно SQL запросы можно условно разделить на две большие группы:

  • Запросы, не возвращающие данных (INSERT, UPDATE, DELETE и т.д.);
  • Запросы возвращающие данные (запросы на выборку (SELECT)).
Запросы, не возвращающие данных

Для выполнения запросов к текущей базе данных служит метод Execute объекта CurrentDb. Этот метод принимает в качестве параметра строку с SQL запросом, который необходимо выполнить.

Это простейший запрос. Но, как быть с запросами, которые манипулируют теми или иными данными?

Такие запросы тоже можно выполнить. Для этого нужно просто сформировать соответствующую строку.

Так, например, может быть реализовано добавление записей в таблицу:

А, так их обновление:

Выполнение другие типов запросов не возвращающих данных осуществляется по аналогичным принципам.

Запросы на выборку

Метод Execute объекта CurrentDb не поддерживает выполнение запросов на выборку. Поэтому для них нужен другой подход.

Чтобы работать с выборкой данных необходимо воспользоваться объектом RecordSet, который можно создать при помощи метода OpenRecordSet объекта CurrentDb. Этот метод также принимает в качестве параметра строку с SQL запросом.

После создания RecordSet мы можем перебрать все записи, как это показано ниже.

Помимо простого перебора доступны несколько видов поиска. Но в основном используются два.

Первый вид поиска реализован в виде методов FindFirst, FindLast, FindNext и FindPrevious объекта RecordSet.

Первые два устанавливают курсор на соответственно первую и последнюю записи, соответствующие условию поиска. Условие поиска передаётся в качестве параметра в виде строки. Само условие задаётся по аналогии с предложением WHERE в обычном SQL запросе.

Методы FindNext и FindPrevious устанавливают курсор на следующую и предыдущую записи в соответствии с условием поиска, если такие записи существуют. Условие поиска для этих методов задаётся также, как и для FindFirst и FindLast.

Обратите внимание, что эти четыре метода именно устанавливают указатель на нужную запись, а не производят фильтрацию выборки. Таким образом количество записей выбранных SQL запросом остаётся неизменным.

В следующем примере перебор записей начнётся с записи, у которой id равен 234, так как курсор был перемещён к ней до начала обхода набора записей в цикле.

Vba access execute

Как запускать запросы из VBA

Опубликовано: 28 янв 05
Рейтинг:

Автор: Sfagnum, участники форума по Аксессу
Прислал: Владимир Саныч

1. Вопросы.
1.1. Как отключить подтверждения?
1.2. Execute либо OpenRecordset выдаёт ошибку «слишком мало параметров» , что делать?
1.3. Как правильно использовать DoCmd.RunSQL ?
1.4. Почему нельзя использовать конструкцию Application.SetOption ?

2. Ответы.
Прежде чем перейти к ответам, надо отметить, что запрос будет выполнять непосредственно Jet и что DoCmd.RunSQL ( Access ), CurrentDb.Execute ( DAO ), Connection.Execute ( ADO ) являются не более чем интерфейсами к Jet .

2.1. Методы отключения сообщений на подтверждение при запуске Action Queries .
Подтверждения отключаются следующими способами (ответы перечислены в порядке применимости):

Перейти на использование конструкции CurrentDb.Execute

Использовать вместе с DoCmd.RunSQL , DoCmd.SetWarnings False

Изменить глобальные настройки с помощью конструкции

Application.SetOption «Confirm Record Changes» , False

Application.SetOption «Confirm Document Deletions» , False

Application.SetOption «Confirm Action Queries» , False

NB. (Категорически НЕ рекомендуется).

2.2 Устранение ошибок в CurrentDb.Execute и в CurrentDb.OpenRecordset
Ошибка, как правило, возникает со следующим текстом «Too few parameters. Expected Число» («Слишком мало параметров. Ожидалось Число»).
Эта ошибка возникает, если команда или один из нижележащих запросов содержит обращения к формам или собственные параметры, — все эти обращения будут восприняты как параметры, которым не передано значение.
Почему так происходит? — Вот вольный перевод из MSDN ( ms-help://MS.MSDNQTR.2003APR.1033/enu_kbacc2000kb/acc2000kb/209203.htm ):

NOTE : В DAO Вы должны явно присвоить значение параметру. При использовании DoCmd.OpenQuery Вы этого делать не должны, т.к. DAO использует операции низкого уровня, что даёт Вам большую свободу в использовании параметров (т.е. Вы можете сами присвоить параметру значение переменной, а не использовать ссылку на форму), но Вы должны выполнить служебные действия, которые Аксесс делает «за кулисами» при исполнении DoCmd . С другой стороны, DoCmd работает на более высоком уровне, чем DAO . Выполняя DoCmd , Microsoft Access делает некоторые предположения о том, как поступить с параметрами, и не дает Вам никакой свободы в этом отношении.

Читать еще:  Routing and remote access настройка

Если все параметры являются ссылками на контролы форм ( Forms![ИмяФормы]![ИмяКонтрола] ), тогда самое простое (и красивое) решение:

Dim q As DAO.QueryDef, p As DAO.Parameter

Set q = CurrentDb.QueryDefs( «ИмяЗапроса» ) ‘как обычного запроса Select,

‘так и INSERT/UPDATE; в запросах на удаление это не помогает

For Each p In q.Parameters

q.close: Set q= Nothing

Если вместо обращений к формам Вы используете собственные параметры (например, [Введите начальную дату:]), тогда Вам нужно задать параметры вручную:

Dim q As DAO.QueryDef

Set q = CurrentDb.QueryDefs( «ИмяЗапроса» )

q.Parameters( «[Введите начальную дату:]» ).Value= Cdate (Ваше_значение_параметра)

‘и т.д. пока не переберете все параметры

q.close: set q= Nothing

Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода:

Dim q As DAO.QueryDef, p As DAO.Parameter

Set q = CurrentDb.QueryDefs( «ИмяЗапроса» )

For Each p In q.Parameters

q.close: set q= Nothing

Альтернативой может быть использование функций, которые будут брать значения либо напрямую из нужного контрола, либо из переменной. (Такая функция должна быть описана в стандартном модуле. В модуле формы можно пользоваться свойством без параметров, функцией без параметров либо публичной переменной, но на них надо ссылаться через форму и без скобок в конце.) Использование данного метода позволяет более широко контролировать подставляемое значение, а также позволяет избавиться от квадратных скобок, что иногда бывает критично. Пример: в модуле пишем функцию, которая получает значение из поля формы:

Rep_BegDate = Forms ! frmRep ! txtBegDate

и тогда в запросах и отчетах вместо

WHERE . = Forms ! frmRep ! txtBegDate

Обратите внимание на Rep_BegDate() со скобками.

Еще одной альтернативой является программное формирование команды SQL, в которой все значения параметров подставлены в явном виде. Подробнее см. здесь: http://www.sql.ru/faq/faq_topic.aspx?fid=157

Если аналогичное явление происходит не при CurrentDb.Execute , а при CurrentDb.OpenRecordset , то годятся все те же решения. При этом если параметры задаются вручную, то открывать рекордсет надо так:

Set rs = q.OpenRecordset(. )

‘а не Set rs = CurrentDb.OpenRecordset(«ИмяЗапроса»), . )

В перекрестных запросах возникает то же явление. Правда, оно возникает не при попытке запуска (ибо перекрестный запрос не является Action Query), а при любом использовании, например при открывании формы, основанной на таком запросе. В этом случае надо действовать следующим образом:

PARAMETERS [Forms]![ИмяФормы]![ИмяКонтрола] Text , . ;

Примечание. Везде в примерах, где сказано «ИмяЗапроса», имеется в виду не обязательно имя сохраненного запроса, но также и команда SQL, которая нигде не сохранена.

2.3 Устранение ошибок в Command.Execute

Если все параметры являются ссылками на контролы форм ( Forms![ИмяФормы]![ИмяКонтрола] ), тогда самое простое (и красивое) решение:

Dim cmd As ADODB.Command

Dim cnn As ADODB.Connection

Dim rs As ADODB.Recordset

Dim p As ADODB.Parameter

Set cnn = CurrentProject.Connection

‘или если не используете текущее соединение:

‘Set cnn = New adodb.Connection

‘cnn.Open «Cтрока подключения по аналогии с CurrentProject.BaseConnectionString»

Set cmd = New ADODB.Command

‘начиная с ADO версии 2.6 (. ) без этого свойства работать не будет —

‘ADO будет заполнять коллекцию параметров не по имени, а по порядку

For Each p In .Parameters

‘имена параметров равны именам контролов формы, только без @

‘Имя контрола NameFIO, тогда в процедуре @NameFIO. @- убираем с помощью Replace

p.Value = Eval(Forms( «ИмяФормы» )(Replace(p.Name, «@» , «» , 1, 1, vbTextCompare)))

Set rs = .Execute(, , adExecuteNoRecords)

‘adExecuteNoRecords — можно и не указывать, если в процедуре стоит Set NoCount ON

‘или чтобы иметь возможность задать свойства rs (обновляемость, например):

‘Set rs = New ADODB.Recordset

Set cmd = Nothing

rs.Close: Set rs = Nothing

cnn.Close: Set cnn = Nothing

Если вместо обращений к формам Вы используете собственные параметры, тогда Вам нужно задать параметры вручную:

Dim cmd As ADODB.Command

Dim cnn As ADODB.Connection

Dim rs As ADODB.Recordset

Set cnn = CurrentProject.Connection

Set cmd = New ADODB.Command

‘Cоздадим параметр nVarChar (500)

.Parameters.Append .CreateParameter( «@имяПарматра1» , adVarWChar, adParamInput, 500, «Некая строка» )

‘создадим параметр типа int (SQL) — Long (VBA)

.Parameters.Append .CreateParameter( «@имяПараметра2» , adInteger, adParamInput, , CLng (111))

Set rs = .Execute(, , adExecuteNoRecords)

Set cmd = Nothing

rs.Close: Set rs = Nothing

cnn.Close: Set cnn = Nothing

Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода:

Dim cmd As ADODB.Command

Dim cnn As ADODB.Connection

Dim p As ADODB.Parameter

Set cnn = CurrentProject.Connection

Set cmd = New ADODB.Command

For Each p In .Parameters

Set cmd = Nothing

cnn.Close: Set cnn = Nothing

2.4. Использование DoCmd.RunSQL .
Иногда советуют поставить DoCmd.SetWarnings False перед DoCmd.RunSQL , но это крайне опасно. Это требует добавить DoCmd.SetWarnings True где только можно, особенно в обработчиках ошибок. В противном случае Аксесс в какой-нибудь момент вообще перестанет выдавать предупреждения на удаление и т.п. (в том числе и предупреждения об ошибках) до конца работы программы. Также есть возможность, что в отладочный период Вы остановите выполнение кода ДО включения сообщений, что тоже повлечёт за собой выше описанный результат. Но если Вы решили использовать данную конструкцию, то используйте её следующим образом.

On Error Goto mis

2.5. Противопоказания к использованию конструкции Application.SetOption
Подтверждения исчезнут во всей аппликации насквозь, в том числе там, где это не планировалось. Это можно делать только в том случае, если соблюдены два условия:

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

Подтверждения не отключаются, если в приложении работает сам разработчик.

2.6. Возможность отката
Нередко возникает необходимость при возникновении ошибок отменить результат исполнения целого ряда запросов. DoCmd.RunSQL такой возможности не дает. CurrentDb.Execute , в отличие от него, позволяет откатить транзакцию, в которую включено то, что посчитает нужным программист. В CurrentDb.Execute есть опция dbFailOnError — она относится только к выполнению конкретного запроса, т.е. отвечает только за то, будет ли запрос при ошибке откачен целиком и будет возвращена ошибка, или же возможно частичное выполнение запроса.
Пример отката внешней транзакции:

Читать еще:  Access forbidden перевод

Public Function Test()

On Error Goto Rollback_Label

CurrentDb.Execute «Запрос1» , dbFailOnError

CurrentDb.Execute «Запрос2» , dbFailOnError

CurrentDb.Execute «Запрос3» , dbFailOnError

В данном случае если не выполнится хотя бы один запрос, то все запросы «откатятся».

Базы данных и ADO Объект ADODB.Command и запуск хранимых процедур в VBA

9.6 Объект Command и коллекция Parameters

Объект ADODB.Command, запуск хранимых процедур в VBA, объект Parameter и коллекция Parameters, метод Execute(), возврат значений в Recordset

В самых простых вариантах, когда можно получить и изменять данные напрямую в таблицах, можно обойтись объектом Recordset. Однако во многих ситуациях возможностей только этого объекта недостаточно. Как уже говорилось, предпочтительнее производить любое внесение изменений на источник данных при помощи хранимых процедур. Часто существует потребность в создании временных таблиц и других объектов на сервере. Бизнес-логика многих приложений (начисление процентов, абонентской платы, формирование специальных отчетов с вычислениями и т.п.) также реализована в виде хранимых процедур, поэтому в реальных приложениях одним объектом Recordset не обойтись.

Для выполнения команд SQL на сервере (в том числе запуска хранимых процедур, команд DDL для создания объектов, выполнения служебных операций типа резервного копирования, восстановления, изменения параметров работы) необходимо использовать объект Command.

Создание этого объекта производится очень просто:

Dim cmd As ADODB.Command

Set cmd = CreateObject(«ADODB.Command»)

Следующее, что нужно сделать — назначить объекту Command объект подключения Connection. Для этой цели предназначено свойство Command.ActiveConnection. Ему можно передать готовый объект Connection, а можно сформировать этот объект неявно, используя в качестве значения свойства ActiveConnection строку подключения. Рекомендуется всегда предавать готовый объект подключения: во-первых, так для соединения можно настроить больше параметров, а во-вторых, если вы используете в приложении несколько объектов Command, можно использовать для каждого такого объекта одно-единственное подключение, что экономит ресурсы. В нашем примере мы используем созданный нами ранее объект Connection:

Следующая наша задача — выбрать тип команды. В принципе, для многих источников можно его и не выбирать — модули ADO постараются сами выяснить у источника данных, что это за команда (хранимая процедура, SQL-запрос и т.п.), однако лучше всегда его определять: экономится время и системные ресурсы, уменьшается вероятность ошибок. Для выбора типа команды используется свойство CommandType. Значения, которые ему можно присвоить, аналогичны возможным значениям параметра Options метода Open() объекта Recordset, которое было рассмотрено выше. Например, если мы передаем команду на выполнение хранимой процедуры, то присвоить соответствующее значение можно так:

Следующее действие — определить текст команды, которая будет выполняться. Делается это при помощи свойства CommandText. Например, если мы хотим запустить на выполнение хранимую процедуру CustOrderHist, то соответствующий код может выглядеть так:

Чаще всего хранимая процедура требует передачи ей одного или нескольких параметров. Делается это при помощи коллекции Parameters и объектов Parameter. Для определения параметров можно использовать два способа:

  • создать объекты Parameter автоматически путем запроса к серверу (используется метод Refresh() коллекции Parameters) и затем присвоить им значения:
  • создать объекты Parameter вручную и вручную добавить их в коллекцию Parameters. Этот способ более экономичен (нет необходимости лишний раз обращаться на сервер), но требует предварительных выяснений точных свойств параметра и кода большего размера:

Dim Prm As ADODB.Parameter

Set Prm = cmd.CreateParameter(«CustomerID», adVarWChar, adParamInput, 5, «ALFKI»)

После этого команду необходимо запустить на выполнение. Для этого используется метод Execute(). Самый простой способ его вызова выглядит так:

Этот метод принимает также три необязательных параметра, при помощи которых можно дополнительно определить параметры, тип вызываемой команды и т.п.

Некоторые хранимые процедуры и передаваемые команды не требуют возврата каких-либо значений (кроме кода ошибки), но так бывает редко. Как же принять значения, возвращаемые выполняемой командой?

Если возвращаемое значение официально зарегистрировано как возвращаемый параметр (например, оно помечено ключевым словом OUT в определении хранимой процедуры), то это значение будет присвоено соответствующему параметру объекта Command, и до него можно будет добраться обычным способом — при помощи свойства Value.

Если же, как в нашем примере с CustOrderHist, возвращаемое значение просто сбрасывается в поток вывода (в нашем случае возвращается набор записей), то можно использовать два способа:

  • первый способ — использовать то, что метод Execute() возвращает объект Recordset, заполненный полученными при помощи команды записями:

Dim rs2 As ADODB.Recordset

Set rs2 = cmd.Execute()

  • второй способ — воспользоваться тем, что метод Open() объекта Recordset может принимать в качестве параметра объект Command (в этом случае объект Connection передавать этому методу уже нельзя):

Dim rs2 As ADODB.Recordset

Set rs2 = CreateObject(«ADODB.Recordset»)

Некоторые другие свойства и методы объекта Command:

  • CommandStream — возможность вместо прямого назначения текста команды (через свойство CommandText) принять значение из потока ввода (например, из текстового файла или другой программы). Допустимый формат потока зависит от провайдера — драйвера для данного подключения. Использовать одновременно и CommandStream, и CommandText нельзя (второе свойство автоматически становится пустым);
  • CommandTimeout — возможность указать, сколько времени в секундах ждать результата выполнения команды на источнике, прежде чем вернуть ошибку;
  • Dialect — это свойство позволяет указать особенности разбора (parsing) текста команды на провайдере;
  • NamedParameters (только true или false, по умолчанию false) — возможность определить, будут ли передаваться провайдеру имена параметров, или будет использоваться просто передача по порядку значений.
  • Prepared — свойство, которое может влиять на производительность. Если установить его в true (по умолчанию false), то при первом выполнении команды провайдер создаст ее откомпилированную версию, которую и будет использовать при последующих выполнениях. Первый раз команда будет выполнять медленнее, чем обычно, зато последующие разы — быстрее. Такое «приготовление команды» (command preparation) поддерживают далеко не все драйверы подключений.
  • свойство State возвращает те же значения и используется в тех же целях, что и для объекта Recordset;
  • метод Cancel() позволяет прекратить выполнение команды (можно использовать, если выполнение затянулось), если такую возможность поддерживает провайдер.
Ссылка на основную публикацию
Adblock
detector