Главная страница
    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.037 c
2-1169586449
Pasha L
2007-01-24 00:07
2007.02.11
Когда следует вызывать connect от idhttp


2-1168648733
Wind
2007-01-13 03:38
2007.02.11
ANSI >UNICODE


15-1169071857
DillerXX
2007-01-18 01:10
2007.02.11
На сколько выстрелов обычно хватает глушителя?


9-1143442262
Gleb
2006-03-27 10:51
2007.02.11
Напишите пожалуйста алгаритм игры Пятнашки на кнопках Button


2-1169396785
md
2007-01-21 19:26
2007.02.11
динамический массив





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