分享
 
 
 

用ADO管理SQLServer数据库及其设备

王朝mssql·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

微软公司的SQL Server是目前小型网络中常用的数据库管理系统之一。面向这种网络数据库的应用程序也在日益增多,这种网络数据库应用系统的正常运行,一般都依赖于已经存在的用户数据库。创建数据库的工作当然可以用SQL Server提供的SQL Enterprise Manager工具来完成,但是,如果能够提供一种定制的数据库管理工具,专门管理应用系统需要的数据库及其设备,对用户来说无疑更加理想。

现存问题

我们知道,在使用CREATE DATABASE语句创建一个数据库之前,必须存在一个有剩余空间的数据库设备,或者事先使用DISK INIT语句创建一个新设备。但是这些语句含有很多必需的参数,而且如果不使用SQL Server的管理工具,很多参数值往往难以确定。

以创建数据库设备的DISK INIT语句为例,这个语句的完整语法如下:

DISK INIT

NAME =‘logical_name,

PHYSNAME =‘physical_name,

VDEVNO = virtual_device_number,

SIZE = number_of_2K_blocks

[, VSTART = virtual_address]

其中NAME和SIZE这两个参数都很容易得到,麻烦的是物理名PHYSNAME和虚拟设备号VDEVNO这两个参数。前者要求是一个服务器上的物理文件全路径名;后者要求在1~255之间找一个没有被别的设备占用的号码。而在编写数据库管理程序时,用户的服务器上有哪些设备号已经被占用,SQL Server装在哪个驱动器上,都是无法预料的。

虽然,使用SQL Server的管理工具SQL Enterprise Manager,可以非常方便地创建、删除数据库设备,或者扩大一个已经存在的数据库,也可以非常方便地创建、删除或者修改一个数据库,但是,这个工具仍然要求我们输入很多不太常用的参数,界面稍显复杂。

所以,理想的情况是:用户只需要按下一个命令按钮,应用程序需要的数据库及其设备都能立即自动地创建好。

解决方案

为了实现这样的目标,我们必须想办法解决SQL语句中的参数设置问题。

1.创建设备的语句参数

创建设备的语句即前面提到的DISK INIT语句。

为了简化问题,我们可以指定与数据库名相同的设备文件名,并将设备文件保存在master设备所在的子目录中。数据库名是在设计应用程序时已经确定;而master设备所在的子目录,可以从系统表sysdevices中查询得到。这样,设备文件的物理名参数就确定下来了。

虚拟设备号的问题则比较复杂,因为sysdevices系统表中没有“虚拟设备号”这样一个字段,因此,必须另想办法。

对SQL Server的系统存储过程sp_helpdevice进行分析之后,我们发现,虚拟设备号是“隐藏”在sysdevices系统表的low字段中的,借助另一个系统表spt_values,可以找到每个设备的虚拟设备号。这样,我们只需要在一个循环中找一下某个设备号是否存在于sysdevices中,就可以确定我们现在可用的虚拟设备号。

至于数据库设备的大小,我们不妨设得大一些,或者让用户指定一下也可以。

2.创建数据库的语句参数

创建数据库的语句如下:

CREATE DATABASE database_name

[ON {DEFAULT | database_device} [= size]

[, database_device [= size]]...]

[LOG ON database_device [= size]

[, database_device [= size]]...]

[FOR LOAD]

其中,大部分参数都是可选的,我们只需要指定一个设备名及数据库的大小即可,而数据库名、设备名、大小在创建设备的时候已经确定好了,所以,这个语句的参数不存在问题。

具体实现

使用普通的应用开发工具Visual Basic,我们就可以实现一个定制的数据库管理程序。

为了实现与数据库服务器的连接,我们必须选择一种数据库访问接口。虽然从VB访问SQL Server有很多接口可供选择,但微软最新的数据库访问接口ADO(Active Data Objects)无疑是最有前途的,因为它为基于浏览器的数据库应用系统的实现提供了可能性。

以下是一些用于数据库及其设备管理的常用函数。

1.取当前的工作数据库

由于管理任务一般都必须在master库中完成,因此,在执行管理任务之前,最好保存当前工作库,以便完成任务之后再切换回去。

Public Function SQLGetCurre

ntDatabaseName(Cn As ADODB.Connection) As String

Dim sSQL As String

Dim RS As New ADODB.Recordset

On Error GoTo errSQLGetCurrentDatabaseName

sSQL =“select CurrentDB = DB_NAME()"

RS.Open sSQL, Cn

SQLGetCurrentDatabaseName = Trim$(RS!CurrentDB)

RS.Close

Exit Function

errSQLGetCurrentDatabaseName:

SQLGetCurrentDatabaseName =“"

End Function

2.判断一个数据库设备是否存在

Public Function SQLExistDeviceName(Cn As ADODB.Connection, sDevName As String) As Boolean

--按照名称判断一个设备是否存在,如果存在,返回1,否则返回0

Dim sSQL As String

Dim RS As New ADODB.Recordset

Dim bTmp As Boolean

On Error GoTo errSQLExistDeviceName

sSQL =“select CntDev=count(*) from master.dbo.sysdevices where name =‘“& sDevName&”"

RS.Open sSQL, Cn

If RS!CntDev = 0 Then bTmp = False Else bTmp = True

RS.Close

SQLExistDeviceName = bTmp

Exit Function

errSQLExistDeviceName:

SQLExistDeviceName = False

End Function

3.判断一个虚拟设备号是否被占用:SQLExistDeviceNumber。

编者注:函数源代码发表在以下站点上,地址。欢迎访问!

4.找一个最小的尚未被占用的虚拟设备号:SQLGetUnusedDeviceNumber。

5.取得SQL Server安装目录下的DATA子目录路径:SQLGetDataPath。

6.创建一个新设备:SQLCreateDevice。

7.创建一个新的数据库:SQLCreateDatabase65。

8.取数据库设备的详细信息:SQLGetDeviceInfo。

9.扩大数据库设备的尺寸:SQLExpandDevice。

数据库应用系统在运行一段之后,数据量的增大往往要求数据库增大,进而要求扩大设备尺寸。可惜DISK RESIZE语句要求的尺寸参数为扩大后的新尺寸,而非需要增加的尺寸。所以,必须事先查到设备的原有尺寸,才能使用DISK RESIZE语句。

10.判断一个数据库是否存在:SQLExistDatabase。

11.删除一个数据库:SQLDropDatabase。

12.删除一个数据库设备:SQLDropDevice。

13.取SQL Server的版本信息:SQLGetVersionString。

在即将发行的SQL Server 7.0中,不再有数据库设备的概念,创建数据库也将变得更加简单。在创建特定的用户数据库时,为了区分不同的版本进行不同的操作,取得SQL Server的版本是非常重要的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有