![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение "runtime" и "design time" [D7, XP]
mefodiy © (2010-08-16 10:02:00)Есть база данных в MySQL, в которой много таблиц. В программе приходится использовать много запросов, иногда используя несколько компонентов TQuery одновременно. Вопрос такой: как лучше с точки зрения быстродействия, расходования оперативной памяти, размера exe файла, теории программирования и т.д. создавать (по мере необходимости) и уничтожать TQuery на лету в "runtime" или включить нужное количество этих компонент в "design time". Вопрос для мастеров может быть и наивный, но тем не менее прошу ответить.
int64 (2010-08-16 11:43:00) [1]Распихай TQuery по классам, их использующим. И в каждом случае смотри: где в полях держать, где локально создавать.
А если все TQuery в одну кучу валить, возникает проблема "глобальных переменных". Когда не знаешь, между какими объектами переменная служит буфером.
mefodiy (2010-08-16 11:01:00) [2]
> А где и как ты создаешь формы с TQuery?
У меня есть Data Module, куда я бросил все компоненты TQuery. Их у меня по числу таблиц БД (в названиях TQuery использую названия таблиц), что конечно удобно, но, наверное, неэффективно.
12 (2010-08-16 10:19:00) [3]не знаю
делаю так: (заодно может кто про код что скажет, лучше сразу словить от форума, чем после от заказчика :) )
основные кидаю, а вспомогательные создаю
написал unit для созданий, и создавать получается не долго
например
OpenQ(oqTmp, 'select CODEPAGE_ID, SEPARATOR from PARAMS where SUBSCRIBER_ID = :SUBSCRIBER_ID', [FSubscrID] );
открыть
OpenQC(oqTmp, 'select CODEPAGE_ID, SEPARATOR from PARAMS where SUBSCRIBER_ID = :SUBSCRIBER_ID', [FSubscrID] );
создать и открыть
ExecQC(oqTmp, 'update PARAMS set AAA= 22323 where SUBSCRIBER_ID = :SUBSCRIBER_ID', [FSubscrID] );
создать, выполнить
и не забывать FreeAndNil()
---
где
procedure OpenQ(const Q:tORAQuery; const SQL:string; const P:array of variant);
var
i:integer;
s:string;
begin
try
Q.SQL.Text := SQL;
s := '';
for i := 0 to Q.ParamCount-1 do
begin
Q.Params[i].Value := P[i];
s := s + Q.Params[i].Name + '=' + Q.Params[i].AsString + #13#10;
end;
Q.Open;
except
on E:Exception do
begin
E.Message := E.Message + #13#10 + 'uUtils. procedure OpenQ.' + #13#10 + Q.SQL.Text + #13#10 + s;
Raise;
end;
end;
end;
или например
procedure CreateQ(var Q:tORAQuery);
begin
if Session = nil then Raise Exception.Create('uUtils. CreateQ. Неинициализированная пременная модуля Session');
Q := tORAQuery.Create(nil);
Q.Session := Session;
end;
procedure OpenQC(var Q:tORAQuery; const SQL:string; const P:array of variant);
begin
CreateQ(Q);
OpenQ(Q, SQL, P);
end;
и кажется уже проще не кидать, а создавать..
ну и еще написать пару костылей можно
if GetFld(oqData, 'DRIVE_WAY', V) then edtDriveWay.Text := V;
или
SetByFld(sPhone, oqHelp, 'PHONE');
где
function GetFld(const Q:tORAQuery; const Fld:string; var Val:Variant):boolean;
begin
Result := true;
if Q.IsEmpty then
begin
Result:=false;
Val := varEmpty;
Exit;
end;
if Q.FindField(Fld) = nil then
begin
Raise Exception.Create('Поле ' + Fld + ' не найдено в uUtils.GetFld.Q ');
Exit;
end;
if Q.FieldByName(Fld).IsNull then
begin
Result := False;
Val := varNull;
Exit;
end;
Val := Q.FieldByName(Fld).Value;
end;
procedure SetByFld(Var S:String; const Q:tORAQuery; const Fld:string);
var
V: Variant;
begin
if GetFld(Q, Fld, V) then S := V;
end;
и вообще почти не тратимся на реализацию, только на логику
int64 (2010-08-16 10:18:00) [4]А где и как ты создаешь формы с TQuery?
Сергей М. (2010-08-16 10:08:00) [5]
> много запросов
> несколько компонентов
"Много" и "несколько" - понятия растяжимые.