Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TBlobField не записывается как NULL


StriderMan ©   (2006-03-02 21:09:00) 

Доброго времени суток, уважаемые мастера!

Пишу на Delphi7, использую InterBase и компоненты IBExpress

проблема такая:


var
 fld: TBlobField
begin
 fld.Clear;
....


дальше делаем

 Transaction.CommitRetaining

 и в итоге в таблицу попадает не NULL а пустая строка

далее самое интересное!
ищем запросом TIBSQL эту запись, находит...

и в это поле в результате запроса попадает уже не пустая строка, а строка, содержащая текст '(Blob)'

Вопрос. Как записать в блоб null?


StriderMan   (2006-03-03 12:25:00) [1]

нашел вот такой замечательный код в исходниках

function TIBXSQLVAR.GetAsVariant: Variant;
begin
 if IsNull then
   result := NULL
 { Check null, if so return a default string }
 else case FXSQLVAR.SqlDef of
     SQL_ARRAY:
       result := '(Array)'; {do not localize}
     SQL_BLOB:
       result := '(Blob)'; {do not localize}

а так как пустая строка не является NULL то получаем вместо пустой строки '(Blob)'

И о чем думали разработчки IBX .... ?


StriderMan   (2006-03-02 21:33:00) [2]

результаты я смотрю через утилиту IBExpert. в нем можно посмортеть БЛОБ в любом виде, в т.ч. как строку. Вот там-то и отображается пустая строка а не null.


> С какой целью Вы используете TBlobField для работы со строковыми
> полями?


один блоб используется для записи строки неограниченной длины, а другой - для картинок.


> а как привязано это поле к датасету?


для доступа к таблице используются в разных случаях либо TIBTable с полями, тогда как раз и проявляется эффект что вместо NULL записывается пустая строка,

либо TIBSQL, которым производится поиск в таблице по уникальному полю.
После поиска, поля из запроса переписываются в запрос типа UPDATE, в который и попадает злосчастный 'Blob'


procedure TdmTableReport.FillParamsByDataQuery(const AParams: TIBXSQLDA);
var
 i: integer;
begin
 if (DataQuery = nil) then Exit;
 for i := 0 to DataQuery.FieldCount - 1 do
   AParams.ByName(DataQuery.Fields[i].Name).Value := DataQuery.Fields[i].Value;
end;


API   (2006-03-02 21:18:00) [3]

TBlobField не записывается как NULL <...> и в итоге в таблицу попадает не NULL а пустая строка

С какой целью Вы используете TBlobField для работы со строковыми полями?

и в это поле в результате запроса попадает уже не пустая строка, а строка, содержащая текст '(Blob)'

Как Вы это определили?


Desdechado   (2006-03-02 21:17:00) [4]

а как привязано это поле к датасету?
что в запросе стоит?


Desdechado   (2006-03-02 21:16:00) [5]

> строка, содержащая текст '(Blob)'
это просто способ показа блоба в гриде


StriderMan   (2006-03-02 21:15:00) [6]

PS:

пробовал обNULLять по-всякому

fld.Clear;
fld.Value := NULL;
fld.SetData(nil);


Наверх

Титульная страница Поиск, карта сайта Написать письмо