Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];
ВнизРазмышления о построении SQL-запроса. Найти похожие ветки
← →
Kostafey © (2007-01-17 11:22) [40]> clickmaker ©
Боже мой ! Что это ? Стасибо огромное, но у меня удут годы чтобы это освоить !
А если серьезно, то обязательно постараюсь разобраться как это применять-то хотя бы.
Консультации та эту тему не предусмотрены ?
← →
vidiv © (2007-01-17 11:54) [41]я обычно использую константы и функцию format... единственный минус - это то, что дельфи не подволяет вводит многостроковые константы. Я имеею ввиду как, например в php:
query("
SELECT
...
WHERE
...
").
Поэтому приходится каждый запрос тщательно отлаживать
← →
КиТаЯц © (2007-01-17 12:09) [42]
> Kostafey © (16.01.07 23:46)
>
> ...
> В последнее время пишу в основном какой-то странный код,
> нелепая смесь паскаля и SQL.
> ...
А что? Это не всегда плохо. Я вот, например так измачиваюсь:function UpdSQL(Base:tIBDataBase; TableName: string;
FieldsName: array of string; NewValues: array of variant;
WhereField: string; WhereValue: variant; DoCommitRetaining: boolean = True): boolean; overload;
var ibSQL: tIBSQl; S: string; I: Integer;
begin
if (Length(FieldsName) <> Length(NewValues))
then begin
raise Exception.Create("Неправильно заполнены параметры в функции"+_+"UpdSQL");
exit;
end;
ibSQL:= tIBSQl.Create(Base);
try
ibSQL.SQL.Add("UPDATE"+_+TableName+_+"SET"+_); S:="";
for I:= 0 to High(FieldsName) do S:= S+TableName+"."+FieldsName[i]+"="+":"+IntToStr(i)+",";
SetLength(S, Length(S)-1);
ibSQL.SQL.Add(S+_+"WHERE"+_+"("+WhereField+"="+":KEY)");
for I:= 0 to High(NewValues) do begin
ibSQL.ParamByName(IntToStr(i)).IsNull:= (AnsiUpperCase(VarToStr(NewValues[i])) = "NULL");
if not ibSQL.ParamByName(IntToStr(i)).IsNull
then ibSQL.ParamByName(IntToStr(i)).Value:= NewValues[i];
end;
ibSQL.ParamByName("KEY").Value:= WhereValue;
ibSQL.ExecQuery;
finally
ibSQL.Close; ibSQL.Free;
if DoCommitRetaining then Base.DefaultTransaction.CommitRetaining;
Base.DefaultTransaction.Active:=True;
end;//finally
Result:= True;
end;
function UpdSQL(Base:tIBDataBase; TableName: string;
FieldsName: array of string; NewValues: array of variant;
WhereField1:string; WhereValue1:variant; WhereField2:string; WhereValue2:variant; DoCommitRetaining: boolean = True): boolean; overload;
var ibSQL: tIBSQl; S: string; I: Integer;
begin
...
Ну и т.д. InsSQL, DelSQL ...
← →
КиТаЯц © (2007-01-17 12:14) [43]add к [42]
Const _ = " ";
← →
_inic (2007-01-17 14:55) [44]> clickmaker [38]
А неплохая идея, почему-то о таком подходе не задумывался. Например, можно сделать набор классов для разных СУБД с учетом специфики SQL-синтаксиса.
Беглым взглядом не видно где формируются строки с использованием joins, хотя классы присутствуют. Альфа-версия ?
← →
Kostafey © (2007-01-17 16:54) [45]> clickmaker ©
А как реализовано CreateQuery ?
TADOQuery.Create(Query) - работает, но пишет предупреждение , мол Query не инициализировано.
> [42] КиТаЯц © (17.01.07 12:09)
Хоть кто-то солидарен.
Вообще у меня как-то сразу появилась мысль о том, что запрос должен быть не просто записан, а он должен "полуавтоматически" формироваться.
Ну а поскольку я срузу приступил к написанию кода, и по ходу дела лепил процедуры получилось не очень.
Т.е. пишу запрос. Глядь, проглядывавется какая-то тенденция - в процедурку ее !
← →
clickmaker © (2007-01-17 17:11) [46]
> [44] _inic (17.01.07 14:55)
> > clickmaker [38]
>
> Беглым взглядом не видно где формируются строки с использованием
> joins, хотя классы присутствуют. Альфа-версия ?
нет, и даже не бета. Их можно использовать для реализации вложенных подзапросов.
Но я привел только фрагмент, для затравки, так сказать. Остальное несложно домыслить и заточить под себя.
> [45] Kostafey © (17.01.07 16:54)
> > clickmaker ©
>
> А как реализовано CreateQuery ?
ну что-то типаQ:=TADOQuery.Create(nil);
Q.Name:="Query"+IntToStr(QueryCount); // для уникальности можно вести счетчик имен
Q.Connection:=<твой ADOConnection>
Q.SQL.Text := Stmt;
← →
Kostafey © (2007-01-17 17:37) [47]> [46] clickmaker © (17.01.07 17:11)
Значит буду следующий проект писать - возьму ваши исходники за основу.
Для этого что-то менять уже поздновато. его уже заканчивать на днях нужно.
Все же с чего начинали - к тому вернулись: возможны и удобные механизмы построения запроса,
и не всегда только готовый текст запроса (хранимый тет или иным образом) есть единственно верное решение.
Всем спасибо за участие в обсуждении !
← →
SpellCaster (2007-01-18 11:35) [48]> ADOQuery1.SQL.Text := "";
> for i := 1 to ZVKTableCount do
> ADOQuery1.SQL.Text := ADOQuery1.SQL.Text +
> "delete from " + ZVKTableNames[i] + " "#13#10;
По-моему, логичнее делать ADOQuery1.SQL.Add("delete from " + ZVKTableNames[i] + " "). И выполняться быстрее будет.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.037 c