使用流对象保存和显示图片 打开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 ReadFromDB(RY As String) Dim Rst As New ADODB.Recordset Dim Mstream As ADODB.Stream Dim SQL As StringOn Error Resume Next SQL = "select * from ry_manage where rybh='" & RY & "'" Set Rst = New ADODB.Recordset Rst.CursorLocation = adUseClient Rst.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdTextIf IsNull(Rst.Fields("pic")) Then img.Picture = LoadPicture(): Exit SubIf Rst.RecordCount = 0 Then ShowMsg 1, " 数据库出错,请与系统管理员联系!" Rst.Close Set Rst = Nothing Exit Sub End IfSet Mstream = New ADODB.Stream Mstream.Type = adTypeBinary Mstream.Open Mstream.Write Rst.Fields("pic").Value Mstream.SaveToFile App.Path & "\tmpImage.gif", adSaveCreateOverWrite Mstream.Close Set Mstream = Nothing img.Picture = LoadPicture(App.Path & "\tmpImage.gif")End Sub保存的 Private Sub SaveToDB(RY As String) Dim Rst As New ADODB.Recordset Dim Mstream As New ADODB.Stream Dim SQL As String Dim MediaName As StringMediaName = Trim$(PicFileName) Set Rst = New ADODB.Recordset Rst.CursorLocation = adUseClient SQL = "select * from ry_manage where rybh='" & RY & "'" Rst.Open SQL, Conn, adOpenStatic, adLockPessimistic, adCmdText Set Mstream = New ADODB.Stream Mstream.Type = adTypeBinary Mstream.Open
Mstream.LoadFromFile PicFileName Rst.Fields("Pic").Value = Mstream.Read Rst.UpdateRst.Close Set Rst = Nothing Set Mstream = NothingEnd Sub
前二天论坛上这样的回贴,不保存到文件的方法,现学现卖一下: Private Sub Command1_Click() '新增一张图片 Dim Bag As PropertyBag Dim Buff() As Byte Dim cn As ADODB.Connection Dim rs As ADODB.Recordset
Set Bag = New PropertyBag Bag.WriteProperty "Image", Picture1.Image ReDim Buff(LenB(Bag.Contents)) Buff = Bag.Contents
'Set cn = ConnectionToDB Set rs = New ADODB.Recordset rs.Open "select img from tb_image where 1=0", _ cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("img") = Buff rs.Update
Set rs = Nothing Set cn = Nothing Set Bag = Nothing
MsgBox "OK" End SubPrivate Sub Command2_Click() '读出全部图片 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Bag As PropertyBag Dim Buff() As Byte Dim t
'Set cn = ConnectionToDB Set rs = New ADODB.Recordset rs.Open "Select * From tb_image", _ cn, adOpenKeyset, adLockOptimistic
While Not rs.EOF Buff = rs.Fields("Img").Value Set Bag = New PropertyBag Bag.Contents = Buff Call Bag.WriteProperty("Image", Buff) Set Picture1.Picture = Bag.ReadProperty("Image") '延时 t = Timer Do DoEvents Loop While Timer - t < 1 rs.MoveNext Set Bag = Nothing Wend set rs=nothing set cn=nothing End Sub
Option Explicit Dim mdbConn As New ADODB.Connection Dim rs As New ADODB.RecordsetPrivate Sub Command1_Click() '退出 rs.Close mdbConn.Close Set rs = Nothing Set mdbConn = Nothing Unload Me End Sub Private Sub ViewData() Dim B() As Byte With rs Text1.Text = .Fields(0) B = .Fields(1).Value Dim Bag As New PropertyBag Bag.Contents = B Set Picture1.Picture = Bag.ReadProperty("Image") End With End Sub Private Sub Command2_Click() '新增 Dim Bag As New PropertyBag Dim B() As Byte Bag.WriteProperty "Image", Picture1.Image ReDim B(LenB(Bag.Contents)) B = Bag.Contents rs.AddNew rs.Fields(0) = "'" & Replace(Text2, ".", "") rs.Fields(1).Value = B rs.Update Set Bag = Nothing End SubPrivate Sub Command3_Click() '浏览 CommonDialog1.Filter = "BMP文件(*.bmp)|*.bmp|JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif" CommonDialog1.ShowOpen Picture1.Picture = LoadPicture(CommonDialog1.FileName) Text2.Text = CommonDialog1.FileTitle End Sub Private Sub CmdMoveData_Click(Index As Integer) With rs Select Case Index Case 0 '移到第一条记录 If Not .BOF Then .MoveFirst Case 1 '移到上一条记录 If .RecordCount > 0 Then If .BOF = False Then .MovePrevious If .BOF = True Then .MoveFirst MsgBox "记录已经移到第一条!", vbOKOnly, Me.Caption End If End If Case 2 '移到下一条记录 If .RecordCount > 0 Then If .EOF = False Then .MoveNext If .EOF = True Then .MoveLast MsgBox "记录已经移到最后一条!", vbOKOnly, Me.Caption End If End If Case 3 '移到最后一条记录 If .RecordCount > 0 Then If Not .EOF = True Then .MoveLast End If End Select ViewData Text3.Text = "第 " & rs.AbsolutePosition & " 条记录" End With End SubPrivate Sub Command4_Click() Dim Bag As New PropertyBag Dim B() As Byte Bag.WriteProperty "Image", Picture1.Image ReDim B(LenB(Bag.Contents)) B = Bag.Contents rs.Fields(1).Value = B rs.Update Set Bag = Nothing End SubPrivate Sub Command5_Click() rs.Delete adAffectCurrent rs.Update CmdMoveData_Click (1) End SubPrivate Sub Form_Load() Dim lsDbFile As String lsDbFile = App.Path & "\db.mdb" mdbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & lsDbFile & ";Persist Security Info=False" rs.Open "select * from tabtemp", mdbConn, adOpenKeyset, adLockOptimistic If rs.RecordCount <> 0 Then ViewData rs.MoveFirst Text3.Text = "第 " & rs.AbsolutePosition & " 条记录" End If End Sub
我用的是sql2000的数据库,代码我发出来大家帮我看看,我快晕了。谢谢大家了 Private Sub Command1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Bag As PropertyBag Dim Buff() As Byte Set cn = New ADODB.Connection cn.ConnectionString = Adodc1.ConnectionString cn.Open
Set rs = New ADODB.Recordset rs.Open "Select photo From xjsj where bianh ='0789' and enroll_time ='080325091523'", _ cn, adOpenKeyset, adLockOptimistic Buff = rs.Fields("photo").Value Set Bag = New PropertyBag Bag.Contents = Buff Call Bag.WriteProperty("Image", Buff) Set Picture1.Picture = Bag.ReadProperty("Image") Set rs = Nothing Set cn = Nothing End Sub
打开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 ReadFromDB(RY As String)
Dim Rst As New ADODB.Recordset
Dim Mstream As ADODB.Stream
Dim SQL As StringOn Error Resume Next
SQL = "select * from ry_manage where rybh='" & RY & "'"
Set Rst = New ADODB.Recordset
Rst.CursorLocation = adUseClient
Rst.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdTextIf IsNull(Rst.Fields("pic")) Then img.Picture = LoadPicture(): Exit SubIf Rst.RecordCount = 0 Then
ShowMsg 1, " 数据库出错,请与系统管理员联系!"
Rst.Close
Set Rst = Nothing
Exit Sub
End IfSet Mstream = New ADODB.Stream
Mstream.Type = adTypeBinary
Mstream.Open
Mstream.Write Rst.Fields("pic").Value
Mstream.SaveToFile App.Path & "\tmpImage.gif", adSaveCreateOverWrite
Mstream.Close
Set Mstream = Nothing
img.Picture = LoadPicture(App.Path & "\tmpImage.gif")End Sub保存的
Private Sub SaveToDB(RY As String)
Dim Rst As New ADODB.Recordset
Dim Mstream As New ADODB.Stream
Dim SQL As String
Dim MediaName As StringMediaName = Trim$(PicFileName)
Set Rst = New ADODB.Recordset
Rst.CursorLocation = adUseClient
SQL = "select * from ry_manage where rybh='" & RY & "'"
Rst.Open SQL, Conn, adOpenStatic, adLockPessimistic, adCmdText Set Mstream = New ADODB.Stream
Mstream.Type = adTypeBinary
Mstream.Open
Mstream.LoadFromFile PicFileName
Rst.Fields("Pic").Value = Mstream.Read
Rst.UpdateRst.Close
Set Rst = Nothing
Set Mstream = NothingEnd Sub
Private Sub Command1_Click()
'新增一张图片
Dim Bag As PropertyBag
Dim Buff() As Byte
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set Bag = New PropertyBag
Bag.WriteProperty "Image", Picture1.Image
ReDim Buff(LenB(Bag.Contents))
Buff = Bag.Contents
'Set cn = ConnectionToDB
Set rs = New ADODB.Recordset
rs.Open "select img from tb_image where 1=0", _
cn, adOpenKeyset, adLockOptimistic
rs.AddNew
rs.Fields("img") = Buff
rs.Update
Set rs = Nothing
Set cn = Nothing
Set Bag = Nothing
MsgBox "OK"
End SubPrivate Sub Command2_Click()
'读出全部图片
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Bag As PropertyBag
Dim Buff() As Byte
Dim t
'Set cn = ConnectionToDB
Set rs = New ADODB.Recordset
rs.Open "Select * From tb_image", _
cn, adOpenKeyset, adLockOptimistic
While Not rs.EOF
Buff = rs.Fields("Img").Value
Set Bag = New PropertyBag
Bag.Contents = Buff
Call Bag.WriteProperty("Image", Buff)
Set Picture1.Picture = Bag.ReadProperty("Image")
'延时
t = Timer
Do
DoEvents
Loop While Timer - t < 1
rs.MoveNext
Set Bag = Nothing
Wend
set rs=nothing
set cn=nothing
End Sub
Dim mdbConn As New ADODB.Connection
Dim rs As New ADODB.RecordsetPrivate Sub Command1_Click() '退出
rs.Close
mdbConn.Close
Set rs = Nothing
Set mdbConn = Nothing
Unload Me
End Sub
Private Sub ViewData()
Dim B() As Byte
With rs
Text1.Text = .Fields(0)
B = .Fields(1).Value
Dim Bag As New PropertyBag
Bag.Contents = B
Set Picture1.Picture = Bag.ReadProperty("Image")
End With
End Sub
Private Sub Command2_Click() '新增
Dim Bag As New PropertyBag
Dim B() As Byte
Bag.WriteProperty "Image", Picture1.Image
ReDim B(LenB(Bag.Contents))
B = Bag.Contents
rs.AddNew
rs.Fields(0) = "'" & Replace(Text2, ".", "")
rs.Fields(1).Value = B
rs.Update
Set Bag = Nothing
End SubPrivate Sub Command3_Click() '浏览
CommonDialog1.Filter = "BMP文件(*.bmp)|*.bmp|JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif"
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
Text2.Text = CommonDialog1.FileTitle
End Sub
Private Sub CmdMoveData_Click(Index As Integer)
With rs
Select Case Index
Case 0 '移到第一条记录
If Not .BOF Then .MoveFirst
Case 1 '移到上一条记录
If .RecordCount > 0 Then
If .BOF = False Then .MovePrevious
If .BOF = True Then
.MoveFirst
MsgBox "记录已经移到第一条!", vbOKOnly, Me.Caption
End If
End If
Case 2 '移到下一条记录
If .RecordCount > 0 Then
If .EOF = False Then .MoveNext
If .EOF = True Then
.MoveLast
MsgBox "记录已经移到最后一条!", vbOKOnly, Me.Caption
End If
End If
Case 3 '移到最后一条记录
If .RecordCount > 0 Then
If Not .EOF = True Then .MoveLast
End If
End Select
ViewData
Text3.Text = "第 " & rs.AbsolutePosition & " 条记录"
End With
End SubPrivate Sub Command4_Click()
Dim Bag As New PropertyBag
Dim B() As Byte
Bag.WriteProperty "Image", Picture1.Image
ReDim B(LenB(Bag.Contents))
B = Bag.Contents
rs.Fields(1).Value = B
rs.Update
Set Bag = Nothing
End SubPrivate Sub Command5_Click()
rs.Delete adAffectCurrent
rs.Update
CmdMoveData_Click (1)
End SubPrivate Sub Form_Load()
Dim lsDbFile As String
lsDbFile = App.Path & "\db.mdb"
mdbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & lsDbFile & ";Persist Security Info=False"
rs.Open "select * from tabtemp", mdbConn, adOpenKeyset, adLockOptimistic
If rs.RecordCount <> 0 Then
ViewData
rs.MoveFirst
Text3.Text = "第 " & rs.AbsolutePosition & " 条记录"
End If
End Sub
下面这一句抱错呀。
实时错误'5'
无效的过程调用或参数
Bag.Contents = Buff这是怎么回事呀?帮帮我吧
问一下,为什么一定要这么做?不如通过文件来得好些
我的测试是:
SQL数据库(ACCESS数据库没测试,但应该没有问题),表中字段类型是image,通过PropertyBag对象写入的图像,再用PropertyBag对象读出
不知道你的byte数组的数据是那儿来的,如果是直接open文件来的,此方法不行
Private Sub Command1_Click()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Bag As PropertyBag
Dim Buff() As Byte
Set cn = New ADODB.Connection
cn.ConnectionString = Adodc1.ConnectionString
cn.Open
Set rs = New ADODB.Recordset
rs.Open "Select photo From xjsj where bianh ='0789' and enroll_time ='080325091523'", _
cn, adOpenKeyset, adLockOptimistic Buff = rs.Fields("photo").Value
Set Bag = New PropertyBag
Bag.Contents = Buff
Call Bag.WriteProperty("Image", Buff)
Set Picture1.Picture = Bag.ReadProperty("Image")
Set rs = Nothing
Set cn = Nothing
End Sub