vb和MSSQL的图像保存
我用VB6和MSSQL来编个程序,相片是image类型。用image控件来加载,
并与数据库邦定了。但更新后数据库里并没有存入相片。请问该如何来
加载并保存到数据库里?
问题点数:20、回复次数:8Top
1 楼Leftie(左手,为人民币服务)回复于 2006-03-13 21:14:16 得分 6
使用流对象保存和显示图片
打开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 SubTop
2 楼faysky2(出来混,迟早是要还嘀)回复于 2006-03-13 22:07:46 得分 6
往数据库插入图片一般是用ADODB.Stream来做,或者用二进制方式读取文件,然后写入数据库中,请参考:
SqlServer中的photo字段类型为Image
Dim 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 Sub
Private Sub cmdSaveFile_Click()
saveFile App.Path & "\temp.jpg"
End Sub
Private 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 Sub
Private 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
Top
3 楼cyyno1(GunRose)回复于 2006-03-13 22:14:43 得分 0
收藏Top
4 楼latelord(龙过洋)回复于 2006-03-14 00:18:28 得分 0
谢谢,可没太看明白。
我用了一个通用对话框来选择相片。
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控件中?如果可以应该怎样写?
问得可能很笨,不太懂,实在不好意思。请多多帮忙,不幸感激!
Top
5 楼DengXingJie(杰西)回复于 2006-03-14 08:41:41 得分 0
好貼值得收藏Top
6 楼vansoft(Vansoft Workroom)回复于 2006-03-14 09:04:15 得分 0
給人回答完了。
ADODB.Stream在微軟的網站上有示例代碼的。Top
7 楼Dengyu1997(Q&f)回复于 2006-03-14 09:51:15 得分 8
'//
'// 保存二进制数据到数据库(如图片、视频等)
'//
'// 使用示例:
'// 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
Top
8 楼latelord(龙过洋)回复于 2006-03-16 00:00:20 得分 0
实在太感谢你们了!我运行成功了!Top




