Всем доброго времени суток дорогие читатели! В этой статье хотел бы поговорить о работе ADO, а именно о получении всевозможной информации о таблицах, полях и так далее. Конечно, может многие уже об этом знают, но все же, данная статья больше будет рассчитана для новичков.
В этой статье мы сможем посмотреть, как можно узнать текущее состояние подключения, также мы сможем определить, что Ваш набор данных поддерживает. То есть в зависимости от настройки Базы данных, мы сможем узнать: поддерживается ли редактирование записей, добавление новых записей, удаление записей и так далее. Также мы определим версию, установленной технологии ADO на компьютере пользователя. Кроме всего это мы научимся получать список доступных базы данных, индексов, полей таблицы, а также процедур, если конечно они присутствуют в таблице, в том числе мы будем получать данные и о системных таблицах, если они, конечно же, имеются в Базе данных.
Ну, что ребята, давайте приступим к самому простому из нашего списка – это определение версии, установленной на компьютере пользователя, технологии ADO. А для начала мы создадим некоторую базу данных и в ней таблицу, с несколькими полями, это на Ваше усмотрение, она может быть произвольной. Я создал таблицу следующего вида:
Все, теперь, давайте сделаем подключение к нашей Базе данных. Как это делается я описывал в статье. После того, как мы соединились с нашей Базой данных, теперь мы можем получать от нее различную информацию и как я говорил Выше давайте начнем с получение версии технологии ADO, установленной на компьютере пользователя. Это мы можем сделать, обращаясь к свойству Version компонента TADOConnecton. Например, так:
procedure TForm1.Button3Click(Sender: TObject);
begin
Caption:=ADOConnection1.Version;
end;
Можете посмотреть результат, у меня на заголовке моей формы отобразилось – 2.8, у Вас естественно может отличаться от моей версии. Кроме того, данное свойство будет работать, то есть, мы сможем получить версию ADO, даже если свойство Connected компонента TADOConnection установлено в False.
Переходим к следующему нашему пункту, а именно получение информации о состоянии соединения в текущий момент времени. Данную информацию мы можем получить, а точнее определить с помощью свойства State компонента TADOConnection.
PropertyState:TObjectStates
Список всех возможных значений, которое может принимать свойство State описано ниже:
- stClosed
- stOpen
- stConnecting
- stExecuting
- stFetching
Теперь разберемся по порядку. Значение stClosed – означает, что данный (текущий) набор данных не доступен. Значение stOpen – означает, что набор данных открыт и Ваше множество данных доступно для изменения, редактирования, удаления и так далее. Значение stConnecting – означает, что если потомок класса TCustomADODataSet находится в процессе соединения, то вот свойство State и возвращает данное значение. Значение stExecuting – означает то, что в данный момент времени элемент управления выполняет команду. Ну и наконец, значение stFetching – означает, что в данный момент времени происходит выборка строк из таблиц. То есть, если пользователь выбирает по определенному критерию строки из таблицы, то свойство State вернет данное значение. Эти значения можно применить почти к аналогичному свойство множества данных RecordSet – RecordsetState.
Ну что, давайте теперь посмотрим небольшой пример использования:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ADOConnection1.State=[stOpen] then
begin
Caption:='Набор данных открыт'
end;
end;
Думаю, что с этим разобрались, так что идем дальше. Давайте теперь попробуем получить список всех таблиц, которые у нас присутствуют в нашей Базе данных. Кроме того, мы получим не только список таблиц, а также некоторые данные по ним, которые будут отображаться в TDBGrid. Ну что, давайте разместим на форме следующие компоненты:
- TADOConnection
- TADODataSet
- TDBGrid
- TDataSource
- TButton
Сделайте подключение к Вашей Базе данных через компонент TADOCOnnection, об этом я писал в данной статье. Как только Вы сделали подключение, выделите компонент TADODataSet и в свойстве Connection свяжем его с компонентом TADOConnection. Далее выделяем компонент TDataSource и в свойстве DataSet связываем его с компонентом TADODataSet. Ну и наконец, выделяем компонент TDBGrid и в свойстве DataSource мы связываем его с компонентом TDataSource. Вот и все, нам даже для выполнения данной цели нам и программировать не придется практически, достаточно, чтобы было сделано правильно подключение к нашей Базе данных и связаны между собой компоненты.
Теперь на событие OnClick нашей кнопки напишем код, который состоит всего из двух строчек:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.Open;
ADOConnection1.OpenSchema(siTables,EmptyParam,EmptyParam,ADODataSet1);
end;
Первый параметр в процедуре OpenShema может быть не обязательно таблицы, в нем может присутствовать и индекса, процедуры и много другое, то есть о каких элементах Базы данных мы хотим получить данные, первым параметром мы и указываем. У меня получилось следующее:
Как видите, мы здесь получили не только список таблиц нашей базы данных, а также все данные по ним, в том числе и описание таблиц. У меня как-то спрашивали: как можно получить описание таблицы Базы данных MS Access, я привел пример, уже не помню какой именно код, но здесь я привожу еще один вариант, как это можно сделать. Так что, как-то так.
На основе данной процедуры (OpenShema) построены ряд методов, с помощью которых также можно получать данные о таблицах:
- procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);
- procedure GetFieldNames(const TableName: string; List: TStrings);
- procedure GetProcedureNames(List: TStrings);
Пример использования:
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOConnection1.GetTableNames(ListBox1.Items);
end;
Если в данной процедуре указать необязательный второй параметр и установить его в TRUE, то в компонент TListBox выведется список таблиц нашей Базы данных, в том числе и системные таблицы Базы данных.
Точно также работают и другие методы. Ну что теперь давайте перейдем к последнему нашему пункту статьи – это получение информации о нашем наборе данных. То, есть мы можем определить каким возможностями он обладает. На уровне администрирования нашей База данных мы можем ей выставить какие-то права, вот здесь мы и будем получать то, что мы можем и не можем делать с нашим набором данных. Необходимо на форму установить следующие компоненты:
- TADOConnection
- TADODataSet
- TButton
Теперь необходимо установить соединение к нашей Базе данных через компонент TADOConnection, это конечно можно сделать и сразу в компоненте TADODataSet в свойстве ConnectionString, но все же, сделаем через компонент TADOConnection, если кто-то забыл, как это делать, то смотрим это здесь. После того, как мы установили соединение с нашей Базой данных, выделяем компонент TADODataSet и в свойстве Connection выбираем компонент TADOConnection. Теперь в TADODataSet необходимо добавить некоторый набор данных, который мы будем проверять. Для этого мы выделяем компонент TADODataSet и в свойстве CommandText добавим следующий SQL-запрос:
SELECT * FROM Table1
Почти все, нам осталось компонент TADODataSet только активировать и свойство Active устанавливаем в TRUE. Для того, чтобы нам выявить какими возможностями обладает наш набор данных, то мы воспользуемся функцией:
- function Supports(CursorOptions: TCursorOptions): Boolean;
Если указанная опция, которая передается в параметр данной функции, поддерживается нашим набором данным, то метод возвратит значение TRUE, если же нет, то соответственно FALSE. Теперь на событие OnClick нашей кнопки пишем следующий код:
procedure TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Active:=True;
if ADODataSet1.Supports([coAddNew])=True then
begin
Caption:='True';
end;
end;
Здесь я запросил данные о том: поддерживает ли наш набор данных (в нашем случае просто таблица) вставку новых записей. Список значений, которое может принимать наша функция Supports следующие:
- coHoldRecords – большинство записей без подтверждения отложенных обновлений
- coMovePrevious – курсор может быть перемещен без использования закладок
- coAddNew – есть возможность вставки новых данных
- coDelete – есть возможность удаления данных
- coUpdate – есть возможность модификации данных (редактирование данных)
- coBookmark — Закладка (свойство Bookmark) объекта Recordset может быть использована для перемещения курсора или для доступа к отмеченной записи
- coApproxPosition – записи поддерживают свойство Recno, соответственно можно идентифицировать номер записи
- coUpdateBatch – есть возможность пакетного обновления данных
- coResync – данные курсора могут обновляться асинхронным способом
- coNotify — объект Recordset поддерживает уведомления и может генерировать
- события
- coFind – для поиска данных можно использоваться метод Locate()
- coSeek – для поиска данных может использоваться метод Seek()
- coIndex – для задания текущего индекса таблицы может быть использовано свойство IndexName.