Не генерируется запрос _stUpdate (GenerateSQL)

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
Akella
Сообщения: 167
Зарегистрирован: Пн 02 апр 2012 14:41

Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение Akella » Вс 10 май 2020 16:53

все запросы генерируются, хоть и не совсем правильно, а вот запрос Update вообще пустой.
на входе в aSelectSql запрос простой: select id, name from table1

Код: Выделить всё

procedure GenSQL(UniQuery: TUniQuery; const aSelectSql: string);
begin
  UniQuery.SQL.Text := aSelectSql;
  UniQuery.KeyFields := 'id';
  UniQuery.Open;

  UniQuery.SQLInsert.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stInsert, true);
  OutputDebugString(Pwidechar(UniQuery.SQLInsert.Text));

  UniQuery.SQLUpdate.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stUpdate, true);
  OutputDebugString(Pwidechar(UniQuery.SQLUpdate.Text));

  UniQuery.SQLDelete.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stDelete, true);
  OutputDebugString(Pwidechar(UniQuery.SQLDelete.Text));

  UniQuery.SQLRefresh.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stRefresh, true);
  OutputDebugString(Pwidechar(UniQuery.SQLRefresh.Text));


  //UniQuery.close;
end;
В UniQuery.Oprions включен параметр "foTableAliasAndField".
UniDAC 8.0.1, Delphi Rio.
Последний раз редактировалось Akella Вс 10 май 2020 17:15, всего редактировалось 2 раза.

Akella
Сообщения: 167
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение Akella » Вс 10 май 2020 16:57

В чем "неправильность" запросов.
запросы генерируются в виде

Код: Выделить всё

INSERT INTO TABLE1
  (ID, NAME)
VALUES
  (?, ?)
Но если вставить select-запрос в редактор запросов TUniQuery и нажать там кнопку Generate SQL, то сгенерируется вот такой запрос, т.е. с именованными параметрами:

Код: Выделить всё

INSERT INTO TABLE1
  (ID, NAME)
VALUES
  (:ID, :NAME)
Что сделать, чтобы SQL-генератор программно в runtime генерировал правильные запросы?

oleg0k
Devart Team
Сообщения: 4
Зарегистрирован: Вт 10 мар 2020 17:46

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение oleg0k » Пт 22 май 2020 21:05

Добрый день, извините за долгий ответ

Для Update третий параметр GenerateSQL устанавливайте в False, и для генерирования запроса с именованными параметрами:

Код: Выделить всё

  TDBAccessUtils.SQLGenerator(UniQuery1).SubstituteParamName := False;
  UniQuery1.SQLUpdate.Text := TDBAccessUtils.SQLGenerator(UniQuery1).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stUpdate, False);
wbr, Oleg
Devart Team

Akella
Сообщения: 167
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение Akella » Сб 23 май 2020 09:33

На счет именованных параметров вопрос.
Подскажите ,что не так в коде?

Код: Выделить всё

procedure GenSQL(UniQuery: TUniQuery; const aSelectSql: string);
begin
  UniQuery.SQL.Text := aSelectSql;
  UniQuery.KeyFields := 'id';
  UniQuery.Open;

  TDBAccessUtils.SQLGenerator(UniQuery).SubstituteParamName := False;// для генерирования запроса с именованными параметрами

  UniQuery.SQLInsert.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stInsert, true);
  OutputDebugString(Pwidechar(UniQuery.SQLInsert.Text));

  UniQuery.SQLUpdate.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stUpdate, False);// Для Update 3й параметр = False
  OutputDebugString(Pwidechar(UniQuery.SQLUpdate.Text));

  UniQuery.SQLDelete.Text  := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stDelete, true);
  OutputDebugString(Pwidechar(UniQuery.SQLDelete.Text));

  UniQuery.SQLRefresh.Text := TDBAccessUtils.SQLGenerator(UniQuery).GenerateSQL(TDAParamsInfo.Create(TDAParamInfo) , _stRefresh, true);
  OutputDebugString(Pwidechar(UniQuery.SQLRefresh.Text));

end;
Результаты вот такие:
Debug Output:
select id, name "назва" from OPERATION
WHERE INSERT INTO OPERATION
(ID, NAME)
VALUES
(?, ?((ID=?) OR (ID=?) OR (ID=?) OR (ID=?) OR (ID=?) OR (ID=?)) )


Debug Output:
UPDATE OPERATION
SET
ID = ?, NAME = ?
WHERE
ID = ?

Debug Output:
DELETE FROM OPERATION
WHERE
ID = ?

Debug Output:
SELECT ID AS IBC$0, NAME AS IBC$1 FROM OPERATION
WHERE
ID = ?
INSERT вообще странный какой-то

вот сам основной select запрос

Код: Выделить всё

select id, name "назва" from OPERATION

Еще добавлю кода:

Код: Выделить всё

    qRef.Conditions.Clear;
    qRef.sql.Text := 'select ' + IfThen(aFields.IsEmpty, 'id, name "назва"', aFields) + ' from ' + aTable;
    qRef.SpecificOptions.Values['KeyGenerator']  := aGenerator;
    qRef.SpecificOptions.Values['GeneratorMode'] := 'gmInsert';

    GenSQL(qRef, qRef.sql.Text);// генерируем остальные запросы

oleg0k
Devart Team
Сообщения: 4
Зарегистрирован: Вт 10 мар 2020 17:46

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение oleg0k » Ср 27 май 2020 18:30

Добрый день,
Поведение с Insert не удалось воспроизвести.
Чтобы мы могли дать вам развернутый ответ, составьте демо пример, заархивируйте в zip и пришлите через форму на нашем сайте:
https://devart.com/company/contactform.html

wbr, Oleg
Devart Team

Akella
Сообщения: 167
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение Akella » Ср 27 май 2020 18:37

Ок, пришлю пример.

А поведение с именованными параметрами?
Мне так и не удалось сгенерировать запрос с именованными параметрами.

Akella
Сообщения: 167
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Не генерируется запрос _stUpdate (GenerateSQL)

Сообщение Akella » Чт 28 май 2020 08:26

В общем, проблемы проявляются, если у TUniQuery включить SmartFetch.

Ответить