Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.11;
Скачать: CL | DM;

Вниз

Размышления о построении 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.057 c
2-1169842797
Amychok
2007-01-26 23:19
2007.02.11
Медиаплеер


6-1157130974
KOLYA-rzn
2006-09-01 21:16
2007.02.11
Попытка написать rAdmin. Вопросы по Indy


15-1169202246
Kerk
2007-01-19 13:24
2007.02.11
Akismet Anti-Spam


2-1169571641
*Ray*
2007-01-23 20:00
2007.02.11
Модификация данных


2-1169890385
tu_21
2007-01-27 12:33
2007.02.11
Запись в Access