数据库是access 2000,数据库的名字:DB1;数据表的名称:T01;
字段名:
xh 文本 /*编号*/
xm 文本 /*姓名*/
zp OLE对象 /*照片*/unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, ExtCtrls, DB, ADODB, ComCtrls, jpeg,DBTables,
  DBCtrls;type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Button1: TButton;
    Label5: TLabel;
    Edit5: TEdit;
    Label6: TLabel;
    Edit6: TEdit;
    Button2: TButton;
    Label7: TLabel;
    Edit7: TEdit;
    GroupBox1: TGroupBox;
    Button3: TButton;
    Button4: TButton;
    Image1: TImage;
    OpenDialog1: TOpenDialog;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    UpDown1: TUpDown;
    Label8: TLabel;
    Edit8: TEdit;
    Image2: TImage;
    RichEdit1: TRichEdit;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }  end;var
  Form1: TForm1;
  FileDiskPath: string;
implementation
uses comfun;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
    if edit1.Text <>'' then
    begin
        //showmessage(comfun.ChangeDateFormat(edit1.Text));
        if (comfun.ChangeDateFormat(edit1.Text)<>'F') then
        begin
            edit2.Text :=comfun.ChangeDateFormat(edit1.Text);
        end;
    end;        edit4.Text:=comfun.DateChangeStr(date());end;procedure TForm1.Button2Click(Sender: TObject);
begin
    if (comfun.formatdata(edit5.text)<>'F') then
    begin
        edit6.text:=comfun.formatdata(edit5.text);
        edit7.Text:=comfun.formatstring(edit6.text);
    end;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  if opendialog1.Execute then
  begin
    image1.Picture.LoadFromFile(opendialog1.FileName);
    FileDiskPath:=opendialog1.FileName ;
  end ;
end;//将.JPG图片存到数据库中
procedure TForm1.Button4Click(Sender: TObject);
var
    buffer:TMemoryStream;
    length: longint;
begin
    //ADOConnection1.ConnectionString :=ADOConnection1.ConnectionString + ';sa=';
    ADOConnection1.Connected :=true;
  if ADOConnection1.Connected  then
  begin
     buffer:=TMemoryStream.Create ;
     image1.Picture.Graphic.SaveToStream (buffer); 
     ADOQuery1.SQL.Clear ;
     ADOQuery1.SQL.Text :='insert into t01(xh,xm,zp) values (:xh,:xm,:image)';
     ADOQuery1.Parameters.ParamByName('xh').Value :='C001';
     ADOQuery1.Parameters.ParamByName('xm').Value :=edit8.text;
     ADOQuery1.Parameters.ParamByName('image').LoadFromStream (buffer,ftblob);
     ADOQuery1.ExecSQL;
     ADOQuery1.Close;
     buffer.Free ;
     ADOQuery1.close;
     showmessage('存盘成功!');
  end
  else
    showmessage('数据库连接出错!,请重试');
    ADOConnection1.Connected :=true;
end;//从数据库中读出图片数据,并显示在IMAGE中
procedure TForm1.Button5Click(Sender: TObject);
var
    blobstream:TblobStream;
    jpegmap:Tjpegimage;
begin
//读出数据
     ADOConnection1.Connected :=true;
     ADOQuery1.SQL.Clear ;
     ADOQuery1.SQL.Text :='select zp from t01';
     ADOQuery1.open;
     if  not ADOQuery1.FieldByName('zp').IsNull then
  begin
    JpegMap:=TJpegImage.Create;
    blobstream:=TBlobStream.Create(TBlobField(ADOQuery1.FieldByName('zp')),bmRead);
    try
      JpegMap.LoadFromStream(blobstream);
      Image2.Picture.BitMap.Assign(JpegMap);
    finally
      jpegmap.free;
      blobstream.free;
    end;
  end
  else image2.Picture:=nil;
end;end.出现的问题是:进行图片显示的时候,在运行时提示:"invalid  class typecast",点击确定后停留在
    blobstream:=TBlobStream.Create(TBlobField(ADOQuery1.FieldByName('zp')),bmRead);
这句。请问:是什么错误导致发生这个错误。怎么改正呢。
还有两个问题:   
    1。使用流把图片存进数据库,怎么样做才能成功?前提是使用ADOQUERY,而不是用表(TTABLE)。
    2。使用流能否把一个IMAGE中的图片读到另一个IMAGE中?请给出源码。
请各位高手指点。

解决方案 »

  1.   

    哈哈。。
    我知道哪里错了!驱动程序的问题;一定要用ORACLE的驱动,不能用微软给ORACLE开发的驱动,用ODBC也不好!—————————————————————————————————
    ┏━★━━◆━━★━┓ 
    ♂欢|◢CSDN◣|使♂        ▲自由保存帖子,浏览,关注检测
    ┃迎|◥论坛助手◤|用┃        ▲完善的CSDN客户端工具
    ┗━☆━━◇━━━☆┛       ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
    http://www.csdn.net/expert/topic/573/573604.xml
    http://www.chinaok.net/csdn/csdn.zip
      

  2.   

    还有,记住要升级DELPHI6和ADO2.6
      

  3.   

    invalid  class typecast--非法的类转换
    看看哪里类型不匹配,或是表中的字段是否是"Blob"或"OLE 对象"类型
      

  4.   

    procedure TDriverInfoForm.BitBtn1Click(Sender: TObject);
    var
            ImageField:TField;
            Picture:TPicture;
            
    begin
      
    if OpenPicDlg.Execute then
    Begin
            with DataSource.DataSet do
            try
              Query.Edit;
              ImageField := FindField('Pic');
              if ImageField <> nil then
              begin
                Picture := TPicture.Create;
                try
                  Query.Edit;
                  Picture.LoadFromFile(OpenPicDlg.FileName);
                  if Picture.Graphic is TBitmap then
                    ImageField.Assign(Picture)
                  else
                  SaveGraphicToBlobField(Picture.Graphic, ImageField);
                finally
                  Picture.Free;
                  end;
              end;
              
            except
            end;
    End;
    end;procedure SaveGraphicToBlobField(AGraphic: TGraphic; AField: TField);
    var
      BlobStream: TStream;
    begin
      if AField is TBlobField then
        with AField as TBlobField do
        begin
          {$IFNDEF DELPHI3}
          BlobStream := TBlobStream.Create(AField as TBlobField, bmWrite);
          {$ELSE}
          BlobStream := DataSet.CreateBlobStream(AField, bmWrite);
          {$ENDIF}
          try
            AGraphic.SaveToStream(BlobStream);
          finally
            BlobStream.Free;
          end;
        end;
    end;
      

  5.   

    存入(bmp是例子, 随便什么文件都可以)
    imagestream:=tfilestream.create('d:\test.bmp',fmShareDenyNone);
    Sqlclause:='insert into  table values(:aa)';
            tempquery.SQL.Clear;
            tempquery.SQL.Add(SqlClause);
            Tempquery.Parameters.ParamByName('aa').LoadFromStream(imagestream,ftblob);
            tempquery.ExecSQL;取出
    SqlClause:='select * from table';
          tempquery:=tadoquery.Create(application);
          try
            tempquery.SQL.Clear;
            tempquery.SQL.Add(SqlClause);
            tempquery.open;
            while not tempquery.Eof do
            begin          filename:='d:\test1.bmp'
    (tempquery.fieldbyname('image') as TBlobField).savetofile(filename);
              imagestream:=TFileStream.Create(filename,fmShareDenyNone);
    tempquery.Next;
            end;
          finally
            tempquery.Free;
          end;
        end;
    图片字段是ole型
    我用的delphi5,ado2.5,win98,没问题