日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。...

發布時間:2025/7/14 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
老問題,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) ?
? ?
?

總結

以上是生活随笔為你收集整理的老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。