我们原先使用的是Access 97,存放了个人资料(姓名、性别、照片等等,其中照片使用的是ole 对象),现在系统升级了,要求把Access的数据导入到Sql 2000中,可是导入成功后发现delphi的DbImage不支持转入的格式,提示:Bitmap image is not valid.我查了一些文章,可是还是没能解决,特地来请教大家,先谢过了!
其中有篇文章介绍了VB的解决办法,不知道Delphi能不能?下面是这篇文章:
Access数据库的OLE型字段中存放的图形是按OLE格式存放的图像,而不是VB的Image控件或Picturebox控件所支持的标准图片格式(.bmp、.rle、.ico、.gif、.jpg、.emf和.wmf),所以不能使用Image控件或Picturebox控件来观看。应该使用VB的OLE控件,该控件在工具条中如右图所示。我们以VB5目录下的NWIND.MDB文件为例说明这一过程。首先在窗体上添加Data控件(以下称为Data1),将Database设为NWIND.MDB文件,然后将RecordSource属性设为Employees表。再在窗体上添加OLE控件,此时VB会显示一个对话框让你选择文件类型,按“取消”键(如果这时你误按了“确定”键,则需将OLE控件的Class属性置为空。)。设置DataSource为Data1,DataField为Photo(这是一个OLE图形字段)。这时你再运行就可以得到想要的结果了。这个技巧也适用VB 4.0的32位版本。如果是使用VB 4.0的16位版本或VB 3.0, 不能使用这一技巧,可以访问Microsoft Knowledge Base(http://support.microsoft.com/default.aspx),其中的Q147727 是针对VB 4.0的16位版本,Q113957则针对VB 3.0。从这两篇文章中,你也可以了解到Access 1.x和2.0是怎样存储OLE字段的。 

解决方案 »

  1.   

    用Sql 2000直接导入数据不行吗。
    如果不行,你用OLE控件另存为一个文件,再将这个文件用下面的方法存入库中。
    var
      sFileName :string;  function BlobContentToString(const FileName: String): String;
      begin
        with TFileStream.Create(FileName, fmOpenRead) do
        try
          SetLength(Result,Size);
          read(Pointer(Result)^,Size);
        finally
          Free;
        end;
      end;begin
      if (OpenDialog1.Execute) then
      begin
        sFileName :=OpenDialog1.FileName;
        frmData.cdsHtyg.edit;
        frmData.cdsHtyg.fieldByName('原稿内容').AsString:=BlobContentToString(sFileName);
        frmData.cdsHtyg.Post;
      end;
      

  2.   

    1。在导入过程中,可能你的图片被损坏,可能是你的连接SQL SERVER的别名参数中blob size设置太小,改大些再升级试试,如10240,太小的话导入不完整2。可能你的图片格式是*.gif、*.jpg,Delphi的TDbImage直接支持有问题,应在用到TDbImage的窗口的onCreate事件中注册TJPEGImage类,执行RegisterClass(TJPEGImage);
      

  3.   

    谢谢各位了!可是我还是有些问题,麻烦大家看看首先,Access的ole对象存储的是BMP格式照片,73k一张,一个库大概有1500条数据。导入到Sql2000后担心图片损坏,所以我试着导回到Access,图片可以正常打开。
    我现在想问的是:Delphi的DbImage是否支持BMP格式?如果是,那么就说明Access数据库的OLE型字段中存放的图形是按OLE格式存放的图像,而不是Delphi的DbImage控件所支持的标准图片格式。
    #################################################################################
    请哪位高手试着将包含ole对象(存入照片信息)的Access数据库导入到Sql2000,然后通过Delphi的DbImage控件显示出对应字段的照片。
    #################################################################################
    再次感谢大家的热情帮助^-^
      

  4.   

    谢谢goldstar365(星光宝盒)提供的解决办法,可是因为数据量特别大,有1万多条记录,如果每个都转储太烦琐而且容易出错。
    我想说的是如果能直接将包含ole对象(存入照片信息)的Access数据库导入到Sql2000,然后通过Delphi的DbImage控件显示出对应字段的照片那就万事大吉了。可是我试着这么做没能成功,大家还有什么好办法吗?