Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Генератор SQL-запросов Insert/Update

Поиск:
Вам ещё не надоело динамически генерировать SQL запросы insert и update ? Давайте посмотрим, как можно раз и навсегда упростить этот процесс.

Допустим Вы создавали запрос следующим образом (типы параметров Data1:string Data2: integer Data3:TdateTime)

Код

SqlCmd := 'insert into MyTable (Field1,Field2,Field2) values (' +    
               QuotedStr(Data1) + ',' + IntToStr(Data2) + ',' + 'to_date('  
               + QuotedStr(FormatdateTime('dd/mm/yyyy',Data3)) + ','  
               + QuotedStr('dd/mm/yyyy') + '))';  


{Ужасно! ещё хуже, когда количество колонок увеличивается}

А если сделать функцию типа ..

Код

SqlCmd := SqlInsert([Data1,Data2,Variant(Data3)],  
                  'MyTable',  
                  ['Field1','Field2','Field3']);  


она эмулирует строку запроса наподобие ..

Код

insert into MyTable  
(Fields1,Field2,Field3)  
values ('Sweets',934,to_date('21/05/2001','dd/mm/yyyy'))  


неправда ли она более проста в использовании ?

Здесь представлены функции SqlInsert и SqlUpdate. Вы наверное заметили, что я передаю TDateTime приведённый как Variant. Причина кроется в том, что VType в array of const не имеете TDateTime типа и даты просто представлены как vtExtended.

Функция SqlInsert имеет 2 переопределённых вызова, которые позволяют Вам включить или выполнить массив имён колонок.


Посмотрим, как выглядят эти функции:

Код

interface  

const CrLf = #13#10;  // Возврат и перевод каретки  

// Прототипы функций  

function SqlInsert(Values : array of const;  
                  TableName : string;  
                  ColNames : array of string) : string; overload;  

function SqlInsert(Values : array of const;  
                  TableName : string) : string; overload;  

function SqlUpdate(Values : array of const;  
                  TableName : string;  
                  ColNames : array of string;  
                  WhereClause : string) : string;  

// ---------------------------------------------------------------------------  
implementation  

// Помещаем TDateTime в Values (array of const)  
// Представлен как Variant  

function SqlInsert(Values : array of const;  
                  TableName : string;  
                  ColNames : array of string) : string;  
var RetVar : string;  
   i : integer;  
begin  
 RetVar := 'insert into ' + TableName + CrLf +  
           '(' + ColNames[0];  
 for i := 1 to High(ColNames) do  
    RetVar := RetVar + ',' + ColNames[i];  
 RetVar := RetVar + ')' + CrLf;  

 RetVar := RetVar + 'values (';  

 for i := 0 to High(Values) do begin  
    case Values[i].VType of  
         vtInteger,  
         vtInt64    : RetVar := RetVar + IntToStr(Values[i].VInteger);  
         vtChar     : RetVar := RetVar + QuotedStr(Values[i].VChar);  
         vtString   : RetVar := RetVar + QuotedStr(Values[i].VString^);  
         vtPChar    : RetVar := RetVar + QuotedStr(Values[i].VPChar);  
         vtExtended : RetVar := RetVar + FloatToStr(Values[i].VExtended^);  
         vtAnsiString : RetVar := RetVar +  
                        QuotedStr(string(Values[i].VAnsiString));  
         // TDateTime - иначе получаем как vtExtended  
         vtVariant  : RetVar := RetVar + 'to_date(' +  
                      QuotedStr(FormatdateTime('dd/mm/yyyy',  
                      TDateTime(Values[i].VVariant^))) + ',' +  
                      QuotedStr('dd/mm/yyyy') + ')';  
    else  
      RetVar := RetVar + '??????';  
    end;  

    RetVar := RetVar + ',';  
 end;  

 Delete(RetVar,length(RetVar),1);  
 RetVar := RetVar + ')';  
 if High(Values) < High(ColNames) then  
    ShowMessage('SQL Insert - Not enough values.');  
 if High(Values) > High(ColNames) then  
    ShowMessage('SQL Insert - Too many values.');  

 Result := RetVar;  
end;  


function SqlInsert(Values : array of const;  
                  TableName : string) : string; overload;  
var RetVar : string;  
   i : integer;  
begin  
 RetVar := 'insert into ' + TableName + CrLf;  
 RetVar := RetVar + 'values (';  

 for i := 0 to High(Values) do begin  
    case Values[i].VType of  
         vtInteger,  
         vtInt64    : RetVar := RetVar + IntToStr(Values[i].VInteger);  
         vtChar     : RetVar := RetVar + QuotedStr(Values[i].VChar);  
         vtString   : RetVar := RetVar + QuotedStr(Values[i].VString^);  
         vtPChar    : RetVar := RetVar + QuotedStr(Values[i].VPChar);  
         vtExtended : RetVar := RetVar + FloatToStr(Values[i].VExtended^);  
         vtAnsiString : RetVar := RetVar +  
                        QuotedStr(string(Values[i].VAnsiString));  
         // TDateTime - иначе получаем как vtExtended  
         vtVariant  : RetVar := RetVar + 'to_date(' +  
                      QuotedStr(FormatdateTime('dd/mm/yyyy',  
                      TDateTime(Values[i].VVariant^))) + ',' +  
                      QuotedStr('dd/mm/yyyy') + ')';  
    else  
      RetVar := RetVar + '??????';  
    end;  

    RetVar := RetVar + ',';  
 end;  

 Delete(RetVar,length(RetVar),1);  
 RetVar := RetVar + ')';  

 Result := RetVar;  
end;  


function SqlUpdate(Values : array of const;  
                  TableName : string;  
                  ColNames : array of string;  
                  WhereClause : string) : string;  
var RetVar,Parm : string;  
   i : integer;  
begin  
 RetVar := 'update ' + TableName + ' set' + CrLf;  

 for i := 0 to Min(High(Values),High(ColNames)) do begin  
    case Values[i].VType of  
         vtInteger,  
         vtInt64    : Parm := IntToStr(Values[i].VInteger);  
         vtChar     : Parm := QuotedStr(Values[i].VChar);  
         vtString   : Parm := QuotedStr(Values[i].VString^);  
         vtPChar    : Parm := QuotedStr(Values[i].VPChar);  
         vtExtended : Parm := FloatToStr(Values[i].VExtended^);  
         vtAnsiString : Parm := QuotedStr(string(Values[i].VAnsiString));  
         // TDateTime - иначе получаем как vtExtended  
         vtVariant  : Parm := 'to_date(' +  
                      QuotedStr(FormatdateTime('dd/mm/yyyy',  
                      TDateTime(Values[i].VVariant^))) + ',' +  
                      QuotedStr('dd/mm/yyyy') + ')';  
    else  
      Parm := '??????';  
    end;  

    RetVar := RetVar + ColNames[i] + '=' + Parm + ',';  
 end;  

 Delete(RetVar,length(RetVar),1);  
 RetVar := RetVar + CrLf + 'where ' + WhereClause;  
 if High(Values) < High(ColNames) then  
    ShowMessage('SQL Update - Not enough values.');  
 if High(Values) > High(ColNames) then  
    ShowMessage('SQL Update - Too many values.');  

 Result := RetVar;  
end;  
Автор: Mike Heydon






Просмотров: 1913

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную