delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061217121231255.html
用的TClientDataSet  
  保存如下  
  var  
    tempClient:TClientDataSet;  
    tempJpeg:TJPEGImage;  
    tempStream:TMemoryStream;  
    ....  
  begin  
    ....  
    tempJpeg.LoadFromFile('d:\1.jpg');  
    tempJpeg.SaveToStream(tempStream);  
    tempClient.CommandText:='Insert   Into   myTest     (ImageID,ImageSize,Image)   values(:ID,:Size,:ImageData)';  
              tempClient.Params.ParamByName('ID').AsInteger:=tempID;  
              tempClient.Params.ParamByName('Size').AsInteger:=tempStream.Size;  
              tempClient.Params.ParamByName   ('ImageData').LoadFromStream(tempStream,ftGraphic);  
      //此时的stream的大小和1.jpg的大小一致。stream的大小为447244  
      tempClient.Execute;  
  ....  
  end;  
   
  读取  
  var  
      tempClient:TClientDataSet;  
  begin  
      tempClient:=TClientDataSet.Create(nil);  
      try  
          tempClient.CommandText:='select   ImageSize,Image   from   MyTest   where   ID   =1   ';  
          tempClient.Open;  
          if   not   tempClient.FieldByName('Image').IsNull   then  
          begin  
              TBlobField(tempClient.FieldByName('Image')).SaveToStream(tempStream);  
              //这里发现我读取得到的tempSteam和原始的jpeg文件大小不同。把流保存到一个文件中,发现数据根本不对,原始文件大小为447244,从数据库得到的stream大小为550262  
          end;  
      fianlly  
          ...  
      end;  
  end;  
   
  数据库为SQL   2000,用的是ADO连接

试试直接保存和读取看看  
  tempClient.Params.ParamByName   ('ImageData').LoadFromFile('d:\1.jpg');  
   
  TBlobField(tempClient.FieldByName('Image')).SaveToFile('d:\1.jpg');  
   
 

谢谢。  
   
  回xxmmmx(踢踏)   (   )   直接loadFromeFile和SaveToFile的结果一样。  
  SaveToFile保存的新文件仍然变大了。数据也变了  
 

我测试了一下。   没有问题的。但我用的是ADOQuery;  
   
  var  
      tempJpeg:TJPEGImage;  
      tempStream:TMemoryStream;  
  begin  
      tempStream   :=   TMemoryStream.Create;  
      tempJpeg   :=   TJPEGImage.Create;  
      tempJpeg.LoadFromFile('C:\1.jpg');   //原文件大小148884Byte  
      tempJpeg.SaveToStream(tempStream);  
      ShowMessage(FloatToStr(tempStream.Size));   //148884Byte  
      tempQuery.SQL.Text:='Insert   Into   TImage(ImageSize,Image)   values(:Size,:ImageData)';  
      tempQuery.Parameters.ParamByName('Size').Value:=tempStream.Size;  
      tempQuery.Parameters.ParamByName('ImageData').LoadFromStream(tempStream,ftGraphic);  
      tempQuery.ExecSQL;  
  end;  
   
  procedure   TFormDemo.BExportClick(Sender:   TObject);  
  var  
      tempJpeg:TJPEGImage;  
      tempStream:TMemoryStream;  
  begin  
      tempStream   :=   TMemoryStream.Create;  
      tempQuery.SQL.Text:='Select   Image   From   TImage   Where   ImageID   =   1';  
      tempQuery.Open;  
      TBlobField(tempQuery.FieldByName('Image')).SaveToStream(tempStream);  
      ShowMessage(FloatToStr(tempStream.Size));   //148884Byte  
  end;

另外把xxmmmx(踢踏)的建议也测试了一下  
   
  写入  
  tempQuery.Parameters.ParamByName('ImageData').LoadFromFile('C:\1.JPG',   ftBlob);  
   
  读出  
  TBlobField(tempQuery.FieldByName('Image')).SaveToFile('C:\2.JPG');  
   
  结果完全一样。很正确('C:\1.JPG'和'C:\2.JPG'完全一样)

你用TClientDataSet呢看看呢。  
  我用的是TClientDataSet。  
   
  是不是TClientDataSet不支持呢?工程里都用的是TClientDataSet。晕。

我这么用过是没问题的  
  Ado+DataSetProvider+TClientDataSet  
   
  例如:  
  保存  
          if   cdsERFiles.IsEmpty   then  
          begin  
              cdsERFiles.Append;  
              cdsERFiles.FieldByName('RecID').AsString:=trim(owExamineRepairID.Text);  
              cdsERFiles.FieldByName('State').AsInteger:=0;  
              cdsERFiles.FieldByName('Type').AsInteger:=0;  
          end   else  
              cdsERFiles.Edit;  
          cdsERFiles.FieldByName('FileName').AsString:=ExtractFileName(OpenDialog.FileName);  
          TBlobField(cdsERFiles.FieldByName('FileContent')).LoadFromFile(OpenDialog.FileName);  
   
          cdsERFiles.ApplyUpdates(0);  
   
  读出,保存成文件:  
          sFileName:=sFileName+'\'+cdsERFiles.FieldByName('FileName').AsString;  
   
          TBlobField(cdsERFiles.FieldByName('FileContent')).SaveToFile(sFileName);  
          if   FileExists(sFileName)   then  
              ShellExecute(Handle,'open',PChar(sFileName),nil,nil,SW_SHOWNORMAL)  
   
 

posted on 2009-05-12 16:02 delphi2007 阅读(364) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。