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

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

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

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

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

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

Укажите явно тип параметра. Что-то типа
Код: 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
14.07.2014, 20:37
    #38696292
Виталий Гробштейн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
_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
14.07.2014, 21:43
    #38696317
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Виталий ГробштейнНеужели никто не знает?
вся "проблема" в 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
14.07.2014, 22:29
    #38696345
Виталий Гробштейн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
kdv,
Увы, Bound тоже не помогает.
...
Рейтинг: 0 / 0
14.07.2014, 22:57
    #38696361
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Виталий Гробштейнkdv, Увы, Bound тоже не помогает.

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

или какой реально тип у вашего поля.
Проблема состоит в том, что по данным=null нельзя определить тип. Ругается не AnyDac, а ODBC: похожие вещие ловил на Informix-е - через родной драйвер BDE все работает (вероятно сам смотрит тип), а через BDE-ODBC - ломается.
...
Рейтинг: 0 / 0
14.07.2014, 23:07
    #38696374
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
bk0010Ругается не AnyDac, а ODBC
Потому что в нём функция определения типа параметра - опциональная и мало какой драйвер её
реализует. А у MySQL даже в родном API в текущих версиях для этого функция есть, но она не
работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.07.2014, 23:12
    #38696382
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Виталий ГробштейнЕсть вот такой код:Блин! Ну неужели так сложно подумать своим мозгом и модифицировать мой код?
Код: 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
15.07.2014, 00:37
    #38696449
Виталий Гробштейн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
_Vasilisk_,
А ведь действительно, так работает! Спасибо.
Но согласитесь, господа, что это криво. Неужели так и задумано?
...
Рейтинг: 0 / 0
15.07.2014, 01:05
    #38696456
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Виталий ГробштейнНеужели так и задумано?_Vasilisk_1) при вызове API функции MySQL нужно указать тип параметра
2) Из препарированного запроса тип параметра узнать невозможно
Виталий ГробштейнВ ADO и IBX такой проблемы нет, проверено сто раз.Давно IBX научился работать с MySQL?

Тынц авторThis function currently does nothing.
...
Рейтинг: 0 / 0
15.07.2014, 07:49
    #38696506
Гхостик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Как это IBX определяет тип параметра автоматически?
Например, для запроса
Код: sql
1.
select :v from rdb$database
...
Рейтинг: 0 / 0
15.07.2014, 09:01
    #38696546
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
в ДОА при вызове процедур в параметры вместо 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
15.07.2014, 11:19
    #38696660
Виталий Гробштейн
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
_Vasilisk_Давно IBX научился работать с MySQL?
Вы хотите сказать, что этот эффект связан со специфическими особенностями MySQL? Значит, на другой базе FireDAC сможет определить тип параметра так же, как это делают IBX и ADO?
Очень интересно было бы проверить. Может, у кого-нибудь есть возможность быстро это сделать...
...
Рейтинг: 0 / 0
15.07.2014, 11:34
    #38696672
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
ГхостикКак это 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
15.07.2014, 11:42
    #38696675
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Мне вот в Fibplus тоже пришлось писать:

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

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

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
26.04.2019, 10:08
    #39806596
sasha27
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC и значение Null
Виталий Гробштейн,

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


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