关于流操作问题(请教)(50分)

  • 主题发起人 主题发起人 wangmao
  • 开始时间 开始时间
W

wangmao

Unregistered / Unconfirmed
GUEST, unregistred user!
我想将通过流操作word文档等文件写入数据库并从数据库读出
但是写入和读出的文件字节数并不相同,而且对于word文件从数据库读出后,并不能打开
怎么解决这个问题

我的程序如下
保存到数据库:
var
m_str: Tmemorystream;
sqlstr, file_name, filename, file_ext, str: string;
zq1: TzQuery;
size, i: Integer;

begin
if OpenDialog1.Execute then
begin
file_name := OpenDialog1.FileName;
file_ext := ExtractFileExt(OpenDialog1.FileName);
filename := ExtractFileName(OpenDialog1.FileName)
end;

m_str := Tmemorystream.Create;
m_str.LoadFromFile(file_name);
m_str.Position := 0;
i := m_str.Size;
zq1 := TZQuery.Create(Self);
zq1.Connection := ZConnection1;

with zq1 do
begin
close;
sql.Clear;
SQL.Text := 'insert into tb_file (file_name,file_ext,file) values(:file_name,:file_ext,:file)';
ParamByName('file_name').AsString := filename;
ParamByName('file_ext').AsString := file_ext;
ParamByName('file').LoadFromStream(m_str, ftBlob);

ExecSQL;

end;
zq1.Free;

m_str.Free;

end;

从数据库读出:
var
m_str: Tmemorystream; //修改图片POS_mgxid

str, file_ext, filename: string;
zq1: tzquery;
file_id, SizeOf, i: Integer;
begin
if not zQuery1.IsEmpty then //如果更新编号不为空

begin


m_str := Tmemorystream.Create;

zq1 := TZQuery.Create(Self);
zq1.Connection := ZConnection1;
with zq1 do
begin
close;
SQL.Clear;
SQL.Text := ' select file from tb_file where file_id=' + inttostr(file_id);
Open;

end;


Tblobfield(zq1.FieldByName('file')).savetostream(m_str);
zq1.Free;

file_ext := zQuery1.fieldbyname('file_ext').AsString;
filename := zQuery1.fieldbyname('file_name').AsString;

m_str.SaveToFile(ExtractFilePath(Application.ExeName) + filename);
end;
end;
 
你和是测一下你的程序,我的程序保存word,excel都不会出错的
 
你用是什么数据库?SQL Server之类的数据库有一个选项用来设置Blob Size,可能是这个参数值太小,所以只读出一部分;你看看是否与文件长度有关。
 
我用的是postgresql 字段用的是BYTEA类型,存储二进制类型
 
后退
顶部