用ADO管理SQLServer数据库及其设备
微软的SQLServer是小型网络中常用的数据库管理系统之一。面向这种网络数据库的应用越来越多,这种网络数据库应用系统的正常运行一般依赖于现有的用户数据库。当然,数据库创建的工作可以由SQL Server提供的SQL EnterpriseManager来完成。然而,为用户提供一个定制的数据库管理工具来管理应用系统所需的数据库及其设备无疑是更理想的。
存在的问题
我们知道,在使用CREATEDATABASE语句创建数据库之前,必须有一个剩余空的数据库设备,或者必须事先使用DISKINIT语句创建一个新设备。但是这些语句包含了很多必要的参数,如果不使用SQLServer的管理工具,很多参数的值往往很难确定。
以创建数据库设备的DISKINIT语句为例。该语句的完整语法如下:
DISKINITNAME= '逻辑名称',PHYSNAME= '物理名称',VDEVNO =虚拟设备编号,SIZE =个块的数量[,VSTART =虚拟地址]
名称和大小这两个参数很容易得到,但是物理名称PHYSNAME和虚拟设备号VDEVNO这两个参数比较麻烦。前者需要服务器上物理文件的完整路径名;后者需要一个不被其他设备占用的介于1和255之间的数字。在编写数据库管理程序时,无法预知用户服务器上的哪些设备号被占用了,SQLServer安装在哪个驱动器上。
虽然使用SQLServer的管理工具SQLEnterpriseManager,可以非常方便地创建和删除数据库设备,或者扩展一个已有的数据库,或者创建、删除、修改一个数据库,但是这个工具还是需要我们输入很多不常用的参数,界面也略显复杂。
因此,理想的情况是:用户只需要按下一个命令按钮,应用程序所需的数据库及其设备就可以立即自动创建。
解决办法
为了实现这个目标,我们必须找到一种方法来解决SQL语句中的参数设置问题。
1.创建设备的语句参数。
创建设备的语句是前面提到的DISKINIT语句。
为了简化问题,我们可以指定与数据库名称相同的设备文件名,并将设备文件保存在主设备所在的子目录中。设计应用程序时已经确定了数据库名称;主设备所在的子目录可以从系统表sysdevices中找到。这样就确定了设备文件的物理名称参数。
虚拟设备号的问题比较复杂,因为sysdevices系统表中没有“虚拟设备号”这样的字段,所以必须另辟蹊径。
在分析了SQLServer的系统存储过程sp_helpdevice后,我们发现虚拟设备号“隐藏”在sysdevices系统表的low字段中。在另一个系统表spt_values的帮助下,可以找到每个设备的虚拟设备号。这样,我们只需要在一个循环中找出sysdevices中是否存在某个设备号,就可以确定我们现在可用的虚拟设备号。
至于数据库设备的大小,我们不妨设置大一点,或者让用户指定。
2.创建数据库的语句参数
创建数据库的语句如下:
create database database _ name[ON { DEFAULT | database _ device }[= size][,database_device[=size]]...]
[登录数据库设备[=大小][,数据库设备[=大小]]...[FORLOAD]
其中,大部分参数是可选的。我们只需要指定设备名称和数据库的大小,而数据库名称、设备名称和大小在创建设备时就已经确定了。所以这个说法的参数没有问题。
具体实现
使用通用的应用程序开发工具VisualBasic,我们可以实现一个定制的数据库管理程序。
为了实现与数据库服务器的连接,我们必须选择一个数据库访问接口。虽然从VB访问SQLServer的接口有很多,但微软最新的数据库访问接口ADO(ActiveDataObjects)无疑是最有前途的,因为它为基于浏览器的数据库应用系统的实现提供了可能。
以下是数据库及其设备管理的一些常用功能。
1.以当前工作数据库为例——因为管理任务通常必须在主数据库中完成,所以在执行管理任务之前,请保存当前工作数据库,以便在完成任务后可以切换回来。
PublicFunctionSQLGetCurrentDatabaseName(CnAsADODB。连接)AsStringDimsSQLAsStringDimRSAsNewADODB。recordset
onerrorgotoerrsqlgetcurrentdatabasenames SQL = " selectCurrentDB = DB _ NAME()" RS。OpensSQL,
CnSQLGetCurrentDatabaseName = Trim $(RS!货币b)卢比。CloseExitFunctionerrSQLGetCurrentDatabaseName:SQLGetCurrentDatabaseName = " " end function
2.确定数据库设备是否存在。
PublicFunctionSQLExistDeviceName(CnAsADODB。连接,sDevNameAsString)作为布尔值
-根据设备名称判断设备是否存在,如果存在,返回1,否则返回0
DimsSQLAsStringDimRSAsNewADODB。RecordsetDimbTmpAsBooleanOnErrorGoToerrSQLExistDeviceNamesSQL = "
selectCntDev = count(*)from master . dbo . sysdeviceswherename = ' " & sDevName & " ' " RS。OpensSQL,CnIfRS!CntDev = 0 thenbtmp = false elsebtmp =
TrueRS。CloseSQLExistDeviceName = bTmpExitFunctionerrSQLExistDeviceName:
SQLExistDeviceName = false end function
3.确定虚拟设备号是否被占用。
编者按:该函数的源代码公布在本报的WWW网站上,地址为:http://www.computerworld.com.cn/98/skill/default.htm.,下同。欢迎参观!
4.找到尚未被占用的最小虚拟设备号:SQLGetUnusedDeviceNumber。
5.获取SQLServer安装目录下数据子目录的路径:SQLGetDataPath。
6.创建一个新设备:SQLCreateDevice。
7.创建一个新数据库:SQLCreateDatabase65。
8.获取数据库设备的详细信息:SQLGetDeviceInfo。
9.扩展数据库设备的大小。
数据库应用系统运行一段时间后,数据量的增加往往要求数据库变大,进而要求设备规模的扩大。不幸的是,DISKRESIZE语句需要的size参数是扩展后的新大小,而不是需要增加的大小。因此,在使用DISKRESIZE语句之前,必须事先找到设备的原始大小。
10.确定数据库是否存在。
1.删除数据库:SQLDropDatabase。
12.删除数据库设备:SQLDropDevice。
13.获取SQLServer: SQLGetVersionString的版本信息。
在即将发布的SQLServer7.0中,不再有数据库设备的概念,创建数据库将变得更加容易。在创建特定的用户数据库时,为了区分不同操作的不同版本,获取SQLServer的版本是非常重要的。
位律师回复
0条评论