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

Куда в файловом ClientDataSet пропадают данные Blob?   Найти похожие ветки 

← →
Aleksandr ©   (2003-07-08 13:45) [0]

Есть бинарная файловая таблица TClientDataSet в виде ID,Type,Data, где Data типа ftBlob. Сохраняю данные в ней вот так:


//эта функция подготавливает и открывает файловый датасет
function TRICard.PrepareClient: TClientDataset;
var
i : integer;
begin
Result:=TClientDataSet.Create(nil);
Result.FileName:=MainDir+UserCardFileName;
if NOT FileExists(Result.FileName) then begin
// копировать поля с шаблона
for i:=0 to DM.csUserInfo.FieldDefs.Count-1 do
Result.FieldDefs.Add(DM.csUserInfo.FieldDefs[i].Name,DM.csUserInfo.FieldDefs[i].DataType);
for i:=0 to DM.csUserInfo.IndexDefs.Count-1 do
Result.IndexDefs.Add(DM.csUserInfo.IndexDefs[i].Name,DM.csUserInfo.IndexDefs[i].Fields,DM.csUserInfo.IndexDefs[i].Options);
Result.CreateDataSet;
Result.SaveToFile;
Result.Active:=false
end;
Result.LoadFromFile;
Result.LogChanges:=false //это чтобы Дельта не хранилась
end;

//эта функция открывает для записи блобовое поле
function TRICard.AddPosition(C : TClientDataSet; IDT: word; const aType: TFilterInfoType=fiBlob): TStream;
begin
if NOT C.Locate("IDT;LocalID;Type",VarArrayOf([IDT,Ord(aType)]),[]) then begin
C.Insert;
C.FieldByName("IDT").AsInteger:=IDT;
C.FieldByName("Type").AsInteger:=Ord(aType);
C.Post;
C.SaveToFile
end;
C.Edit;
Result:=C.CreateBlobStream(C.FindField("Data"),bmReadWrite)
end;

//а это непосредственно код сохранения данных
var
C : TClientDataSet;
B : TStream;
d : byte;
begin
C:=PrepareClient;
if Assigned(C) then try
B:=AddPosition(C,siUserData);
if Assigned(B) then try
B.Position:=0;
B.Size:=0;
B.Write(ID,SizeOf(ID));
d:=Length(Login);
B.Write(d,SizeOf(d));
if d>0 then
B.Write(Login[1],d);
D:=length(Password);
B.Write(d,SizeOf(D));
if d>0 then
B.Write(Password[1],d);
B.Seek(0,soFromBeginning)
finally
B.Free;
C.Post;
C.SaveToFile;
C.Active:=false
end
finally
FreeAndNil(C)
end;
C:=PrepareClient;
if Assigned(C) then try
B:=AddPosition(C,siAccess);
if Assigned(B) then try
B.Position:=0;
B.Size:=0;
FAccessList.Store(B) //свой метод объекта записи в поток
finally
B.Seek(0,soFromBeginning);
B.Free;
C.Post;
C.SaveToFile;
C.Active:=false
end


И вот, млин, проблема появилась. Когда создается пустой файл, то все данные этим кодом в него записываются. А если произвести запись повторно, в уже существующие поля, то начинается интересное кино: после сохранения первой записи - все в порядке, при просмотре файла все данные в нем есть. При сохранении второй записи (FAccessList) после C.SaveToFile вдруг обнаруживаешь, что конкретно блобовые данные первой записи вдруг исчезают - просто пустые становятся. В чем тут проблема? Размер блобового поля стоит 0 (да и фиг его знает, какой размер для блобов надо ставить, прописывая FieldDefs).


← →
Aleksandr ©   (2003-07-08 13:46) [1]

Сорри, что-то инет глюканул и дважды добавилось :(



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

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



Память: 0.45 MB
Время: 0.015 c
1-100682
Альф
2003-07-18 10:36
2003.07.31
Привет :) Маленький вопрос по FastReport 2.4


3-100590
Dinik
2003-07-01 11:16
2003.07.31
Шифрование данных таблицы


1-100788
so_well
2003-07-16 15:15
2003.07.31
olecontainer и blobstream


3-100544
Spawn
2003-07-10 21:39
2003.07.31
Ссылочная целостность


14-100939
XobBIT
2003-07-15 12:13
2003.07.31
Память + Delphi




   Наверх