Базы данных и ADO Открытие Recordset в ADO/VBA

          Назад



9.5.1 Открытие Recordset


Открытие 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 действительно создан и существует, можно, например, при помощи строки

MsgBox rs.GetString

При открытии 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.




Далее