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

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

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

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

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

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

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

Сообщение ViktorV » Вт 21 июн 2016 09:14

Да, вы правы, для пустых параметров SDAC устанавливает значение в Unassigned. Для определения того, что параметр возвратил пустое значение, вам следует использовать свойство TMSQuery.IsNull. Например:

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

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

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

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

Сообщение Zelius » Вт 21 июн 2016 10:39

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

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

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

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

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

Мы нигде не говорим о полной совместимости SDAC c ADO, так как это различные по своей архитектуре продукты. Поведение SDAC соответствует нашей архитектуре и может отличаться от поведения ADO.

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

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

Сообщение Zelius » Вт 21 июн 2016 11:55

Я не говорю про полную совместимость, но у вас же есть страница для миграции, почему там не указаны такие важные различия? Цитата из хелпа:
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);

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

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

Сообщение ViktorV » Вт 21 июн 2016 12:33

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

Ответить