Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FIBPlus blob default значение не NULL / 23 сообщений из 23, страница 1 из 1
06.03.2019, 21:19
    #39783237
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Приветствую!

Подскажите есть домен для FB:

Код: sql
1.
CREATE DOMAIN D_BIGTEXT	AS 	BLOB SUB_TYPE 1 DEFAULT '';



И почему-то FIBPlus Dataset не хочет для него по умолчанию (для других типов данных типов данных все работает) брать дефолтное значение и подставлять его для sql-запросов датасета. Вместо пустого значения которое заданно для умолчания, почему-то подставляется NULL. Причем, даже если я вручную пытаюсь задать FN('CONTENT').AsString:=''; То все равно FIBPlus делает запрос к базе с NULL значением... опция pfImportDefaultValues:=True И собственно для всех других типов дефолтное значение успешно подставляется.
...
Рейтинг: 0 / 0
06.03.2019, 21:56
    #39783253
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbis,

в ФИБах это отключено?

В крайнем случае, создай на сервере триггер
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE TEST_BLOB (
    ID                   INTEGER NOT NULL,
    BLOB_TEXT            BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    STR_FLD              VARCHAR(10),
    BLOB_TEXT_WITH_NULL  BLOB SUB_TYPE 1 SEGMENT SIZE 16384
);

/* Trigger: TEST_BLOB_BIU0 */
CREATE OR ALTER TRIGGER TEST_BLOB_BIU0 FOR TEST_BLOB
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
AS
begin
    IF (NEW.BLOB_TEXT IS NULL) THEN
      NEW.BLOB_TEXT = '';

end
^



...
Рейтинг: 0 / 0
06.03.2019, 22:09
    #39783258
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Док,

спасибо за быстрый ответ!

psSetEmptyStrToNull конечно тоже стоит False; И собственно с типом данных VARCHAR все работает - нет никого NULL при попытки сохранить пустую строку. А вот с BLOB такой фокус не работает! и вот причина здесь именно в обработке BLOB.

Сейчас сделал пробный тип BLOB SUB_TYPE 1 DEFAULT 'TEST' и обнаружил что дефолтное значение все-таки подхватывается!!! и подставляется по умолчанию, НО вот причина в том, что если значение пустая строка, то тогда оно почему-то конвертируется в NULL. И все это именно для BLOB, с VARCHAR такого нету. Проблема не в компоненте редакторе, проверил тоже. Если задавать в ручную FN('FIELD').AsString=''; то опять на выходе ошибка из-за NULL.

P.S. Создавать тригеры очень не хочу, у меня порядка сотни таблиц.
...
Рейтинг: 0 / 0
06.03.2019, 23:47
    #39783287
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbisтогда оно почему-то конвертируется в NULL
Результат, часом, не IBE смотришь? Если так, то попробуй затри <null> здесь
получишь

и ничего менять не придется :)
...
Рейтинг: 0 / 0
06.03.2019, 23:48
    #39783288
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbisЕсли задавать в ручную FN('FIELD').AsString=''; то опять на выходе ошибка из-за NULL.
кстати, а что за ошибка и что за "выход"?
...
Рейтинг: 0 / 0
07.03.2019, 01:38
    #39783297
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Обычна ошибка Validation, к FB претензий нету, непонятно вот почему FIB+ тулит NULL вместо ""

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
===== ErrorHandler FIBErrorEvent =====
Sender.ClassName = TFIBQuery
Sender.Name = UpdateQuery
Owner.Name = FDSProvider
ConstraintName = 
ExceptionNumber = -1
Lasterror = keOther
SQLCode = -625
IBErrorCode = 335544347
Message = FProvider.FDSProvider.UpdateQuery:
The insert failed because a column definition includes validation constraints.Validation error for column NOTICE, value "*** null ***".

IBMessage = Validation error for column NOTICE, value "*** null ***".

SQLMessage = The insert failed because a column definition includes validation constraints.
KindIBError = keOther

SQL Query = UPDATE PROVIDER
SET 
    SKEY = :SKEY,
    GROUP_ID = :GROUP_ID,
    NAME = :NAME,
    KIND_KEY = :KIND_KEY,
    STATE_KEY = :STATE_KEY,
    PARAMS = :PARAMS,
    MANAGER = :MANAGER,
    PHONES = :PHONES,
    EMAILS = :EMAILS,
    STORE = :STORE,
    SERV_ADDR = :SERV_ADDR,
    SERV_PHONE = :SERV_PHONE,
    NOTICE = :NOTICE,
    POS = :POS
WHERE
    ID = :OLD_ID
    

SKEY : ""
GROUP_ID : "1"
NAME : "Новый поставщик 1"
KIND_KEY : "kDefault"
STATE_KEY : "kDefault"
PARAMS : ""
MANAGER : ""
PHONES : ""
EMAILS : ""
STORE : ""
SERV_ADDR : ""
SERV_PHONE : ""
NOTICE : NULL
POS : "1"
OLD_ID : "1"
...
Рейтинг: 0 / 0
07.03.2019, 10:43
    #39783405
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbis,

Тогда уж показывай DDL таблицы, где поле NOTICE. И заодно код на клиенте, каким образом ты в это поле значения суешь.
...
Рейтинг: 0 / 0
07.03.2019, 10:49
    #39783411
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Навскидку, в запросе для NOTICE используй coalesce
...
Рейтинг: 0 / 0
07.03.2019, 11:10
    #39783420
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
По правилам SQL NULL сравнивать нельзя. (иногда это включается настройками set).
Для сравнения используется
Код: sql
1.
 some IS NULL

или соотв. функции
...
Рейтинг: 0 / 0
07.03.2019, 12:20
    #39783480
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
GatorПо правилам SQL NULL сравнивать нельзя. (иногда это включается настройками set).
У ТС в DDL домена NOT NULL, похоже, воткнут. Вот и ругается птиц :)

melbis,
Ы?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE DOMAIN DMN_BLOBTXT_NOT_NULL AS
BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UTF8
DEFAULT ''
NOT NULL
COLLATE UTF8;

CREATE TABLE TEST_BLOB (
    ID                   INTEGER NOT NULL,
    BLOB_TEXT            BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    STR_FLD              VARCHAR(10),
    BLOB_TEXT_WITH_NULL  BLOB SUB_TYPE 1 SEGMENT SIZE 16384,
    BLOB_TEXT_WO_NULL    DMN_BLOBTXT_NOT_NULL
);

INSERT INTO TEST_BLOB (ID,
                       BLOB_TEXT,
                       STR_FLD,
                       BLOB_TEXT_WITH_NULL,
                       BLOB_TEXT_WO_NULL)
VALUES (NULL,
        'trtrtrtrtr',
        '123456789',
        NULL,
        COALESCE(:BLOB_TEXT_WO_NULL,''))



...
Рейтинг: 0 / 0
07.03.2019, 12:32
    #39783489
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Док,

Ну пусть юзает не пустую строку, а пробел или 0х00
...
Рейтинг: 0 / 0
07.03.2019, 14:46
    #39783577
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Gator,

подождем, пока выскажется "начальник транспортного цеха" © :)
...
Рейтинг: 0 / 0
07.03.2019, 14:48
    #39783579
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Док, завтра ведь пятницаааа
...
Рейтинг: 0 / 0
07.03.2019, 15:34
    #39783612
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Gator,

не только
...
Рейтинг: 0 / 0
10.03.2019, 21:50
    #39784311
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE DOMAIN D_BIGTEXT	AS 	BLOB SUB_TYPE 1 DEFAULT ''	NOT NULL;     

CREATE TABLE provider (
   id 		D_PK,
   skey		D_VC32,
   group_id	D_FK,
   name 	D_VC,
   kind_key	D_VC100,
   state_key	D_VC100,
   params	D_VC,
   manager 	D_VC,
   phones 	D_VC,
   emails	D_VC,
   store 	D_VC,
   serv_addr 	D_VC,
   serv_phone 	D_VC,
   notice 	D_BIGTEXT,
   pos 		D_INT,
   CONSTRAINT PK_provider PRIMARY KEY (id),
   CONSTRAINT FK1_provider FOREIGN KEY (group_id) 
   	REFERENCES provider_group(id) 
   		ON DELETE CASCADE
);



да, есть вариант с coalesce, но это все как и триггера - надо много чего править... Есть ли вариант настроить FIB+ таким образом чтобы он не пытался подставить NULL вместо пустой строки?
...
Рейтинг: 0 / 0
10.03.2019, 23:18
    #39784317
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbisЕсть ли вариант настроить FIB+ таким образом чтобы он не пытался подставить NULL вместо пустой строки?
кроме той опции, я про другие не знаю. Кстати, как ты узнаёшь, что вместо пустой строки там NULL?
...
Рейтинг: 0 / 0
10.03.2019, 23:46
    #39784321
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Док,

Через FibErrorHandler. Я привел выше 21826875 отчет по ошибке где четко видно, что для поля BLOB FIBPlus вместо "" подставляет NULL
...
Рейтинг: 0 / 0
11.03.2019, 10:41
    #39784381
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
melbisотчет по ошибке где четко видно, что для поля BLOB FIBPlus вместо "" подставляет NULL
имхо, у тебя два выхода: либо править исходники ФИБов (т.е. включить поведение psSetEmptyStrToNull и для текстовых блобов), либо править ручками исходники своего приложения (или ковыряться в базе).

Боюсь, тут "понадобится программист" © :)
...
Рейтинг: 0 / 0
11.03.2019, 11:30
    #39784396
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Док,

так и есть! И чтобы не изобретать велосипед, может у кого-то уже есть исправленный блок ФИБов для работы с BLOB NULL?
...
Рейтинг: 0 / 0
11.03.2019, 13:12
    #39784431
FIBPlus blob default значение не NULL
melbis
Код: sql
1.
CREATE DOMAIN D_BIGTEXT	AS 	BLOB SUB_TYPE 1 DEFAULT '';



И почему-то FIBPlus Dataset не хочет для него по умолчанию (для других типов данных типов данных все работает) брать дефолтное значение и подставлять его для sql-запросов датасета. Вместо пустого значения которое заданно для умолчания, почему-то подставляется NULL. Причем, даже если я вручную пытаюсь задать FN('CONTENT').AsString:=''; То все равно FIBPlus делает запрос к базе с NULL значением... опция pfImportDefaultValues:=True И собственно для всех других типов дефолтное значение успешно подставляется.

Тут дело не в Fib+. Тут дело в Delphi, скорее. Дело в том, что данные для blob-поля пишутся в буфер
Код
Код: pascal
1.
датасет.FBN('блоб').Value := ''


в итоге вызовет метод TBlobField.SetAsString('') модуля db.pas:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TBlobField.SetAsString(const Value: string);
begin
  with DataSet.CreateBlobStream(Self, bmWrite) do
    try
      WriteBuffer(Pointer(Value)^, Length(Value));
    finally
      Free;
    end;
end;


При Value равном "Пустая строка" операция WriteBuffer(Pointer(Value)^, Length(Value)) в реальности не сделает никаких изменений.
Автоматиче кое назначение Default value для поля вызовет то же действие.
В итоге на сервер в качестве значения уедет Null.
---
Вместо TpFIBDataSet используй TpFIBQuery. :)
...
Рейтинг: 0 / 0
11.03.2019, 13:35
    #39784447
melbis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FIBPlus blob default значение не NULL
Разрабоччик,

Спасибо! Да есть такой вариант, я нашел в FIBDataset обертку для работы с мемо

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TFIBMemoField.SetAsString(const Value: string); 
begin
 with  TFIBDataSet(DataSet).Database do
  if NeedUTFEncodeDDL
   and IsUnicodeConnect or (FCharSetID in UnicodeCharSets) then
    inherited SetAsString(UTF8Encode(Value))
   else
   inherited SetAsString(Value)
end;



как вариант можно исправить на
Код: pascal
1.
2.
3.
4.
    if Length(Value) > 0 then
       inherited SetAsString(Value)
       else
       inherited SetAsString(' ');



ну или в db.pas там где Вы указали. Но мне не очень нравится этот вариант, все-таки FIB+ общается с СУБД с помощью SQL-запросов как я понимаю? Как отправляется непосредственно блоб в БД? Если с помощью SQL, то правильнее найти тот код в котором формируется этот SQL (точнее подставляются значения в SQL-запрос вместо :FIELD) и там скорее всего происходит анализ, если значение нулевой длины, то подставляется константа NULL, которую и заменить собственно на пустую строку. Но вот не могу найти только где это происходит...
...
Рейтинг: 0 / 0
11.03.2019, 14:37
    #39784489
FIBPlus blob default значение не NULL
melbis,
для редактирования блоб - полей никогда не использовал датесет, только TpFIBQuery, и проблем не было.

Может, действительно добавишь триггер OnBeforeInsert/OnBeforeUpdate?
Код: plsql
1.
2.
if new.txt is null  
  new.txt = '';


И заодно not null к ddl домена. Чтобы ошибочно не навтыкать лишнего.
Все же, контроль на сервере надежнее. И никакой головной боли на клиенте, в данном случае - с fib+.
...
Рейтинг: 0 / 0
11.03.2019, 14:42
    #39784493
FIBPlus blob default значение не NULL
melbisP.S. Создавать тригеры очень не хочу, у меня порядка сотни таблиц.
Сие легко автоматизировать. Например, в генераторе скрипта дизайнера IbExpert. Для каждой таблички, в составе полей которой есть соотв. домен, и т.д. - создать триггер.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FIBPlus blob default значение не NULL / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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