实例三: VB6.0数据库访问技术与例程解析 引言 作为微软旗下一款优秀的RAD工具,VB在数据库应用开发方面的能力十分强大。微软设计了多种数据库访问方法,下面通过对VB访问数据库的多种技术进行深入剖析,并总结出实际开发中的几点经验。希望能够对那VB的初学者有所帮助。(注意,文中所有的描述均在Windows 2000 professional和Visual Basic 6.0的环境下进行的) 一. DAO、RDO、ODBC和ADO 在VB的开发环境中,可以使用三种数据库访问方式,它们分别是:数据访问对象(DAO)、远程数据对象(RDO)和ADO对象模型。 DAO: 数据访问对象是用来显露了Microsoft Jet数据库引擎(最早是给Microsoft Access 所使用,现在已经支持其它数据库),并允许开发者通过ODBC直接连接到其他数据库一样,直接连接到 Access 表。DAO 最适用于单系统应用程序或在小范围本地分布使用。其内部已经对Jet数据库的访问进行了加速优化,而且其使用起来也是很方便的。所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式。 VB已经把DAO模型封装成了Data控件,分别设置相应的DatabaseName属性和RecordSource属性就可以将Data控件与数据库中的记录源连接起来了。以后就可以使用Data控件来对数据库进行操作。 RDO RDO(Remote Data Objects)远程数据对象是一个到ODBC的、面向对象的数据访问接口,它同易于使用的DAO style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL Server、Oracle 以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。 和DAO一样,在VB中也把其封装为RDO控件了,其使用方法与DAO控件的使用方法完全一样。 ODBC ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。 一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。 一个完整的ODBC由下列几个部件组成:
1. 应用程序(Application) ODBC管理器(Administrator)。该程序位于Windows 95控制面板(Control Panel)的32位ODBC内,其主要任务是管理安装的ODBC驱动程序和管理数据源。 驱动程序管理器(Driver Manager)。驱动程序管理器包含在ODBC32.DLL中,对用户是透明的。其任务是管理ODBC驱动程序,是ODBC中最重要的部件。 2. ODBC API ODBC 驱动程序。是一些DLL,提供了ODBC和数据库之间的接口。 数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。 ODBC连接目前仅仅限于关系型数据库,对于其他数据源比如EXCEL、文本文件都不能进行访问,而且有很多DBMS(数据库管理系统)都不能充分的支持其所有的功能。相比之下,OLEDB可以存取任何形式的数据,所以其功能是相当的强大,它也指导了目前技术发展的方向。 ADO ADO(ActiveX Data Object)是DAO/RDO的后继产物。ADO 2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO"扩展"了DAO和 RDO 所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。 作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。 ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE DB三种方式。后面的例程将详细讲解这三种方式的具体访问实现。 要使用ADO,必须清楚ADO的对象层次结构,其大体上分为以下7个对象层次: 1、 Command 对象:包含关于某个命令,例如查询字符串、参数定义等的信息。Command 对象在功能上和 RDO的rdoQuery 对象相似。 2、 Connection 对象:包含关于某个数据提供程序的信息。Connection 对象在功能上和 RDO 的 rdoConnection 对象是相似的,并且包含了关于结构描述的信息。它还包含某些 RDOEnvironment 对象的功能,例如transaction 控件。 3、 Error对象:包含数据提供程序出错时的扩展信息。Error 对象在功能上和 RDO 的rdoError 对象相似。 4、 Field 对象:包含记录集中数据的某单个列的信息。Field 对象在功能上和 RDO的rdoColumn 对象相似。 5、 Parameter 对象:包含参数化的Command对象的某单个参数的信息。该 Command对象有一个包含其所有Parameter 对象的 Parameters 集合。Parameter 对象在功能上和 RDO 的 rdoParameter 对象相似。 6、 Property对象:包含某个 ADO 对象的提供程序定义的特征。没有任何等同于该对象的RDO,但DAO有一个相似的对象。 7、Recordset对象:用来存储数据操作返回的记录集。此对象和Connection对象是所有对象最重要的两个对象。 当然,对于初级用户来说,我们只需要掌握其中的Connection对象和RecordSet对象就可以实现基本的数据库操作,在后面的经验介绍里面我将给出详细的介绍。
二. 开发经验小结: 前面总体上介绍了一下当前在VB平台下的数据库访问技术,这些技术也是当前数据库技术的主流。下面笔者结合近几年的开发经验,给出一些开发经验和小技巧,以供参考: 经验一:如果数据量不大,而且要求开发周期短的情况,建议使用DAO+Access虽然DAO功能并不强大,但是其对Jet引擎进行了加速优化处理,所以这种搭配应该是比较好的选择。 经验二:RDO当前已经用的很少了,一般用ADO来替代。 经验三:(本经验很重要)使用ADO开发时,连接数据库的方式有三种(前面已经叙述了),其中DSN需要用户首先使用要将所要操纵的数据库设置为数据库源并给其命名。方法是在控制面板->管理工具->数据源(ODBC)下面进行配置。比如设置的数据源名称为data,那么可以通过下面几行代码来连接数据库:
Dim conn As New ADODB.Connection
经验四:前面讲到手动设置ODBC数据源,这里可以通过程序来进行动态设置。首先要清楚的是ODBC的详细信息全部存放在注册表的下述键值内:"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC",通过调用Win32函数WriteProfileString来对相应的键值进行修改即可达到目的。 经验五:通常将数据库的连接代码和资源释放代码放入各自特定的函数里面,因为一般大一点的程序里需要经常对这两个功能模块进行调用,这样做就可以提高效率,当然很多时候都需要写成连接池的形式。 经验六:使用VB在SQL中处理含单引号的字符串时,对字符串数据都用单引号引起来,如:
Select * from MyTable Where
Private Function StrToSQL(ByVal strValue As String) As String
strValue="First'Id"
下面介绍一个实例,来消化以上的相关知识。这里我在一个程序界面下实现了DAO,ADO,ODBC,OLEDB四种数据库访问方式。
程序代码分析:
'整个程序功能是选择不同的连接方式来进行显示工作,三种方式显示效果完全相同 '下面是主程序过程 Private Sub Command1_Click() Dim selitem As Integer '判断连接数据库的方式 If Option1.Value = True Then selitem = 1 Else If Option2.Value = True Then selitem = 2 Else selitem = 3 End If End If '选取不同的数据库连接方式 Select Case selitem Case 1: '使用DAO的数据库连接方式 Call ShowByDAO Case 2: '使用ADO的数据库连接方式 Call ShowByADO Case 3: '使用ODBC的数据库连接方式 Call ShowByODBC Case 4: '使用OLEDB的数据库连接方式 Call ShowByOLEDB End Select End Sub Private Sub ShowByDAO() '使用DAO的数据库连接方式 Dim db As Database Dim rs As Recordset Dim sqlstr$ '存放查询语句 Set db = OpenDatabase(App.Path & "\db1.mdb") sqlstr = "select * from 成绩表" Set rs = db.OpenRecordset(sqlstr) '显示结果 Call GridShow(rs) End Sub Sub ShowByADO() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset '使用数据源来连接数据库 conn.Open "dsn=data" rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic rs.Open "select * from 成绩表", conn Call GridShowOfADO(rs) End Sub Sub ShowByODBC() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset '使用数据源来连接数据库 conn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=data" rs.Open "select * from 成绩表", conn '显示结果 Call GridShowOfADO(rs) End Sub Sub ShowByOLEDB() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset '使用数据源来连接数据库 conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path & "\db1.mdb" + ";Persist Security Info=False" rs.Open "select * from 成绩表", conn '显示结果 Call GridShowOfADO(rs) End Sub Sub GridShow(rs As Recordset) '对dao方式进行显示工作 MSFlexGrid1.TextMatrix(0, 0) = "姓名" MSFlexGrid1.TextMatrix(0, 1) = "性别" MSFlexGrid1.TextMatrix(0, 2) = "语文" MSFlexGrid1.TextMatrix(0, 3) = "数学" MSFlexGrid1.TextMatrix(0, 4) = "英语" rs.MoveLast MSFlexGrid1.Rows = rs.RecordCount + 1 MSFlexGrid1.Cols = rs.Fields.Count Dim i% i = 1 rs.MoveFirst While (Not rs.EOF) MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0) MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1) MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2) MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3) MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4) rs.MoveNext i = i + 1 'If (rs.EOF = True) Then ' Exit For Wend End Sub Sub GridShowOfADO(rs As ADODB.Recordset) '对ado方式进行显示工作 MSFlexGrid1.TextMatrix(0, 0) = "姓名" MSFlexGrid1.TextMatrix(0, 1) = "性别" MSFlexGrid1.TextMatrix(0, 2) = "语文" MSFlexGrid1.TextMatrix(0, 3) = "数学" MSFlexGrid1.TextMatrix(0, 4) = "英语" '注意recordcount属性必须在当前记录指针在最后一条记录时才会返回正确的值 rs.MoveLast MSFlexGrid1.Rows = rs.RecordCount + 1 MSFlexGrid1.Cols = rs.Fields.Count Dim i% i = 1 rs.MoveFirst While (Not rs.EOF) MSFlexGrid1.TextMatrix(i, 0) = rs.Fields(0) MSFlexGrid1.TextMatrix(i, 1) = rs.Fields(1) MSFlexGrid1.TextMatrix(i, 2) = rs.Fields(2) MSFlexGrid1.TextMatrix(i, 3) = rs.Fields(3) MSFlexGrid1.TextMatrix(i, 4) = rs.Fields(4) rs.MoveNext i = i + 1 Wend End Sub Private Sub Command2_Click() End End Sub
四.小结 本文通过对数据库访问相关技术的分析与总结,提出若干有价值的经验。借鉴这些经验,会给开发带来一定的便利。 实例四: VB6中用DataReport做报表 我不是VB熟练工,最近刚刚用VB做完一个程序,其中控制部分没费太大周折,倒是报表部分颇让我费了一翻脑筋。在网上找了半天,也没找到关于VB6的 DataReport的详细介绍,于是想借鉴"前辈"们的经验,用CrystalReport或EXCEL,感觉也不省劲,于是决定回头再去"啃"DataReport,别说,还真让有所收获,下面就简单的介绍一下我的体会,希望对大家能有所帮助。 首先介绍一下DataReport对象的几个常用属性。一是DataSource,用于设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库;二是DataMember,从DataSource提供的几个数据成员中设置一个特定的数据成员;三是LeftMargin、RightMargin、TopMargin、BottomMargin等,用于指定报表的左右上下的页边距;四是Sections,即DataReport的报表标头、页标头、细节、页脚注、报表脚注5个区域,如果加上分组(可以有多层分组),则增加一对区域,即分组标头、分组脚注。其中DataSource一般是一个数据环境或是ADODB.Connection类型的变量,而DataMember则对应数据环境中的Command或是ADODB.RecordSet类型的变量,推荐使用数据环境及Command,页边界大家肯定都很清楚,下面我主要介绍以下Sections,这也是DataReport的精髓所在。 Sections是一个集合,您可以为每一个Section指定名称,也可以用其缺省的索引,从上到下依次为1、2…。每个Section均有Height和Visible属性,您可以在一定条件下使一个Section不可见。在Section中可以放置各种报表控件,其中RptLabel、RptImage、RptShape和RptLine可以放在任意的Section中,用于输出各种文字、图形及表格线;RptTextBox只能放在细节中,一般用于绑定输出DataMemeber提供的数据字段;RptFunction只能被放置在分组注脚中,用于输出使用各种内置函数计算出的合计、最大值、最小值、平均值、记数等等。上述报表控件中常用公共属性有用于控制位置及高度宽度的Top、Left、Height、Width和控制可见性的Visible;其中RptTextBox还有DataField、DataMember、DataFormat及Font属性;其他属性不再多说。 然后介绍一下我的使用经验。一是对想控制的报表控件按类型有规律的命名;二是用RptShape的矩形框做表格线框,比用RptLine画框省事多了,只有斜线才使用RptLine;三是报表标题及报表中的表头文字、日期及页码用RptLabel,其中Caption属性支持转义字符,%D为长格式日期,%d为短格式日期,%P为总页数,%p为当前页码;四是对固定报表在设计窗口直接将报表控件摆放到位,对于活报表,应首先考虑报表最大的情形,将足够的控件分别放置在不同区域,位置大小可以不必深究,然后在报表输出前用VBA代码对所有控件的属性进行调整,包括位置、高度、宽度、字体、对齐方式、显示格式、可见性等等,相应的对Section也应根据情况调整其高度和可见性。 连接数据库
With 数据环境.rsCommand名 这样做的优点是报表设计时简单,调整方便、随意,只需更改一点代码,而不必为了一点点的修改而费神的在设计窗口调整半天。 |
|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )
GMT+8, 2024-5-25 08:00 , Processed in 0.406237 second(s), 15 queries .