各位大侠:
       我已经在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'   请各位帮忙!谢谢!
   
    

解决方案 »

  1.   

    给你一份资料,也许有用。
    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的经验之谈。
      

  2.   

    不用Stream,直接保存到数据库和读出后保存到文件吧
    保存:
        TBlobField(cdsERFiles.FieldByName('FileContent')).LoadFromFile(OpenDialog.FileName);读出:
        TBlobField(cdsERFiles.FieldByName('FileContent')).SaveToFile(sFileName);