Главная страница
    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.55 MB
Время: 0.046 c
3-1163953908
click
2006-11-19 19:31
2007.02.11
Query в цикле


15-1169415457
Kerk
2007-01-22 00:37
2007.02.11
Skype пытается отобрать домен skype.tv за $75


2-1169609787
exolon
2007-01-24 06:36
2007.02.11
Помогите укротить типизированный файл.


2-1169474414
Mishenka
2007-01-22 17:00
2007.02.11
Как отловить событие наведения и увода указателя мыши с формы?


15-1169067840
Real
2007-01-18 00:04
2007.02.11
IE совсем что-то захирел...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский