利用Vb保存一幅图到Access数据库.docx
《利用Vb保存一幅图到Access数据库.docx》由会员分享,可在线阅读,更多相关《利用Vb保存一幅图到Access数据库.docx(16页珍藏版)》请在冰豆网上搜索。
利用Vb保存一幅图到Access数据库
在我们做的许多管理系统中,除了保存大量的文字信息以外,有时候也需要保存一定数量的图片。
例如:
一个人事管理系统,就需要对每个人的照片进行保存,以便可以方便的对每个人的信息进行处理。
Office中的Access数据库除了保存文本,还可以保存图片,保存图片的数据类型就是"OLE对象":
它用来保存Excel电子表格、Word文档、图形、声音或其他二进制数据。
我现在用一个例子介绍利用vb保存图片的方法,首先我们要介绍vb中处理二进制数据的语句:
Put、Get。
Put、Get语句语法如下:
Put[#]filenumber,[recnumber],varname
Get[#]filenumber,[recnumber],varname
Filenumber:
必需的。
任何有效的文件号
Recnumber:
可选的。
Variant(Long)。
记录号(Random方式的文件)或字节数(Binary方式的文件),指明在此处开始写入
Varname:
必需的。
包含要写入磁盘的数据的变量名
说明:
文件中的第一个记录或字节位于位置1,第二个记录或字节位于位置2,依次类推。
若省略recnumber,则将上一个Get或Put语句之后的下一个记录或字节写入。
所有用于分界的逗号都必须罗列出来。
现在我们来开始建一个工程,功能是保存一个文档,同时可以保存一幅图片。
首先我们建一个表(表名为photo),字段如下:
字段名类型标题
class类别文档的分类
photoOLE对象保存图片文件
photo_ext文本图片的扩展名
inputtime日期/时间文档输入的时间
modifytime日期/时间文档的修改时间
subject文本文本
现在我们就可以创建finput窗口文件来保存图片。
首先我们要连接我们的数据库,代码如下:
DimstrAsString
str="Provider=Microsoft.Jet.OLEDB.4.0;PersistSecurityInfo=False;"_
amp;"DataSource="amp;App.Pathamp;"\realize.mdb;JetOLEDB:
database"
.Openstr
.CursorLocation=adUseClient
这段代码可以放在form_load事件中,当做一个多窗口的系统时,最好放到一个模块文件中,这样在其它窗口中都可以调用这个cn连接。
下面是具体的窗口代码:
VERSION5.00
Object="{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0";"comdlg32.ocx"
Object="{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0";"richtx32.ocx"
BeginVB.Formfinput
BorderStyle=0'None
Caption="文档输入"
ClientHeight=6240
ClientLeft=0
ClientTop=0
ClientWidth=8955
ControlBox=0'False
LinkTopic="Form1"
MDIChild=-1'True
ScaleHeight=6240
ScaleWidth=8955
ShowInTaskbar=0'False
BeginMSComDlg.CommonDialogCommonDialog1
Left=8040
Top=3840
_ExtentX=847
_ExtentY=847
_Version=393216
End
BeginVB.ComboBoxCombo1
Height=300
Left=7080
TabIndex=10
Top=480
Width=1335
End
BeginVB.CommandButtonCommand3
Caption="关闭"
Height=375
Left=5280
TabIndex=8
Top=5640
Width=1095
End
BeginVB.CommandButtonCommand2
Caption="保存"
Height=375
Left=2520
TabIndex=7
Top=5640
Width=1095
End
BeginVB.CommandButtonCommand1
Caption="浏览"
Height=255
Left=8040
TabIndex=6
Top=4800
Width=735
End
BeginVB.TextBoxText2
Height=375
Left=1200
TabIndex=5
Top=4800
Width=6375
End
BeginRichTextLib.RichTextBoxRichTextBox1
Height=3615
Left=1200
TabIndex=3
Top=960
Width=6375
_ExtentX=11245
_ExtentY=6376
_Version=393217
Enabled=-1'True
TextRTF=$"finput.frx":
0000
End
BeginVB.TextBoxText1
Height=375
Left=1200
TabIndex=2
Top=443
Width=4695
End
BeginVB.LabelLabel4
Caption="类别"
Height=255
Left=6240
TabIndex=9
Top=480
Width=615
End
BeginVB.LabelLabel3
Caption="图片"
Height=255
Left=480
TabIndex=4
Top=4800
Width=495
End
BeginVB.LabelLabel2
Caption="容"
Height=255
Left=480
TabIndex=1
Top=960
Width=495
End
BeginVB.LabelLabel1
Caption="标题"
Height=255
Left=480
TabIndex=0
Top=503
Width=495
End
End
AttributeVB_Name="finput"
AttributeVB_GlobalNameSpace=False
AttributeVB_Creatable=False
AttributeVB_PredeclaredId=True
AttributeVB_Exposed=False
OptionExplicit
PrivateSubCommand1_Click()
CommonDialog1.DefaultExt=App.Path
CommonDialog1.Filter="Pictures(*.bmp;*.jpg;*.gif) *.bmp;*.jpg;*.gif"'注意要加引号
CommonDialog1.ShowOpen
Text2.Text=CommonDialog1.FileName
EndSub
'保存文档的标题,和文档的容,以及相应的图片
PrivateSubCommand2_Click()
'判断是否所写的文档是否已经存在数据库了,如果没有,则保存,否则
'不能保存(利用一个"临时rs"查询标题)
Dimsubject,sqlAsString
Dimtemp_photoAsStream
DimrsAsNewADODB.Recordset
Dimrs1AsNewADODB.Recordset'定义rs1得到类别的id
Dimclass_idAsInteger'定义得到类别的ID号
subject=Trim(Text1.Text)'获得标题
sql="select*frompaperwheresubject='"+subject+"'"
'开始查询
rs.Opensql,,adOpenDynamic,adLockPessimistic
'判断标题是否存在
Ifrs.EOFThen'文档不存在,开始保存
DimtempdateAsDate'临时时间变量
tempdate=Date
rs.AddNew
'得到类别的ID
sql="selectcl_number,classfromclasswhereclass='"+Combo1.Text+"'"
rs1.Opensql,,adOpenDynamic,adLockPessimistic
rs("class")=rs1("cl_number")
rs1.Close'关闭rs1
rs("subject")=subject
rs("content")=RichTextBox1.Text
IfTrim(Text2.Text)<>""Then'假如有图片,开始得到图片文件
Dimimage_data()AsByte'定义图片保存的变量
OpenTrim(Text2.Text)ForBinaryAs#1
ReDimimage_data(LOF
(1)-1)
Get#1,,image_data()
rs("photo").AppendChunkimage_data()
EndIf
rs("inputtime")=tempdate
rs("modifytime")=tempdate
rs.Update'可能出现保存不成功的现象,所以要考虑可能会出现错误
MsgBox("保存成功!
")'保存成功
Text1.Text=""
RichTextBox1.Text=""
Text2.Text=""'此处清空选择图片的框
Else'存在,不能保存,显示错误信息
MsgBox("文档已经存在,不能保存,请修改!
")
EndIf
rs.Close'关闭结果集
EndSub
PrivateSubCommand3_Click()
UnloadMe
EndSub
PrivateSubForm_Load()
Me.Left=0
Me.Top=0
fmain.Width=Me.Width+340
fmain.Height=Me.Height+1550
'显示文档的类别
DimrsAsNewADODB.Recordset
DimsqlAsString
sql="select*fromclass"
rs.Opensql,,1,1
DoWhileNotrs.EOF'类别不空,则添加进去,对应类别的number为索引
Combo1.AddItemrs("class")
rs.MoveNext
Loop
Ifrs.RecordCount<>0Then'只有查询结果集不为空时,才能设定显示第一项,利用纪录总数不为0判定
Combo1.ListIndex=0'不能用notrs.eof判定,因为现在cursor已经到了最后
EndIf
rs.Close
EndSub
当然,在上面这段代码中,还用到了另一个表(表名为class),字段如下:
字段名类型意义
class文本文档类别的名称
cl_number数字类别的编号
上面的代码可以较好的保存我们的文档和图片,我们还需要显示我们的图片和文档,现在我们还要显示我们的图片,我做了一个显示窗口(fshow),现在我假设数据库中有一条记录,subject为"ipx协议简介",里面有一个图片(ipx体系结构),窗口代码如下:
VERSION5.00
Object="{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0";"mscomctl.ocx"
Object="{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0";"richtx32.ocx"
BeginVB.Formfshow
BorderStyle=0'None
Caption="显示图片"
ClientHeight=7125
ClientLeft=0
ClientTop=0
ClientWidth=10275
LinkTopic="Form1"
MDIChild=-1'True
ScaleHeight=7125
ScaleWidth=10275
ShowInTaskbar=0'False
BeginVB.FrameFrame2
Height=6615
Left=2880
TabIndex=1
Top=240
Width=7335
BeginVB.CommandButtonCommand1
Caption="关闭"
Height=375
Left=5880
TabIndex=5
Top=5880
Width=1215
End
BeginRichTextLib.RichTextBoxRichTextBox1
Height=4095
Left=120
TabIndex=4
Top=1200
Width=6975
_ExtentX=12303
_ExtentY=7223
_Version=393217
TextRTF=$"fshow.frx":
0000
End
BeginVB.ImageImage1
Height=855
Left=120
Stretch=-1'True
Top=5640
Width=1095
End
BeginVB.LineLine4
X1=5520
X2=5520
Y1=5520
Y2=6600
End
BeginVB.LineLine3
X1=0
X2=7320
Y1=5520
Y2=5520
End
BeginVB.LineLine2
X1=0
X2=7320
Y1=960
Y2=960
End
BeginVB.LabelLabel1
BackColor=amp;H80000009amp;
Height=615
Left=120
TabIndex=3
Top=240
Width=7095
End
End
BeginVB.FrameFrame1
Height=6735
Left=120
TabIndex=0
Top=240
Width=2535
BeginMSComctlLib.TreeViewTreeView1
Height=6375
Left=120
TabIndex=2
Top=240
Width=2295
_ExtentX=4048
_ExtentY=11245
_Version=393217
PathSeparator=""
Style=7
Appearance=1
End
End
BeginVB.LineLine1
BorderColor=amp;H80000001amp;
X1=2760
X2=2760
Y1=120
Y2=6960
End
End
AttributeVB_Name="fshow"
AttributeVB_GlobalNameSpace=False
AttributeVB_Creatable=False
AttributeVB_PredeclaredId=True
AttributeVB_Exposed=False
OptionExplicit
PrivateSubCommand1_Click()
UnloadMe
EndSub
PrivateSubForm_Load()
Dimtemptop,templeftAsLong
Me.Left=0
Me.Top=0
fmain.Width=Me.Width+340
fmain.Height=Me.Height+1550
fmain.Top=(Screen.Height-fmain.Height)/2
fmain.Left=(Screen.Width-fmain.Width)/2
'显示结果
DimrsAsNewADODB.Recordset
Dimimage_filenameAsString
Dimtemp_image()AsByte
DimsqlAsString
sql="select*frompaperwheresubject='ipx协议简介'"
rs.Opensql,,adOpenDynamic,adLockReadOnly
Label1.Caption=rs("inputtime")
temp_image()=rs("photo")
image_filename=App.Path+"\temp."+rs("photo_ext")
rs.Close
'建立临时文件
Openimage_filenameForBinaryAs#1
Put#1,,temp_image()
Close#1
Image1.Picture=LoadPicture(image_filename)
'删除临时文件
Killimage_filename
EndSub
上面代码只能显示一条记录,而且需要先赋条件,显示图片用的是先建一个临时文件,然后把二进制数据读到这个文件里,同时要赋给正确的扩展名,然后可以显示图片,注意,要及时删除临时文件。
总结:
这种方法只是保存图片的其中一种,还有其它保存到数据库的方法,希望大家不断的交流其它的保存图片的方法。