Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC - присвоить Null полю / 25 сообщений из 104, страница 1 из 5
12.05.2020, 14:28
    #39956302
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Здравствуйте!
У меня был старый очень AnyDAC, там в компоненте собственном для работы с данными "на лету" были следующие строки:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
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, достаточно было параметру присвоить пустую строку ''.
Т.е.
Код: pascal
1.
0: Q.ParamByName(FData[I]).AsString := '';


Сейчас в новом FireDAC это приводит к тому, что полю присваивается ноль 0.
Как исправить данное поведение?
...
Рейтинг: 0 / 0
12.05.2020, 14:35
    #39956309
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
.Clear?
...
Рейтинг: 0 / 0
12.05.2020, 14:40
    #39956312
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
wadman,

Вот так сделал
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      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;
...
Рейтинг: 0 / 0
12.05.2020, 15:07
    #39956324
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Код: pascal
1.
Q.ParamByName(FData[I]).clear
...
Рейтинг: 0 / 0
12.05.2020, 15:59
    #39956346
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
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.
...
Рейтинг: 0 / 0
12.05.2020, 16:21
    #39956361
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
svnvlad
Сейчас в новом FireDAC это приводит к тому, что полю присваивается ноль 0.
Как исправить данное поведение?

TFDQuery -> FormatOptions -> StrsEmpty2Null -> True
...
Рейтинг: 0 / 0
13.05.2020, 10:01
    #39956665
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
да, действительно
14089754
...
Рейтинг: 0 / 0
13.05.2020, 12:47
    #39956771
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
kdv
Метод Clear заменяет значение параметра на NULL, но не устанавливает Bound в false. Тем не менее, если метод Clear используется для установки значения параметра в NULL, свойство Bound должно быть явно установлено в true.

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

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

Как из первого следует второе, где, блин, логика?!..
...
Рейтинг: 0 / 0
13.05.2020, 12:51
    #39956779
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
а кому вообще нужно свойство Bound?
...
Рейтинг: 0 / 0
13.05.2020, 12:59
    #39956785
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
X11
а кому вообще нужно свойство Bound?

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

В полном виде надо:
Код: pascal
1.
2.
3.
LParam.DataType := ftXxxx;
LParam.Bound := True;
LParam.Clear;
...
Рейтинг: 0 / 0
13.05.2020, 13:05
    #39956791
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?
...
Рейтинг: 0 / 0
13.05.2020, 13:06
    #39956792
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Код: sql
1.
IsNull := true;


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2020, 14:48
    #39956879
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

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

Понять-бы еще где это bound применяется/обязателен? Даже в примерах не замечал.
...
Рейтинг: 0 / 0
13.05.2020, 15:14
    #39956903
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Можно же по умолчанию настроить, что пустая строка присвоит нулл.
...
Рейтинг: 0 / 0
13.05.2020, 15:28
    #39956926
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.

Какой ужас... Вы с Оракла?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2020, 15:55
    #39956943
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

Я понимаю, что очень бы хотелось TMyProgram.Create(<и тут миллион аргументов>) :)
...
Рейтинг: 0 / 0
13.05.2020, 15:59
    #39956945
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
wadman
X11
Почему бы разработчикам не сделать готовый метод, чтобы не вызывать три строки, а вызвать одну?

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

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


я так понимаю, что bound касается только параметров, а полей не касается
...
Рейтинг: 0 / 0
13.05.2020, 16:01
    #39956946
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
X11
wadman
пропущено...

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

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


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

И я процедурами пользуюсь.
...
Рейтинг: 0 / 0
13.05.2020, 16:09
    #39956951
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Dimitry Sibiryakov
Код: sql
1.
IsNull := true;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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;
...
Рейтинг: 0 / 0
13.05.2020, 17:09
    #39956989
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..
...
Рейтинг: 0 / 0
13.05.2020, 17:49
    #39957019
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
alekcvp
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..

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

Непустая строка - это описание события "Докладываю: рейхстаг взят".
Пустая строка - это описание события "Докладываю: ничего не произошло".
Null - доклада не было.
...
Рейтинг: 0 / 0
13.05.2020, 20:38
    #39957120
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
alekcvpКак из первого следует второе, где, блин, логика?!..
вместо возмущений логикой следовало бы почитать справку или исходники.
1. присвоение значения параметру (не null) выставляет Bound в True. Это индикатор "значение присвоено".
2. если пункта 1 не было, Bound = False.
3. вызываем Clear - Bound остается False.
4. дальше ... ?
...
Рейтинг: 0 / 0
13.05.2020, 20:43
    #39957121
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
alekcvp,

черт, никогда у меня не получалось за один раз всё написать.
Так вот. Null - это не значение. Это отсуствие значения. И хранить его можно только как "индикатор отсутствия значения".
И с Bound + Clear вот как раз эта самая фигня. Clear убивает значение, теперь значения нет. А Bound является индикатором, что значение всё-таки есть. Но оно "пустое".
...
Рейтинг: 0 / 0
14.05.2020, 03:39
    #39957199
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
kdv

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

Ну так разве .Bound = False - это не есть Null, который и был нужен ТСу?..
...
Рейтинг: 0 / 0
14.05.2020, 09:55
    #39957260
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - присвоить Null полю
alekcvp
Гаджимурадов Рустам
L_argo> Можно же по умолчанию настроить, что пустая строка присвоит нулл.
Какой ужас... Вы с Оракла?
А какой смысл хранить в базе пустую строку?..
Соображений может быть много. Начиная от стиля и предпочтений архитектора и кончая некот. нюансами в приложении, н-р упрощение работы с фильтрами. Также это может быть требование архитектуры сторонней системы.

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


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