数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

用ADO管理SQL Server数据库及其设备


发布日期:2021年03月29日
 
用ADO管理SQL Server数据库及其设备

微软公司的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_K_blocks

[ VSTART = virtual_address]

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

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

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

解决方案

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

.创建设备的语句参数

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

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

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

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

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

.创建数据库的语句参数

创建数据库的语句如下

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)无疑是最有前途的因为它为基于浏览器的数据库应用系统的实现提供了可能性

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

.取当前的工作数据库

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

Public Function SQLGetCurre

ntDatabaseName(Cn As ADODBConnection) As String

Dim sSQL As String

Dim RS As New ADODBRecordset

On Error GoTo errSQLGetCurrentDatabaseName

sSQL =select CurrentDB = DB_NAME()

RSOpen sSQL Cn

SQLGetCurrentDatabaseName = Trim$(RS!CurrentDB)

RSClose

Exit Function

errSQLGetCurrentDatabaseName:

SQLGetCurrentDatabaseName =

End Function

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

Public Function SQLExistDeviceName(Cn As ADODBConnection sDevName As String) As Boolean

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

Dim sSQL As String

Dim RS As New ADODBRecordset

Dim bTmp As Boolean

On Error GoTo errSQLExistDeviceName

sSQL =select CntDev=count(*) from masterdbosysdevices where name =& sDevName&

RSOpen sSQL Cn

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

RSClose

SQLExistDeviceName = bTmp

Exit Function

errSQLExistDeviceName:

SQLExistDeviceName = False

End Function

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

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

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

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

.创建一个新设备SQLCreateDevice

.创建一个新的数据库SQLCreateDatabase

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

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

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

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

.删除一个数据库SQLDropDatabase

.删除一个数据库设备SQLDropDevice

.取SQL Server的版本信息SQLGetVersionString

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

               

上一篇:SQL入门:将行进行排序

下一篇:在SQL Server 2000数据仓库中使用分区