Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 FireDAC - присвоить Null полю  [new]
svnvlad
Member

Откуда:
Сообщений: 2149
Здравствуйте!
У меня был старый очень AnyDAC, там в компоненте собственном для работы с данными "на лету" были следующие строки:
for I := 0 to FData.Count - 1 do
        begin
          DataVal := PQValue(FData.Objects[I])^;
          case DataVal.TypeVal of
            0: Q.ParamByName(FData[I]).AsString := DataVal.VString;
            1: Q.ParamByName(FData[I]).LoadFromStream(DataVal.VStream, ftBlob);
            2: Q.ParamByName(FData[I]).AsDateTime := DataVal.VDateTime;
          end;
        end;

Чтобы присвоить полю Null, достаточно было параметру присвоить пустую строку ''.
Т.е.
0: Q.ParamByName(FData[I]).AsString := '';

Сейчас в новом FireDAC это приводит к тому, что полю присваивается ноль 0.
Как исправить данное поведение?
12 май 20, 14:28    [22131229]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
.Clear?
12 май 20, 14:35    [22131239]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
svnvlad
Member

Откуда:
Сообщений: 2149
wadman,

Вот так сделал
      for I := 0 to FData.Count - 1 do
        begin
          DataVal := PQValue(FData.Objects[I])^;
          case DataVal.TypeVal of
            0: begin
                 Q.ParamByName(FData[I]).AsString := DataVal.VString;
                 if DataVal.VString = '' then
                   Q.ParamByName(FData[I]).Value := Null;
               end;
            1: Q.ParamByName(FData[I]).LoadFromStream(DataVal.VStream, ftBlob);
            2: Q.ParamByName(FData[I]).AsDateTime := DataVal.VDateTime;
          end;
        end;
12 май 20, 14:40    [22131242]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
Q.ParamByName(FData[I]).clear
12 май 20, 15:07    [22131263]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28798
svnvlad,

Если речь идет о TParam, то вот так.

Q.ParamByName(FData[I]).Clear;
Q.ParamByName(FData[I]).Bound:=True;

Собственно, уже сто лет как в справке Дельфей написано
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.
Метод Clear заменяет значение параметра на NULL, но не устанавливает Bound в false. Тем не менее, если метод Clear используется для установки значения параметра в NULL, свойство Bound должно быть явно установлено в true.
12 май 20, 15:59    [22131314]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
alekcvp
Member

Откуда:
Сообщений: 2035
svnvlad
Сейчас в новом FireDAC это приводит к тому, что полю присваивается ноль 0.
Как исправить данное поведение?

TFDQuery -> FormatOptions -> StrsEmpty2Null -> True
12 май 20, 16:21    [22131348]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
да, действительно
14089754
13 май 20, 10:01    [22131813]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
alekcvp
Member

Откуда:
Сообщений: 2035
kdv
Метод Clear заменяет значение параметра на NULL, но не устанавливает Bound в false. Тем не менее, если метод Clear используется для установки значения параметра в NULL, свойство Bound должно быть явно установлено в true.

Я вот эту фразу не могу понять:

.Clear не устанавливает .Bound в False
поэтому .Bound необходимо установить в True

Как из первого следует второе, где, блин, логика?!..
13 май 20, 12:47    [22131964]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
а кому вообще нужно свойство Bound?
13 май 20, 12:51    [22131973]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9843
X11
а кому вообще нужно свойство Bound?

Например для вызова ХП с параметрами имеющими значения по умолчанию.
kdv
Q.ParamByName(FData[I]).Clear;
Q.ParamByName(FData[I]).Bound:=True;

В полном виде надо:
LParam.DataType := ftXxxx;
LParam.Bound := True;
LParam.Clear;
13 май 20, 12:59    [22131982]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?
13 май 20, 13:05    [22131989]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49980

IsNull := true;

Posted via ActualForum NNTP Server 1.5

13 май 20, 13:06    [22131992]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

Видимо давно сделали, т.к. я впервые слышу про такую конструкцию.

Понять-бы еще где это bound применяется/обязателен? Даже в примерах не замечал.
13 май 20, 14:48    [22132122]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
L_argo
Member

Откуда:
Сообщений: 1154
Можно же по умолчанию настроить, что пустая строка присвоит нулл.
13 май 20, 15:14    [22132154]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61404
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.

Какой ужас... Вы с Оракла?

Posted via ActualForum NNTP Server 1.5

13 май 20, 15:28    [22132184]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9843
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

Я понимаю, что очень бы хотелось TMyProgram.Create(<и тут миллион аргументов>) :)
13 май 20, 15:55    [22132203]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
wadman
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

Видимо давно сделали, т.к. я впервые слышу про такую конструкцию.

Понять-бы еще где это bound применяется/обязателен? Даже в примерах не замечал.


я так понимаю, что bound касается только параметров, а полей не касается
13 май 20, 15:59    [22132205]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
X11
wadman
пропущено...

Видимо давно сделали, т.к. я впервые слышу про такую конструкцию.

Понять-бы еще где это bound применяется/обязателен? Даже в примерах не замечал.


я так понимаю, что bound касается только параметров, а полей не касается

И я процедурами пользуюсь.
13 май 20, 16:01    [22132206]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 14081
Dimitry Sibiryakov
IsNull := true;


ну да, я вот смотрю исходники FibPlus

procedure TFIBXSQLVAR.Clear;
begin
 IsNull:=True;
end;


...
...
procedure TFIBXSQLVAR.SetIsNull(aValue: Boolean);
begin
  if aValue then
  begin
   FWideTempValue:='';
   if FStreamValue<>nil then
   begin
     FStreamValue.Free;
     FStreamValue:=nil;
   end;
  end;
  SetValue(0,0,tspNull,aValue)
end;


Сообщение было отредактировано: 13 май 20, 16:08
13 май 20, 16:09    [22132213]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
alekcvp
Member

Откуда:
Сообщений: 2035
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..
13 май 20, 17:09    [22132258]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
ъъъъъ
Member

Откуда:
Сообщений: 666
alekcvp
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..

Никакого. Вопрос обсуждался в соотвествующем разделе скруля, единственное, что надыбали - вот такой сценарий:

Непустая строка - это описание события "Докладываю: рейхстаг взят".
Пустая строка - это описание события "Докладываю: ничего не произошло".
Null - доклада не было.
13 май 20, 17:49    [22132294]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28798
alekcvp
Как из первого следует второе, где, блин, логика?!..

вместо возмущений логикой следовало бы почитать справку или исходники.
1. присвоение значения параметру (не null) выставляет Bound в True. Это индикатор "значение присвоено".
2. если пункта 1 не было, Bound = False.
3. вызываем Clear - Bound остается False.
4. дальше ... ?
13 май 20, 20:38    [22132414]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28798
alekcvp,

черт, никогда у меня не получалось за один раз всё написать.
Так вот. Null - это не значение. Это отсуствие значения. И хранить его можно только как "индикатор отсутствия значения".
И с Bound + Clear вот как раз эта самая фигня. Clear убивает значение, теперь значения нет. А Bound является индикатором, что значение всё-таки есть. Но оно "пустое".
13 май 20, 20:43    [22132415]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
alekcvp
Member

Откуда:
Сообщений: 2035
kdv

1. присвоение значения параметру (не null) выставляет Bound в True. Это индикатор "значение присвоено".
2. если пункта 1 не было, Bound = False.
3. вызываем Clear - Bound остается False.

Ну так разве .Bound = False - это не есть Null, который и был нужен ТСу?..
14 май 20, 03:39    [22132546]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC - присвоить Null полю  [new]
L_argo
Member

Откуда:
Сообщений: 1154
alekcvp
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..
Соображений может быть много. Начиная от стиля и предпочтений архитектора и кончая некот. нюансами в приложении, н-р упрощение работы с фильтрами. Также это может быть требование архитектуры сторонней системы.

И нулл и пустая строка имеют право на жизнь.
14 май 20, 09:55    [22132621]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Delphi Ответить