我从包含msword文件的数据库中读取blob字段时遇到问题,并将其保存到文件(.doc / .docx)中。什么是更好的Delphi 2010,但在Delphi Xe2保存的文件无效。这是我的代码
dane.SQLtmp.Close;
dane.SQLtmp.SQL.Clear;
dane.SQLtmp.SQL.Add('select wydruk,typ,IdWydruku from wydruki where nazwa=:d0');
dane.SQLtmp.Params[0].AsString:=name;
dane.SQLtmp.Open;
if dane.SQLtmp.RecordCount> 0 then
begin
t:=TMemoryStream.Create;
t.Position:=0;
TblobField(dane.sqltmp.FieldByName('wydruk')).saveToStream(T);
T.SaveToFile('C:\FILE'+filetpe);
t.Free;
end;
将文件保存到数据库中:
dane.SQLtmp.Close;
dane.SQLtmp.SQL.Clear;
dane.SQLtmp.SQL.Add('insert into Wydruki (Nazwa,Operator,wydruk,opis,typ,rodzaj,podmiot,typsplaty,grupa,podgrupa)');
dane.Sqltmp.SQL.Add('VALUES (:d0,:d1,:d2,:d3,:d4,:d5,:d6,:d7,:d8,:d9)');
dane.SQLtmp.Params[0].AsString:=NazwaPliku; //File name
dane.SQLtmp.Params[1].AsInteger:=glowny.ID_operator;
t:=TMemoryStream.Create;
t.Position:=0;
t.LoadFromFile(OpenFile.FileName);
t.Position:=0;
dane.sqltmp.Params[2].LoadFromStream(t,ftBlob);
dane.SQLtmp.Params[3].AsString:=opis;
dane.SQLtmp.Params[4].AsString:=typ; // file type
// .
// .
// .
dane.SQLtmp.ExecSQL;
在Delphi 2010中它起作用了......:/
答案 0 :(得分:3)
您需要使用TBlobField.CreateBlobStream
并复制到TFileStream
。
调用CreateBlobStream以获取用于读取和写入Field参数指定的字段值的流。 Mode参数指示流是否将用于读取字段的值(bmRead),写入字段的值(bmWrite)或修改字段的值(bmReadWrite)。
同一文档页面上的提示说:
提示:最好调用 CreateBlobStream ,而不是直接在代码中创建blob流。这确保了流适合于数据集,并且还可以确保在内存中不总是存储BLOB数据的数据集在创建流之前获取blob数据。
基于您的示例代码:
var
Blob: TStream;
Strm: TFileStream;
BlobFld: TBlobField;
begin
dane.SQLtmp.SQL.Text := 'select wydruk,typ,IdWydruku from wydruki where nazwa=:d0';
dane.SQLtmp.Params[0].AsString:=name;
dane.SQLtmp.Open;
BlobFld := dane.SQLtmp.FieldByName('wydruk') as TBlobField;
Blob := dane.SQLtmp.CreateBlobStream(BlobFld, bmRead);
try
Strm := TFileStream.Create('C:\FILE' + filetpe, fmCreate);
try
Strm.CopyFrom(Blob, Blob.Size);
finally
Strm.Free;
end;
finally
Blob.Free;
end;
end;
答案 1 :(得分:0)
问题在于Xe2中的Interbase组件(IB)。当我将它们更改为FireDac'c组件时,我和你的代码可以正常工作。 这很有意思,最近embarcadero的产品有很多错误。