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

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代码则被封装在类中。用标准模块,
你必须将控制权交给模块。最后,类模块更易于移植。


【问底】Yao Yu:谈Twitter的百TB级Redis缓存实践 “OKCoin与你·北京一夜”:共商比特币可持续繁荣之道 苹果再发力:推Apple Pay,或将引发新一轮支付变革 CausalImpact,谷歌开源的R时域因果关系分析工具 腾讯云总裁陈磊:互联网和传统企业互联网化是主线 不得不看,苹果Pay技术大起底! 详解Apple Pay:一大波iOS原生应用正在逼近! 高性能微信公众平台开发 【先锋】事务、高性能,王涛谈打造超越MongoDB的NoSQL 浅谈互联网数据中心海量运营之道 一篇文章读懂开源web引擎Crosswalk Facebook创建新开源组织TODO,Google、Twitter等继续捧场 微软明日将启动第二轮裁员 涉及所有的事业部 IBM推出Watson Analytics 将人机对话带进企业决策 参与2014中国移动开发者大调查 MDCC门票等你拿 手游开发经验谈:付费体系决定游戏收成好与坏? 惠普推出全新ProLiant Gen9服务器 腾讯安全出杀手锏 搭建全国最大Wi-Fi开放平台帮助网友免费蹭网 云与数据安全实践尽在ISC 2014(免费门票) 开源的对决,MapR将Apache Drill引入企业应用 令程序员费解的10个语言特性 走进雅虎北京全球研发中心:五年光阴缔造雅虎全球创新引擎 超强集成游戏编辑器!开源跨平台引擎Wave 求别再侵犯儿童隐私!FTC狠罚Yelp和TinyCo 华为应用市场助力开发者 软硬结合造就强大生态系统 【CTO俱乐部看板研修班北京站现场速递】看板方法:渐进变革的过程 《近匠》不背单词,用“沉浸”征服英语学习 ETpl——强复用、灵活、高性能的JavaScript模板引擎 MDCC 2014大会日程概览发布 最新嘉宾议题揭秘 终于来了,微信企业号正式开启公测! 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究 高分求购经典旧书配本源码 《Windows编程指南》,清华出版社,成功后立马送分 关于百度插件问题 怎样用Request.QueryString("k")的值和select pass from c while pass=44的结果比较 关于在QR中横向打印的问题........... 为什么有的网站明明是用了数据库,但是网页文件却是.html的? 如何实现数据库中的图片存储 select ???? 这怎解决啊,Help!!!! 如何将结构相同的两表的数据合并? 建立一个简单的网上直播服务器需要那些步骤? 请教一个关于属性页的问题 可以这样查询吗 ?请问怎么出现设置目录的对话框,并且把路径保存edit中!!急急急急急急急(lxjgyl82) 关于监考管理 怎么通过ado动态的连接数据库 web服务器控件和html服务器控件有什么区别 合肥工業大學爆发學潮 Java程序监听数据库的操作 串口 对DBNavigator组件的操作,请大家帮忙 怎么看历史短消息啊?原来有的怎么看啊? 一个sql的意义! 我在程序启动时所出现的封面如果关闭程序? vc环境下如何外部调用exe可执行文件?最好给个例子。 校园性喻 (转自罗斯文) 大放分,我加三角(可惜总分也就10分,全给了~~~)——> 拨号服务器问题,这样怎么不能实现代理上网???立即给分相谢!!! 在QR中横向打印的问题.................. 我们的出路在哪里? 简单数组问题 教我做一个课程设计,关于数据结构的。 win2000+php+mysql+iis用什么函数删除文件 如何实现CSDN论坛中的“我参与的贴子”的功能 卖身!!可怜可怜,看值多少? 好郁闷! 两个小游戏,加一起还不到40K 急!!在MDI中ChildView类是自动生成的吗?还是要自己手动加入呢。 求助!!系统里的installshield 坏了怎么办啊! 谁能给在下解释下面的语句:#pragma warning(disable:4786)? 关于文本扫描替换的问题: 急!!在MDI中ChildView类是自动生成的吗?还是要自己手动加入呢。 请教两个问题。。。。 急急急急急急1 swing用的多吗?交流一下学习java的经验!! 请教大家软件文档的写法 C++ Primer 中文版 apache只能读.php而不能读取.php3文件,怎么搞定? 关于ICMP 怎样在xml架构上确定多个primary keys? 此头文件“afxext.h”做何用? 什么样的人能做程序员,我可以么? 浙江吨位最大海巡船列编海事局 构筑安东阳两姐妹被残忍杀害 尸体装皮箱浇筑冷空气来袭 宁波降雨基本告别高温天超市收银女被捅 现场民警未出手制止(警惕染色枸杞 长期食用伤肝伤肾女孩签30万助学协议 未如期考上美院小偷偷到手机发现有密码 回去索要钱财杭州明天气温反弹到35℃ 第二波冷空金华35岁已婚男假装23岁单身小伙性杭州西溪路玉古路口昨晨淹水 因老水管杭州商教苑小区大妈用藤椅占车位 自称马云加入UC董事会 旨在互抬身价实现浙江公布10大网络造谣案 已有两人因终身学籍号启用 中小学生拥有唯一学籍宁波市规定幼儿园只能收取保教费和服务公交司机连撞16车被刑拘 27人受伤宁波九院正式成为市第一医院江北分院余杭一批事业单位周四起招聘89人光大总裁辞职 压力说经验短板说众说纷杭州新初一语文课本有调整 一些老师觉孙杨回归朱志根门下 录制好声音推迟一奔跑吧,主编 | 那些离职创业的主编马云摊上大事了!阿里在美遭欺诈调查,不知天之将黑,不知老之将至不再妄下评判,2015年你能做到吗?北京喜剧院,欢喜开张!第7讲:产业地产定位、招商和运营心得这是世上最伟大的败家爷们,没有之一亮瞎了!奶茶妹妹与刘强东已结婚家用咖啡机哪家强?荐号|在资讯=金钱的时代,你该看些什IT八卦 | BAT的“离职圈”生意电子游戏装逼指南1.0不用讨好别人也能受欢迎的小心机揭开面纱,荣耀4A神秘新品21号发布易到要造车?“只用不卖”的共享汽车所以说,什么罩杯的姑娘都有烦恼分享 | 迅速提升个人品味的微信你都不知道苍井空有多好!想升总监?算算看有多远千股涨停到千股跌停一日之隔当印度阅兵遇上北京,印度哭了
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘