我的代码有什么问题?我尝试保存一个对象,然后再次将其加载到数据库中的一个blob字段,但没有得到任何返回。
记录被保存,但我不能说数据是否被正确写入,因为我不能读回数据。
下面是对象类型:
TMyObject = class
Name: string;
end;
在这里我试着保存:
procedure TForm1.btnSaveObjectClick(Sender: TObject);
var
myObject: TmyObject;
aMemoryStream: TMemoryStream;
begin
myObject:= TMyObject.Create;
myObject.Name:=edtName.Text;
aMemoryStream:= TMemoryStream.Create;
aMemoryStream.Write(myObject, myObject.InstanceSize);
aMemoryStream.Position:=0;
with TSQLQuery.Create(nil) do
begin
DataBase:=Conn;
SQL.Text:='INSERT INTO testtable (data) VALUES (:data)';
try
ParamByName('data').LoadFromStream(aMemoryStream, ftBlob);
ExecSQL;
TX.CommitRetaining;
finally
aMemoryStream.Free;
myObject.Free;
Free;
end;
end;
end;
尝试再次读取数据:
procedure TForm1.btnLoadObjectClick(Sender: TObject);
var
myObject: TMyObject;
BlobStream : TStream;
begin
with TSQLQuery.Create(nil) do
begin
DataBase:=Conn;
SQL.Text:='SELECT data FROM testtable';
myObject:= TmyObject.Create;
try
Open;
Last;
BlobStream:= CreateBlobStream(FieldByName('data'), bmread);
BlobStream.Position:=0;
BlobStream.Read(myObject, BlobStream.Size);
ShowMessage('Stored Name: ' +myObject.Name);
finally
myObject.Free;
Free;
end;
end;
end;
BlobStream应该免费吗?
2条答案
按热度按时间dwthyt8l1#
将对象存储到文件、流或blob字段中的正确方法是首先使用额外的方法扩展对象,以便将对象字段(对象内部变量)中的数据加载和保存到单个内存块中。
您可以通过保存一个又一个字段来实现这一点。
如果你的对象是动态大小的(包含动态数组或字符串),不要忘记分别存储它们的大小,这样你就可以在以后加载对象时知道有多少数据属于它们。
另外,如果你的对象包含一些其他对象,你也需要它们有类似的方法来存储和加载它们的数据。
实现在很大程度上取决于对象的类设计。下面是一个字符串字段的代码示例:
这样,就可以使用CreateBlobStream返回的流,并将myObject保存到blobfield:
..或从流中加载它:
7xllpg7q2#
将文件保存在SQL SERVER/ Delphi 中的图像类型字段中:
TblobField(QCMD.FieldByName('ARQUIVO ')).LoadFromFile(lFile);