从blob文件Delphi xe2中读取msword

时间:2014-12-16 12:43:03

标签: delphi delphi-xe2

我从包含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中它起作用了......:/

2 个答案:

答案 0 :(得分:3)

您需要使用TBlobField.CreateBlobStream并复制到TFileStream

根据documentation

  

调用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的产品有很多错误。

相关问题