微软公司
![](/icons/82138de.gif)
SQLServer是目前小型网络中常用
![](/icons/82138de.gif)
数据库管理系统的
![](/icons/82138yi.gif)
![](/icons/82138dou2.gif)
面向这种网络数据库
![](/icons/82138de.gif)
应用
![](/icons/82138chengxu.gif)
也在日益增多
![](/icons/82138dou.gif)
这种网络数据库应用系统
![](/icons/82138de.gif)
正常运行
![](/icons/82138dou.gif)
![](/icons/82138yi.gif)
般都依赖于已经存在
![](/icons/82138de.gif)
用户数据库
![](/icons/82138dou2.gif)
创建数据库
![](/icons/82138de.gif)
工作当然可以用SQL Server提供
![](/icons/82138de.gif)
SQL EnterpriseManager工具来完成
![](/icons/82138dou.gif)
但是
![](/icons/82138dou.gif)
如果能够提供
![](/icons/82138yi.gif)
种定制
![](/icons/82138de.gif)
数据库管理工具
![](/icons/82138dou.gif)
专门管理应用系统需要
![](/icons/82138de.gif)
数据库及其设备
![](/icons/82138dou.gif)
对用户来说无疑更加理想
现存问题
我们知道
![](/icons/82138dou.gif)
在使用CREATEDATABASE语句创建
![](/icons/82138yi.gif)
个数据库的前
![](/icons/82138dou.gif)
必须存在
![](/icons/82138yi.gif)
个有剩余空间
![](/icons/82138de.gif)
数据库设备
![](/icons/82138dou.gif)
或者事先使用DISKINIT语句创建
![](/icons/82138yi.gif)
个新设备
![](/icons/82138dou2.gif)
但是这些语句含有很多必需
![](/icons/82138de.gif)
参数
![](/icons/82138dou.gif)
而且如果不使用SQLServer
![](/icons/82138de.gif)
管理工具
![](/icons/82138dou.gif)
很多参数值往往难以确定
以创建数据库设备
![](/icons/82138de.gif)
DISKINIT语句为例
![](/icons/82138dou.gif)
这个语句
![](/icons/82138de.gif)
完整语法如下:
DISKINITNAME=‘logical_name',PHYSNAME=‘physical_name',VDEVNO=virtual_device_number,SIZE=number_of_2K_blocks[,VSTART=virtual_address]
其中NAME和SIZE这两个参数都很容易得到
![](/icons/82138dou.gif)
麻烦
![](/icons/82138de.gif)
是物理名PHYSNAME和虚拟设备号VDEVNO这两个参数
![](/icons/82138dou2.gif)
前者要求是
![](/icons/82138yi.gif)
个服务器上
![](/icons/82138de.gif)
物理文件全路径名;后者要求在1~255的间找
![](/icons/82138yi.gif)
个没有被别
![](/icons/82138de.gif)
设备占用
![](/icons/82138de.gif)
号码
![](/icons/82138dou2.gif)
而在编写数据库管理
![](/icons/82138chengxu.gif)
时
![](/icons/82138dou.gif)
用户
![](/icons/82138de.gif)
服务器上有哪些设备号已经被占用
![](/icons/82138dou.gif)
SQLServer装在哪个驱动器上
![](/icons/82138dou.gif)
都是无法预料
![](/icons/82138de.gif)
虽然
![](/icons/82138dou.gif)
使用SQLServer
![](/icons/82138de.gif)
管理工具SQLEnterpriseManager
![](/icons/82138dou.gif)
可以非常方便地创建、删除数据库设备
![](/icons/82138dou.gif)
或者扩大
![](/icons/82138yi.gif)
个已经存在
![](/icons/82138de.gif)
数据库
![](/icons/82138dou.gif)
也可以非常方便地创建、删除或者修改
![](/icons/82138yi.gif)
个数据库,但是
![](/icons/82138dou.gif)
这个工具仍然要求我们输入很多不太常用
![](/icons/82138de.gif)
参数
![](/icons/82138dou.gif)
界面稍显复杂
所以
![](/icons/82138dou.gif)
理想
![](/icons/82138de.gif)
情况是:用户只需要按下
![](/icons/82138yi.gif)
个命令按钮
![](/icons/82138dou.gif)
应用
![](/icons/82138chengxu.gif)
需要
![](/icons/82138de.gif)
数据库及其设备都能立即自动地创建好
解决方案
为了实现这样
![](/icons/82138de.gif)
目标
![](/icons/82138dou.gif)
我们必须想办法解决SQL语句中
![](/icons/82138de.gif)
参数设置问题
1.创建设备
![](/icons/82138de.gif)
语句参数
创建设备
![](/icons/82138de.gif)
语句即前面提到
![](/icons/82138de.gif)
DISKINIT语句
为了简化问题
![](/icons/82138dou.gif)
我们可以指定和数据库名相同
![](/icons/82138de.gif)
设备文件名
![](/icons/82138dou.gif)
并将设备文件保存在master设备所在
![](/icons/82138de.gif)
子目录中
![](/icons/82138dou2.gif)
数据库名是在设计应用
![](/icons/82138chengxu.gif)
时已经确定;而master设备所在
![](/icons/82138de.gif)
子目录
![](/icons/82138dou.gif)
可以从系统表sysdevices中查询得到
![](/icons/82138dou2.gif)
这样
![](/icons/82138dou.gif)
设备文件
![](/icons/82138de.gif)
物理名参数就确定下来了
虚拟设备号
![](/icons/82138de.gif)
问题则比较复杂
![](/icons/82138dou.gif)
![](/icons/82138yinwei.gif)
sysdevices系统表中没有“虚拟设备号”这样
![](/icons/82138yi.gif)
个字段
![](/icons/82138dou.gif)
因此
![](/icons/82138dou.gif)
必须另想办法
对SQLServer
![](/icons/82138de.gif)
系统存储过程sp_helpdevice进行分析的后
![](/icons/82138dou.gif)
我们发现
![](/icons/82138dou.gif)
虚拟设备号是“隐藏”在sysdevices系统表
![](/icons/82138de.gif)
low字段中
![](/icons/82138de.gif)
![](/icons/82138dou.gif)
借助另
![](/icons/82138yi.gif)
个系统表spt_values
![](/icons/82138dou.gif)
可以找到每个设备
![](/icons/82138de.gif)
虚拟设备号
![](/icons/82138dou2.gif)
这样
![](/icons/82138dou.gif)
我们只需要在
![](/icons/82138yi.gif)
个循环中找
![](/icons/82138yi.gif)
下某个设备号是否存在于sysdevices中
![](/icons/82138dou.gif)
就可以确定我们现在可用
![](/icons/82138de.gif)
虚拟设备号
至于数据库设备
![](/icons/82138de.gif)
大小
![](/icons/82138dou.gif)
我们不妨设得大
![](/icons/82138yi.gif)
些
![](/icons/82138dou.gif)
或者让用户指定
![](/icons/82138yi.gif)
下也可以
2.创建数据库
![](/icons/82138de.gif)
语句参数
创建数据库
![](/icons/82138de.gif)
语句如下:
CREATEDATABASEdatabase_name[ON{DEFAULT|database_device}[=size][,database_device[=size]]...]
[LOGONdatabase_device[=size][,database_device[=size]]...][FORLOAD]
其中
![](/icons/82138dou.gif)
大部分参数都是可选
![](/icons/82138de.gif)
![](/icons/82138dou.gif)
我们只需要指定
![](/icons/82138yi.gif)
个设备名及数据库
![](/icons/82138de.gif)
大小即可
![](/icons/82138dou.gif)
而数据库名、设备名、大小在创建设备
![](/icons/82138de.gif)
时候已经确定好了
![](/icons/82138dou.gif)
所以
![](/icons/82138dou.gif)
这个语句
![](/icons/82138de.gif)
参数不存在问题
具体实现
使用普通
![](/icons/82138de.gif)
应用开发工具VisualBasic
![](/icons/82138dou.gif)
我们就可以实现
![](/icons/82138yi.gif)
个定制
![](/icons/82138de.gif)
数据库管理
![](/icons/82138chengxu.gif)
为了实现和数据库服务器
![](/icons/82138de.gif)
连接
![](/icons/82138dou.gif)
我们必须选择
![](/icons/82138yi.gif)
种数据库访问接口
![](/icons/82138dou2.gif)
虽然从VB访问SQLServer有很多接口可供选择
![](/icons/82138dou.gif)
但微软最新
![](/icons/82138de.gif)
数据库访问接口ADO(ActiveDataObjects)无疑是最有前途
![](/icons/82138de.gif)
![](/icons/82138dou.gif)
![](/icons/82138yinwei.gif)
它为基于浏览器
![](/icons/82138de.gif)
数据库应用系统
![](/icons/82138de.gif)
实现提供了可能性
以下是
![](/icons/82138yi.gif)
些用于数据库及其设备管理
![](/icons/82138de.gif)
常用
![](/icons/82138hanshu.gif)
1.取当前
![](/icons/82138de.gif)
工作数据库 ----由于管理任务
![](/icons/82138yi.gif)
般都必须在master库中完成
![](/icons/82138dou.gif)
因此
![](/icons/82138dou.gif)
在执行管理任务的前
![](/icons/82138dou.gif)
最好保存当前工作库
![](/icons/82138dou.gif)
以便完成任务的后再切换回去
PublicFunctionSQLGetCurrentDatabaseName(CnAsADODB.Connection)AsStringDimsSQLAsStringDimRSAsNewADODB.Record
![](/icons/82138set.gif)
OnErrorGoToerrSQLGetCurrentDatabaseNamesSQL=“selectCurrentDB=DB_NAME
![](/icons/82138kh.gif)
"RS.OpensSQL,
CnSQLGetCurrentDatabaseName=Trim$(RS!CurrentDB)RS.CloseExitFunctionerrSQLGetCurrentDatabaseName:SQLGetCurrentDatabaseName=“"EndFunction
2.判断
![](/icons/82138yi.gif)
个数据库设备是否存在
PublicFunctionSQLExistDeviceName(CnAsADODB.Connection,sDevNameAsString)AsBoolean
'--按照名称判断
![](/icons/82138yi.gif)
个设备是否存在
![](/icons/82138dou.gif)
如果存在
![](/icons/82138dou.gif)
返回1
![](/icons/82138dou.gif)
否则返回0
DimsSQLAsStringDimRSAsNewADODB.Record
![](/icons/82138set.gif)
DimbTmpAsBooleanOnErrorGoToerrSQLExistDeviceNamesSQL=“
selectCntDev=count(*)frommaster.dbo.sysdeviceswherename=‘“&sDevName&”'"RS.OpensSQL,CnIfRS!CntDev=0ThenbTmp=FalseElsebTmp=
TrueRS.CloseSQLExistDeviceName=bTmpExitFunctionerrSQLExistDeviceName:
SQLExistDeviceName=FalseEndFunction
3.判断
![](/icons/82138yi.gif)
个虚拟设备号是否被占用:SQLExistDeviceNumber
编者注:
![](/icons/82138hanshu.gif)
源代码发表在本报
![](/icons/82138de.gif)
WWW站点上
![](/icons/82138dou.gif)
地址是:http://www.computerworld.com.cn/98/skill/default.htm
![](/icons/82138dou2.gif)
下同
![](/icons/82138dou2.gif)
欢迎访问!
4.找
![](/icons/82138yi.gif)
个最小
![](/icons/82138de.gif)
尚未被占用
![](/icons/82138de.gif)
虚拟设备号:SQLGetUnusedDeviceNumber
5.取得SQLServer安装目录下
![](/icons/82138de.gif)
DATA子目录路径:SQLGetDataPath
6.创建
![](/icons/82138yi.gif)
个新设备:SQLCreateDevice
7.创建
![](/icons/82138yi.gif)
个新
![](/icons/82138de.gif)
数据库:SQLCreateDatabase65
8.取数据库设备
![](/icons/82138de.gif)
详细信息:SQLGetDeviceInfo
9.扩大数据库设备
![](/icons/82138de.gif)
尺寸:SQLExpandDevice
数据库应用系统在运行
![](/icons/82138yi.gif)
段的后
![](/icons/82138dou.gif)
数据量
![](/icons/82138de.gif)
增大往往要求数据库增大
![](/icons/82138dou.gif)
进而要求扩大设备尺寸
![](/icons/82138dou2.gif)
可惜DISKRESIZE语句要求
![](/icons/82138de.gif)
尺寸参数为扩大后
![](/icons/82138de.gif)
新尺寸
![](/icons/82138dou.gif)
而非需要增加
![](/icons/82138de.gif)
尺寸
![](/icons/82138dou2.gif)
所以
![](/icons/82138dou.gif)
必须事先查到设备
![](/icons/82138de.gif)
原有尺寸
![](/icons/82138dou.gif)
才能使用DISKRESIZE语句
10.判断
![](/icons/82138yi.gif)
个数据库是否存在:SQLExistDatabase
11.删除
![](/icons/82138yi.gif)
个数据库:SQLDropDatabase
12.删除
![](/icons/82138yi.gif)
个数据库设备:SQLDropDevice
13.取SQLServer
![](/icons/82138de.gif)
版本信息:SQLGetVersionString
在即将发行
![](/icons/82138de.gif)
SQLServer7.0中
![](/icons/82138dou.gif)
不再有数据库设备
![](/icons/82138de.gif)
概念
![](/icons/82138dou.gif)
创建数据库也将变得更加简单
![](/icons/82138dou2.gif)
在创建特定
![](/icons/82138de.gif)
用户数据库时
![](/icons/82138dou.gif)
为了区分区别
![](/icons/82138de.gif)
版本进行区别
![](/icons/82138de.gif)
操作
![](/icons/82138dou.gif)
取得SQLServer
![](/icons/82138de.gif)
版本是非常重要
![](/icons/82138de.gif)
延伸阅读
最新评论