Текущий архив: 2008.04.13;
Скачать: CL | DM;
Вниз
Работа с ADO Найти похожие ветки
← →
Nucer (2007-11-19 22:11) [0]
try
ADODataSet.RecordSet := AdoConnection.Execute("SELECT name FROM users WHERE age>20");
except
for i:=0 to ADOConnection.Errors.Count-1 do ATL("ADO: "+ADOConnection.Errors.Item[i].Description,mtError);
exit;
end;
if ADODataSet.RecordCount=0 then
begin
ATL("Empty Table",mtError);
exit;
end;
for i:=0 to ADODataSet.RecordCount-1 do
begin
ATL(ADODataSet.Fields[0].AsInteger,mtInfo);
ADODataSet.Next;
end;
ADODataSet.Close;
Правильно ли все делаю? В конце надо вызывать ADODataSet.Close?
← →
sniknik © (2007-11-19 23:20) [1]> Правильно ли все делаю?
нет конечно. зачем такие сложности с получением ошибки? и с получением рекордсета? почему запрос прямо в рекордсет не "вложить"? (можно даже в дизайне, и вместо 20 сделать параметр.)
в ексепте уже есть нужная ошибка, читай ее.
и цикл так с датасетами не делают, делают while not ADODataSet.Eof do ....
с for можно нарваться на непиятности...
и обращение к полю name (явно строковому) как AsInteger тоже доверия не вызывает.
> В конце надо вызывать ADODataSet.Close?
а данные в нем еще нужны?
← →
Slym © (2007-11-20 04:32) [2]
var Field:TField;
begin
//....
if ADODataSet.IsEmpty then
begin
ATL("Empty Table",mtError);
exit;
end;
Field:=ADODataSet.Fields[0];
while not ADODataSet.Eof do
begin
ATL(Field.AsInteger,mtInfo);
ADODataSet.Next;
end;
← →
Nucer (2007-11-20 10:35) [3]
> и с получением рекордсета? почему запрос прямо в рекордсет
> не "вложить"? (можно даже в дизайне, и вместо 20 сделать
> параметр.)
Это как?
> а данные в нем еще нужны?
Именно эти данные уже нет, но далее будут еще выполняться запросы. В этом случае надо закрывать (ADODataSet.Close) перед следующим запросом?
Можно как-то к полям обращаться не по индексам, а по названиям (что-то вроде ADODataSet.Fields["name"])?
P.S. AsInteger это я перепутал, текущий запрос составил для примера
← →
Nucer (2007-11-20 13:45) [4]Просто работал с базой кое-как, каждый раз в разных процедурах приходилось отлавливать исключения и выводить ошибки в лог (процедура ATL). Теперь понял, что так делать нельзя и решил написать функцию, отправляющую запрос, выводящую информацию об ошибках (если такие есть).
← →
Nucer (2007-11-20 16:13) [5]Вот так правильно?
function TfrmMain.QuerySelect(sql:string; args:array of const):_Recordset;
begin
sql:=format(sql,args);
try
result:=ADOConnection.Execute(sql);
except
on E:Exception do ATL(E.Message);
end;
end;
procedure TfrmMain.ButtonClick(Sender: TObject);
const
s="SELECT name FROM users WHERE age > %d";
var
Field:TField;
begin
ADODataSet.Recordset:=QuerySelect(s,[StrToIntDef(edit.text,0)]);
if not ADODataSet.IsEmpty then while not ADODataSet.EOF do
begin
ATL(ADODataSet.FieldByName("name").AsString);
ADODataSet.Next;
end;
ADODataSet.Close; //Надо?
end;
← →
sniknik © (2007-11-20 17:14) [6]> Вот так правильно?
как сказать... нормально, но както все, на мой вгляд усложнено, как специально. и нехватает кое чего.procedure TfrmMain.ButtonClick(Sender: TObject);
var
Field:TField;
begin
with ADODataSet do
try
DisableControls;
try
Close; //на всякий случай если решишь не закрывать гденибудь в конце (а используется этот датасет судя по всему не только здесь, т.к. запрос не забит в дизайне, что, имхо, лучше)
CommandText:= "SELECT name FROM users WHERE age>:age"; //универсальный возраст, так можно забить в дизайне, и меняя только параметр можно выбрать любой возраст, а смена запроса тут, уже не нужна.
Parameters.ParamByName("age").Value:= StrToIntDef(edit.text, 0);
Open;
Field:= FieldByName("name");
while not EOF do begin
ATL(Field.AsString);
Next;
end;
Close; //если данные не нужны то не помешает. ресурсы нужно освобождать
except
on E:Exception do ATL(E.Message);
end;
finally
EnableControls;
end;
end;
вот так точно правильно. (смущает еще только ATL, непонятная функция. и на результат и на ошибку одинаковая...)
← →
sniknik © (2007-11-20 17:18) [7]+
> if not ADODataSet.IsEmpty then
проверка бессмысленна т.к. дублирует следующее условие в while not EOF do begin поэтому не нужна.
Страницы: 1 вся ветка
Текущий архив: 2008.04.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.008 c