admin 管理员组

文章数量: 1184232


2024年3月19日发(作者:title of)

第1O卷第6期 

2010年l2月 

潍坊学院学报 

Journal of Weifang University 

VoI.10 No.6 

NOV.2O1O 

VB对SQL Server数据库的访问解析 

侯 刚 

(潍坊学院,山东 

潍坊261061) 

摘 要:本文讨论了Visual Basic应用程序访问SQL Server数据库的几种常用的方法,分别说明了每 

种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法性能和优缺点。 

关键词:Visual Basic;SQL Server;数据库 

中图分类号:TP393 文献标识码:A 文章编号:1671—4288(2010)06--0061—06 

SQL Server是微软推出的中小型网络数据库系统,是目前最常用的数据库系统之一。随着SQL 

Server网络数据库应用程序日益增多,这种web数据库应用系统的正常运行一般依赖于已存在的用户数 

据库。创建维护数据库的工作可用SQL Server提供的SQL Enterprise Manager 212具来进行,如能提供一 

种定制的数据库管理工具,通过管理应用程序来管理数据库及其设备,对用户来说无疑是最理想的。 

Visual Basic作为一种面向对象的可视化编程工具,具有简单易学,灵活方便和易于扩充的特点。而 

且Microsoft为其提供了与SQL Server通信的API函数集及工具集,因此它越来越多地用作大型公司数 

据和客户机一服务器应用程序的前端,与后端的Microsoft SQL Server相结合,VB能够提供一个高性能 

的客户机一服务器方案。 

1 VB访问SQL Server数据的常用方法 

1.1数据访问对象/Jet 

VB支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机一服务 

器之间的对话方式,但它的确有许多优点。DAO/Jet是为了实现从VB访问Access数据库而开发的程序 

接口对象。使用DAOs访问SQL Server的过程如下: 

应用程序准备好语句并送至Jet,Jet引擎(MASJT2OO.DLL)优化查询,载人驱动程序管理器并与之 

通讯,驱动程序管理器(ODBC.DLL)通过调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译 

并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。 

Dim mydb As Database 

Dim mydynaset As Dynaset 

Private Sub FormI oad() 

_

Set mydb—OpenDatabase(””,False,False,”ODBC;DSN=Myserver;WSID=LCI ;DATABASE—sales”) 

Set mydynaset—mydb CreateDynaset(”Select*from Customers”) 

End Sub 

上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenData— 

base函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需 

要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,“DATABASE”为所要访问的数据库 

名。 

1.2利用ODBC API编程 

ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对 

话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理 

器中的函数,而驱动程序管理器反过来通过驱动器(SQLSRVR.DLL)把它们送到服务器中。 

*收稿日期:2OlO一08—16 

作者简介:侯刚(1970一),男,山东高密人,潍坊学院计算机与通信工程学院讲师。 

潍坊学院学报 2O10年12月 

下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句句柄。 

Global giHEnv As Long 

Global giHDB As Long 

Global giHStmt As Long 

Dim myResuh As integer 

Dim myConnection As Srting 

Dim myBuff As String 256 

Dim myBufflen As Integer 

If SQI AllocEnv(giHEnv)<>SQL—SUCCESS Then 

MsgBox”Allocation couldn注释:t happen!” 

End If 

If SQI AllocConnecl(giHEnv,giHDB)<>SQI 一SUCCESS Then 

MsgBox”SQL Server couldn注释:t connect!_l 

End lf 

myConnection=”DSN=myServer;UID=I CI ;PWD=;APP=ODBCTest;WSID=I CI ;DATABASE—sales” 

myResult—SQ1 DriverConnect(giHDB,Test,form1.hWnd,myConnection.1en(myConnection),myBuff,256,myBufflen, 

SQI 一DRIVER—COMPI ETE—REQU IED) 

myResult=SQI AllocStmt(giHDS.giHStmt) 

myResult—SQIJFreeStmt(giHStmt,SQ1 C0I SE) 

rsSQI 一”Select*from Customers Where City一”Hunan”” 

myResult SQI ExecDirect(giHStmt,rsSQI ,I.en(rsSQI )) 

1.3使用VBSQL对DB库API编程 

DB库是SQI Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提 

供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQI Server的性能最好最直接的方式。 

VBSQL包含以下三个文件: 

VBSQL.VBX:包含库函数,具有访问重要的消息和处理错误的能力。 

VBSQI BI:包括所有的常量和变量说明。 

VBSQL.HLP:Windows帮助文件,使用VBSQL的指南。 

使用VBSQI 时,必须将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有VBS— 

QI .VBX文件。 

般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用SqlConnec— 

tion打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并登录到服务器的通用例程。 

PrivalC Sub InitializeApplication() 

DBI 1B_k:ERSION=SqlInit() 

If DBI II3

VERSION-二””Then 

_

MsgBox”Could l1(]1 initialize DBI IB!Exit application.”,MI ICONEXCI AMAT10N 

End If 

End St1b 

Private Function I oginToServer()As integer 

toginToScrver=SUCCEED 

Status 一SqlSelloginTime (1oginTime()ut) 

If giSqlConn< ̄;>0 Then 

SqlC1ose( SqlConn)注释:关闭已打开的连接 

giSqlConn=SqlOpenConnection(gsServerName。gsI oginlD,gsPassword,ProgramName,ProgramName) 

If giSqlConn ̄0 Then 

liresuit—SqlUse(giSqlConn。”Sales”) 

E1se 

62— 

第6期 侯刚:VB时SQI Server数据库的访问解析 

LogintoServer=FAII 

End If 

End Function 

1.4 RDO远程数据对象(RemoteData Objects) 

RDO是从DAO派生出来的,但两者很大的不同在于其数据库模式。DAO是针对[记录(Records)] 

和E-T-段(Fields)],而RDO是作为[行(Rows)]和[列(Columns)]来处理。也就是说DAO是ISAM模 

式,RDO是关系模式。此外DAO是访问Access的Jet引擎(Jet是ISAM)的接口,而RDO则是访问OD— 

BC的接口。 

可见,RDO是综合了DAo/Jet、VBSQL/DB b以及ODBC的优点的对象(Object)。需要强调的是, 

RDO是包裹着ODBC API的一层薄薄的外壳,被设计成在后台(服务器端)有数据库存在的前提下运行, 

同时也是针对SQL Server和Oracle而特别设计的。 

RDO的优势在于它完全被集成在VB之中。此外,直接访问sQL Server存储过程、完全支持T— 

SQI 、T—SQL调试集成在开发环境中、Visual Database Tools的集成化等,也是RDO的长处。 

在RDO的对象和集合中,有很多对数据库的状态和设定进行操作的属性(Property),以及对数据库 

进行操作的方法(Method)。利用这些,从RDO2.0起就可以开发事件驱动的数据库应用程序。 

RDO对象与VB中其他对象的概念相同。与VB用的ActiveX控件(以往称为Custom Control或 

OCX、VBX)相似的是,RDO也带有属性和方法;但同Spread、InputMan等普遍应用的ActiveX控件不同 

的是,RD0没有自己的用户界面,因而可以和VB标准的Timer控件归为同一类。当然也可以将RDO看 

作调用oDBC API函数,进而对后台数据库操作加以控制的对象。在RDO的属性和方法中,包含了对单 

个的()DBC API函数以及一连串API函数的调用。 

(1)rdoEngine对象 

最初调用RDO对象以及RDC(远程数据控件)时,自动生成rdoEngine对象的附带事件(incident)。 

rdoEngine用于对RDO全局属性的参数、选项进行设置,是在RDO的阶层结构内处于最上层的对象,包 

含了所有的其他对象。 

rdoEngine对象与DAO/Jet不同,虽然被多个应用程序共享,但体现rdoEngine对象的设定值的属性 

却并不共用,而是在各自的应用程序的程序界面中对其分别加以设定。这些设定值对其他使用RDO以及 

RDC的应用程序没有任何影响。rdoEngine不是集合的要素,而是重新定义的对象,rdoEngine对象不能 

被追加作成对象属性的初值。 

(2)rdoEnvironment对象 

RDO对象在自动创建rdoEngine对象时,将rdoEnviroment对象的初始值生成并保存为rdoEnviro- 

ments(0)。一般情况下,应用程序中不必追加rdoEnvironment对象,大多只需对已有的rdoEnviroments 

(0)进行操作就可以了。只有在支持一个以上事务(Transaction),需要将用户名和口令信息分别处理的情 

况下,利用rdoCreateEnvironment方法将特定的用户名和口令值做成新的rdoEnvironment对象。在这个 

方法中可以指定固有名、用户名和口令,如果所指定的值与rdoEnvironments集合的已经存在的成员名称 

相同,会产生错误。新建的rdoEnvironment对象自动追加在rdoEnvironments集合的最后。调rdoCrea— 

teEnvironment方法时,其name参数可以是长度为0的文字列,这时新的rdoEnvironment对象将不会被 

迫加在rdoEnvironments集合之中。 

(3)rdoConnection对象 

rdoConnection对象用于同SQI Server的连接管理。下面是与SQI Server连接的例子。 

用()penConnection方法的一个实例。设定的DSN为MyDSN: 

Dim Cn As rdoConnection 

Dim En As rdoEnvironment 

Dim Conn As String 

Conn=”DSN—MyDSN;UID—Jacob;’’8L”PWD一123456;DATA BASE—MyDb;“ 

63— 

潍坊学院学报 2010年12月 

Set Cn=En.ODenConnection(””,rdDriverPrompt,False,Co nn) 

Set Cn=En.0penConnection(Prompt:一rdDriverPrompt,Rea dOnly:一False,Connect: Cnn) 

1.5 ADO数据对象(Active Data Objects) 

ADO是基于全新的OLE DB技术,OLE DB可对电子邮件、文本文件、复合文件、数据表等各种各样 

的数据通过统一的接口进行存取。随着ActiveX控件的升级(Windows 98的ActiveX 5.O),RDO将被以 

ActireX技术为基础的ADO接口所替代。下面将介绍基于ActiveX技术的ADO访问SQL Server 6.5数 

据库的技术和方法。 

(1)取当前的工作数据库 

由于管理任务一般都必须在Master库中完成,因此在执行管理任务之前,最好保存当前工作库,以便 

完成任务之后再切换回原来的任务。 

Public Function SQI GetCurrentDatabaseName(Cn As AEK)DB.Connection)As String 

Dim sSQI As String 

Dim RS As New ADODB.Recordset 

On Error GoTo errSQLGetCurrentDatabaseName 

sSQL一”select CurrentDB=D13_NAME()” 

RS.Open sSQI ,Cn 

SQI GetCurrentDatabaseName=Trim¥(RS I CurrentDB) 

RS.Close 

Exit Function 

errSQI GetCurrentDatabaseName: 

SQLGetCurrentDatabaseName=…’ 

End Function 

(2)取SQL Server安装目录下的DATA子目录路径 

取SQL Server的设备文件缺省目录,返回如D:MSSQL DATA。 

Public Function SQI GetDataPath(Cn As AI)()DB.Connection)As String 

Dim sSQL As String 

Dim RS As New ADODB.Recordset 

Dim sFullPath As String 

On Error GoTo errSQI GetDataPath 

sSQI 一“select phyname from master..sysdevices where name=注释:master注释:” 

RS.()pen sSQI ,Cn 

sFullPath==RS!phyname 

RS.Close 

SQI GetDataPath=Left¥(sFullPath,Len(sFullPath)一10)注释:MASTER.DAT的大小 

Exit Function 

errSQI GetDataPath: 

SQLGetDataPath …’ 

End Function 

(3)创建一个新数据库 

Public Function SQI CreateDatabase65(Cn As AEK)DB.Connection,sDBName As String,sDataDeviceName As String, 

nDataSize As Integer,Optional sI ogDeviceName,Optional nLogSize)As Boolean 

Dim sSQI As String 

On Error GoTo errSQI CreateDatabase65 

Dim sDB As String 

sDB SQI GetCurrentDatabaseName(Cn) 

sSQI 一”USE master” 

Cn.Execute sSQI 

64— 

第6期 侯刚:VB对SQI Server数据库的访问解析 

sSQL一”CREATE DATABASE”&sDBName 

sSQI 一sSQL&”ON”&sDataDeviceName&”一”&nDataSize 

If Not IsMissing(sLogDeviceName)And Not IsMissing(nLogSize)Then 

sSQI 一sSQI &”LOG ON”&sI ogDeviceName&’’一‘ &nI ogSize 

End If 

Cn.Execute sSQI 

sSQI 一”USE”&sDB 

Cn.Execute sSQI 

SQLCreateDatabase65:True 

Exit Function 

errSQI CreateDatabase65: 

On Error Resume Next 

sSQL一”USE”&sDB 

Cn.Execute sSQL 

SQI CreateDatabase65一False 

End Function 

(4)判断一个数据库是否存在 

Public Function SQLExistDatabase(Cn As ADODB.Connection。sDBName As String)As Boolean 

Dim sSQI As String 

Dim RS As New ADODB.Recordset 

Dim bTmp As Boolean 

on Error GoTo errSQLExistDatabase 

sSQL一”select CntDB—count(*)” 

sSQI 一sSQI &”From master.dbo.sysdatabases” 

sSQL—sSQI &”Where name一注释:”&sDBName&”注释:” 

RS.()pen sSQL,Cn 

If RS!CntDB一0 Then bTmp=False Else bTmp—True 

RS.Close 

SQLExistDatabase—bTmp 

Exit Function 

errSQI ExistDatabase: 

SQLExistDatabase—False 

Exit Function 

End Function 

(5)删除一个数据库 

Public Function SQI DropDatabase(Cn As ADODB.Connection,sDBName As String)As Boolean 

Dim sSQI As String 

On Error GoTo errSQLDropDatabase 

If Not SQLExistDatabase(Cn,sDBName)Then 

SQI DropDatabase—True 

Exit Function 

End If 

Dim sDB AS String 

sDB—SQLGetCurrentDatabaseName(Cn) 

sSQL一”Use master” 

Cn.Execute sSQL 

sSQI 一”DROP DATABASE”&sDBName 

Cn.Execute sSQL 

65— 

潍坊学院学报 2O10年12月 

sSQI 一”USE”&sDB 

Cn.Execute sSQI 

SQI I)ropDatabase—True 

Exh FUIICtion 

errSQ1 Drop1)atabase: 

On Error Resume Nexl 

sSQI =”USE”& sDB 

Cn.Execute sSQI 

SQI Drop1)atabase—False 

End Function 

2性能b匕较及应用说明 

用VB开发基于SQI Server的数据库系统,以上几种访问SQI Server的方法各有各的特点。DAOs 

方法是基于对象的,因而便于使用,但是它是从Visual Basic到SQI Server最慢的连接方式。ODBC API 

和VBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的互操作性,编程简单, 

但速度慢于VBSQI 方法。VBSQI 方法通过VBSQI 控件,提供了重要的SQL Server前端应用程序所需 

的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计 

算列等。这些都是VBSQI 方法超出其它方法的优势,但其编程稍复杂。RD()是位于ODBC API之上的 

个对象模型层,它依赖ODBC API、ODBC驱动程序以及后端数据库引擎来实现,用RDO所写的程序短 

小(约250 KB)、快速。RDO具备基本的ODBC处理方法,可直接执行大多数ODBC API函数,RDO包含 

在VB 4.O/VB 5.0企业版中,由MSRDO32.DI L动态连接库来实现。RDO是综合了DAO/Jet、VBS- 

QI /DBLib和ODBC的优点的对象模型,包含ODBC API应.用层,设计为在后台(服务器端)有数据库存 

在的前提下运行,是针对SQI Server和Oracle而特别设计的。RD()的优势在于它完全被集成在VB之 

中,可直接访问SQI Server存储过程、完全支持T—sQI 、T~SQI 调试集成在开发环境中、Visual Data— 

base Tools的集成化等。但微软已宣布今后不再对VBSQI /DBI ib进行升级,而ODBC API函数一般的 

编程方式也不为人们所喜爱,RDO的应用将逐渐减少。至于实际使用哪一种接口方式,在很大程度上依 

赖于用户的应用程序的具体情况而定。 

3 VisualBasic访问数据库的前景 

近来随着web应用软件的迅速发展和现有数据存储形式的多种多样,Visual Basic访问数据库的解 

决方案面临诸如快速提取分布于企业内部和外部有用商业信息等的多种挑战。为此Microsoft提出一种 

新的数据库访问策略,即“统一数据访问”(UniversalDataAccess)的策略。“统一数据访问”提供了高性能 

的存取包括关系型和非关系型在内的多种数据源,提供独立于开发工具和开发语言的简单的编程接口,这 

些技术使得企业集成多种数据源、选择更好的开发工具、应用软件、操作平台、建立容易维护的解决方案成 

为可能。 

参考文献: 

[J]叶俊民,汪望珠.面向对象软件工程[M].2版.北京:清华大学出版社,2006. 

[2]郑阿奇,彭作民.Visual Basic.NET程序设计教程[M].北京:机械工业出版社,2007. 

[3]郑阿奇.sQI Server教程[M].北京:清华大学出版社,2005. 

[4]王昕.基于VB+SQI 数据库的方法及接口比较的研究[J].微计算机信息,2009,(1 5):86—89 

(责任编辑:肖恩忠) 


本文标签: 数据库 对象 方法 访问 应用程序