powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Насчет свойств формирования SQL запроса
64 сообщений из 64, показаны все 3 страниц
Насчет свойств формирования SQL запроса
    #39557529
Здравствуйте. Есть класс, реализующий доступ к некоторой БД.

Код: pascal
1.
2.
type
  TMyQuery = class(...)

...
Со свойствами, реализующими функционал формирования SQL запросов:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  private
    fSQL: TStrings;
    procedure SetSQLMore(const aValue: string);
    procedure SetSQLText(const aValue: string);
    function GetSQLText: string;
  public
    property SQLText: string read GetSQLText write SetSQLText;
    property SQLMore: string write SetSQLMore;
  end;

implementation

function TMyQuery.GetSQLText: string;
begin
  Result := fSQL.Text
end;

procedure TMyQuery.SetSQLMore(const aValue: string);
begin
  fSQL.Text := aValue
end;

procedure TMyQuery.SetSQLText(const aValue: string);
begin
  fSQL.Add(aValue);
end;


Вот так пользоваться:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  fMyDS: TMyQuery;
begin
...
  fMyDS.SQLText := 'select * from MyTable mt';
  fMyDS.SQLMore := '  where mt.Filed1 is not null';
  fMyDS.SQLMore := '    and mt.Filed2 = 42';


Все нормально, но выглядит подозрительно. Может, просто создать паблик - свойство
Код: pascal
1.
    property SQL : TStrings read fSQL;


?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557538
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведем очередь c ума,

А зачем изначально разделили SQLText и SQLMore?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557540
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведем очередь c ума
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TMyQuery.GetSQLText: string;
begin
  Result := fSQL.Text
end;

procedure TMyQuery.SetSQLMore(const aValue: string);
begin
  fSQL.Text := aValue
end;

Поменяй местами названия этих функций и начнет работать, как ты хочешь.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557542
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведем очередь c ума
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyQuery.SetSQLMore(const aValue: string);
begin
  fSQL.Text := aValue
end;

procedure TMyQuery.SetSQLText(const aValue: string);
begin
  fSQL.Add(aValue);
end;

Тю, блин, этих.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557544
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterСведем очередь c ума,

А зачем изначально разделили SQLText и SQLMore?Это наверно специально, секретный код пишут. Чтоб потом, даже если исходники украдут, никто не понял ничего. Тут сам автор, видишь, уже в трех строках запутался.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557547
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Да накой плодить кучу геттеров/сеттеров для работы с одним текстом SQL запроса? С ростом числа таких пропертей получаем неоднозначное поведение (SQLMore это что - "дайте две"?) + провоцируем "забывание" установки какого-то свойства + сложность понимания кода.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557549
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterпровоцируем "забывание" установки какого-то свойства + сложность понимания кода.Ну я думал, в этом и смысл.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557557
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Развожу руками :) Я знаю одну либу, где у Query есть доп. проперти типа SQLWhere, SQLOrder и т.п. - но эти свойства используются для получения доступа к отдельным частям запроса, не более, и являются продуктом парсинга SQL запроса - применимы эти проперти в 0.1% случаев, в остальном в принципе бесполезны. Ну если ТС хочет игру в угадайку "а чего я сейчас сделаю знаешь?" - пусть себе.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557562
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterДа накой плодить кучу геттеров/сеттеров для работы с одним текстом SQL запроса?

Ну, например, потому, что "назначить текст запроса" и "добавить к запросу ещё одно
условие" это две разные операции. Но что имел на мысли автор кода - неясно. Возможно,
некоторую дополнительную обработку текста (типа автоматического добавления where и and по
необходимости):
Код: sql
1.
2.
3.
fMyDS.SQLText := 'select * from MyTable mt';
fMyDS.SQLMore := 'mt.Filed1 is not null';
fMyDS.SQLMore := 'mt.Filed2 = 42';


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557575
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу, например, потому, что "назначить текст запроса" и "добавить к запросу ещё одно
условие" это две разные операцииНу да. И
SQL.Text :=
и
SQL.Text.Add

для этого использовать конечно же не интересно.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557595
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockдля этого использовать конечно же не интересно.

А местами - просто невозможно (если у "подкладки" запрос хранится не в TStrings).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557609
YuRockСведем очередь c ума
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyQuery.SetSQLMore(const aValue: string);
begin
  fSQL.Text := aValue
end;

procedure TMyQuery.SetSQLText(const aValue: string);
begin
  fSQL.Add(aValue);
end;

Тю, блин, этих.

Да. :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557611
Dimitry Sibiryakov...Но что имел на мысли автор кода - неясно...


SQLText заменяет весь SQL текст.
SQLMore добавляет текст к уже имеющемуся.

PS: Я в коде реализаторов накосячил: 20975499
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557616
Сведем очередь c умаYuRockпропущено...
Тю, блин, этих.

Да. :)

Вот так должно быть:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
type
  TMyQuery = class(...)
...
  private
    fSQL: TStrings;
    procedure SetSQLMore(const aValue: string);
    procedure SetSQLText(const aValue: string);
    function GetSQLText: string;
  public
    property SQLText: string read GetSQLText write SetSQLText;
    property SQLMore: string write SetSQLMore;
  end;

implementation

function TMyQuery.GetSQLText: string;
begin
  Result := fSQL.Text
end;

procedure TMyQuery.SetSQLText(const aValue: string);
begin
  fSQL.Text := aValue
end;

procedure TMyQuery.SetSQLMore(const aValue: string);
begin
  fSQL.Add(aValue);
end;
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557628
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведем очередь c ума,

Введи еще тогда свойство Filter :string и Filtered:boolean... Вещь нужная кстати.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557656
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не удивляюсь, что потом находятся противники ООП. Я тоже против такого 'ООП' :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557692
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сведем очередь c ума,

А если у Вас будет запрос с параметрами
parambyname()......
как Ваша модель будет работать ?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557892
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что, в Делфи многострочные литералы в ближайшие 10-20 лет не появятся?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557911
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxа что, в Делфи многострочные литералы в ближайшие 10-20 лет не появятся?
Код: pascal
1.
2.
3.
4.
SQL.Add(
  '1234'#13#10 +
  'qwer'
);


Такие?
Или в чем проблема?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557916
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockandreymxа что, в Делфи многострочные литералы в ближайшие 10-20 лет не появятся?
Код: pascal
1.
2.
3.
4.
SQL.Add(
  '1234'#13#10 +
  'qwer'
);



Такие?
Или в чем проблема?такие
Код: pascal
1.
2.
3.
4.
5.
6.
SQL.Add('
select *
  from table1 t1
   left join table2 t2
      on t1.id1 = t2.id2
 where t2.name = :p_name');
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557919
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

не думаю, что такое появится. Хотя не знаю, но мне лично не особо и нужно. Я плюсики ставлю и не жужжу. Тем более, символы переноса строки могут быть разными.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557928
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв Делфи многострочные литералы в ближайшие 10-20 лет не появятся?

Врятли. Корни растут из pascal. Да и не нужно это особо никому, мне кажется.

У меня возле баз довольно много обвязки, целые запросы я использую не так часто, чаще 'конструкторы' запросов. Очень удобно.

авторА если у Вас будет запрос с параметрами

Написал небольшую процудерку, все запросы парсятся, строчные параметры заменяются на ':Fieldn' (n = 0,1,2,3), параметры добавляются в компоненту с помощью ParamByName и делается запрос. Удобно - само всё обрабатывается.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557955
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

а можете более детально рассказать (показать пример)
застрял сейчас этим вопросом.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39557971
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxа что, в Делфи многострочные литералы в ближайшие 10-20 лет не появятся?
Надеюсь, нет. Я понимаю их пользу для убогих инструментов типа Явы, но в Делфи они будут только провоцировать плохой стиль программирования.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558152
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

что конкретно?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558252
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

У меня в классе есть метод выполняющий запросы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TClients.getSQLrequest(sql: string);
begin
 with fDataModule_modelwork do begin
  try
  IBQuery_SQLrequest.SQL.Clear;
  IBQuery_SQLrequest.SQL.Add(sql);
  IBQuery_SQLrequest.Open;
  except
  on e: exception do
  MessageDlg('Ошибка выполнения запроса'+#13#10+e.message, mtError, [mbOk], 0);
  end;
 end;
end;



Есть методы через которые запросы отправляються

Код: pascal
1.
2.
3.
4.
procedure TClients.getClients_list();
begin
getSQLrequest('select ID,NAME from CLIENTS');
end;



С таким запросом проблем нет, а вот если в запрос необходимо передать параметр например 'select ID,NAME from CLIENTS where id=:id_client' нехочеться в сам запрос вставлять переменные например ('select ID,NAME from CLIENTS where id='+id_client ) а передавать через ParamByName
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558286
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua,

Можно в сделать не процедуру, а функцию, которая вернет Query. Что-то в таком роде (только каркас):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function GetSQLQuery(Sql:string):TIB_Query;
begin
   Result:=TIBQuery.Create(nil);   // тут могут быть варианты, можно взять уже созданную где-то Query
   Result.SQL.Text:=Sql;
   Result.Prepare;
end;


var Q:TIBQuery;

Q:=GetSQLQuery('select name from clients where id=:id');
Q.ParamByName('id').AsInteger:=123;
Q.Open;
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558291
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Установку транзакции и соединения, старт транзакции и т.п. - я опустил если что.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558308
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

в этом случае лучше сделать следующий шаг, обойтись и без процедуры, и без функции, а воспользоваться нормальным компонентом, настроенным в дизайн-тайме.

Функция типа "сделай запрос" нужна тогда, когда требуется реализовать какую-то мелочь, под которую жалко и несоразмерно использовать тяжёлую артиллерию. Впрочем, со временем я всё больше убеждаюсь, что потребность в таких функциях означает плохой дизайн приложения. Но тем не менее, в идеале API для неё выглядит примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
{ Сформировать настроенный dataset }
function MakeQuery(const ASQL: string; Params: array of const): TXYZQuery;

{ Выполнить запрос и вернуть двумерный массив значений }
function SelectSQL(const ASQL: string; Params: array of const): variant;

{ Выполнить DML/анонимный блок и вернуть out-параметры }
function ExecSQL(const ASQL: string; Params: array of const): variant;

{ Выполнить хранимку и вернуть out-параметры }
function ExecSP(const ASQL: string; Params: array of const): variant;


Три последних, соответственно, пользуются первой. Первая нужна, например, для более эффективного фетча в случае долгих запросов.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558328
Sashauamakhaon,

У меня в классе есть метод выполняющий запросы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TClients.getSQLrequest(sql: string);
begin
 with fDataModule_modelwork do begin
  try
  IBQuery_SQLrequest.SQL.Clear;
  IBQuery_SQLrequest.SQL.Add(sql);
  IBQuery_SQLrequest.Open;
  except
  on e: exception do
  MessageDlg('Ошибка выполнения запроса'+#13#10+e.message, mtError, [mbOk], 0);
  end;
 end;
end;



Есть методы через которые запросы отправляються

Код: pascal
1.
2.
3.
4.
procedure TClients.getClients_list();
begin
getSQLrequest('select ID,NAME from CLIENTS');
end;



С таким запросом проблем нет, а вот если в запрос необходимо передать параметр например 'select ID,NAME from CLIENTS where id=:id_client' нехочеться в сам запрос вставлять переменные например ('select ID,NAME from CLIENTS where id='+id_client ) а передавать через ParamByName

Для таких безобразий ("получить значение по-быстрому") класс, инкапсулирующий объект коннекта, имеет метод:

Код: pascal
1.
2.
3.
    function QueryValue(const aSQL: string; FieldNo: integer {"-1" - для изменений};
      ParamValues: array of variant; 
      aTransaction: TMyTransaction = nil (если не указано - создается "внутренняя транзакция")): Variant; overload;



Код: pascal
1.
2.
3.
  fId := fMyConnect.QueryValue('select id from MyTable where FullName = :FullName', 0, ['Хонда Икс Рэй']);
...
  fMyConnect.QueryValue('update MyTable set FullName = :FullName where id = :id', -1, ['Хонда Икс Рэй - 666', fId], fMyUpdateTransaction);
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558429
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

В одном проекте видел функционал, завязанный именно на динамическое создание Query. Такое впечатление, что пытались эмулировать LINQ или сгородить что-то свое. Пользоваться в принципе можно было, но я бы такого не делал, если проект большой достаточно.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558441
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerDarkMaster,
Функция типа "сделай запрос" нужна тогда, когда требуется реализовать какую-то мелочь, под которую жалко и несоразмерно использовать тяжёлую артиллерию.

Поделюсь и своими наблюдениями :) Есть кучка подразделений, которым нужно время от времени посмотреть какой-то отчет (отчеты разные, часто меняются/дополняются). Для этого сделали подсистему, которая умеет строить список доступных для пользователя отчетов, брать текст SQL запроса из БД, при наличии параметров - строить форму для их ввода, выводить результаты в сетку и экспортировать при необходимости куда нужно. Весь код (подсистемы) влез в пару экранов + 1 dfm (форма с PageControl) - все делается с помощью динамически создаваемых Query. Вся работа по поддержке - написать запрос и внести его в специальную табличку вместо постоянной возьни в IDE с настройками в design-time. Как-то так.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558478
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу кинуть самый главный кусок функции.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  IBSQL.Close;
  IBSQL.SQL.Clear;
  if not IBSQL.Transaction.Active then
   IBSQL.Transaction.StartTransaction;
  s1 := UpperCase(Copy(s, 1, 6));
  if (s1 = 'UPDATE') or (s1 = 'INSERT') then
  begin
   List := TStringList.Create;
   try
    TempB := Pos('"', s);
    TempE := NPos('"', s, 2);
    s1 := s;
    while TempB > 0 do
    begin
     List.Add(ReplaceChr(CopyLim(s1, TempB, TempE), '', '"'));
     s1 := ReplaceStr(':Field' + IntToStr(List.Count), s1, TempB - 1, TempE);
     TempB := Pos('"', s1);
     TempE := NPos('"', s1, 2);
    end;
    IBSQL.SQL.Add(s1);
    for i1 := 0 to List.Count - 1 do
     IBSQL.ParamByName(Format('Field%d', [i1 + 1])).AsString := List.Strings[i1];
   finally
    FreeAndNil(List);
   end;
  end



Тут парочка частных функций. И местами частное исполнение. Но, думаю, идея будет понятна.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558484
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

что это?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558521
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДmakhaon,

что это?

Попытка применить параметры только для INSERT/UPDATE видимо. О том, что параметры могут быть для SELECT - догадываются, но значения не придают. О том, что двойные кавычки вполне себе легитимный символ для некоторых SQL серверов и даже диалектов внутри одного SQL сервера - наверное тоже. Ну и так - по мелочи (экранируемые символы по идее тоже лесом пойдут - не всматривался). Но это я так - брюзжу по-стариковски.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558531
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterпараметры могут быть для SELECTи для execute. И прбелы могут вначале быть или другие незначащие символы. И Transaction может быть =nil...
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558547
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

я же написал - частный случай. для моего, частного, случая (FB), работает отлично 10+ лет. нужно - дописывайте по образу.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558548
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

автори для execute. И прбелы могут вначале быть или другие незначащие символы. И Transaction может быть =nil...

у меня не может быть. ни то, ни другое.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558554
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonМогу кинуть самый главный кусок функции.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  IBSQL.Close;
  IBSQL.SQL.Clear;
  if not IBSQL.Transaction.Active then
   IBSQL.Transaction.StartTransaction;
  s1 := UpperCase(Copy(s, 1, 6));
  if (s1 = 'UPDATE') or (s1 = 'INSERT') then
  begin
   List := TStringList.Create;
   try
    TempB := Pos('"', s);
    TempE := NPos('"', s, 2);
    s1 := s;
    while TempB > 0 do
    begin
     List.Add(ReplaceChr(CopyLim(s1, TempB, TempE), '', '"'));
     s1 := ReplaceStr(':Field' + IntToStr(List.Count), s1, TempB - 1, TempE);
     TempB := Pos('"', s1);
     TempE := NPos('"', s1, 2);
    end;
    IBSQL.SQL.Add(s1);
    for i1 := 0 to List.Count - 1 do
     IBSQL.ParamByName(Format('Field%d', [i1 + 1])).AsString := List.Strings[i1];
   finally
    FreeAndNil(List);
   end;
  end



Тут парочка частных функций. И местами частное исполнение. Но, думаю, идея будет понятна.

А что оно делает ?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558560
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Оно делает запросы с параметрами из просто запросов. Удобно - написал запрос и забыл.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558561
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonDarkMaster,

я же написал - частный случай. для моего, частного, случая (FB), работает отлично 10+ лет. нужно - дописывайте по образу.

Та у меня собственно никаких претензий и нет - у самого лисапед такой системы в сарае припрятан :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558570
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonschi,

Оно делает запросы с параметрами из просто запросов. Удобно - написал запрос и забыл.А почему нельзя имена параметров ставить такими же, как имена полей?
Я лично так делаю и потом их заполнение - наглядно и понятно.
Передаю в подобную ф-цию имя таблицы и массив-список полей, и генерится такое:
INSERT INTO TABLE(ID,NAME) VALUES(:ID,:NAME)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558572
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

1. Не стоит этот код воспринимать как догму :) Но как идею. Как будет реализовано - на усмотрение. Так называть, или по-другому, как удобно.

2. Мне удобно тем, что я пишу:

Код: pascal
1.
2.
MakeQuery(IBSQL1, Format('delete from fixes where fix_sel_str = "%s"', [SelStr]));
MakeQuery(IBSQL1, Format('insert into fixes (fix_sel_str, fix_data) values ("%s", "%s")', [SelStr, FixData]));


Функция сама разберется с параметрами.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558581
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

1. Не стоит этот код воспринимать как догму :) Но как идею. Как будет реализовано - на усмотрение. Так называть, или по-другому, как удобно.

2. Мне удобно тем, что я пишу:

Код: pascal
1.
2.
MakeQuery(IBSQL1, Format('delete from fixes where fix_sel_str = "%s"', [SelStr]));
MakeQuery(IBSQL1, Format('insert into fixes (fix_sel_str, fix_data) values ("%s", "%s")', [SelStr, FixData]));



Функция сама разберется с параметрами.
Ниче не понял. Если ты уже значения туда загнал, зачем тогда параметры уже? Чтоб потом их поменять можно было еще? Ну так вот, менять их нагляднее, когда они называются как поля, а не Param1, Param2.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558585
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon2. Мне удобно тем, что я пишу:
А инъектор о своём удобстве скромно умалчивает :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558611
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

авторНиче не понял. Если ты уже значения туда загнал, зачем тогда параметры уже?

затем, что на инсертах и апдейтах на некоторых серверах (подробностей за давностью не помню) просто не работает, валится с исключениями.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558615
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonschi,

Оно делает запросы с параметрами из просто запросов. Удобно - написал запрос и забыл.

"Каждой хозяйке и не надо покупать этот агрегат. Его одного на весь город хватит. Он будет установлен где-нибудь в центре города, скажем, на Невском. И там будет оборудован ЕГКОЦ - Единый Городской Консервооткрывательный Центр. Это очень удобно. Вот, скажем, пришли к тебе гости, надо для них шпроты открыть. Ты просто берёшь свою консервную банку, быстренько выходишь на улицу, едешь в ЕГКОЦ. Там сдаёшь банку приёмщице, платишь пять копеек новыми и получаешь квитанцию. Приёмщица наклеивает на банку ярлычок и ставит её на конвейер. А ты идёшь себе в зал ожидания, садишься в кресло и смотришь короткометражный фильм на консервную тему. Вскоре тебя вызывают к окошечку, ты предъявлять квитанцию, получаешь открытую банку и спокойненько едешь домой на Васильевский. Удобно, правда?"

Вадим Шефнер, "Скромный гений"
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558628
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль, что мы так и не услышали начальника транспортного цеха.

Михаил Жванецкий, "Собрание на ликеро-водочном заводе"
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558635
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

авторНиче не понял. Если ты уже значения туда загнал, зачем тогда параметры уже?

затем, что на инсертах и апдейтах на некоторых серверах (подробностей за давностью не помню) просто не работает, валится с исключениями.Некоторые сервера не поддерживают инсертов с константами? Только с параметрами?
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558639
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

Возможно, всё заканчивалось исключением.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558647
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterДля этого сделали подсистему, которая умеет строить список доступных для пользователя отчетов, брать текст SQL запроса из БД, при наличии параметров - строить форму для их ввода, выводить результаты в сетку и экспортировать при необходимости куда нужно. Весь код (подсистемы) влез в пару экранов + 1 dfm (форма с PageControl) - все делается с помощью динамически создаваемых Query. Вся работа по поддержке - написать запрос и внести его в специальную табличку вместо постоянной возьни в IDE с настройками в design-time. Как-то так.Тоже такая фигня есть. Но в отчете может быть несколько запросов, в виде иерархии со связанными полями для организации мастер-деталь, выводятся в cxGrid с уровнями. Можно нарисовать отчет в FastReport на этих же запросах, и сохранить в отчете. Потом ещё был допилен показ на внутреннем сайте.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558665
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, мой вариант лучше такого:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:=('INSERT INTO gryz (ooo_g, ati_g, Kontact_g, Telephone_g,' +
                          ' data_sv_g, cposob_opl_g, data_zag_g, data_vig_g, kakoy_gryz_g,' +
                          ' kyzov_g, ton_ob_g,tip_zagr_vigr_g, stavka_g,adres_zag_g, adres_vig_g,dopoln_g)' +
                          'VALUES (:OOO_g, :ati_g, :Kontact_g, :Telephone_g,' +
                          ' :data_sv_g, :cposob_opl_g, :data_zag_g, :data_vig_g, :kakoy_gryz_g,' +
                          ' :kyzov_g, :ton_ob_g, :tip_zagr_vigr_g, :stavka_g, :adres_zag_g, :adres_vig_g,:dopoln_g);');
ADOQuery1.Parameters.ParamByName('ooo_g').Value:=(DBEdit1.Text);
ADOQuery1.Parameters.ParamByName('ati_g').Value:=(DBEdit2.Text);
ADOQuery1.Parameters.ParamByName('Kontact_g').Value:=(DBEdit3.Text);
ADOQuery1.Parameters.ParamByName('Telephone_g').Value:=(DBEdit4.text);
ADOQuery1.Parameters.ParamByName('data_sv_g').Value:=(DBEdit12.Text);
ADOQuery1.Parameters.ParamByName('cposob_opl_g').Value:=(DBMemo1.Text);
ADOQuery1.Parameters.ParamByName('data_zag_g').Value:=(DBEdit10.text);
ADOQuery1.Parameters.ParamByName('data_vig_g').Value:=(DBEdit11.Text);
ADOQuery1.Parameters.ParamByName('kakoy_gryz_g').Value:=(DBEdit6.text);
ADOQuery1.Parameters.ParamByName('kyzov_g').Value:=(DBEdit5.text);
ADOQuery1.Parameters.ParamByName('ton_ob_g').Value:=(DBEdit7.Text);
ADOQuery1.Parameters.ParamByName('tip_zagr_vigr_g').Value:=(DBEdit8.Text);
ADOQuery1.Parameters.ParamByName('stavka_g').Value:=(DBEdit9.text);
ADOQuery1.Parameters.ParamByName('adres_zag_g').Value:=(DBMemo2.Text);
ADOQuery1.Parameters.ParamByName('adres_vig_g').Value:=(DBMemo3.text);
ADOQuery1.Parameters.ParamByName('dopoln_g').Value:=(DBMemo4.text);


У себя, впрочем, я такое вообще конструктором 'собираю':

Код: pascal
1.
2.
3.
4.
 AddContent('study_direct_show_code', StudyParams.StudyDirectShowCode, 16);
 AddContent('patient_uid', StudyParams.PatientUID);
 AddContent('study_uid', StudyParams.StudyUID);
 Execute;
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558673
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonмой вариант лучше такогоТакого вообще не бывает :)
Когда контролы называются Edit1,2,3,4,5,6... это не код, дальше можно не смотреть.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558674
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonМне кажется, мой вариант лучше такого:Просто ни ты ни автор приведенного кода не слышали про UpdateSQL. Типично, чо :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558747
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и у меня есть такой лисапед:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class function TMainDatabaseUtils.QueryValues(const AStmt: string; const Params: array of const): Variant;
.......
       v := TMainDatabaseUtils.QueryValues(Stmt, ['ID', PeopleRoleID]);
       if not VarIsNull(v) then
       begin
         DepID := v[0];
         OrgID := v[1];
         RoleTypeID := v[2];
         VarClear(v);
       end;


Для вставки можно генерить SQL:
Код: pascal
1.
class function BuildInsertStatement(const ATable: string; const IgnoreFields: array of const): string;


списки разные:
Код: pascal
1.
2.
3.
4.
     class procedure List(L: TStrings; const AStatement: string; const AParams: array of const;
                          AOptions: TSelectListTypes;
                          const IDField: string = 'ID';
                          const NameField: string = 'NAME');


и вообще очень много подобного накопилось.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558753
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerФункция типа "сделай запрос" нужна тогда, когда требуется реализовать какую-то мелочь, под которую жалко и несоразмерно использовать тяжёлую артиллерию. Впрочем, со временем я всё больше убеждаюсь, что потребность в таких функциях означает плохой дизайн приложения.

Если приложение для одной конкретной задачи, то, наверное, потребности в таких подручных средствах и не должно возникать, но для большой мультимегаполисистемы всего в классы не задизайнишь ))
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558788
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon:cposob_opl_g

В мемориз! Такого я на протяжении своей долгой работы с базами данных еще не встречал
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558830
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик,

авторПросто ни ты ни автор приведенного кода не слышали про UpdateSQL.

1. Знаток Гхостик наверно не в курсе, что к IBSQL IBUpdateSQL вообще не цепляется
2. А даже если бы и цеплялся (как к IBQuery) он слабо поможет, если нужно делать запросы к разным таблицам. Точнее - поможет, но эти же запросы придётся в него же и добавлять вместо того, что бы просто добавить в IBQuery. А еще лучше, собрать запрос конструктором.

авторТакого я на протяжении своей долгой работы с базами данных еще не встречал

Чего только на развалах в интернетах не встретишь
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558872
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Знаток Гхостик наверно не в курсе, что к IBSQL IBUpdateSQL вообще не цепляется
В приведенном коде - db-aware контролы. Т.е. явно TDataSet. К которому IBUpdateSQL легко цепляется. А сравнивать свое решение с явно плохим - значит заранее занижать свою планку качества.

> эти же запросы придётся в него же и добавлять вместо того, что бы просто добавить в IBQuery.
Чем "просто добавить" проще чем "добавить"? Тем что "просто" же!
Про тупой код связывания контролов с параметрами о котором речь и велась, уже забыли.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558970
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик,

авторТ.е. явно TDataSet. К которому IBUpdateSQL легко цепляется

У меня для тебя плохие новости :)
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558976
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того. К TDataSet'у в принципе нельзя прицепить ничего из IBX'а, потому что это разные библиотеки. Как и к ADOшным компонентам.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39558984
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

авторпотому что это разные библиотеки

Если быть еще более точным, то ibx и tdataset вообще разные слои абстракции.
А у ADO апдейтера вообще нет.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39559051
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Если быть еще более точным, то ibx и tdataset вообще разные слои абстракции.
Ок, TIBDataSet.

> А у ADO апдейтера вообще нет.
Это повод не использовать ADO или дописать чтобы он таки появился.
...
Рейтинг: 0 / 0
Насчет свойств формирования SQL запроса
    #39559073
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик,

Чудо, ты хоть в среду заглядывай Прежде чем писать, да еще с таким пафосом.
Обычно пишущие запросы делаются с помощью IBSQL. К нему апдейтер не цепляется вообще.
Но ок, будем делать их с помощью IBQuery.
Итак, два запроса:
Код: sql
1.
insert into patients (patient_id,patient_name,patient_dob,patient_title,patient_sex,patient_weight,patient_height,patient_address1,patient_address2,patient_address3,patient_address4,patient_police,patient_case_history,patient_cathegory,patient_uid) values ("249999","Anonymous","2014-07-28","","M","","","","","","","","","","5329692466")


Код: sql
1.
update STUDIES set STUDY_STATUS = "Выполненное",STUDY_DONE_DATE = "2017-11-24",STUDY_DONE_TIME = "18:18:32" where study_accession_number = "24013917170181"



У меня это 'собирается' 'поэлементно' и даётся команда на выполнение запроса. Чем тут TIBUpdateSQL поможет?
...
Рейтинг: 0 / 0
64 сообщений из 64, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Насчет свойств формирования SQL запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]