说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB用类来编写数据库程序

HTML文档下载 WORD文档下载 PDF文档下载
VB用类来编写数据库程序


类模块使VB编程更为简洁。通过封装技术将复杂的代码同程序的其它部分分隔开,
并通过方法和属性同程序的其它部分对话。对于类的种种好处,相信大家都非常清
楚了。本文主要介绍类在数据库编程方面的应用。

通过类模块的封装,你可以只需要书写一次那些冗长繁人的SQL查询语句,并能方
便地同他人分享你的代码。本文向你介绍如何利用类模块创建SQL查询对象。本文
用到Northwind数据库。数据访问技术用的是DAO。


工程目的
本工程的目的是要建立一个查询,该查询将从Northwind数据库中返回Beverage供
应商的信息。这些信息包括哪种饮料是由哪些供应商供应的。看上去很简单,但你
得对三个表进行操作,这三个表分别是Suppliers, Categories和Products, 因此
你需要写一串很长的SQL查询语句,所以你只希望写一次就够了。
设计类模块
首先确认你已添加了对Microsoft DAO 3.5 Object Library的引用。接下来在工程
中添加一个类模块。将该类模块重命名为ClsSQL。
让我们先为这个类创建两个新的公共属性,代码如下:

Public CompanyName As String 'Object property
Public CategoryName As String 'Object property


添加一个公用变量,名为strMsg。该变量用来保存对象返回给用户的信息。
Public CompanyName As String 'Object property
Public CategoryName As String 'Object property

Public strMsg As String


现在为这个类编写RunQuery方法。
Sub RunQuery()

Dim strSQL As String
Dim db As Database
Dim qdfTemp As QueryDef
Dim rsResults As Recordset

'Construct the SQL string
strSQL = "SELECT DISTINCTROW Suppliers.CompanyName, " & _
"Products.ProductName FROM Suppliers INNER JOIN " & _
"(Categories INNER JOIN Products ON Categories.CategoryID = " & _
"Products.CategoryID) " & _
"ON Suppliers.SupplierID = Products.SupplierID " & _
"WHERE (((Suppliers.CompanyName)='" & CompanyName & "') AND " & _
"((Categories.CategoryName)='" & CategoryName & "'))"



Set db = OpenDatabase("C:\MSOffice\Access\Samples\Northwind.mdb")

Set qdfTemp = db.CreateQueryDef("")
qdfTemp.SQL = strSQL

Set rsResults = qdfTemp.OpenRecordset(dbOpenSnapshot)
rsResults.MoveFirst

'Enumerate the recordset
With rsResults
Do While Not .EOF
Debug.Print .Fields(0); " "; .Fields(1)
strMsg = strMsg & .Fields(1) & vbCrLf
.MoveNext
Loop
End With

rsResults.Close
qdfTemp.Close

End Sub


现在让我们来简单地分析一下上面的代码。在上面的代码中数据库的路径是用的绝
对路径。如果Northwind数据库的路径同你机器上的不同,你需要修改这个路径,
以便程序能找到这个数据库。
SQL代码是在Access中建立好然后粘贴到程序中来的。这样做不仅免去你书写代码
的麻烦,而且还不容易出错。在粘贴完之后,将原来在SQL代码中的"Bigfoot
Breweries" 和 "Beverages"用公共变量CompanyName和CategoryName替换掉。

在定义了QueryDef之后,程序枚举记录集。记录集的信息不仅在立即窗口中显示出
来,同时被写入strMsg变量中。

在结束对类模块的编码之前,我们还需要对类模块的Terminate事件编写代码。将
下面的代码放到该事件中。

Private Sub Class_Terminate()

MsgBox strMsg, Title:="Beverage Results for " & CompanyName, buttons:=
vbExclamation

End Sub


现在我们已结束了对类模块的编程。接下来在窗体中添加一个命令按钮。将该命令
按钮的Caption属性设置为&Run Query。将下面的代码放在命令按钮的鼠标单击事
件中。
Private Sub Command1_Click()

Dim objSQL As ClsSQL

'Set the object variable
Set objSQL = New ClsSQL

'Set properties of the new object
With objSQL
.CompanyName = "Bigfoot Breweries"
.CategoryName = "Beverages"
End With

'Retrieve the properties
Debug.Print objSQL.CompanyName
Debug.Print objSQL.CategoryName

'Call a method of the object
objSQL.RunQuery

'Destroy the object
Set objSQL = Nothing

End Sub


在上面的语句中,我们首先定义了一个对象变量,接下来将这个对象变量初始化为
我们刚建立的类的一个实例。我们也可以用下面这一条语句来实现。
Dim objSQL As New ClsSQL

紧接着我们设置该对象的属性。CompanyName = "Bigfoot Breweries"和
CategoryName = "Beverages", 将这两个值在立即窗口中显示出来。这样做仅仅为
了验证而已。然后调用对象的RunQuery方法。
objSQL.RunQuery

最后释放该对象,触发对象的Terminate事件,弹出消息框,显示查询结果。
MsgBox strMsg, Title:="Beverage Results for " & CompanyName, buttons:=
vbExclamation

结论
现在你已对用类模块进行数据库编程的好处有了初步的认识。当然你也可以用标准
模块来实现同样的功能。但是用标准模块远不如用类模块简洁。用类模块,你可以
为每个查询初始化一个新的对象,而复杂的SQL代码则被封装在类中。用标准模块,
你必须将控制权交给模块。最后,类模块更易于移植。


IE11中的WebGL探秘:渲染速度超Chrome 数据驱动智能:百度在计算广告学领域的技术突破 UX设计师和软件开发者,谁将是2014年的老大? 爸爸去哪儿:开发知名题材手游压力山大 多平台同步 谈IE11全新功能 高通副总裁沈劲:移动是产生变革的强大原动力 高性能、高流量Java Web站点打造的22条建议 云巅:第三代虚拟技术+搜索引擎+乐高理念打造分布式桌面云 Intel:从“芯”构建下一代数据中心 WhatsApp:50名员工,月4亿活跃用户,日160亿条消息和5亿张图片 三星Galaxy Gear智能手表失利 需改进的8个方面 IE11全新的F12开发人员工具详解 研发周报:为什么开发者担心将代码公布 Hadoop YARN的发展史与详细解析 一周消息树:Firefox OS会不会成为下一个Android PhoneGap 3.3.0发布,支持Android 4.4 KitKat 移动周报:两岸三地在线编程学习网站大搜罗 有道周枫和他的“放养”团队 看IE11如何助力AAF推动公益事业 SUSE总裁Nils:将SUSE Cloud 2.0打造成“零影响的云安装程序” Windows 8之父Steven Sinofsky:2014年科技界的十大趋势 电视盒子还没智能化?看Fan TV们怎么玩 畅游启动“必赢计划” 十亿巨资代理优质产品 数据控使用Hadoop的三种最常用方式 值得创始人学习的五大企业文化管理方式 圣诞节快乐:来自程序员们的问候 宏碁任命新CEO Jason Chen:曾任职英特尔14年、台积电8年 史上第一次越狱发布会与Evad3rs太极助手罗生门 新东方在线CTO曾明:已用Cocos2d-html5开发出150余款产品 Facebook 2013年的9个开源项目 开源力量公开课2013年度庆典:我们的开源项目 [提问]我装Microsoft Visual Studio SP5遇到麻烦,请帮忙。 dataAdapter配置视图函数是出错:函数提供的参数不够! 100分紧急求教关于 TClass 的问题。 一个不是很难的问题! 将三个数字型字符串加密成一密文,可逆 做了一个WBE服务器帮忙测试一下,来者有分,(只限2小时) 利用Sax进行XML文档解析的问题(高分)??? 我用一个ADOCONN,ADODATASOURCE,ADODATASET取得一组数据,请问我怎么用代码来控制指针下移,以及用代码取得当前某个字段的值? 好奇怪???? 错误分析,高分求解!! 各位大虾,帮帮忙!求助如何实现网页访问者的人数 有一个查询问题.快进来.进来有分. 重装Win系统后如何进入Linux系统?? 谁能帮我画这个图??给20分,真的给. 表格中的回车那里去了? 能把这样的VBS脚本改写为VB代码吗? 2000无故奇怪死机! 能把这样的VBS脚本改写为VB代码吗?? 非典时期,你流过几次泪了,我们还需要感动多少次? 先问一下实现性:手机能发送图片,avi和声音吗 2000和xp 共享的问题? 怎么通过netmeeting连上广域网的主机? 能不能将一个文件夹下的图片进行批量上传? 字符串问题: 有关结束进程的问题 谢谢高手 怎样才能学好c语言这门课 帮帮我吧—— 一个简单的问题! 怎样调用Twain设备照相,并将照片放在一个picturebox中 怎样在数据表中查询在某个范围内共有几条记录?(好象很弱的问题) 一个jbuilder的问题[求助] default.asp有IFRAME里面包含list.asp页,list.asp里的链接如何给default.asp传递一个值并刷新它? ★★★如何在界面线程中调用主线程的对象★★★ 如何让jbuilder生成的文件,在没有jbuilder环境的机器上运行? 有人能吧“准女友胸太平”和“一个程序员的艳遇”粘贴后发成贴子吗,我的机子配置差,打不开。估计这种方法可以。谢谢 问有关窗体的参数属性 学计算机的是不是出去闯比较好!但是听到很多大学同学讲,在外面也不容易!很矛盾! ?WSAWaitForMultipleEvents如何退出 在ASP.net怎么用MessageBox啊?? 俺向大家请教一个问题,可以送分! 真无奈,恳求大家帮我! 接下来我应该干什么????!!! 小女子关于数据库连接的一点看法,请指教 请问如何将一个结构体和listview绑定??绑定后listview是不是相当于一个结构体数组 请问各位兄弟:怎样在 本地机打开XML语言的网页 如何在数据窗口的列名的上方家一行标题, 200分寻找fastReport,有的快进。 关于打印的问题 how are you?????????????????/ 一个小问题,请大家帮帮忙! 如何才能实现左边导航条菜单的样子?(www.csdn.net 左边的) JBuilder7.0+weblogic7.0+jsp+编译时为何出错???? 美国首家厕所主题餐厅开业 真马桶上阵外媒:日本也流行“土豪金”苹果发布新款平板电脑iPad Air日本猫站长阿玉担任“粉红丝带”宣传大浙江温州一在建祠堂坍塌致7人受伤浙江海事局下放海员证和油污保险证办理浙江省新增1例人感染H7N9禽流感病云南晋宁传唤嫌犯引发群体性事件 多名荷兰针对俄扣押其破冰船向国际法庭提起50多个国家将参加第五届外洽会吸引中日网上传视频主张独岛主权 韩国敦促日东盟各国持续热议中国与东盟合作前景美加州大学戴维斯分校打造奢华宿舍吸引温州将建10条BRT 3条线路近期先中石油与俄油气公司签署LNG购销协议星巴克回应售价质疑 称在中国利润不比意大利父子专制冒牌名酒遭警方查获 将日本首相安倍表示将对离岛等土地买卖实美国男子跑马拉松织出近4米长围巾 破韩军拟提前部署三艘宙斯盾驱逐舰 欲增韩国战殁者遗属要求取消靖国神社合祀二出手了:中国政府开始制裁国人赴日爆买通付盾10.5亿融资扑朔迷离 真相如连小S都换发型了,你还等什么?全球手机市场纷纷萎缩了,唯独中国厂商美联储加息只是喊个口号“狼来了”其意如何利用仪式感提高效率?李玟为姐姐庆祝毕业季:感谢你替我完成世卫 65℃饮料 可能致癌手机记录的日本北京汽车与戴姆勒进一步深化战略伙伴关上海迪士尼里有“童话”吗?更强引力波再次“现身”O2O分化之下,百度外卖牵手刘诗诗意迪士尼限流大兴一幼儿园老师被指针扎孩子本周关注2845反击战!哪些板块将有亦庄金茂逸墅冠领南中央别墅区毒胶囊不是重现 而是从未离去作文评分 今年“两头撕”从严治校佛心---亚青印象
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘