Проблема с параметрами TMSQuery

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Ответить
Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Проблема с параметрами TMSQuery

Сообщение Zelius » Ср 15 июн 2016 15:50

Добрый день!
Есть TMSQuery, который возвращает запись по ID (через хр. проц-ру), в AfterOpen проверяется, если ID = 0 и TMSQuery пуст, то он переводится в режим Insert (все там же, в AfterOpen), заполняются поля и вызывается ExecSQL другого TMSQuery (там вызов хр.проц-ры создающей запись и возвращающей ее ID) привязанного к нему по MasterSource с несколькими параметрами и один из них ID InputOutput, после чего первый TMSQuery должен переоткрываться с новым ID. Так вот, после ExecSQL, этот параметр не получает значение нового ID (остается Unassigned) и его тип сбрасывается в ptInput (!!!). Код старый, его много, переводится с ADO, где все работало корректно. Прошу помощи! Исходников нет, самому не справится, а сроки поджимают...
Спасибо

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Чт 16 июн 2016 07:40

Я посмотрел профайлер и обнаружил, что SDAC поменял тип параметра с In\Out на In. Если посмотреть на то что показывает монитор
exec :RETURN_VALUE = EntityAdd
@ID = :ID out,
@Name = :Name,
:RETURN_VALUE(Integer,OUT)=<NULL>
:ID(LargeInt,IN)=<NULL>
:Name(String[3],IN)='222'
То параметр ID, хоть и имеет спецификатор перед вызовом ptInputOutput, где-то внутри сбрасывается в ptInput. Options.ReturnParams не помог.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Чт 16 июн 2016 09:28

Возможно, проблема связана с MasterSource, если убрать эту связь и скопировать значения параметров из полей вручную, то запрос работает корректно, тип параметра не меняется, значение возвращается. Еще нюанс, у меня используется не сам TMSQuery, а его потомок TMyMSQuery=class(TMSQuery)... Может ли это быть причиной такого странного поведения?

ViktorV
Devart Team
Сообщения: 198
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с параметрами TMSQuery

Сообщение ViktorV » Чт 16 июн 2016 12:41

Для исследования проблемы, пожалуйста, составьте и вышлите на viktorv*devart*com небольшой пример демонстрирующий проблему, включающий скрипты для создания объектов БД.

ViktorV
Devart Team
Сообщения: 198
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с параметрами TMSQuery

Сообщение ViktorV » Пн 20 июн 2016 11:45

На данный момент, когда свойство TMSQuery.MasterSource не установлено в nil, свойство TMSQuery.ParamType автоматически устанавливается в ptInput. Мы рассмотрим возможность изменения данного поведения SDAC и сообщим вам о результате.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Пн 20 июн 2016 13:02

Спасибо.
А что насчет того, что свойства параметров не заполняются автоматически при вводе запроса вида exec Proc :Param в TMSQuery ?

ViktorV
Devart Team
Сообщения: 198
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с параметрами TMSQuery

Сообщение ViktorV » Пн 20 июн 2016 14:22

Для установки точных значений свойств параметров необходимо выполнить обращение к серверу. При вводе запроса с параметрами на вкладке SQL редактора TMSQuery, обращение к серверу не происходит, а происходит парсинг текста запроса, на основании которого мы получаем названия параметров. Для получения и установки точных значений свойств параметра, вам следует установить свойство TMSQuery.Options.DescribeParams в True и вызвать метод TMSQuery.Prepare.
Также вы можете воспользоваться вкладкой Stored Proc Call Genarator редактора TMSQuery для автоматического формирования SQL запроса и установки точных значений свойств параметров в дизайн-тайме. Для этого вам следует выбрать в выпадающем окне Stored Procedure Name название хранимой процедуры и нажать кнопку Generate.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Пн 20 июн 2016 15:27

спасибо за разъяснение, но похоже, что ничего из предложенного не поможет, так как SDAC не поддерживает вызов процедур с передачей параметров по имени (что является требование в нашей программе), а Prepare вызвать в design time нельзя, правильно? танцы вокруг autoprepare пока не помогли

ViktorV
Devart Team
Сообщения: 198
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с параметрами TMSQuery

Сообщение ViktorV » Пн 20 июн 2016 15:57

SDAC поддерживает вызов процедуры с передачей параметров по имени. В присланном вами примере как раз и происходит вызов процедуры с передачей параметров по имени. Да, метод TMSQuery.Prepare в дизайн-тайме вызвать не получится, но в run time всё будет работать.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Пн 20 июн 2016 16:12

А нельзя в Ваш редактор запросов встроить кнопку Prepare? Сами понимаете, что запросы настраиваются в Design-Time, что толку от runtime. Сложность еще в том, что проект далеко не новый, много форм... Поменять работу с данными уже не получится...

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Проблема с параметрами TMSQuery

Сообщение Zelius » Пн 20 июн 2016 16:19

P.S. "SDAC не поддерживает вызов процедур с передачей параметров по имени " - я имел ввиду TMSStoredProc и формат {call}

ViktorV
Devart Team
Сообщения: 198
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Проблема с параметрами TMSQuery

Сообщение ViktorV » Вт 21 июн 2016 11:05

В дизайн-тайме вы можете устанавливать необходимые свойства параметров вручную. В ран-тайме они будут устанавливаться автоматически после вызова метода TMSQuery.Prepare. Поэтому для больших проектов эффективней настраивать запросы в рантайме. При вызове метода TMSQuery.Prepare запрос препарируется на сервере, а не только автоматически устанавливаются значения свойств параметров. Поэтому мы не видим целесообразности добавления кнопки Prepare в редактор TMSQuery.

Ответить