使用流对象保存和显示图片 打开vb6,新建工程。添加两个按钮,一个image控件 注意:Access中的photo字段类型为OLE对象. SqlServer中的photo字段类型为Image'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本 ‘2.5版本以下不支持Stream对象 Dim iConcstr As String Dim iConc As ADODB.Connection '保存文件到数据库中 Sub s_SaveFile() Dim iStm As ADODB.Stream Dim iRe As ADODB.Recordset Dim iConcstr As String '读取文件到内容 Set iStm = New ADODB.Stream With iStm .Type = adTypeBinary '二进制模式 .Open .LoadFromFile App.Path + "\test.jpg" End With '打开保存文件的表 Set iRe = New ADODB.Recordset With iRe .Open "select * from img", iConc, 1, 3 .AddNew '新增一条记录 .Fields("photo") = iStm.Read .Update End With '完成后关闭对象 iRe.Close iStm.Close End Sub Sub s_ReadFile() Dim iStm As ADODB.Stream Dim iRe As ADODB.Recordset '打开表 Set iRe = New ADODB.Recordset ‘得到最新添加的纪录 iRe.Open "select top 1 * from img order by id desc", iConc, adOpenKeyset, adLockReadOnly '保存到文件 Set iStm = New ADODB.Stream With iStm .Mode = adModeReadWrite .Type = adTypeBinary .Open .Write iRe("photo") ‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误. .SaveToFile App.Path & "\test1.jpg" End With Image1.Picture = LoadPicture(App.Path & "\test1.jpg") '关闭对象 iRe.Close iStm.Close End Sub Private Sub Command1_Click() Call s_ReadFile End Sub Private Sub Command2_Click() Call s_SaveFile End Sub Private Sub Form_Load() '数据库连接字符串 iConcstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _ ";Data Source=F:\csdn_vb\database\保存图片\access图片\img.mdb"‘下面的语句是连接sqlserver数据库的. ‘iConcstr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _ ‘ "User ID=sa;Password=;Initial Catalog=test;Data Source=yang" Set iConc = New ADODB.Connection iConc.Open iConcstr End Sub Private Sub Form_Unload(Cancel As Integer) iConc.Close Set iConc = Nothing End Sub
往数据库插入图片一般是用ADODB.Stream来做,或者用二进制方式读取文件,然后写入数据库中,请参考:SqlServer中的photo字段类型为ImageDim cn As New ADODB.Connection,rs As New ADODB.Recordset Private Sub Form_Load() cn.CursorLocation = adUseClient '这里给的是sql库的连接,具体的数据库连接请自己改过来 cn.Open "Provider=SQLOLEDB.1;Password=;Persist Security Info=False;User ID=sa;Initial Catalog=Test;Data Source=ljx" End SubPrivate Sub cmdSaveFile_Click() saveFile App.Path & "\temp.jpg" End SubPrivate Sub cmdReadFile_Click() readFile App.Path & "\temp1.jpg" End Sub'保存文件到数据库 Private Sub saveFile(Byval strFile As String) Dim tmp() As Byte Dim lngFile As Long If rs.State=adStateOpen Then rs.Close rs.Open "select * from test where 1<>1", cn, adOpenDynamic, adLockOptimistic
lngFile = FreeFile Open strFile For Binary As #lngFile ReDim tmp(LOF(lngFile)) Get #lngFile, , tmp Close #lngFile rs.AddNew rs.Fields("ID").Value="001" rs.Fields("pic").Value = tmp rs.Update End Sub'读取数据库的文件,保存到硬盘 Private Sub readFile(Byval strFile As String) Dim tmp() As Byte If rs.State=adStateOpen Then rs.Close rs.Open "select * from test where [ID]='001'", cn ReDim tmp(rs.Fields(0).ActualSize) '返回2进制文件的字节长度 tmp = rs.Fields("pic").Value Open strFile For Binary As #1 Put #1, , tmp Close #1 End SubPrivate Sub Form_Unload(Cancel As Integer) If rs.State<>adStateClosed Then rs.Close If cn.State<>adStateClosed Then cn.Close Set rs = Nothing Set cn=Nothing End Sub
谢谢,可没太看明白。 我用了一个通用对话框来选择相片。 Private Sub cmdbrowse_Click() Set iStm = New ADODB.Stream comdia1.ShowOpen comdia1.Filter = "所有文件(*.*)|*.*|" If comdia1.FileName <> "" Then 'Image1.Picture = LoadPicture(comdia1.FileName) With iStm .Type = adTypeBinary '二进制模式 .Open .LoadFromFile comdia1.FileName End With End If End Sub 再就在更新过程中加上:Adodc1.Recordset.Fields("相片") = iStm.Read 请问这样可以吗?那个 .Write iRe("photo") ‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误. .SaveToFile App.Path & "\test1.jpg" End With Image1.Picture = LoadPicture(App.Path & "\test1.jpg")可不可以不把文件写到文件夹下,直接加载到image控件中?如果可以应该怎样写?问得可能很笨,不太懂,实在不好意思。请多多帮忙,不幸感激!
給人回答完了。ADODB.Stream在微軟的網站上有示例代碼的。
'// '// 保存二进制数据到数据库(如图片、视频等) '// '// 使用示例: '// Rs.AddNew '// SaveBinaryDataToDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile") '// Rs.Update '// Public Function SaveBinaryDataToDB(surFile As String, fldField As ADODB.Field) As Boolean On Error GoTo ErrorHandler Dim Strm As ADODB.Stream
Set Strm = New ADODB.Stream Strm.Type = 1 ' adTypeBinary==1 Strm.Open Strm.LoadFromFile surFile fldField = Strm.Read Strm.Close Set Strm = Nothing
SaveBinaryDataToDB = True
Exit Function ErrorHandler: SaveBinaryDataToDB = False
End Function'// '// 取出二进制数据从数据库(如图片、视频等) '// '// 使用示例: '// GetBinaryDataFromDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile") '// Public Function GetBinaryDataFromDB(dstFile As String, fldField As ADODB.Field) As Boolean On Error GoTo ErrorHandler Dim Strm As ADODB.Stream Set Strm = New ADODB.Stream Strm.Type = adTypeBinary Strm.Open Strm.Write fldField Strm.SaveToFile dstFile, adSaveCreateOverWrite Strm.Close Set Strm = Nothing
GetBinaryDataFromDB = True
Exit Function ErrorHandler: GetBinaryDataFromDB = False
打开vb6,新建工程。添加两个按钮,一个image控件
注意:Access中的photo字段类型为OLE对象.
SqlServer中的photo字段类型为Image'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本
‘2.5版本以下不支持Stream对象
Dim iConcstr As String
Dim iConc As ADODB.Connection
'保存文件到数据库中
Sub s_SaveFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
Dim iConcstr As String '读取文件到内容
Set iStm = New ADODB.Stream
With iStm
.Type = adTypeBinary '二进制模式
.Open
.LoadFromFile App.Path + "\test.jpg"
End With
'打开保存文件的表
Set iRe = New ADODB.Recordset
With iRe
.Open "select * from img", iConc, 1, 3
.AddNew '新增一条记录
.Fields("photo") = iStm.Read
.Update
End With
'完成后关闭对象
iRe.Close
iStm.Close
End Sub
Sub s_ReadFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
'打开表
Set iRe = New ADODB.Recordset
‘得到最新添加的纪录
iRe.Open "select top 1 * from img order by id desc", iConc, adOpenKeyset, adLockReadOnly
'保存到文件
Set iStm = New ADODB.Stream
With iStm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write iRe("photo")
‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误.
.SaveToFile App.Path & "\test1.jpg"
End With
Image1.Picture = LoadPicture(App.Path & "\test1.jpg")
'关闭对象
iRe.Close
iStm.Close
End Sub
Private Sub Command1_Click()
Call s_ReadFile
End Sub
Private Sub Command2_Click()
Call s_SaveFile
End Sub
Private Sub Form_Load()
'数据库连接字符串
iConcstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=F:\csdn_vb\database\保存图片\access图片\img.mdb"‘下面的语句是连接sqlserver数据库的.
‘iConcstr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
‘ "User ID=sa;Password=;Initial Catalog=test;Data Source=yang"
Set iConc = New ADODB.Connection
iConc.Open iConcstr
End Sub
Private Sub Form_Unload(Cancel As Integer)
iConc.Close
Set iConc = Nothing
End Sub
Private Sub Form_Load()
cn.CursorLocation = adUseClient
'这里给的是sql库的连接,具体的数据库连接请自己改过来 cn.Open "Provider=SQLOLEDB.1;Password=;Persist Security Info=False;User ID=sa;Initial Catalog=Test;Data Source=ljx"
End SubPrivate Sub cmdSaveFile_Click()
saveFile App.Path & "\temp.jpg"
End SubPrivate Sub cmdReadFile_Click()
readFile App.Path & "\temp1.jpg"
End Sub'保存文件到数据库
Private Sub saveFile(Byval strFile As String)
Dim tmp() As Byte
Dim lngFile As Long
If rs.State=adStateOpen Then rs.Close
rs.Open "select * from test where 1<>1", cn, adOpenDynamic, adLockOptimistic
lngFile = FreeFile
Open strFile For Binary As #lngFile
ReDim tmp(LOF(lngFile))
Get #lngFile, , tmp
Close #lngFile
rs.AddNew
rs.Fields("ID").Value="001"
rs.Fields("pic").Value = tmp
rs.Update
End Sub'读取数据库的文件,保存到硬盘
Private Sub readFile(Byval strFile As String)
Dim tmp() As Byte
If rs.State=adStateOpen Then rs.Close
rs.Open "select * from test where [ID]='001'", cn
ReDim tmp(rs.Fields(0).ActualSize) '返回2进制文件的字节长度
tmp = rs.Fields("pic").Value
Open strFile For Binary As #1
Put #1, , tmp
Close #1
End SubPrivate Sub Form_Unload(Cancel As Integer)
If rs.State<>adStateClosed Then rs.Close
If cn.State<>adStateClosed Then cn.Close
Set rs = Nothing
Set cn=Nothing
End Sub
我用了一个通用对话框来选择相片。
Private Sub cmdbrowse_Click()
Set iStm = New ADODB.Stream
comdia1.ShowOpen
comdia1.Filter = "所有文件(*.*)|*.*|"
If comdia1.FileName <> "" Then
'Image1.Picture = LoadPicture(comdia1.FileName)
With iStm
.Type = adTypeBinary '二进制模式
.Open
.LoadFromFile comdia1.FileName
End With
End If
End Sub
再就在更新过程中加上:Adodc1.Recordset.Fields("相片") = iStm.Read
请问这样可以吗?那个
.Write iRe("photo")
‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误.
.SaveToFile App.Path & "\test1.jpg"
End With
Image1.Picture = LoadPicture(App.Path & "\test1.jpg")可不可以不把文件写到文件夹下,直接加载到image控件中?如果可以应该怎样写?问得可能很笨,不太懂,实在不好意思。请多多帮忙,不幸感激!
'// 保存二进制数据到数据库(如图片、视频等)
'//
'// 使用示例:
'// Rs.AddNew
'// SaveBinaryDataToDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile")
'// Rs.Update
'//
Public Function SaveBinaryDataToDB(surFile As String, fldField As ADODB.Field) As Boolean
On Error GoTo ErrorHandler
Dim Strm As ADODB.Stream
Set Strm = New ADODB.Stream
Strm.Type = 1 ' adTypeBinary==1
Strm.Open
Strm.LoadFromFile surFile
fldField = Strm.Read
Strm.Close
Set Strm = Nothing
SaveBinaryDataToDB = True
Exit Function
ErrorHandler: SaveBinaryDataToDB = False
End Function'//
'// 取出二进制数据从数据库(如图片、视频等)
'//
'// 使用示例:
'// GetBinaryDataFromDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile")
'//
Public Function GetBinaryDataFromDB(dstFile As String, fldField As ADODB.Field) As Boolean
On Error GoTo ErrorHandler
Dim Strm As ADODB.Stream Set Strm = New ADODB.Stream
Strm.Type = adTypeBinary
Strm.Open
Strm.Write fldField
Strm.SaveToFile dstFile, adSaveCreateOverWrite
Strm.Close
Set Strm = Nothing
GetBinaryDataFromDB = True
Exit Function
ErrorHandler: GetBinaryDataFromDB = False
End Function