Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  131

•  TDictionary Custom Sort  3 314

•  Fast Watermark Sources  3 064

•  3D Designer  4 823

•  Sik Screen Capture  3 318

•  Patch Maker  3 532

•  Айболит (remote control)  3 633

•  ListBox Drag & Drop  2 994

•  Доска для игры Реверси  81 549

•  Графические эффекты  3 925

•  Рисование по маске  3 230

•  Перетаскивание изображений  2 610

•  Canvas Drawing  2 734

•  Рисование Луны  2 559

•  Поворот изображения  2 165

•  Рисование стержней  2 161

•  Paint on Shape  1 564

•  Генератор кроссвордов  2 226

•  Головоломка Paletto  1 764

•  Теорема Монжа об окружностях  2 213

•  Пазл Numbrix  1 682

•  Заборы и коммивояжеры  2 052

•  Игра HIP  1 279

•  Игра Go (Го)  1 224

•  Симулятор лифта  1 471

•  Программа укладки плитки  1 214

•  Генератор лабиринта  1 542

•  Проверка числового ввода  1 351

•  HEX View  1 489

•  Физический маятник  1 355

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Генератор 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;





Похожие по теме исходники

Календарь генератор

Генератор текстур

Генератор сигнала

TextureGen (генератор текстур)

 

Генератор лабиринтов

PassGen генератор паролей

Генератор импульсов

Генератор лабиринта

 

Генератор кроссвордов

Конструктор тестов SQL

SQL Zapros

Application Updater

 



Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте