powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FIBPlus blob default значение не NULL
23 сообщений из 23, страница 1 из 1
FIBPlus blob default значение не NULL
    #39783237
melbis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Подскажите есть домен для 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
FIBPlus blob default значение не NULL
    #39783253
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FIBPlus blob default значение не NULL
    #39783258
melbis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

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

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

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

и ничего менять не придется :)
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39783288
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melbisЕсли задавать в ручную FN('FIELD').AsString=''; то опять на выходе ошибка из-за NULL.
кстати, а что за ошибка и что за "выход"?
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39783297
melbis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычна ошибка 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
FIBPlus blob default значение не NULL
    #39783405
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melbis,

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

или соотв. функции
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39783480
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FIBPlus blob default значение не NULL
    #39783489
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

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

не только
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39784311
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.
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
FIBPlus blob default значение не NULL
    #39784317
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melbisЕсть ли вариант настроить FIB+ таким образом чтобы он не пытался подставить NULL вместо пустой строки?
кроме той опции, я про другие не знаю. Кстати, как ты узнаёшь, что вместо пустой строки там NULL?
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39784321
melbis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

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

так и есть! И чтобы не изобретать велосипед, может у кого-то уже есть исправленный блок ФИБов для работы с BLOB NULL?
...
Рейтинг: 0 / 0
FIBPlus blob default значение не NULL
    #39784431
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
FIBPlus blob default значение не NULL
    #39784447
melbis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрабоччик,

Спасибо! Да есть такой вариант, я нашел в 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
FIBPlus blob default значение не NULL
    #39784489
melbis,
для редактирования блоб - полей никогда не использовал датесет, только TpFIBQuery, и проблем не было.

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


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


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