Программирование
Баз Данных
ТЕХНОЛОГИЯ ADO
clck.ru/9bxFT
Базы данных
Основные компоненты
вкладка DataControls
вкладки ADO, Data Access
1
DBGrid аналог StringGrid
Отображает табличную информацию
Другие аналоги
Label dbtxt1: TDBText;
Edit dbedt1: TDBEdit;
Memo dbmmo1: TDBMemo;
ComboBox dbcbb1: TDBComboBox;
CheckBox dbchk1: TDBCheckBox;
RadioGroup dbrgrp1: TDBRadioGroup;
Структура связей
Визуальный компонент
Компонент источник
Набор данных
Соединение с БД
БД
Технология ADO
Структура связей
Визуальный компонент
Компонент источник
Набор данных
Соединение с БД
БД
DBGrid DBText DBEdit DBMemo DBComboBox DBCheckBox DBRadioGroup
DataSource
ADODataSet ADOTable ADOQuery
ADOConnection
БД локальная, сетевая
Порядок проектирования снизу вверх
Отображение таблицы из БД
запрос в CommandText
select * from t1
просто выбираем таблицу
Отображение отдельных полей
Соединяем через наборы данных и выбираем одно поле
2
Избирательное отображение�записей таблицы
procedure TForm1.btn2Click(Sender: TObject);
begin
ds1.Filter:='[Возраст]>'+edt2.Text;
ds1.Filtered:=True;
end;
4
Избирательное отображение�записей таблицы
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;
Внести в поле таблицы
procedure TForm1.dbedt1Change(Sender: TObject);
begin
tbl1.Edit;
tbl1.FieldValues['Возраст']:=dbedt1.Text;
end;
Динамическое подключение БД�через ADODataSet
procedure TForm1.FormActivate(Sender: TObject);
begin
try
con1.Connected:=true;
ds1.Active:=true;
except
ShowMessage('нет БД');
end;
end;
Зафиксировать даже если не закончилось редактирование
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;
Узнать имя столбца и номер столбца таблицы, значение поля
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;
Конструктор запросов Access
Поиск информации
label1.Caption := table1.Lookup('Имя', edt1.Text, 'Возраст');
Метод у набора данных - функция
Lookup(KeyField, KeyValues, ResultField);
Поле поиска
Значение
поиска
Поле результата
поиска
SQL - Итоговые функции
Итоговые, статистические, агрегатные или суммирующие - функции обрабатывают набор строк и возвращают одно значение:
COUNT() функция возвращает число строк в столбце.
MAX() функция возвращает максимум в столбце.
MIN() функция возвращает минимум в столбце.
SUM() функция возвращает сумму значений столбца.
�
SELECT MIN(price), MAX(price), AVG(price)
FROM prices;
Сумма по колонке 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
Сумма по колонке 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
Сумма по колонке SQL
with qry1 do
begin
Close;
SQL.Clear;
SQL.Add('Select sum([Ср Балл]) FROM t1');
Open;
btn3.Caption :=
FloatToStr(Fields.Fields[0].AsFloat);
end;
3
Добавить запись�даже если есть счетчик
tbl1.Active:=false;
qry1.SQL.Text:=
'INSERT INTO t1(имя, возраст)
VALUES ('''+'Andrey'''+', 43)';
qry1.ExecSQL;
tbl1.Active:=True;
Добавить запись�даже если есть счетчик
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;
Изменить запись�даже если есть счетчик
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;
Добавить запись
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;
если нет счетчика
Запись картинки в ADO таблицу
ADOQuery1.Edit;
TBLOBField(ADOQuery1.FieldByName('myField')).
LoadFromFile('c:\my.bmp');
DOQuery1.Post;
При клике мышкой по таблице
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
form1.Caption := DBGrid1.SelectedField.Text + ':' +
IntToStr(Column.Index) + ':' +
Column.FieldName;
end;
При клике мышкой по объекту
procedure TForm1.cal1Click(Sender: TObject);
begin
tbl1.Edit;
tbl1.FieldByName('дата').AsDateTime:=cal1.Date;
tbl1.Post;
cal1.Visible:=False;
end;
Удалить текущую запись
Удалить текущее поле
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;
При изменении положения в таблице
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;
Отобразить список таблиц
procedure TForm1.FormActivate(Sender: TObject);
begin
con1.GetTableNames(lst1.Items);
end;
Из списка таблиц выбрать
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;
Отобразить список полей
AdoConnection1.GetFieldNames('t1',ListBox2.Items);
ListBox2.Items:=adoTable1.FieldDefList;
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);
SQL
способы работы через 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;