最終,我的目標是能夠在sqlite BLOB字段中保存一組記錄數據結構,但在此期間,我試圖序列化一組記錄並將其存儲在TMemoryStream中。在情況下,它可能是相關的,我使用Tim Anderson's sqlite wrapper(Unicode)的2010年與德爾福如何將「記錄數組」保存到TMemoryStream(然後存儲在sqlite BLOB字段中)?
這是我記錄的聲明數組:
type
TPerson = array of packed record
sCountry: string[50];
sFullName: string[100];
sAddress: string[100];
sCity: string[30];
sEmployer: string[100];
end;
var
MyPeople : TPerson;
這裏是我目前使用的序列化此數組的代碼記錄到TMemoryStream。問題是,這是行不通的:在任如何一般序列記錄的陣列到內存流,或更好的方法來存儲一組記錄在一個SQLite BLOB字段
var
i : integer;
ms : TMemoryStream:
ms2 : TMemoryStream;
TestPeople : TPerson;
sldb : TSQLiteDatabase;
begin
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
sldb := TSQLiteDatabase.Create(slDBPath); //sldBPath is a global variable with path to sqlite db
try
i := Length(MyPeople);
ms.Write(i, 4);
ms.Write(pointer(MyPeople)^, i * sizeOf(MyPeople));
///
ms2.Read(i, 4);
SetLength(ms2, i);
ms2.Read(pointer(TestPeople)^, i * sizeOf(TestPeople));
WriteLn('#############' + ms2[0].sFullName); //check if we can read data back
sQuery := 'UPDATE PersonDirectory SET fldPersonBlob = ? WHERE id = "' + 42 + '";';
sldb.UpdateBlob(sQuery, ms);
finally
ms.Free;
ms2.Free;
sqldb.Free;
end;
end;
任何想法?
元素的大小仍然可以找到:'SizeOf(MyPeople [0])'。 – 2011-03-14 00:57:54
是的,你說得對,但是如果你像這樣分開代碼,代碼會更加清晰。由於TPersons可以包含多個人,所以命名也更好。 :) – GolezTrol 2011-03-14 01:17:18
同意,尤其是命名! – 2011-03-14 01:44:09