FROM1含AdoConnection、ADOQuery、Datasource、DBGrid三个控件,数据库为SQL2000,连接的数据表中含有“照片”列,为image类型,程序用文件流的方式存储图片到照片列,FORM2中含有image、多个DBEdit,在FORM1中的DBGrid的单元格双击事件中弹出FORM2以显示当前单条记录并在image显示“照片”列中存储的图片
在UNIT2中:
procedure TForm2.FormCreate(Sender: TObject);
var
  mStream:TMemoryStream;
  JpgFile:TjpegImage;
begin
      mStream:=TMemoryStream.Create ;
    TBlobField(Form1.ADOQuery1.FieldByName('照片')).SaveToStream(mStream);  //
    mStream.Position :=0;
    JpgFile:=TjpegImage.Create ;
    jpgfile.LoadFromStream(MStream);
    image1.Picture.Bitmap.Assign(JpgFile);
end;
UNIT1中 :
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
 Form2:TForm2;
begin
    Form2:=TForm2.Create(self);
  Form1.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.Active:=true;
end;
但是运行提示错误:[Error] UNIT2.pas(91): Illegal character in input file: ' ' ($A1A1)不明白是什么意思一直没有改对,请大家帮忙修改多谢!  

解决方案 »

  1.   

      就是说明你在Unit2.pas文件的第91行用汉字输入法的全角方式输入了一个空格~~   
      只要删除那个空格就可以了~~  
      

  2.   

    [Error]   UNIT2.pas(91):   Illegal   character   in   input   file:   ' '   ($A1A1)
    这句话说明你的程序是从其他复制粘贴进去的
    把91行所有空格删除即可
    或者删掉91行,自己手工写入代码
      

  3.   

    最好不要用内存流的方式,那方法效率很差
    这里给个例子,实在搞不懂,找我,我发程式给你
    猫猫:28088191
    ------------------------------------------
    //----下面是定义一个装图片入库的过程
    procedure TForm1.SavePicture;
    var
    TheWidth:integer;
    TheHeight:integer;//定义加入图片的长与宽
    TheTotalPicture:integer;//定义这个变量主要是让ID字须增加
    begin
    try
    TheJpeg:=TJpegImage.Create;
    if OpenPictureDialog1.Execute then begin
      TheJpeg.LoadFromFile(OpenPictureDialog1.FileName);
      Image1.Picture.Assign(TheJpeg);
      if Image1.Picture.Graphic<>nil then begin
         TheWidth:=TheJpeg.Width; //取得加入图片的宽
         TheHeight:=TheJpeg.Height;//取得加入图片高
         if (TheWidth<>800) and (TheHeight<>535) then begin//验证图片大小
            Image1.Stretch:=False;
            if Application.MessageBox('图片大小不符合规定是否继续?','系统提示',MB_YESNO+MB_ICONQUESTION)=IDYES then begin//对用户选择进行处理
               ClientDataSet1.Append;
               TheTotalPicture:=ClientDataSet1.RecordCount;
               ClientDataSet1.FieldByName('图片').Assign(Image1.Picture.Graphic);
               ClientDataSet1.Post;
               ClientDataSet1.ApplyUpdates(0);
               MessageDlg('图片增加成功!',mtInformation,[mbOK],0);
            end else begin
              Exit;
            end;
         end else begin
               ClientDataSet1.Append;
               TheTotalPicture:=ClientDataSet1.RecordCount;
               ClientDataSet1.FieldByName('图片').Assign(Image1.Picture.Graphic);
               ClientDataSet1.Post;
               ClientDataSet1.ApplyUpdates(0);
               MessageDlg('图片增加成功!',mtInformation,[mbOK],0);
         end;
      end;
    end;
    except
    end;
      GroupBox2.Caption:='图片总数'+IntToStr(ClientDataSet1.RecordCount)+' 张';
      TheJpeg.Free;
    end;
    //----下面是做一个显示图片的过程
    procedure TForm1.ShowPicture;
    begin
    try
      Image1.Stretch:=True;
      TheJpeg:=TJpegImage.Create;
      TheJpeg.Assign(ClientDataSet1.FieldByName('图片'));
      Image1.Picture.Assign(TheJpeg);
      //下面是做一个是否拉伸图像的判断
      if (TheJpeg.Width>800) and (TheJpeg.Height>600) then begin
        Image1.Stretch:=True;
      end else begin
        Image1.Stretch:=False;
      end;
    except
      Image1.Picture.Assign(ClientDataSet1.FieldByName('图片'));
    end;
      TheJpeg.Free;
    end;
      

  4.   

    unit CJtupianform;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, jpeg, StrUtils,
      Dialogs, ExtCtrls, StdCtrls, Buttons, DB, ADODB, ExtDlgs, ComCtrls;type
      TCJtupian = class(TForm)
        Image1: TImage;
        Edit1: TEdit;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        ADOQuery1: TADOQuery;
        OpenPictureDialog1: TOpenPictureDialog;
        Label1: TLabel;
        ADOQuery2: TADOQuery;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
      private
        { Private declarations }
      Function Ceckytu(str: string): string;
      Function Zkuan(str: string): string;
      Function ytu(str: string): char;
      public
        { Public declarations }
      end;var
      CJtupian: TCJtupian;implementation{$R *.dfm}procedure TCJtupian.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=Cafree;
    end;procedure TCJtupian.BitBtn2Click(Sender: TObject); //添加图片
    var
          sStr:string;
          str1: string;
          i: LongInt;
          f1: file;
    begin
         { OpenPictureDialog1.Filter :='All (*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf)|'
                   +'*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf|JPEG Image File (*.jpg)|'
                   +'*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp|'
                   +'Icons (*.ico)|*.ico|Enhanced Metafiles (*.emf)|*.emf|'
                   +'Metafiles (*.wmf)|*.wmf';  }
      Try
          //OpenPictureDialog1.Filter :='文件(*.jpg)|(*.*)|所有文件(*.*)|(*.*)';
          With AdoQuery1 do
            Begin
              Close;
              SQl.Clear ;
              SQl.Add('select  top 0  * from filetupian');
              open;
            End;
            OpenPictureDialog1.Execute ;
               sStr  :=   OpenPictureDialog1.FileName ;
               str1:=  OpenPictureDialog1.FileName ;
            if Sstr<>'' then  //加载图片中取消时处理2007-11-30晚
               Begin
                  if  ytu(sstr) in  ['H','M','A','S','T','h','m','s','t','a']  then
                    Begin
                          if   pos('.',sStr) <>0  then
                            begin
                              while   pos('\', sStr) <> 0  do
                                  sStr:=copy(sStr, pos('\', sStr)+1,length(sStr)-pos('\',sStr)+1);
                            end;//最后不含路径的文件名
                              assignfile(f1,str1);
                              reset(f1);
                              i:=filesize(f1);
                              Closefile(f1);
                         if  OpenPictureDialog1.FileName <>''then
                           Begin
                              ADOQuery1.Insert;
                              TBlobField(ADOQuery1.FieldByName('image_')).LoadFromFile(OpenPictureDialog1.FileName);
                              AdoQuery1.FieldByName('zkuan_').AsString :=Zkuan(SStr);
                              AdoQuery1.FieldByName('ytu_').AsString :=Ceckytu(sstr);
                              Adoquery1.FieldByName('size_').AsInteger  :=i;
                              AdoQuery1.Post ;
                           End
                         Else
                            Begin                          
                              exit;
                            end;
                        image1.Picture.LoadFromFile(str1);
                        Showmessage('加载图片完成');
                    End
                  Else
                    Begin
                       Showmessage('加载图片没有输入用途');
                    End;
               End
            Else
               Begin
                // showmessage('没有选择图片');
                 exit;
               End;
      Except
        Showmessage('图片加载失败');
        Abort;
      End;
    end;function TCJtupian.Ceckytu(str: string): string;
    var
      str1: string;
      ien_: integer;
    begin
         Str1:=str;
         ien_:=length(str1);
         Ceckytu:=copy(str1,ien_-4,1);
    end;function TCJtupian.Zkuan(str: string): string;
    var
      ien_: integer;
      str1: string;
    begin
        str1:=str;
        ien_:=length(str1);
        zkuan:=copy(str1,1,ien_-5);
    end;procedure TCJtupian.BitBtn1Click(Sender: TObject);  //显示图片
    var
      Tstream: Tmemorystream;
      jpgfile: TjpegImage;
      s: string[50];
      pp: char;
    begin
      image1.Visible :=False;
      image1.Visible :=True;
      if Edit1.Text <>'' then
          Begin
             s:=edit1.Text ;
             pp:=s[length(edit1.text)];
             if pp in ['H','M','A','S','T','h','m','s','t','a']  then
                 Begin
                    With AdoQuery2 do
                      Begin
                        Close;
                        SQl.Clear ;
                        SQl.Add('select  top 1 * from filetupian  where zkuan_='''+copy(edit1.Text ,1,length(edit1.Text )-1)+''' '
                               +' and ytu_='''+rightstr(edit1.Text,1)+'''') ;
                        open;
                      End;
                    if Not AdoQuery2.FieldByName('image_').IsNull  then
                      Begin
                         Tstream:=Tmemorystream.Create ;
                         jpgfile:=Tjpegimage.Create ;
                         TBlobField(AdoQuery2.FieldByName('image_')).SaveToStream(Tstream);
                         Tstream.Position :=0;
                         jpgfile.LoadFromStream(Tstream);
                         image1.Picture.Assign(JpgFile);
                      End;
                 End
              Else
               Showmessage('请在针款编号后面加用途');
          End
      Else
         Begin
               Application.MessageBox('请输入查询条件','注意',mb_iconstop+mb_ok);
         End;
    end;procedure TCJtupian.BitBtn3Click(Sender: TObject);   //删除错误图片2007-11-29添加
    var
      AdoQuery3:TAdoQuery;
      num: string[50];
      pp:Char;
    begin
        AdoQuery3:=TAdoQuery.Create(self);
        Adoquery3.ConnectionString :=AdoQuery2.ConnectionString ;
        if Edit1.Text <>'' then
           Begin
              num:=edit1.Text;
              pp:=num[length(edit1.Text)];
              if pp in ['H','M','A','S','T','h','m','s','t','a']  then
                 Begin
                   if Application.MessageBox('删除图片','注意',mB_iconstop+mb_okcancel)=idok   Then
                       Begin
                         with AdoQuery3 do
                           Begin
                             Close;
                             SQl.Clear ;
                             SQl.Text :='delete from filetupian  where zkuan_='''+Copy(edit1.Text ,1,length(edit1.Text )-1)+''' '
                                       +' and ytu_='''+rightstr(edit1.Text,1)+''' ' ;
                             ExecSQL;
                           End;
                         Showmessage('数据删除完成');
                       end;
                 End
              Else
                 Begin
                    Showmessage('请输入针款编号的用途');
                 End;
           End
        Else
           Begin
             Showmessage('你没有输入要删除的条件');
           End;
    end;function TCJtupian.ytu(str: string): char;//判断图片是否有HMSTA等字样
    var
      num : string[200];
    begin
        num:=str;
        ytu:=num[length(str)-4];
    end;end.
      

  5.   

    procedure TCP.BitBtn1Click(Sender: TObject);
    var                                  //2007-11-29晚,处理下载图片并打印的效果
      Mstream: TMemorystream;
      jpgfile: TjpegImage;
      pp: pChar;
      ss:   String;
      ii:DWORD;
      aa: string;
      ll : string;
    Begin
      GetMem(pp,255);       //处理获得用户登陆电脑名称
      ii:=   255;
      GetUserName(pp,ii);
      ss   :=   StrPas(pp);
      FreeMem(pp);
      ll:= 'C:\Documents and Settings\'+ss+ '\Local Settings\Temp\';
     if (Edit1.Text <>'' ) or (edit1.Text<>'000001')  then                          //2007-11-29晚加,处理打印图片和下载图片问题 ,
         Begin
             With ADOQuery1 do   //处理图片
                Begin
                    Close;
                    SQl.Clear ;
                    SQl.Text :=' Select (n.image_) as image_, isnull(n.zkuan_,'''')as zkuan , (m.ytu_) as ytu_,(m.zkuan_) as  zkuan_ '
                                              +'  from klbom m left  join filetupian n on m.zkuan_=n.zkuan_  and  m.ytu_=n.ytu_ '
                                              +'  where m.id_='''+Trim(Edit1.Text)+''' ' ;
                    Open;
                End;
             try
               While not ADOQuery1.Eof do
                   Begin  //在这里需要判断是否查询到图片的字段,所以特殊添加下面的判断
                      if Adoquery1.FieldByName('zkuan').AsString <>'' then
                        Begin
                           Mstream:=TMemorystream.Create ;
                           jpgfile:=TjpegImage.Create ;
                           TBlobField(ADOQuery1.FieldByName('image_')).SaveToStream(Mstream);
                           Mstream.Position :=0;
                           jpgfile.LoadFromStream(Mstream);
                           aa:='C:\Documents and Settings\'+ss+ '\Local Settings\Temp\'+ADOQuery1.fieldbyname('zkuan_').AsString+ADOQuery1.fieldbyname('ytu_').AsString+'.jpg';
                           jpgfile.SaveToFile(aa);
                        End;
                      Adoquery1.Next;
                   End;         except
               Showmessage('数据处理有问题,请联系信息部');
             End;
     
      

  6.   

    感谢猫猫和步枪,如果用ADO远程访问,编辑数据库图片,用内存流和猫猫的方法哪个能效率高些?
      

  7.   

    我最近也在做这个东东,调试了好久一直出现[ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序的错误。我用的事VB和SQL,希望大家帮忙想想办法。 Dim   Constr   As   String   ′ODBC路径   
        Dim   FileName   As   String   ′图片文件名   
        Const   BLOCKSIZE   =   4096   ′每次读写块的大小   
        Dim   ADOCon   As   New   ADODB.Connection   ′ADODB   Connection对象   
        Dim   ADORst   As   New   ADODB.Recordset   ′ADODB   Recordset   对象   
        Dim   ADOFld   As   ADODB.Field   ′ADODB   Field   对象   
      ------------------------   
        Private   Sub   SaveToDB(ByRef   Fld   As   ADODB.Field,   DiskFile   As   String)   
        Dim   byteData()   As   Byte   ′定义数据块数组   
        Dim   NumBlocks   As   Long   ′定义数据块个数   
        Dim   FileLength   As   Long   ′标识文件长度   
        Dim   LeftOver   As   Long′定义剩余字节长度   
        Dim   SourceFile   As   Long   ′定义自由文件号   
        Dim   i   As   Long   ′定义循环变量   
        SourceFile   =   FreeFile   ′提供一个尚未使用的文件号   
        Open   DiskFile   For   Binary   Access   Read   As   SourceFile   ′打开文件   
        FileLength   =   LOF(SourceFile)   ′得到文件长度   
        If   FileLength   =   0   Then   ′判断文件是否存在   
        Close   SourceFile   
        MsgBox   DiskFile   &   〃   无   内   容   或   不   存   在   !〃   
        Else   
        NumBlocks   =   FileLength   \   BLOCKSIZE   ′得到数据块的个数   
        LeftOver   =   FileLength   Mod   BLOCKSIZE   ′得到剩余字节数   
        Fld.Value   =   Null   
        ReDim   byteData(BLOCKSIZE)   ′重新定义数据块的大小   
        For   i   =   1   To   NumBlocks   
        Get   SourceFile,   ,   byteData()   ′   读到内存块中   
        Fld.AppendChunk   byteData()   ′写入FLD   
        Next   i   
        ReDim   byteData(LeftOver)   ′重新定义数据块的大小   
        Get   SourceFile,   ,   byteData()   ′读到内存块中   
        Fld.AppendChunk   byteData()   ′写入FLD   
        Close   SourceFile   ′关闭源文件   
        End   If   
        End   Sub   
          
        
        ----------------------   
        
        
        Private   Sub   Form_Load()   
           Constr   =   〃DSN=image〃   ′定义ODBC连接   
           ADOCon.Open   Constr   ′创建一个连接   
           ADORst.Open   〃table〃,   ADOCon,   adOpenDynamic,   adLockOptimistic   
        ′打开一个ADO动态集   表名为table   
           Set   AdoCtr.Recordset   =   ADORst   ′将动态集赋给ADO控件   
        End   Sub   
          
        
             ----------------------   
        
        
       Private   Sub   Form_Unload(Cancel   As   Integer)   
        ′记得关闭打开的数据集,释放资源   
        ADORst.Close   
        ADOCon.Close   
        Set   ADORst   =   Nothing   
        Set   ADOCon   =   Nothing   
       End   Sub   
          
        
             ----------------------   
        
       Private   Sub   PreView_Click()   
        ′显示打开文件的公用对话框,选择需要加入数据库的图片   
        CDlg.Filter   =   〃位图(*.bmp)|*.bmp〃   
        CDlg.ShowOpen   
        FileName   =   CDlg.FileName   
        PicBox.Picture   =   LoadPicture(FileName)   ′预览图片   
       End   Sub   
          
        
             ----------------------   
        
       Private   Sub   Save_Click()   
        ADORst.AddNew   ′新增纪录   
        ADORst(〃姓名〃).Value   =   Names.Text   ′给动态集的第一个字段赋值   
        ADORst(〃编号〃).Value   =   Numb.Text   ′给动态集的第二个字段赋值   
        Set   ADOFld   =   ADORst(〃照片〃)   ′给ADODB.Field对象赋值   
        Call   SaveToDB(ADOFld,   FileName)     
        ′调用子程序,给第三个字段(image)赋值   
        ADORst.Update   
       End   Sub   
          
        
             ----------------------   
        
       Private   Sub   Update_Click()   
        ′重新打开纪录集,刷新纪录   
        ADORst.Close   
        ADOCon.Close   
        Set   ADORst   =   Nothing   
        Set   ADOCon   =   Nothing   
        ADOCon.Open   Constr   
        ADORst.Open   〃table〃,   ADOCon,   adOpenDynamic,   adLockOptimistic   
        Set   AdoCtr.Recordset   =   ADORst   
       End   Sub