Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.04 c
15-1169129466
Bless
2007-01-18 17:11
2007.02.11
Какое на аравийском полуострове есть христианское государство?


1-1166097257
webpauk
2006-12-14 14:54
2007.02.11
добавление BitMap в ImageList


15-1169375293
syte_ser78
2007-01-21 13:28
2007.02.11
как распаковать tar.qz ?


2-1169556713
sergeyst
2007-01-23 15:51
2007.02.11
освобождение ресурсов


15-1169294773
Vovan #2
2007-01-20 15:06
2007.02.11
Большой EXE





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