powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC и значение Null
22 сообщений из 22, страница 1 из 1
FireDAC и значение Null
    #38695680
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда писал так:

ParamByName('Param').Value := Null;

В IBX и ADO прекрасно работало. А FireDAC ругается на неизвестный тип параметра. Что бы это значило и как присвоить Null?

ЗЫ База MySQL, поле значение Null допускает.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38695681
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий Гробштейн,

ParamByName('Param').Clear;
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38695689
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и FireDAC тут не при чём
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696230
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Виталий Гробштейн,

ParamByName('Param').Clear;
И что должно произойти?
Опыт показывает, что происходит ошибка с сообщением "Params [Param] type unknown". Та же самая, что и присвоении Null.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696258
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий Гробштейн,

Укажите явно тип параметра. Что-то типа
Код: pascal
1.
ParamByName('param').DataType := ftInteger;


или так
Код: pascal
1.
2.
ParamByName('param').AsInteger := 0;
ParamByName('param').Clear;


ноги растут отсюда
1) при вызове API функции MySQL нужно указать тип параметра
2) Из препарированного запроса тип параметра узнать невозможно

проблема решается двумя способами
1) Тип параметра неявно указывается через VarType для AsVariant или при вызове AsXXXX
2) Парсится запрос и компоненты сами узнают тип параметра

Какой способ используется в FireDac я не знаю.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696292
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
У меня нет проблемы с присвоением значений Integer, String, Datetime и пр. Есть вот такой код:

Код: pascal
1.
2.
3.
4.
5.
6.
SQL.Add('UPDATE MyTable SET BgDat = :Param WHERE ....'
if <БлаБла> then
  ParamByName('BgDat').AsDateTime := Now
else
  ParamByName('BgDat').Value := Null;
ExecSQL;  


Этот код не работает только и исключительно при присвоении Null и только в FireDaC. В ADO и IBX такой проблемы нет, проверено сто раз.
Я могу, конечно, написать для каждого случая свой текст запроса (Null указанный прямо в тексте присваивается успешно). Мне интересно понять причину, почему нельзя того же сделать через параметры.
Неужели никто не знает?
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696317
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий ГробштейнНеужели никто не знает?
вся "проблема" в TParam.Bound, про который никто хелп не читает :-)
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TParam_Bound.html
The Clear method replaces the value of the parameter with NULL, but does not set Bound to false. However, if the Clear method is used to bind the parameter to a NULL value, Bound must be separately set to true.

То есть, одного вызова TParam.Clear для NULL недостаточно. Надо еще написать TParam.Bound:=True;

Лично я не люблю как TParam.Value, поскольку в Дельфи нет "вариантных" переменных, есть только их симуляция (хотя, может, эти переменные и есть симуляция), так и сильно не нравится
TParam.Value:=Null;
Предпочел бы TParam.IsNull:=True, который сделает все сам. Правда, там же опять ссылка на Bound
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TParam_IsNull.html
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696345
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,
Увы, Bound тоже не помогает.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696361
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий Гробштейнkdv, Увы, Bound тоже не помогает.

Решение вам уже подсказали:
Код: pascal
1.
2.
ParamByName('param').Clear;
ParamByName('param').DataType:=ftInteger;

или какой реально тип у вашего поля.
Проблема состоит в том, что по данным=null нельзя определить тип. Ругается не AnyDac, а ODBC: похожие вещие ловил на Informix-е - через родной драйвер BDE все работает (вероятно сам смотрит тип), а через BDE-ODBC - ломается.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696374
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Ругается не AnyDac, а ODBC
Потому что в нём функция определения типа параметра - опциональная и мало какой драйвер её
реализует. А у MySQL даже в родном API в текущих версиях для этого функция есть, но она не
работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696382
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий ГробштейнЕсть вот такой код:Блин! Ну неужели так сложно подумать своим мозгом и модифицировать мой код?
Код: pascal
1.
2.
3.
4.
5.
SQL.Add('UPDATE MyTable SET BgDat = :Param WHERE ....'
ParamByName('BgDat').AsDateTime := Now
if not <БлаБла> then
  ParamByName('BgDat').Value := Null;
ExecSQL;
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696449
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
А ведь действительно, так работает! Спасибо.
Но согласитесь, господа, что это криво. Неужели так и задумано?
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696456
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий ГробштейнНеужели так и задумано?_Vasilisk_1) при вызове API функции MySQL нужно указать тип параметра
2) Из препарированного запроса тип параметра узнать невозможно
Виталий ГробштейнВ ADO и IBX такой проблемы нет, проверено сто раз.Давно IBX научился работать с MySQL?

Тынц авторThis function currently does nothing.
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696506
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как это IBX определяет тип параметра автоматически?
Например, для запроса
Код: sql
1.
select :v from rdb$database
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696546
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ДОА при вызове процедур в параметры вместо Null передается соответствующая переменная:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var // Parameter types must be otXXXX constant cast to varParType in initialization
  parNone: Variant;
  parString: Variant;
  parInteger: Variant;
  parFloat: Variant;
  parDate: Variant;
  parBoolean: Variant;



пример:
  case Next_Item_Type of
   niNumber: Pkg.CallProcedure('unpack_message',       ['item', parFloat]);
     niDate: Pkg.CallProcedure('unpack_message',       ['item', parDate]);
    niRowid: Pkg.CallProcedure('unpack_message_rowid', ['item', parString]);
      niRaw: Pkg.CallProcedure('unpack_message_raw',   ['item', parString]);
  else
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696660
Фотография Виталий Гробштейн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Давно IBX научился работать с MySQL?
Вы хотите сказать, что этот эффект связан со специфическими особенностями MySQL? Значит, на другой базе FireDAC сможет определить тип параметра так же, как это делают IBX и ADO?
Очень интересно было бы проверить. Может, у кого-нибудь есть возможность быстро это сделать...
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696672
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГхостикКак это IBX определяет тип параметра автоматически?
в случае IB/FB IBX и прочим не надо ничего "определять", потому что сервер присылает блок параметров уже с указанием типа. Но действительно, тип параметра можно определить не всегда, как в случае
select :v from rdb$database
Но при
select * from rdb$database
where field = :param
тип параметра равен типу field, и если программист пишет типа
TParam.Value:=...
или для числового параметра пишет
TParam.asString:=Edit1.Text;
то параметр на сервер может приехать "не того типа", и сервер будет производить сравнение (или что-то там) уже самостоятельно преобразуя типы, иногда с неожиданными для разработчика последствиями.
Поэтому, конечно, лучше задавать тип параметра или явно, или через asInteger, asString, но чтобы тип соответствовал ожидаемому сервером.

_Vasilisk_ вот это самое и сделал - сначала через asDateTime фактически принудительно указал параметру тип, а потом через Value:=Null присвоил этому типу флаг null.

Null - это отсутствие значения, а не отсутствие типа. И NULL может в разных серверах обрабатываться по разному. Где-то специальным "неестественным значением", где-то дополнительным флагом у столбца или параметра.
Но тип у Null должен быть. :-)
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696675
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вот в Fibplus тоже пришлось писать:

Код: pascal
1.
2.
3.
4.
      if VarIsNull(vKeyVal) then
        FBN('ID_TYPE').Clear
      else
        FBN('ID_TYPE').AsVariant := vKeyVal;
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38696851
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий ГробштейнВы хотите сказать, что этот эффект связан со специфическими особенностями MySQL?Именно. Я на своих компонентах столкнулся с этой же проблемой. Но я вывернулся немного по другому. У меня параметр всегда имеет какой-то тип. Даже если ничего не было указано. Ну и при вызове процедур а распарсиваю декларацию процедуры и вытягиваю из него тип параметра. Но это и FireDAC должен уметь
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #38697068
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гхостик> Как это IBX определяет тип параметра автоматически?
Гхостик> Например, для запроса

По типу аргумента (обычно поля). В приведенном запросе
тип параметра не определится, будет рантайм ошибка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FireDAC и значение Null
    #39806545
vuginet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виталий ГробштейнВсегда писал так:

ParamByName('Param').Value := Null;

В IBX и ADO прекрасно работало. А FireDAC ругается на неизвестный тип параметра. Что бы это значило и как присвоить Null?

ЗЫ База MySQL, поле значение Null допускает.

Params[7].DataType := ftInteger;
Params[7].Clear;

или

ParamByName('Param').DataType := ftInteger;
ParamByName('Param').Clear;
...
Рейтинг: 0 / 0
FireDAC и значение Null
    #39806596
Фотография sasha27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий Гробштейн,

Проверьте, есть ли модуль Variant в uses.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC и значение Null
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]