Прийоми взаємодії Visual Basic і SQL, Visual Basic, Програмування - Програмування

При створенні програм, що оперують базами даних, нерідко виникають проблеми, пов'язані з організацією взаємодії мови програмування з SQL. У статті розкриваються прийоми використання SQL-запитів під час роботи Visual Basic 6.0 із бібліотекою Microsoft DAO 3.51 Object Library.

Застосування SQL-запитів у коді програми, що працює з базою даних, має свої переваги – це просто, наочно та дуже ефективно. Однак через відмінність типів даних Visual Basic і SQL під час передачі змінних із коду програми до SQL-запиту можуть виникати неприємні нюанси.

Весь запит укладено у подвійні лапки. Щоб процесор БД "виявив" наявність у запиті змінної, її слід вивести за лапки. У нашому випадку це робиться так:

Даний запит вже близький до готовності, але якщо ви спробуєте його застосувати, швидше за все, отримаєте повідомлення про помилку № 3061: Too few parameters. Expected 1. («Занадто мало параметрів. Очікувався один»). Справа в тому, що перед тим, як передати рядкову змінну до SQL-запиту, її потрібно обмежити одинарними лапками, для чого Дж. Мак-Манус рекомендує відповідну функцію (Джеффрі П. Мак-Манус. Обробка баз даних на Visual Basic 6. М .: Діалектика, 1999).

Це особливо зручно тоді, коли доводиться передавати кілька рядкових змінних різні запити. Отже, наш запит набуде вигляду:

Даний рядок коду, звичайно, працює, але тільки потрібно буде додати в проект функцію Quote, а якщо ви не хочете це робити, досить «модернізувати» змінну strCity:

Тепер про те, як передати запит кілька змінних. Припустимо, потрібно вибрати записи жителям Владивостока, які мають прізвище Іванов.

Рядок запиту декількаускладнилася, але її структура залишилася такою самою. У подібних випадках доцільно розбити рядок на кілька частин, інакше він не поміститься на екрані і працюватиме з ним незручно. Рекомендую розділити її так, щоб кожна SQL-директива знаходилася на новому рядку. Це спростить редагування запиту та пошук у ньому помилок.

Зверніть увагу на пробіл між лапками та директивою AND. У разі використання змінних у запиті часом важко зрозуміти, навіщо він потрібен, але без нього ви отримаєте повідомлення про помилку № 3131 Syntax error in FROM clause («Синтаксична помилка в пункті FROM»). Дійсно, якщо ще раз поглянути на SQL-запит, написаний в один рядок (див. попередній приклад), то неважко помітити, що без цього пробілу директива AND "прилипне" до змінної Quote (strCity) і призведе до помилки. Щоб захистити себе від подібних проблем, рекомендую ставити пробіл перед усіма SQL-директивами.

Розглянемо ще кілька прикладів. Допустимо, у нас є база даних, що включає таблицю tblOperations з полями [fieldNumber], [fieldData], [fieldNameCompany] та [fieldSum]. Перше поле містить номер замовлення, друге – дату, третє – ім'я компанії, четверте – суму операції. Необхідно сформувати критерії вибірки на ім'я компанії, причому якщо поле не заповнене, то recordset повинен включати повний набір записів, а якщо заповнено, то і критерій вибірки. У разі цілком можна обійтися одним SQL-запросом. Опишемо докладніше процес формування критерію. "Намалюємо" у формі текстове поле txtCompanyName.

Якщо текстове поле txtCompanyName не буде заповнене, наведений код програми вибере всі записи таблиці. Якщо ж його заповнити, то recordset стане вибирати записи за критерієм збігу зі значенням, введеним у полі txtCompanyName. Про те, яквиконати вибірку за датою, розповімо трохи нижче, а тепер повернемося до прикладу. Зверніть увагу, що в запиті між директивою WHERE [fieldNameCompany] та змінною немає математичного знака – він виноситься за межі запиту та стає частиною змінної. Важливо знати, що процесор баз даних інтерпретує порожнє поле таблиці як Null, а чи не як Empty, і тому не можна використовувати значення Empty під час роботи з базами даних.

В одному з наведених прикладів ми вже надавали рядковій змінній весь SQL-запит. Те ж саме можна виконати з будь-якою частиною цього запиту, в тому числі з директиви SQL. Ось як у такому разі виглядатиме попередній приклад:

У полі нашого зору перебувають переважно рядкові змінні. Справа в тому, що крім них передати в SQL-запит можна лише змінні типу byte, integer та long. Все ж решту доведеться переводити саме в рядковий тип. Поекспериментуємо зі змінними типу integer трохи пізніше, а спочатку подивимося, як найпростіше перевести змінну в рядковий тип.

Для змінних single, double і currency є сенс застосувати вбудовану функцію перетворення на рядковий вигляд str(variable).

Коли потрібно зробити вибірку даних по полю, що містить логічні значення, іноді буває необхідно застосувати в запиті змінну типу boolean. Для цього можна використати функцію IIf. Якщо змінна містить значення True, то функція поверне рядкове значення True, і навпаки.

У результаті змінну типу date доведеться також передавати як рядкову змінну з урахуванням її формату. Дата передається до SQL-запиту як #dd/mm/yy#, тому потрібно зібрати і рядкову змінну. Зверніть увагу, що навіть якщо в операційній системі формат дати встановленороздільниками у вигляді точок, що відображаються в полях бази даних, формат змінної, що передається в SQL-запит, все одно повинен мати косу як роздільник.

Як варіант, у полі бази даних, куди заноситиметься дата, можна поставити текстовий тип цього поля і працювати тільки з рядковими змінними. Слід пам'ятати, що змінна типу date займає 8 байт, а змінна типу string – 10 байт плюс довжина рядка.

Тепер розглянемо змінні типу byte, integer та long, які не потрібно обов'язково обрамляти одинарними лапками. Припустимо, у нас є база даних з декількома таблицями, що мають імена 1, 2, 3, 4, 5. Потрібно вибрати з усіх таблиць дані та рознести їх за різними елементами відображення. Створимо п'ять екземплярів елемента управління ListBox з однаковою назвою та індексами від 0 до 4. Ось як виглядатиме наш код:

Цей код п'ять разів вибере набір записів та рознесе його за різними елементами. Те саме можна зробити і з полями таблиці, якщо в їх назві присутні послідовні цілі числа. Якщо імена таблиці чи її полів складніші, можна «зібрати» їх ім'я в рядкову змінну шляхом конкатенації. Нехай у таблиці tbl1 є поля: [field 1], [field 2], [field 3]. Тоді вибірку з неї можна зробити за допомогою коду:

Застосування змінних при організації зв'язку мови програмування з SQL значно підвищує гнучкість програми. Вам достатньо буде написати одну процедуру з правильно організованим запитом, і тоді ви зможете просто викликати її, передаючи змінні як параметри. Таким чином, ви зменшите свій код і підвищите продуктивність його використання.