从SQL数据库中读取文件出错,急,在线等? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061222113003166.html
各位大侠:
我已经在SQL数据库中有一个字段存放了EXCEL文件,为Image类型,现在通过存储过程取得数据,但想打开取出的EXCEL文件时出错,我的代码如下:
var
Estream:TadoBlobStream;
ClientDataSet1.close;
ClientDataSet1.command:='Exec 存储过程名 ';
ClientDataSet1.open;
Estream:=TadoBlobStream.Create((ClientDataSet1.FieldByName('t_excel') as TBlobField),bmRead);
Estream.SaveToFile('c:\123.xls');
Estream.free;
但是运行时出错:'Invalid class typecast'
请各位帮忙!谢谢!
用十六进制编辑器对比一下文件装入前后的文件头是不是一样。
然后找原因。
给你一份资料,也许有用。
SQL Server和Delphi中有一个讨厌的地方就是,存储任意二进制文件的时候,比较烦人,例如把一个Word文件(25KB)保存到SQL Server中,但是等你重新提出保存成另外的文件的时候,可能生成的文件大小只有24.7KB左右大小了!这样Word就不能打开重新生成的文件!
要解决这个问题,要做几个修改:
首先,你必须修改SQL Server中用来保存任意文件的字段的类型为Image(不要用Text/nText字段,更加不要用Binary/VarBinary字段,因为binary字段最多只能存储8K的数据)数据类型,然后,你在Word里面添加字段的时候,Delphi会默认字段类型为ftMemo,你必须把这个字段改成ftBlob字段!以后你就可以通过
Table1FileField.LoadFromFile()/SaveToFile()来读取任意的二进制文件了!而且不会丢失任何字节!也不会多出什么东西来!这是Kingron的经验之谈。
不用Stream,直接保存到数据库和读出后保存到文件吧
保存:
TBlobField(cdsERFiles.FieldByName('FileContent')).LoadFromFile(OpenDialog.FileName);
读出:
TBlobField(cdsERFiles.FieldByName('FileContent')).SaveToFile(sFileName);
问题已经解决,谢谢各位!结贴,给分