Відкриття Recordset, метод Open (), передача запиту під час відкриття Recordset
Зазвичай наступний етап після установки з'єднання - створення об'єкта Recordset і робота з ним.
Що таке об'єкт Recodrset? Саме слово Recodrset розшифровується як Set of Records, тобто набір записів. Найпростіше уявити його як табличку (аналогічну таблиць в Excel), яка знаходиться в оперативній пам'яті комп'ютера. Однак у Recordset є принципові відмінності від таблиць Excel:
- Excel не стежить за "строгістю" таблиць. На підприємствах часто можна зустріти таблиці, в середину яких вставлені, наприклад, проміжні підсумки по групах або замітки. Recordset - це "сувора" таблиця. У ній чітко визначені стовпці і рядки і розривів вона не допускає (хоча якісь значення на перетині рядків і стовпців цілком можуть бути порожніми);
- в таблиці Excel в одному стовпці без проблем можна використовувати найрізноманітніші значення - числові, дати часу, строкові, формули і т.п. У Recordset для кожного стовпчика визначається тип даних і значення в цьому стовпці повинні відповідати цьому типу даних.
Recordset зазвичай створюється на основі даних, отриманих з джерела (але може бути створений і заповнений вручну), в яких передбачені стовпці (Fields) і рядки (Row). Створення об'єкта Recordset і заповнення його даними з джерела в найпростішому варіанті виглядає так (мається на увазі, що ми відкрили за допомогою об'єкта cn з'єднання з навчальною базою даних Northwind на SQL Server):
Dim rs As New ADODB.Recordset
rs.Open "customers", cn
Переконатися, що Recordset дійсно створений і існує, можна, наприклад, за допомогою рядка
При відкритті Recordset цілком можуть виникнути помилки, тому рекомендується, як зазвичай, використовувати обробник помилок. Спеціальної колекції Errors в Recordset не передбачено, тому доведеться обійтися стандартним об'єктом Err.
У нашому прикладі ми відкрили таблицю Customers цілком. Однак це - не єдиний (і не кращий) спосіб отримання даних з джерела. Для методу Open () рекомендується використовувати запит на мові SQL. Наприклад, в нашому випадку можна було б використовувати такий код:
rs.Open "select * from dbo.customers", cn
Чому запит використовувати краще:
- є можливість вказати фільтр Where (умова - обов'язково в одинарних лапках) і завантажити в Recordset не всі записи, а тільки потрібні вам;
- є можливість точно так же обмежити число що повертаються стовпців - знову-таки скорочення обсягу переданих даних і зменшення витрат пам'яті;
- є можливість використовувати Джойна, функції SQL, сортування на джерелі даних і безліч корисних додаткових можливостей.
Дуже часто в реальних додатках текст запиту "склеюється" зі шматочків, які надходять з різних місць. Наприклад, користувач вибрав в випадаючому списку ім'я замовника - і для події Change для спадаючого списку тут же спрацювала процедура, яка виконала запит на SQL Server, отримавши дані для цього замовника, і привласнила отримані значення інших елементів управління. У нашому випадку відповідний рядок коду може виглядати так:
rs.Open "select * from dbo.customers Where CompanyName =" " '" ComboBox1.Value _ " '". cn
Набір символів " '" - це одинарна лапка всередині двох подвійних. Така конструкція потрібна, щоб текст запиту міг виглядати, наприклад, так:
select * from dbo.customers Where CompanyName = 'Alfreds Futterkiste'
Причина проста - в мові SQL строкові значення потрібно укладати в одинарні лапки.
Якщо ви відповідальні не тільки за створення клієнтського додатка, а й за проектування бази даних, буває дуже зручно передбачити запит даних тільки через уявлення. Це дозволить більш гнучко управляти системою безпеки і в разі необхідності перекроювання бази даних (наприклад, розбиття головної таблиці на поточну і архівну) заощадити безліч часу.
І ще один практичний момент. Звичайно, для роботи з базами даних знати мову запитів SQL дуже корисно. Літератури з нього дуже багато, і його цілком реально освоїти за кілька днів. Однак, якщо ви - звичайний користувач і не маєте про мову SQL жодного уявлення, нічого страшного. Просто відкривайте таблиці цілком без всяких запитів - все інше можна буде зробити засобами VBA.