Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
ВнизКуда в файловом 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 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.31;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c