Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
2-1206041013
tim
2008-03-20 22:23
2008.04.13
проблема со скачиванием страниц


15-1204224347
Kolan
2008-02-28 21:45
2008.04.13
Компоненты(виджеты) для touch screen, сужествуют ли такие?


15-1204405825
Alex
2008-03-02 00:10
2008.04.13
Как вывести в Edit переменную Integer?


2-1205447785
Германн
2008-03-14 01:36
2008.04.13
Вопрос про TADODataset.ParamCheck


2-1205868111
ARM
2008-03-18 22:21
2008.04.13
помогите !!! типизированные файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский