Базы Данных с нуля
Компоненты доступа к данным

Компоненты доступа к данным являются не визуальными. В Delphi для работы с наборами данных служат такие компоненты как: TTable, TQuery, TUpdateSQL, TDisicionQuery и TStoredProc. Но наиболее удобными и часто используемыми являются TTable, TQuery.

Особенности набора данных Table:

Компонент Table представляет собой набор данных, который может быть связан только с одной таблицей Базы Данных. Данный компонент относят к навигационному доступу к данным, поэтому его рекомендуется использовать для локальных БД.

Расположение БД указывает свойство DatabaseName. Значением свойства является имя каталога, в котором находиться БД, или псевдоним (alias), ссылающийся на этот каталог. При задании местоположения таблицы БД, набор данных нужно закрыть, чтобы избежать исключительной ситуации. Чтобы закрыть набор данных, можно воспользоваться двумя способами. Первый способ - это указать свойству Active значение False. А второй - это воспользоваться методом Close. Для того чтобы снова открыть набор данных, можно также воспользоваться двумя способами. Первый - это указать свойству Active значение True, и второй способ - воспользоваться методом Open.

Связь между таблицей и набором данных Table осуществляется через его свойство TableName, которое задает имя таблицы БД. При указании данного свойства необходимо указать имя таблицы и расширение. А теперь рассмотрим пример:

procedure TForm1.FormCreate(Sender: TObject);
begin
 // Закрываем набор данных
 Table1.Close;
 // Задаем расположение БД
 Table1.DatabaseName:='';
 // Задаем имя таблицы
 Table1.TableName:='Base\Base.db';
 // Связываем источник данных с набором данных
 DataSource1.DataSet:=Table1;
 // Связываем сетку с источником данных
 DBGrid1.DataSource:=DataSource1;
 // Открываем набор данных
 Table1.Open;
end;

Обратите внимание на то, что перед указанием расположения таблицы БД, набор данных закрывается, дабы избежать исключительной ситуации. Так же обратите внимание, что я не указал значения для свойства DatabaseName. Но, я явно указал путь к таблице в свойстве TableName. Мой небольшой опыт работы с Базами Данных, показывает что, такой способ позволит избежать некоторых проблем при переносе приложения на другой компьютер.

Свойство TableType определяет тип таблицы и может иметь следующие значения:

  • ttDefault - Тип таблицы определяется расширением файла таблицы;
  • ttParadox - Таблица Paradox;
  • ttDBase - Таблица DBase;
  • ttFoxPro - Таблица FoxPro;
  • ttASCII - Текстовый файл, с данными в табличном виде (таблица ASCII).

Если свойство TableType имеет значение ttDefault, то тип таблицы определяется по расширению файла таблицы:

  • DB или отсутствует - Таблица Paradox;
  • DBF - Таблица DBase;
  • TXT - Текстовый файл (таблица ASCII).

Очень полезным свойством является свойство RecNo. Это свойство возвращает номер текущей записи в наборе данных. Данное свойство очень удобно использовать для запоминания текущей позиции курсора для последующего возврата в эту позицию.

Не менее полезным свойством является свойство RecordCount. Данное свойство возвращает число записей набора данных. Это свойство доступно только во время выполнения программы и доступно только для чтения. Рассмотрим небольшой пример:

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
 StatusBar1.Panels[1].Text:=IntToStr(Table1.RecNo) + '/' + IntToStr(Table1.RecordCount);
end;

В обработчик события onAfterScroll набора данных Table, мы внесли код для определения текущей позиции курсора в наборе данных и общего числа записей набора данных.

А вот так организуется возврат в исходную позицию, после некоторых возможных операций с набором данных:

// Первый способ - запоминание текущей позиции курсора
procedure TForm1.Button1Click(Sender: TObject);
Var RecNum: Integer;
begin
 RecNum:=Table1.RecNo;
 ...
 Table1.RecNo:=RecNum;
end;

// Второй способ - использование закладок
procedure TForm1.Button2Click(Sender: TObject);
Var Bookmark: TBookmark;
begin
 Bookmark:=Table1.GetBookmark;
 ...
 Table1.GotoBookmark(Bookmark);
 Table1.FreeBookmark(Bookmark);
end;

Для навигации по набору данных существует несколько методов:

  • First - Переход на первую запись;
  • Last - Переход на последнюю запись;
  • Next - Переход на следующую запись;
  • Prior - Переход на предыдущую запись.
Кроме того, у Table существуют еще не менее важные методы:
  • Append - Добавление новой записи;
  • Insert - Вставка новой записи в текущую позицию;
  • Edit - Редактирование записи;
  • Delete - Удаление текущей записи;
  • Post - Сохранение изменений;
  • Cancel - Отмена сделанных изменений.

Особенности набора данных Query:

Компонент доступа к данным Query представляет собой набор данных, записи которого формируются в результате выполнения SQL-запроса. Данный компонент относят к реляционному доступу к данным, поэтому его рекомендуется использовать для работы с удаленными БД. Query по своим свойствам и методам очень похож на Table.

Текст запроса, на основании которого в набор данных будут отбираться записи, содержится в свойстве SQL. Запрос представляет собой команды написанные на языке запросов SQL. Он выполняется при открытии набора данных.

При написании запроса не производиться проверка правильности его написания. Эта проверка происходит только во время выполнения данного запроса. Рассмотрим небольшой пример:

procedure TForm1.FormCreate(Sender: TObject);
begin
 // Связываем источник данных с набором данных
 DataSource1.DataSet:=Query1;
 // Связываем сетку с источником данных
 DBGrid1.DataSource:=DataSource1;
 // Закрываем набор данных
 Query1.Close;
 // Очищаем возможные команды
 Query1.SQL.Clear;
 // Добавляем свой запрос
 Query1.SQL.Add('SELECT * FROM Base\Base.db');
 // Открываем набор данных
 Query1.Open;
end;

Использование SQL-запросов позволяет создать эти запросы в процессе выполнения программы. Например, пользователь сам вводит необходимый запрос и тут же его выполняет. Это реализуется при помощи метода Assign. Рассмотрим небольшой пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Query1.Active:=False;
 Query1.SQl.Clear;
 Query1.SQl.Assign(Memo1.Lines);
 Query1.Active:=True;
end;

Иногда при выполнении запроса не требуется возвращать весь набор данных, чтобы снизить нагрузку на сеть. Для этого следует выполнить запрос не открытием набора данных, а вызовом метода ExecSQL. В результате можно выполнить требуемые изменения набора данных, не передавая весь результат в вызывающее приложение.

Для того чтобы данные полученные в результате запроса можно было редактировать, нужно свойству RequestLive указать значение True. Значение данного свойства по умолчанию установлено в False. Иногда в результате выполнения запроса, можно получить не редактируемый набор данных, например при выборке данных из разных БД. В данной ситуации установка свойства RequestLive в True будет проигнорировано. Для того чтобы проверить можно ли набор данных каким-либо образом редактировать можно воспользоваться свойством CanModify логического типа. Если данное свойство возвращает значение True, то набор данных можно редактировать, иначе набор данных не может быть изменен.

Особенности источника данных DataSource:

Источник данных используется как промежуточное звено между наборами данных и визуальными компонентами, при помощи которых, пользователь управляет набором данных. В Delphi источник данных представляет компонент DataSource, который также является не визуальным.

Для указания набора данных служит свойство DataSet. Все визуальные компоненты связываются с источником данных через свойство DataSource. Рассмотрим пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
 // Связь с источником данных DataSource1 разрывается
 DataSource1.DataSet:=NIL;
 // Связь источника данных DataSource2 с набором данных Table
 DataSource2.DataSet:=Table1;
 // Связь источника данных DataSource3 с набором данных Query
 DataSource3.DataSet:=Query1;
end;

Для проверки состояния, в котором находится набор данных, нужно использовать свойство State. При изменении режима набора данных для источника данных генерируется событие onStateChange. Рассмотрим пример:

procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
 Case DataSource1.State Of
   dsEdit     : Label1.Caption:='Редактирование';
   dsInsert   : Label1.Caption:='Вставка';
   dsBrowse   : Label1.Caption:='Просмотр';
   dsInactive : Label1.Caption:='Закрыт';
 End;  
end;

Не менее интересным свойством источника данных является свойство AutoEdit. Данное свойство определяет, может ли автоматически набор данных быть переведен в режим редактирования. Но установка данного свойства в значение True будет влиять только на возможность редактирования со стороны пользователя. Программно можно будет изменять все записи набора данных.

При изменении данных текущей записи возникает событие onUpdateData. Это событие также удобно использовать для дополнительной проверки вводимых данных.

Вернуться в оглавление
Вернуться на главную страницу
Hosted by uCoz