Делфи - очень делфи.
Допустим у вас есть 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;
Ура! Все работает.
Однако, любопытно, какой именно вы дадите параметру тип, уже никого после этого не волнует. Запрос будет выполнен в любом случае (если только он не противоречит структуре базы).
Такое вот Делфи.
Допустим у вас есть 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;
Ура! Все работает.
Однако, любопытно, какой именно вы дадите параметру тип, уже никого после этого не волнует. Запрос будет выполнен в любом случае (если только он не противоречит структуре базы).
Такое вот Делфи.
Комментариев нет:
Отправить комментарий