Як надіслати запит до бази на 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

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

Запити до бази 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

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

Як бачимо, дані вставили

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

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

Тут ми вже використовуємо цикли 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 і покращимо сприйняття нашої програми.

На сьогодні це все.

Ссылка на основную публикацию