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

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

  现存问题

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

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

DISKINITNAME=‘logical_name',PHYSNAME=‘physical_name',VDEVNO=virtual_device_number,SIZE=number_of_2K_blocks[,VSTART=virtual_address]

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

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

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

  解决方案

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

  1.创建设备语句参数

  创建设备语句即前面提到DISKINIT语句

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

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

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

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

  2.创建数据库语句参数

  创建数据库语句如下:

CREATEDATABASEdatabase_name[ON{DEFAULT|database_device}[=size][,database_device[=size]]...]
      [LOGONdatabase_device[=size][,database_device[=size]]...][FORLOAD]

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

  具体实现

  使用普通应用开发工具VisualBasic我们就可以实现个定制数据库管理

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

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

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

PublicFunctionSQLGetCurrentDatabaseName(CnAsADODB.Connection)AsStringDimsSQLAsStringDimRSAsNewADODB.Record
OnErrorGoToerrSQLGetCurrentDatabaseNamesSQL=“selectCurrentDB=DB_NAME"RS.OpensSQL,
CnSQLGetCurrentDatabaseName=Trim$(RS!CurrentDB)RS.CloseExitFunctionerrSQLGetCurrentDatabaseName:SQLGetCurrentDatabaseName=“"EndFunction

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

PublicFunctionSQLExistDeviceName(CnAsADODB.Connection,sDevNameAsString)AsBoolean

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

DimsSQLAsStringDimRSAsNewADODB.RecordDimbTmpAsBooleanOnErrorGoToerrSQLExistDeviceNamesSQL=“
selectCntDev=count(*)frommaster.dbo.sysdeviceswherename=‘“&sDevName&”'"RS.OpensSQL,CnIfRS!CntDev=0ThenbTmp=FalseElsebTmp=
TrueRS.CloseSQLExistDeviceName=bTmpExitFunctionerrSQLExistDeviceName:
SQLExistDeviceName=FalseEndFunction

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

  编者注:源代码发表在本报WWW站点上地址是:http://www.computerworld.com.cn/98/skill/default.htm下同欢迎访问!

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

  5.取得SQLServer安装目录下DATA子目录路径:SQLGetDataPath

  6.创建个新设备:SQLCreateDevice

  7.创建个新数据库:SQLCreateDatabase65

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

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

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

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

  11.删除个数据库:SQLDropDatabase

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

  13.取SQLServer版本信息:SQLGetVersionString

  在即将发行SQLServer7.0中不再有数据库设备概念创建数据库也将变得更加简单在创建特定用户数据库时为了区分区别版本进行区别操作取得SQLServer版本是非常重要 
Tags:  sqlserveradomfc vcadosqlserver vbadosqlserver sqlserverado

延伸阅读

最新评论

发表评论