VB写入数据库的图片DELPHI读取出错的问题

fireegg 2016-02-23 11:20:43

Private Sub UpdateItemPicture()
Dim sTmpPath As String
Dim sTmpFileName As String
Dim sFileName As String
Dim objZip As Object
Dim smFile As ADODB.Stream
Dim varFile As Variant

Dim cn As ADODB.Connection
Dim rs As Recordset
Dim strSql As String
Dim lCountX As Long
Dim lCountY As Long
Dim lOffset As Long
Dim lFileSize As Long
Dim bytChunk() As Byte
Dim bFlag As Boolean

sTmpPath = App.Path & "\temp\" '临时路径
sTmpFileName = App.Path & "\temp\temp.tmp" '临时文件路径
sFileName = "C:\ItemPicture\1042.bmp" '你的物料图片文件路径
If Dir(sFileName, vbNormal + vbHidden + vbSystem) <> "" Then '存在图片
If Dir(sTmpPath, vbDirectory) = "" Then '没有临时路径,创建一个临时路径
MkDir sTmpPath
End If
'将图片文件压缩到临时路径
Set objZip = CreateObject("KDZIP.ZIP")
objZip.Compress sFileName, sTmpFileName, 7
Set objZip = Nothing

'读取图片文件二进制流
Set smFile = New ADODB.Stream
smFile.Type = adTypeBinary
smFile.Open
smFile.LoadFromFile sTmpFileName
varFile = smFile.Read
Set smFile = Nothing

'先更新核算项目表标识某物料存在有图片的标记
cn.Execute "UPDATE t_Item SET FHavePicture = 1 WHERE FItemClassID = 4 AND FItemID

=1432"

'再读取某物料先插入的没有存储二进制流图片文件的附件记录,更新FData字段
strSql = "SELECT FData FROM t_accessory WHERE fitemid=1432"
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseServer
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.ActiveConnection = cn
.Open strSql
End With

'最后进行二进制流字段更新
lOffset = 0
If Not IsNull(varFile) Then
lFileSize = LenB(varFile) - 1
Do While lOffset <= lFileSize
ReDim bytChunk(0 To 99) As Byte
For lCountY = lOffset To lOffset + 99
If lCountY > lFileSize Then
Exit For
End If
bytChunk(lCountY - lOffset) = varFile(lCountY)
Next
If lCountY > lFileSize Then
If (lCountY - lOffset - 1) Mod 2 = 0 Then '偶数
ReDim Preserve bytChunk(0 To lCountY - lOffset) As Byte
Else
ReDim Preserve bytChunk(0 To lCountY - lOffset - 1) As Byte
End If
Else
ReDim Preserve bytChunk(0 To lCountY - lOffset - 1) As Byte
End If
rs!FData.AppendChunk bytChunk()
lOffset = lOffset + conChunkSize
Loop
rs.Update
End If
rs.Close
Set rs = Nothing
Set cn = Nothing
End If

End Sub




以上是VB存入数据库的图片,我使用以下DELPHI读取图片会报错,读取不了。是什么问题?求解。谢谢


var MS:TMemoryStream ;

begin
IF NOT ADOQuery3.Active THEN
BEGIN
MS:=TMemoryStream.Create ;
TRY
ADOQuery3.SQL.Text:='SELECT fdata FROM dbo.t_Accessory where fitemid=2579'
ADOQuery3.Open;
ms:=TMemoryStream(ADOQuery3.CreateBlobStream(ADOQuery3.FieldByName('fdata'),bmRead));
ms.SaveToFile('c:\ddd1.jpg');
Image1.Picture.LoadFromFile('c:\ddd1.jpg');
ADOQuery3.Close;
finally
MS.Free;
END;
end;
end;


...全文
834 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2016-02-25
  • 打赏
  • 举报
回复
procedure Tform1.selectimageClick(Sender: TObject); //选择图像 begin if openpicturedialog1.Execute then image1.Picture.LoadFromFile(openpicturedialog1.FileName ); end; procedure Tform1.savetodbClick(Sender: TObject); //保存图像到数据库 var ext:string; begin if image1.picture.Graphic <> nil then //避免image1中无图像保存出错 begin adotable1.Edit ; adotable1.FieldByName('myimage').Assign(image1.Picture.Graphic); //以下记录保存到数据库的图像格式 ext:=extractfileext(openpicturedialog1.FileName ); //取出文件扩展名 if uppercase(ext) = '.BMP' THEN adotable1.FieldByName('isbmp').VALUE := 1 //BMP型图像数据 ELSE IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN adotable1.FieldByName('isbmp').VALUE := 0; //JPEG型图像数据 ADOTABLE1.Post ; end; end; procedure Tform1.ADOTable1AfterScroll(DataSet: TDataSet); //ADOTable1的AfterScroll事件方法程序  var   jpegimage:tjpegimage;  begin   image1.Picture.Graphic :=nil;   //下边BMP、JPEG两种图像数据必需分别处理   if adotable1.fieldbyname('isbmp').Asstring = '1' then //BMP型图像数据    image1.Picture.bitmap.Assign(adotable1.fieldbyname('myimage'))    //上边语句中的bitmap不能为graphic,否则会出错   else if adotable1.fieldbyname('isbmp').asstring = '0' then //JPEG型图像数据    begin //begin2     jpegimage := tjpegimage.Create ; //通过jpegimage将图像显示在image1,否则会出错     try      jpegimage.Assign(adotable1.fieldbyname('myimage'));      image1.Picture.Graphic :=jpegimage;     finally      jpegimage.Free ;     end; //end try   end; //end begin2 end;
lyhoo163 2016-02-25
  • 打赏
  • 举报
回复
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  ms.LoadFromFile('D:\delphi\szcb.zip');
  UnZip2(ms);
  ms.SaveToFile('D:\delphi\szcb2.mdb');
end;
Delphi解压。
  • 打赏
  • 举报
回复
delphi XE的话有zip单元 delphi7的话 用VclZip控件吧
  • 打赏
  • 举报
回复
'将图片文件压缩到临时路径 Set objZip = CreateObject("KDZIP.ZIP") 它存的是压缩后的图片
fireegg 2016-02-23
  • 打赏
  • 举报
回复
引用 4 楼 linuxpingwangping 的回复:
'将图片文件压缩到临时路径 Set objZip = CreateObject("KDZIP.ZIP") objZip.Compress sFileName, sTmpFileName, 7 Set objZip = Nothing
DELPHI 怎么进行压缩呀。
  • 打赏
  • 举报
回复
人家用zip压缩了, 先解压吧
  • 打赏
  • 举报
回复
'将图片文件压缩到临时路径 Set objZip = CreateObject("KDZIP.ZIP") objZip.Compress sFileName, sTmpFileName, 7 Set objZip = Nothing
jjpweb 2016-02-23
  • 打赏
  • 举报
回复
ms.SaveToFile('c:\ddd1.zip');然后用rar打开看看是不是想要的图片,如果是,找个解压缩的控件。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧