老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。 Delphi / Windows SDK/APIhttp://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)