TBlobField(FieldByName('字段名')).SaveToFile('路径\word.doc');会出现invalid class typecast意外,用的是ADO连接的数据库
一,显示 procedure TfrmOLE.SetOle(nodeName:string); var src:TStream; name,desc:string; begin self.caption := '您正在操作'+nodeName+'站点的文件数据'; name := frmInfoGSM.tblFile.fieldbyname('fileName').AsString; desc := frmInfoGSM.tblFile.fieldbyname('fileDesc').AsString; editDesc.Text := desc; editName.Text := name; src := (frmInfoGsm.tblFile.CreateBlobStream(frmInfoGsm.tblFile.FieldByName('fileData'),bmRead)); src.Position := 0; ole.LoadFromStream(src); FNodename := nodename; FFileName := name; end;二,修改后保存到数据库 var fStream:Tmemorystream; name,desc:string; begin fStream := Tmemorystream.Create; ole.SaveToStream(fStream); name := editName.Text; desc := editDesc.Text; if frmInfoGSM.tblFile.Locate('nodeName;fileName',VarArrayOf([FnodeName,FFileName]),[loCaseInsensitive]) then begin frmInfoGSM.tblFile.edit; frmInfoGSM.tblFile.FieldByName('fileName').AsString := name; frmInfoGSM.tblFile.FieldByName('fileDesc').AsString := desc; fstream.Seek(0,soFromBeginning); (frmInfoGSM.tblFile.FieldByName('fileData') as TBlobField).LoadFromStream(fstream); frmInfoGSM.tblFile.Post;
谢谢hf_linux(悟空) : 我测试了显示,代码如下: var Stream: TStream; begin ADOTable1.open; Stream := ADOTable1.CreateBLOBSTREAM(ADOTable1.fieldbyname('pic'), bmRead); if Stream.Size = 0 then showmessage('fdd'); end; 还是会出现invalid class typecast意外 希望大家给点意见
谢谢hf_linux(悟空) : 我测试了保存部分,代码如下: var stream1: TMemoryStream; begin OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';//{从对话窗选择文件} if OpenDialog1.Execute then begin stream1 := TMemoryStream.Create; OleContainer1.SaveToStream(Stream1); ADOTable1.Open; ADOTable1.Edit; Stream1.Seek(0,soFromBeginning); (ADOTable1.FieldbyName('pic') as TBlobField).LoadFromStream(stream1); ADOTable1.Post; end; end; 还是会出现invalid class typecast意外 希望大家给点意见
郁闷啊,为什么老是出现invalid class typecast意外错误,谁能帮我找出问题所在啊?
VB好像挺简单的,以前做出过.
DELPHI不太清楚,关注ING
2、用OLE将临时文件打开。简略代码
从数据库读word数据:TBlobField(FieldByName('字段名')).SaveToFile('路径\word.doc');
OLE打开word文件:OpenDialog1.Execute;
OleContainer1.CreateLinkToFile(OpenDialog1.FileName,True);
我生成的word.doc为什么是空的啊,明明数据库里表对应的字段有二进制数据啊?
procedure TfrmOLE.SetOle(nodeName:string);
var
src:TStream;
name,desc:string;
begin
self.caption := '您正在操作'+nodeName+'站点的文件数据';
name := frmInfoGSM.tblFile.fieldbyname('fileName').AsString;
desc := frmInfoGSM.tblFile.fieldbyname('fileDesc').AsString;
editDesc.Text := desc;
editName.Text := name;
src := (frmInfoGsm.tblFile.CreateBlobStream(frmInfoGsm.tblFile.FieldByName('fileData'),bmRead));
src.Position := 0;
ole.LoadFromStream(src); FNodename := nodename;
FFileName := name;
end;二,修改后保存到数据库
var
fStream:Tmemorystream;
name,desc:string;
begin
fStream := Tmemorystream.Create;
ole.SaveToStream(fStream);
name := editName.Text;
desc := editDesc.Text;
if frmInfoGSM.tblFile.Locate('nodeName;fileName',VarArrayOf([FnodeName,FFileName]),[loCaseInsensitive]) then
begin
frmInfoGSM.tblFile.edit;
frmInfoGSM.tblFile.FieldByName('fileName').AsString := name;
frmInfoGSM.tblFile.FieldByName('fileDesc').AsString := desc;
fstream.Seek(0,soFromBeginning);
(frmInfoGSM.tblFile.FieldByName('fileData') as TBlobField).LoadFromStream(fstream);
frmInfoGSM.tblFile.Post;
我测试了显示,代码如下:
var
Stream: TStream;
begin
ADOTable1.open;
Stream := ADOTable1.CreateBLOBSTREAM(ADOTable1.fieldbyname('pic'), bmRead);
if Stream.Size = 0 then showmessage('fdd');
end;
还是会出现invalid class typecast意外
希望大家给点意见
我测试了保存部分,代码如下:
var
stream1: TMemoryStream;
begin
OpenDialog1.Filter:='WORD文档(*.DOC)|*.DOC';//{从对话窗选择文件}
if OpenDialog1.Execute then
begin
stream1 := TMemoryStream.Create;
OleContainer1.SaveToStream(Stream1);
ADOTable1.Open;
ADOTable1.Edit;
Stream1.Seek(0,soFromBeginning);
(ADOTable1.FieldbyName('pic') as TBlobField).LoadFromStream(stream1);
ADOTable1.Post;
end;
end; 还是会出现invalid class typecast意外
希望大家给点意见