在VB中存取数据库中的图片
2006-02-27 11:46:00 来源:WEB开发网核心提示:一、数据库的设计数据库可以采用微软的access97或者SQLServer来进行,首先新建一张表,在VB中存取数据库中的图片,取名为Table,添加三个字段,给第三个字段(image)赋值ADORst.UpdateEndSub----------------------PrivateSubUpdate_Click()′
一、数据库的设计
添加一个Form,四个Label控件,两个TextBox控件,一个PictureBox控件,一个ADODC控件,三个CommandButton控件,一个CommandDialog控件,如果ADODC和CommandDialog控件没有出现在工具框上,请单击菜单“工程\部件”。点“控件”选项卡,在其中选中MicrosoftADODataControl6.0(OLEDB)和MicrosoftCommonDialogControl6.0两项按“确定”按钮。
下面是以上各个控件的一些属性:
Form1.MaxButton=False
Label1.Caption=姓名:
Label2.Caption=编号:
Label3.Name=ResName
Label3.BackColor=&H80000009&
Label3.BorderStyle=1-FixedSingle
Label3.DataField=姓名
Label3.DataSource=AdoCtr
Label4.Name=ResNumb
Label4.BackColor=&H80000009&
Label4.BorderStyle=1-FixedSingle
Label4.DataField=编号
Label4.DataSource=AdoCtr
Text1.Name=Names
Text2.Name=Numb
CommonDialog1.Name=CDlg
Adodc1.Name=AdoCtr
CommonButton1.Name=PReView
CommonButton1.Caption=预览
CommonButton2.Name=Save
CommonButton2.Caption=保存
CommonButton3.Name=Update
CommonButton3.Caption=更新
PictureBox1.Name=PicBox
PictureBox1.AutoSize=False
PictureBox1.AutoRedraw=False
PictureBox1.DataField=照片
PictureBox1.DataSource=AdpCtr
下面是程序代码:
′此工程需有MicrosoftActiveXDataObject2.1Library(msado15.dll)
DimConstrAsString′ODBC路径
DimFileNameAsString′图片文件名
ConstBLOCKSIZE=4096′每次读写块的大小
DimADOConAsNewADODB.Connection′ADODBConnection对象
DimADORstAsNewADODB.Recordset′ADODBRecordset对象
DimADOFldAsADODB.Field′ADODBField对象
------------------------
PrivateSubSaveToDB(ByRefFldAsADODB.Field,DiskFileAsString)
DimbyteData()AsByte′定义数据块数组
DimNumBlocksAsLong′定义数据块个数
DimFileLengthAsLong′标识文件长度
DimLeftOverAsLong′定义剩余字节长度
DimSourceFileAsLong′定义自由文件号
DimiAsLong′定义循环变量
SourceFile=FreeFile′提供一个尚未使用的文件号
OpenDiskFileForBinaryAccessReadAsSourceFile′打开文件
FileLength=LOF(SourceFile)′得到文件长度
IfFileLength=0Then′判断文件是否存在
CloseSourceFile
MsgBoxDiskFile&″无内容或不存在!″
Else
NumBlocks=FileLength\BLOCKSIZE′得到数据块的个数
LeftOver=FileLengthModBLOCKSIZE′得到剩余字节数
Fld.Value=Null
ReDimbyteData(BLOCKSIZE)′重新定义数据块的大小
Fori=1ToNumBlocks
GetSourceFile,,byteData()′读到内存块中
Fld.AppendChunkbyteData()′写入FLD
Nexti
ReDimbyteData(LeftOver)′重新定义数据块的大小
GetSourceFile,,byteData()′读到内存块中
Fld.AppendChunkbyteData()′写入FLD
CloseSourceFile′关闭源文件
EndIf
EndSub
----------------------
PrivateSubForm_Load()
Constr=″DSN=image″′定义ODBC连接
ADOCon.OpenConstr′创建一个连接
ADORst.Open″table″,ADOCon,adOpenDynamic,adLockOptimistic
′打开一个ADO动态集表名为table
SetAdoCtr.Recordset=ADORst′将动态集赋给ADO控件
EndSub
----------------------
PrivateSubForm_Unload(CancelAsInteger)
′记得关闭打开的数据集,释放资源
ADORst.Close
ADOCon.Close
SetADORst=Nothing
SetADOCon=Nothing
EndSub
----------------------
PrivateSubPreView_Click()
′显示打开文件的公用对话框,选择需要加入数据库的图片
CDlg.Filter=″位图(*.bmp)|*.bmp″
CDlg.ShowOpen
FileName=CDlg.FileName
PicBox.Picture=LoadPicture(FileName)′预览图片
EndSub
----------------------
PrivateSubSave_Click()
ADORst.AddNew′新增纪录
ADORst(″姓名″).Value=Names.Text′给动态集的第一个字段赋值
ADORst(″编号″).Value=Numb.Text′给动态集的第二个字段赋值
SetADOFld=ADORst(″照片″)′给ADODB.Field对象赋值
CallSaveToDB(ADOFld,FileName)′调用子程序,给第三个字段(image)赋值
ADORst.Update
EndSub
----------------------
PrivateSubUpdate_Click()
′重新打开纪录集,刷新纪录
ADORst.Close
ADOCon.Close
SetADORst=Nothing
SetADOCon=Nothing
ADOCon.OpenConstr
ADORst.Open″table″,ADOCon,adOpenDynamic,adLockOptimistic
SetAdoCtr.Recordset=ADORst
EndSub
程序运行后的结果如图2。
本程序在VB6.0/Windows98/WindowsNT下编译通过。->
数据库可以采用微软的access97或者SQLServer来进行,首先新建一张表,取名为Table,添加三个字段,分别是:姓名Char型(SQLServer中)文本型(Access中);编号Char型(SQLServer中)文本型(Access中);照片image型(SQLServer中)OLE对象(Access中),设计好后存盘。为了可以进行远程调用,我们采用ODBC的方法进行,双击打开控制面板里的ODBC数据源,界面如图1所示:
点“系统DSN”选项卡,按“添加”按钮选择对应的数据源驱动程序Access的*.mdb或者SQLServer,依照添加向导加添加数据源,下面就可以开始程序的编写了。
二、程序的编写
运行VB,新建一个工程。本程序采用ADO控件和动态链接库访问数据库,需要加入ADO的运行库,单击“工程\引用”菜单,出现引用对话框,选择MicrosoftActiveXDataObjects2.0Library并确定。添加一个Form,四个Label控件,两个TextBox控件,一个PictureBox控件,一个ADODC控件,三个CommandButton控件,一个CommandDialog控件,如果ADODC和CommandDialog控件没有出现在工具框上,请单击菜单“工程\部件”。点“控件”选项卡,在其中选中MicrosoftADODataControl6.0(OLEDB)和MicrosoftCommonDialogControl6.0两项按“确定”按钮。
下面是以上各个控件的一些属性:
Form1.MaxButton=False
Label1.Caption=姓名:
Label2.Caption=编号:
Label3.Name=ResName
Label3.BackColor=&H80000009&
Label3.BorderStyle=1-FixedSingle
Label3.DataField=姓名
Label3.DataSource=AdoCtr
Label4.Name=ResNumb
Label4.BackColor=&H80000009&
Label4.BorderStyle=1-FixedSingle
Label4.DataField=编号
Label4.DataSource=AdoCtr
Text1.Name=Names
Text2.Name=Numb
CommonDialog1.Name=CDlg
Adodc1.Name=AdoCtr
CommonButton1.Name=PReView
CommonButton1.Caption=预览
CommonButton2.Name=Save
CommonButton2.Caption=保存
CommonButton3.Name=Update
CommonButton3.Caption=更新
PictureBox1.Name=PicBox
PictureBox1.AutoSize=False
PictureBox1.AutoRedraw=False
PictureBox1.DataField=照片
PictureBox1.DataSource=AdpCtr
下面是程序代码:
′此工程需有MicrosoftActiveXDataObject2.1Library(msado15.dll)
DimConstrAsString′ODBC路径
DimFileNameAsString′图片文件名
ConstBLOCKSIZE=4096′每次读写块的大小
DimADOConAsNewADODB.Connection′ADODBConnection对象
DimADORstAsNewADODB.Recordset′ADODBRecordset对象
DimADOFldAsADODB.Field′ADODBField对象
------------------------
PrivateSubSaveToDB(ByRefFldAsADODB.Field,DiskFileAsString)
DimbyteData()AsByte′定义数据块数组
DimNumBlocksAsLong′定义数据块个数
DimFileLengthAsLong′标识文件长度
DimLeftOverAsLong′定义剩余字节长度
DimSourceFileAsLong′定义自由文件号
DimiAsLong′定义循环变量
SourceFile=FreeFile′提供一个尚未使用的文件号
OpenDiskFileForBinaryAccessReadAsSourceFile′打开文件
FileLength=LOF(SourceFile)′得到文件长度
IfFileLength=0Then′判断文件是否存在
CloseSourceFile
MsgBoxDiskFile&″无内容或不存在!″
Else
NumBlocks=FileLength\BLOCKSIZE′得到数据块的个数
LeftOver=FileLengthModBLOCKSIZE′得到剩余字节数
Fld.Value=Null
ReDimbyteData(BLOCKSIZE)′重新定义数据块的大小
Fori=1ToNumBlocks
GetSourceFile,,byteData()′读到内存块中
Fld.AppendChunkbyteData()′写入FLD
Nexti
ReDimbyteData(LeftOver)′重新定义数据块的大小
GetSourceFile,,byteData()′读到内存块中
Fld.AppendChunkbyteData()′写入FLD
CloseSourceFile′关闭源文件
EndIf
EndSub
----------------------
PrivateSubForm_Load()
Constr=″DSN=image″′定义ODBC连接
ADOCon.OpenConstr′创建一个连接
ADORst.Open″table″,ADOCon,adOpenDynamic,adLockOptimistic
′打开一个ADO动态集表名为table
SetAdoCtr.Recordset=ADORst′将动态集赋给ADO控件
EndSub
----------------------
PrivateSubForm_Unload(CancelAsInteger)
′记得关闭打开的数据集,释放资源
ADORst.Close
ADOCon.Close
SetADORst=Nothing
SetADOCon=Nothing
EndSub
----------------------
PrivateSubPreView_Click()
′显示打开文件的公用对话框,选择需要加入数据库的图片
CDlg.Filter=″位图(*.bmp)|*.bmp″
CDlg.ShowOpen
FileName=CDlg.FileName
PicBox.Picture=LoadPicture(FileName)′预览图片
EndSub
----------------------
PrivateSubSave_Click()
ADORst.AddNew′新增纪录
ADORst(″姓名″).Value=Names.Text′给动态集的第一个字段赋值
ADORst(″编号″).Value=Numb.Text′给动态集的第二个字段赋值
SetADOFld=ADORst(″照片″)′给ADODB.Field对象赋值
CallSaveToDB(ADOFld,FileName)′调用子程序,给第三个字段(image)赋值
ADORst.Update
EndSub
----------------------
PrivateSubUpdate_Click()
′重新打开纪录集,刷新纪录
ADORst.Close
ADOCon.Close
SetADORst=Nothing
SetADOCon=Nothing
ADOCon.OpenConstr
ADORst.Open″table″,ADOCon,adOpenDynamic,adLockOptimistic
SetAdoCtr.Recordset=ADORst
EndSub
程序运行后的结果如图2。
本程序在VB6.0/Windows98/WindowsNT下编译通过。->
更多精彩
赞助商链接