Автор работы: Пользователь скрыл имя, 05 Ноября 2009 в 13:11, Не определен
Лекции
BDE взаимодействует с базами данных через драйверы. Для большинства наиболее распространенных баз данных разработаны стандартные драйверы.
Кроме того, обеспечивается возможность взаимодействия с базой данных через драйвер ODBC. Доступ к SQL-серверам обеспечивает система драйверов SQL Links, позволяющая разрабатывать приложения для серверов Oracle, Informix, Sybase, DB2 и InterBase.
Рис.
15.1. Схема доступа к БД
BDE
разрешает реляционный (на
Для каждой БД строится свой драйвер, который учитывает особенности СУБД и транслирует вызовы функций общего вида в вызовы частного вида.
Каждой БД в BDE обычно назначают условное имя (alias), через которое к ней идет обращение. Перенаправив условное имя на другую БД, можно легко переключить прикладную программу на другие данные и даже на данные другого формата. Назначение условных имен производится программами SQL Explorer или BDE Administrator.
Любое приложение, работающее с базами данных, должно обеспечивать ряд типовых функциональных возможностей, включающих:
Обращение
к базам данных производится с
помощью специальных
TTable – обеспечивает доступ к таблицам локальных баз данных и управление ими;
TQuery
– использует для доступа к базе данных
SQL-запросы, поэтому позволяет работать
как с локальными, так и с удаленными базами
данных.
Любые прикладная программа на Delphi, желающая использовать БД, должна иметь в своем составе, по меньшей мере, три слоя компонентов.
Рис. 15.2.
Схема слоев компонентов в прикладной
программе
Простая
форма предназначена для
Для
такой формы нужны следующие
компоненты:
TQuery (или TTable) - 1 шт.
TDataSource - 1 шт.
TDBGrid - 1 шт.
TDBNavigator -
1 шт.
Основные свойства этих компонент
Свойство | Значение | Комментарий |
TQuery | ||
RequestLive | True | Можно обновлять таблицу в сетке и передавать обновления в БД |
DatabaseName | Student | Условное имя БД (alias) |
Name | Q1 | Имя этого компонента |
SQL | Select * from P | SQL - оператор |
TDataSource | ||
DataSet | Q1 | Имя компонента TQuery, связанного с БД |
Name | DS1 | Имя этого компонента |
TDBGrid | ||
DataSource | DS1 | Имя компонента TDataSource |
TDBNavigator | ||
DataSource | DS1 | Имя компонента TDataSource |
VisibleButtons | nbFirst, … | Список разрешенных кнопок для перемещения по таблице |
Компоненты верхних слоев ссылаются на имена компонентов в нижних слоях.
Компонент
TTable предназначен для доступа к
единственной таблице файл-серверной
СУБД, а TQuery - к любому количеству таблиц
в клиент-серверной СУБД.
Обычно TTable используется в навигационном режиме для обработки единичных строк в таблице, а TQuery - для групповых операций с помощью SQL.
Оба
компонента могут открыть набор
данных методом Open или двоичным свойством
Active и закрыть методом Close или
тем же свойством Active.
Для просмотра и изменения НД обычно используются компоненты: TDBNavigator, TDBGrid и др., которые автоматически вызывают нужные методы компонентов TTable и TQuery.
Примеры
программного доступа к НД:
Пример
1: Изменение в БД
Q1 : TQuery;
...
Q1.Open; // Открыть НД - выполнить оператор SQL SELECT
...
Q1.Edit; // Перевести в режим редактирования
Q1.FieldByName('gorod').
// Столбец 'Gorod' интерпретируется как строка
// Клетке присваивается значение 'Москва'
Q1.Post; // Запомнить изменения в БД
...
Q1.Close; // Закрыть НД
Существуют другие типы-свойства:
AsBoolean : Boolean;
AsDataTime : TDataTime;
AsFloat : double;
AsInteger
: integer;
Пример
2: Изменение БД с подтверждением
if Q1.Modified then // НД был изменен?
if MessageDlg('Записать?', mtConfirmation[mbYes,mbNo],0) = mrYes then
Q1.Post; // Запомнить изменения в БД
Свойство
Modified принимает значение true, если хотя
бы одна клетка НД была изменена пользователем.
Пример
3: Подсчет суммы значений в столбце
var
sum : integer;
begin
sum := 0;
Q1.Open;
Q1.First; // Переход к 1-ой строке
while not Q1.EOF do
begin
sum := sum + Q1.FieldByName('ves').
Q1.Next;
end;
Q1.Close;
...
end;
Некоторые особенности класса TQuery
1) Свойство SQL может содержать только один оператор SQL, хотя в нем могут упоминаться несколько таблиц.
2)
Операторы SELECT из этого свойства
выполняются методом Open, а операторы
INSERT, DELETE и UPDATE методом ExecSQL.
Например:
а)
with Query1 do
begin
Close; { закрыть НД }
SQL.Clear; { удалить предыдущий оператор SQL }
SQL.Add('SELECT * FROM P'); { задать новый оператор SQL }
Open; { будет выполнять этот оператор SQL }
end;
б)
with Query1 do
begin
Close; { закрыть НД }
SQL.Clear; { удалить предыдущий оператор SQL }
SQL.Add('DELETE FROM S'); { задать новый оператор SQL }
ExecSQL; { выполняет другой оператор SQL, помимо SELECT }
end;
3)
Свойство RequestLive задает желание изменять
данные в БД путем навигации
и правки НД, т.е. правки результата
оператора SELECT.
Однако истина (true) в свойстве RequestLive не гарантирует, что правка будет разрешена. Для разрешения требуется, кроме того:
а) обращаться только к одной таблице;
б) не применять часть ORDER BY;
в) не применять функции вида SUM, AVG и пр.;
г)
не применять вычисляемые столбцы.
4)
При любых значениях свойств
RequestLive и CanModify изменять БД можно
операторами UPDATE, INSERT, DELETE и методом
ExecSQL.
5)
Изменяющийся оператор SQL можно построить
двумя способами:
а)
var
x : string[10];
...
with Query1 do
begin
Close; { закрыть НД }
SQL.Clear; { удалить предыдущий оператор SQL }
SQL.Add('SELECT * FROM P WHERE ves='+x); { задать новый оператор SQL }
Open; { будет выполнять этот оператор SQL }
end;
x
- строковая переменная, содержащая
заданный пользователем вес
б) Пусть свойство SQL содержит оператор с двумя параметрами:
SELECT * FROM P WHERE gorod=:Gor AND ves=:Massa
тогда с помощью метода ParamByName
можно дать параметру
Пример:
var
Town, x : string[30];
...
with Query1 do
begin
Close; { закрыть НД }
SQL.Clear;
SQL.Add('SELECT * FROM P WHERE gorod=:Gor AND ves=:Massa');
ParamByName('Gor').Value := Town;
ParamByName('Massa').Value := x;
Open; { будет выполнять оператор SQL }
end;
6) Пусть свойство SQL содержит оператор, который возвращает одиночный результат. Например: SELECT SUM(kapital) FROM S;
Этот
результат удобно извлекать с
помощью метода FieldByName.
Пример:
var
Y : string[30];
...
with Query1 do