среда, 26 февраля 2014 г.

Делфи - очень делфи.

Допустим у вас есть ADQuery, в которую вы пишете запрос. Допустим UPDATE.
Допустим вам надо дать пользователю возможность отредактировать любое сочетание полей в строке таблицы. И, например, чтобы это сделать, вам надо удалить записанное ранее значение во внешнем ключе. т.е. записать туда NULL. Не 0 - а именно, что ничего.

Вы пишете запрос, добавляете туда параметр... Ну, например:

SQL.Clear;
Params.Clear;
SQL.Add('UPDATE my_table SET my_fk = :NullParam;');


...И начинаете думать, как же мне засунуть туда NULL?
Пара минут гуглинга и вы счастливо пишете что-то в духе:

ParamByName('NullParam').Clear;
ExecSQL;


И... Получаете ошибку "... [AnyDAC][Phys][ODBC]-335.Parameter [NULLPARAM] data typ is unknown. ..."

Как это неизвестный тип, думаете вы?..  Какой ему нужен тип?.. Может быть это что-то вроде " int? " в Шарпе?.. Но нет, просто где-то внутри ему нужен тип параметра, чтобы собрать запрос. И он нужен до значения.
Итак. Нужен тип параметра, чтобы все это собрать. А как задать тип параметра? Что мы делаем обычно. Обычно, мы "отипиваем" параметр и даем ему значение:

ParamByName('NullParam').AsInteger = some_int_var;

Однако, выражение AsInteger требует правой части, написать просто:

ParamByName('NullParam').AsInteger;
ParamByName('NullParam').Clear;


...нам ничем не поможет. Зато нас вполне устроит

ParamByName('NullParam').AsInteger = 0;
ParamByName('NullParam').Clear;


Ура! Все работает.
Однако, любопытно, какой именно вы дадите параметру тип, уже никого после этого не волнует. Запрос будет выполнен в любом случае (если только он не противоречит структуре базы).

Такое вот Делфи.

Комментариев нет:

Отправить комментарий