Вниз
Скачать: CL | DM;

TBlobField не записывается как NULL   Найти похожие ветки 

← →
StriderMan ©   (2006-03-02 21:09) [0]

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

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

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


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


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

 Transaction.CommitRetaining

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

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

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

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


← →
StriderMan ©   (2006-03-02 21:15) [1]

PS:

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

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


← →
Desdechado ©   (2006-03-02 21:16) [2]

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


← →
Desdechado ©   (2006-03-02 21:17) [3]

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


← →
API   (2006-03-02 21:18) [4]

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

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

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

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


← →
StriderMan ©   (2006-03-02 21:33) [5]

результаты я смотрю через утилиту 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;


← →
StriderMan ©   (2006-03-03 12:25) [6]

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

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 .... ?



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
2-1143476056
Genry
2006-03-27 20:14
2006.04.09
Функции арифметического округления


2-1143307171
Китаец
2006-03-25 20:19
2006.04.09
Компонент WebBrowser


3-1139917696
V-kras
2006-02-14 14:48
2006.04.09
Поиск нескольких слов в тексте


2-1143033318
sanich
2006-03-22 16:15
2006.04.09
Как динамически формировать имя переменной?


2-1143437746
Chai
2006-03-27 09:35
2006.04.09
Замена ExtractFileName в Win API




   Наверх