Страница 1 из 1

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

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

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

Добавлено: Чт 16 июн 2016 07:40
Zelius
Я посмотрел профайлер и обнаружил, что 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 не помог.

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

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

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

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

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

Добавлено: Пн 20 июн 2016 11:45
ViktorV
На данный момент, когда свойство TMSQuery.MasterSource не установлено в nil, свойство TMSQuery.ParamType автоматически устанавливается в ptInput. Мы рассмотрим возможность изменения данного поведения SDAC и сообщим вам о результате.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: Пн 20 июн 2016 16:19
Zelius
P.S. "SDAC не поддерживает вызов процедур с передачей параметров по имени " - я имел ввиду TMSStoredProc и формат {call}

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

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