我用的是sql server数据库,我在数据库中有一个表为Earthstandard,表中有一个drawing字段是image类型的,我想把drawing字段里的存的图片信息取出来,下面是我的代码:
var
   oStream : TADOBlobStream;
   
                oStream :=nil;
                oStream := TADOBlobStream.Create(adoqry.fieldbyname('drawing') as        TBlobField, bmReadWrite);
                dbiEarthStandard.Picture.Bitmap.LoadFromStream(oStream);
                oStream.Free;但是程序运行到oStream := TADOBlobStream.Create(adoqry.fieldbyname('drawing') as        TBlobField, bmReadWrite);就报错,错误为:Invalid Class typecast
请问这是什么原因,谢谢

解决方案 »

  1.   

    var
       oStream : TADOBlobStream;
       
      oStream :=nil;
      oStream := TADOBlobStream.Create(TBlobField(adoqry.fieldbyname('drawing')), bmReadWrite);
      dbiEarthStandard.Picture.Bitmap.LoadFromStream(oStream);
      oStream.Free;
      

  2.   

    do2008我照你说的改了,但是又出现这样的错误了:access violation at address 00000000,read of address 00000000,这是什么原因啊
      

  3.   

    oStream:=TMemoryStream.Create;
        TBlobField(adoquery.FieldByName('Contain')).SaveToStream(oStream);
        dbiEarthStandard.Picture.Bitmap.LoadFromStream(oStream);
      

  4.   

    >>do2008我照你说的改了,但是又出现这样的错误了:access violation at address 00000000,read of address 00000000,这是什么原因啊
    哦,这样写都会出错,奇怪了,你的adoqry ,Open了没有,以bmReadWrite的方式创建TADOBlobStream,
    要先
    adoqry.edit;
      

  5.   

    zczb我照你说的办法做了,没有问题了
    但是不能显示图片,请问这是什么问题啊
      

  6.   

    你将oStream保存成文件,再从文件读图试试看。(主要是想测试一下oStream中有没有内容)
      

  7.   

    do2008我是这样做的,我写了一个类叫EarthStandard有name,description和image三个属性
    其中image:tfield
    然后我的语句是这样的:
    function loadESFromDB(AName:String):TEarthStandard;
    var adoqry:TADOQuery;
         esi:TEarthStandard;
    begin
                       adoqry:=Tadoquery.create(application);
                       adoqry.connection:=dmgis.adocon;
                       adoqry.sql.add('select * from earthstandard where name='''+AName+'''');
                       adoqry.open;
                       if not adoqry.eof then
                         begin
                             esi.name:=adoqry.fieldbyname('name').value;
                            esi.description:=adoqry.fieldbyname('property').value;
                             esi.image:=adoqry.fieldbyname('drawing'); 
                         end;end;
    然后在formEarthstandard的界面里调用
               var
       oStream : TADOBlobStream;
       esi:TEarthstandard;
                    oStream :=nil;
                    oStream := TADOBlobStream.Create(esi.image as        TBlobField, bmReadWrite);
                    dbiEarthStandard.Picture.Bitmap.LoadFromStream(oStream);
                    oStream.Free;
    你看这样有错吗?错误在哪儿?
      

  8.   

    对了,在loadESFromDB方法里忘了一句:loadESFromDB:=esi;
      

  9.   

    //以载入JPEG图片为例
    //假设我的数据库里已经有了一条记录,其中的Pic字段是Image类型uses Jpeg;  var
      AdoBlobStream:TAdoBlobStream;
    begin
      AdoBlobStream:=TAdoBlobStream.Create(TBlobField(AdoDataSet.FieldByName('Pic')),bmRead);
      try
        if Image1.Picture.Graphic=nil then Image1.Picture.Graphic:=TJpegImage.Create; //有这句应该不会访问出错了。
        Image1.Picture.Graphic.LoadFromStream(AdoBlobStream);
      finally
        AdoBlobStream.Free;
      end;
    end;我是在我机上试的,楼主把变量什么的换成自己的试试看