老问题,SQL保存图片。保存以后再读出来,发现stream的大小不一致。虽然老,但没搜到结果。...
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的大小不一致。虽然老,但没搜到结果。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#操作SharePoint列表
- 下一篇: 紧急通知,读者服务群大调整