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

TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Пн 20 июн 2016 15:37
Zelius
Добрый день!
Использую TMSQuery.Execute для вызова хранимых процедур, в параметре хочу вернуть Null, но SDAC упорно возвращает Unassigned. Что делать? Почему Unassigned, а не Null? :shock:

Re: TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Вт 21 июн 2016 09:14
ViktorV
Да, вы правы, для пустых параметров SDAC устанавливает значение в Unassigned. Для определения того, что параметр возвратил пустое значение, вам следует использовать свойство TMSQuery.IsNull. Например:

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

 if MSQuery.ParamByName('ParamName').IsNull then
    Value := Null
  else
    Value := MSQuery.ParamByName('ParamName').Value;

Re: TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Вт 21 июн 2016 10:39
Zelius
Добрый день! Спасибо за ответ. Но есть проблема, у меня тысячи строк кода, который нужно с локаничного MSQuery.ParamByName('ParamName').Value переделывать на эти ужасные ифы? Зачем? Неужели это продиктовано структурой OLEDB? Почему это не указано в справке по конвертации приложений с ADO? Почему вы решаете за программиста и меняете логику работы? Я не понимаю... Зачем-Зачем-Зачем... Почему возвращаемый разработчиком параметр NULL вы меняете на Unassigned? А 0 int вы не меняете на Unassigned? ведь 0 это почти NULL!

P.S. дико извиняюсь, но после всех затраченных усилий на перевод ADO в SDAC напарываться на такие выкрутасы очень не приятно... И что мне теперь делать? Покупать исходники и допиливать их напильником как в анекдоте?

Re: TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Вт 21 июн 2016 11:05
ViktorV
Мы нигде не говорим о полной совместимости SDAC c ADO, так как это различные по своей архитектуре продукты. Поведение SDAC соответствует нашей архитектуре и может отличаться от поведения ADO.

Re: TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Вт 21 июн 2016 11:55
Zelius
Я не говорю про полную совместимость, но у вас же есть страница для миграции, почему там не указаны такие важные различия? Цитата из хелпа:
SDAC behaviour resembles the one of ADO as much as possible, so migration from ADO to SDAC shoulв not cause much difficulties. As far as possible, SDAC behaviour approaches to the behaviour of ADO, so this migration should not cause any serious difficulties.
И раз, меняется базовая работа с параметрами начиная еще чуть ли не с BDE, без предупреждения, как контрольный выстрел в голову, после изменения типов параметров...

Прошу прощения, можете описать логику, в которой может понадобиться возвращать NULL параметры как Unassigned? Вместо CallMyProc(Prm.Value) писать

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

  if Prm.IsNull then CallMyProc(Null)  else CallMyProc(Prm.Value);

Re: TMSQuery.Execute - как вернуть NULL в параметре?

Добавлено: Вт 21 июн 2016 12:33
ViktorV
Все наши пользователи используют данную функциональность и вы первый пользователь обратившийся к нам с подобной просьбой.
Если Вы хотите, чтобы мы изменили указанное вами поведение, пожалуйста, напишите об этом на нашем User Voice форуме:https://devart.uservoice.com/forums/104 ... sql-server. Если Ваше предложение наберет достаточно голосов, мы рассмотрим возможность его реализации.