Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
ВнизСравнение "runtime" и "design time" Найти похожие ветки
← →
mefodiy (2010-08-16 10:02) [0]Есть база данных в MySQL, в которой много таблиц. В программе приходится использовать много запросов, иногда используя несколько компонентов TQuery одновременно. Вопрос такой: как лучше с точки зрения быстродействия, расходования оперативной памяти, размера exe файла, теории программирования и т.д. создавать (по мере необходимости) и уничтожать TQuery на лету в "runtime" или включить нужное количество этих компонент в "design time". Вопрос для мастеров может быть и наивный, но тем не менее прошу ответить.
← →
Сергей М. © (2010-08-16 10:08) [1]
> много запросов
> несколько компонентов
"Много" и "несколько" - понятия растяжимые.
← →
int64 © (2010-08-16 10:18) [2]А где и как ты создаешь формы с TQuery?
← →
12 © (2010-08-16 10:19) [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;
и вообще почти не тратимся на реализацию, только на логику
← →
mefodiy (2010-08-16 11:01) [4]
> А где и как ты создаешь формы с TQuery?
У меня есть Data Module, куда я бросил все компоненты TQuery. Их у меня по числу таблиц БД (в названиях TQuery использую названия таблиц), что конечно удобно, но, наверное, неэффективно.
← →
int64 © (2010-08-16 11:43) [5]Распихай TQuery по классам, их использующим. И в каждом случае смотри: где в полях держать, где локально создавать.
А если все TQuery в одну кучу валить, возникает проблема "глобальных переменных". Когда не знаешь, между какими объектами переменная служит буфером.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c