1 of 34

Программирование

Баз Данных

ТЕХНОЛОГИЯ ADO

clck.ru/9bxFT

2 of 34

Базы данных

  1. Основные компоненты
  2. Отображение в режиме таблицы
  3. Отображение в режиме формы
  4. Фильтрация
  5. Поиск
  6. Сортировка
  7. Работа с записями и отдельными полями
  8. SQL

3 of 34

Основные компоненты

  • Визуальные

вкладка DataControls

  • Не визуальные

вкладки ADO, Data Access

1

4 of 34

DBGrid аналог StringGrid

Отображает табличную информацию

5 of 34

Другие аналоги

Label dbtxt1: TDBText;

Edit dbedt1: TDBEdit;

Memo dbmmo1: TDBMemo;

ComboBox dbcbb1: TDBComboBox;

CheckBox dbchk1: TDBCheckBox;

RadioGroup dbrgrp1: TDBRadioGroup;

6 of 34

Структура связей

Визуальный компонент

Компонент источник

Набор данных

Соединение с БД

БД

Технология ADO

7 of 34

Структура связей

Визуальный компонент

Компонент источник

Набор данных

Соединение с БД

БД

DBGrid DBText DBEdit DBMemo DBComboBox DBCheckBox DBRadioGroup

DataSource

ADODataSet ADOTable ADOQuery

ADOConnection

БД локальная, сетевая

Порядок проектирования снизу вверх

8 of 34

Отображение таблицы из БД

  • Через ADODataSet

запрос в CommandText

select * from t1

  • Через ADOTable

просто выбираем таблицу

Отображение отдельных полей

  • Через компоненты для полей

Соединяем через наборы данных и выбираем одно поле

2

9 of 34

Избирательное отображение�записей таблицы

procedure TForm1.btn2Click(Sender: TObject);

begin

ds1.Filter:='[Возраст]>'+edt2.Text;

ds1.Filtered:=True;

end;

4

10 of 34

Избирательное отображение�записей таблицы

procedure TForm1.btn3Click(Sender: TObject);

begin

if edt3.Text<>'' then

begin

ds1.Filtered:=False;

ds1.Filter:='Имя Like ''%'+edt3.Text+'%''';

ds1.Filtered:=True;

stat1.Panels[0].Text:=IntToStr(ds1.RecordCount);

end;

end;

11 of 34

Внести в поле таблицы

procedure TForm1.dbedt1Change(Sender: TObject);

begin

tbl1.Edit;

tbl1.FieldValues['Возраст']:=dbedt1.Text;

end;

12 of 34

Динамическое подключение БД�через ADODataSet

procedure TForm1.FormActivate(Sender: TObject);

begin

try

con1.Connected:=true;

ds1.Active:=true;

except

ShowMessage('нет БД');

end;

end;

13 of 34

Зафиксировать даже если не закончилось редактирование

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

if dbgrd1.EditorMode

then tbl1.UpdateBatch(arCurrent);

tbl1.Close; // корректно закрывать наборы данных

end;

if ds1.Modified then ds1.Post;

ds1.Close;

14 of 34

Узнать имя столбца и номер столбца таблицы, значение поля

procedure TForm1.dbgrd1ColEnter(Sender: TObject);

begin

Caption:=dbgrd1.SelectedField.FieldName; Caption:=IntToStr(dbgrd1.SelectedField.FieldNo);

end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);

begin

Caption := DBGrid1.SelectedField.Text + ':' +

IntToStr(Column.Index) + ':' +

Column.FieldName;

end;

15 of 34

Конструктор запросов Access

16 of 34

Поиск информации

label1.Caption := table1.Lookup('Имя', edt1.Text, 'Возраст');

Метод у набора данных - функция

Lookup(KeyField, KeyValues, ResultField);

Поле поиска

Значение

поиска

Поле результата

поиска

17 of 34

SQL - Итоговые функции

Итоговые, статистические, агрегатные или суммирующие - функции обрабатывают набор строк и возвращают одно значение:

COUNT() функция возвращает число строк в столбце.

MAX() функция возвращает максимум в столбце.

MIN() функция возвращает минимум в столбце.

SUM() функция возвращает сумму значений столбца.

SELECT MIN(price), MAX(price), AVG(price)

FROM prices;

18 of 34

Сумма по колонке Delphi

procedure TForm1.btn1Click(Sender: TObject);

Var r,sum: Integer;

begin

for r:=1 to tbl2.RecordCount do

begin

tbl2.RecNo:=r;

sum:=sum+tbl2.Fields.FieldByNumber(2).AsInteger;

end;

end;

// tbl2.First;

// sg.Cells[0,2]:=tbl2.FieldByName('возраст').AsString;

1

19 of 34

Сумма по колонке Delphi

procedure TForm1.btn6Click(Sender: TObject);

var srv: real;

begin

srv:=0;

ADOTable1.First;

while not ADOTable1.Eof do

begin

srv:=srv+ADOTable1.FieldByName('Возраст').AsInteger;

ADOTable1.Next;

end;

srv:=srv/ADOTable1.RecordCount;

edt2.Text:=FormatFloat('0.00',srv);

ADOTable1.First;

end;

2

20 of 34

Сумма по колонке SQL

with qry1 do

begin

Close;

SQL.Clear;

SQL.Add('Select sum([Ср Балл]) FROM t1');

Open;

btn3.Caption :=

FloatToStr(Fields.Fields[0].AsFloat);

end;

3

21 of 34

Добавить записьдаже если есть счетчик

tbl1.Active:=false;

qry1.SQL.Text:=

'INSERT INTO t1(имя, возраст)

VALUES ('''+'Andrey'''+', 43)';

qry1.ExecSQL;

tbl1.Active:=True;

22 of 34

Добавить записьдаже если есть счетчик

procedure TForm1.Button1Click(Sender: TObject);

var n: integer;

begin

AdoTable1.Active:=true;

n:=AdoTable1.RecordCount; // сколько записей в таблице

with Q_Insert do

begin

Parameters.ParamByName('s1').Value:=Edit1.Text;

Parameters.ParamByName('s2').Value:=Edit2.Text;

SQL.Text:='INSERT INTO table_1 VALUES('+IntToStr(n+1)+', :s1, :s2, '+Edit3.Text+')';

ExecSQL;

end;

AdoTable1.Active:=false; AdoTable1.Active:=true;

end;

23 of 34

Изменить записьдаже если есть счетчик

procedure TForm1.Button2Click(Sender: TObject);

var s: string;

begin

with Q_Update do

begin

Parameters.ParamByName('s1').Value:=LabeledEdit1.Text;

Parameters.ParamByName('s3').Value:=LabeledEdit2.Text;

s:='UPDATE table_1 SET Пароль = :s3 WHERE Фамилия = :s1';

SQL.Text:=s;

ExecSQL;

end;

AdoTable1.Active:=false; AdoTable1.Active:=true;

end;

24 of 34

Добавить запись

procedure TForm1.N1Click(Sender: TObject);

var nam: string; id: integer;

begin

with qry1 do

begin

Close;

SQL.Clear;

SQL.Add('Select max(t1.[id]) FROM t1');

Open;

id := Fields.Fields[0].AsInteger + 1;

end;

nam:=inputbox('ввод данных', 'введите фамилию - ','');

with ADOTable1 do

begin

Insert;

FieldByName('id').AsInteger:=id;

FieldByName('Name1').AsString:=nam;

FieldByName(‘средний балл').AsFloat:=0;

Post;

end;

showmessage(запись добавлена...');

end;

если нет счетчика

25 of 34

Запись картинки в ADO таблицу

ADOQuery1.Edit;

TBLOBField(ADOQuery1.FieldByName('myField')).

LoadFromFile('c:\my.bmp');

DOQuery1.Post;

26 of 34

При клике мышкой по таблице

procedure TForm1.DBGrid1CellClick(Column: TColumn);

begin

form1.Caption := DBGrid1.SelectedField.Text + ':' +

IntToStr(Column.Index) + ':' +

Column.FieldName;

end;

27 of 34

При клике мышкой по объекту

procedure TForm1.cal1Click(Sender: TObject);

begin

tbl1.Edit;

tbl1.FieldByName('дата').AsDateTime:=cal1.Date;

tbl1.Post;

cal1.Visible:=False;

end;

28 of 34

Удалить текущую запись

Удалить текущее поле

procedure TForm1.N3Click(Sender: TObject);

begin

DataSource1.DataSet.Delete;

end;

ADOTable1.Edit;

DataSource1.DataSet.Fields.Fields[n_c].Clear;

Adotable1.Fields.Fields[n_c].AsString:='';

ADOTable1.Post;

29 of 34

При изменении положения в таблице

procedure TForm1.ADOTable1AfterScroll(DataSet: TDataSet);

begin

if ADOTable1.RecNo<>-1 then

try

sb.Panels[0].Text :=IntToStr(ADOTable1.RecNo);

sb.Panels[1].Text:=

ADOTable1.Fields.FieldByNumber(ADOTable1.RecNo).AsString;

//sb.Panels[1].Text :=ADOTable1.FieldValues['Name1'];

sb.Panels[2].Text :=

FloatToStr(ADOTable1.FieldValues['Средний балл']);

except

end;

end;

30 of 34

Отобразить список таблиц

procedure TForm1.FormActivate(Sender: TObject);

begin

con1.GetTableNames(lst1.Items);

end;

31 of 34

Из списка таблиц выбрать

procedure TForm1.lst1Click(Sender: TObject);

begin

tbl2.Active:=false;

tempTable:=lst1.Items[lst1.ItemIndex];

stat1.Panels[0].Text:=tempTable;

tbl2.TableName:=tempTable;

tbl2.Active:=true;

end;

32 of 34

Отобразить список полей

  • через AdoConnection

AdoConnection1.GetFieldNames('t1',ListBox2.Items);

  • через AdoTable

ListBox2.Items:=adoTable1.FieldDefList;

  • через AdoDataSet

AdoDataSet2.Close;

AdoDataSet2.CommandText:='SELECT * FROM t1';

AdoDataSet2.Open;

ListBox2.Items.Clear;

for i:=0 to adodataset2.FieldDefs.Count-1 do

listbox2.Items.Add(AdoDataSet2.FieldDefs.Items[i].Name);

33 of 34

SQL

34 of 34

способы работы через AdoQuery

procedure TForm1.btn1Click(Sender: TObject);

var s: string;

begin

tbl1.Active:=false;

s:=Edt1.Text;

qry1.SQL.Text:='INSERT INTO t1(имя, возраст) VALUES ('''+s+''', 43)';

qry1.ExecSQL;

tbl1.Active:=True;

end;

procedure TForm1.btn2Click(Sender: TObject);

begin

qry2.SQL.Text:='SELECT DISTINCT имя FROM t1 ORDER BY имя DESC';

qry2.Active:=True;

end;