Как послать запрос к базе на 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)

CREATE TABLE [dbo].[test_table](
        [id] [int] NOT NULL,
        [name_mon] [varchar](50) NULL
) ON [PRIMARY]
GO

Скриншот 1

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

Скриншот 2

Скриншот 3

Скриншот 4

Скриншот 5

Запросы к базе insert, update, delete на VBA

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

 Private Sub start_Click()
 'Объявляем переменную для хранения строки запроса
 Dim sql_query As String
 'Записываем в нее нужный нам запрос
 sql_query = "insert into test_table (id, name_mon) values ('6', 'Июнь')"
 'Выполняем его
 DoCmd.RunSQL sql_query
 End Sub

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

Скриншот 6

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

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

 Private Sub start_Click()
 'Объявляем переменную для хранения строки запроса
 Dim sql_query As String
 'Записываем в нее запрос на удаление
 sql_query = "delete test_table where id = 6"
 'Выполняем его
 DoCmd.RunSQL sql_query
 End Sub

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

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

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

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

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

 Private Sub start_Click()
 'Объявляем переменные
 'Для набора записей из базы
 Dim RS As ADODB.Recordset
 'Строка запроса
 Dim sql_query As String
 'Строка для вывода итоговых данных в сообщении
 Dim str As String
 'Создаем новый объект для записей
 set RS = New ADODB.Recordset
 'Строка запроса
 sql_query = "Select id, name_mon from test_table"
 'Выполняем запрос с использованием текущих настроек подключения проекта 
 RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 'Циклом перебираем записи
 While Not (RS.EOF)
        'Заполняем переменную для вывода сообщения
     str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline                      
 'переход к следующей записи                                
 RS.MoveNext
 Wend
 'Вывод сообщения
 msgbox str
 End Sub

Скриншот 7

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

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

 Private Sub start_Click()
 'Объявляем переменные
 'Для набора записей из базы
 Dim RS As ADODB.Recordset
 'Строка запроса
 Dim sql_query As String
 'Строка для вывода итогового значения
 Dim str As String
 'Создаем новый объект для записей
 set RS = New ADODB.Recordset
 'Строка запроса
 sql_query = "Select name_mon from test_table where id = 5"
 'Выполняем запрос с использованием текущих настроек подключения проекта 
 RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 'Получаем наше значение
 str = RS.Fields(0)
 msgbox str
 End Sub

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

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

На сегодня это все. Удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Комментариев: 1
  1. Аватар
    Алеша

    вау
    это мега изи
    класс
    первый день в вба — а, уже все понятно

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.