用ADO管理SQL Server数据库及其设备
2008-04-02 10:40:25来源:互联网 阅读 ()
现存问题
我们知道,在使用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.Recordset OnErrorGoToerrSQLGetCurrentDatabaseNamesSQL=“selectCurrentDB=DB_NAME()"RS.OpensSQL, CnSQLGetCurrentDatabaseName=Trim$(RS!CurrentDB)RS.CloseExitFunctionerrSQLGetCurrentDatabaseName:SQLGetCurrentDatabaseName=“"EndFunction |
2.判断一个数据库设备是否存在
PublicFunctionSQLExistDeviceName(CnAsADODB.Connection,sDevNameAsString)AsBoolean '--按照名称判断一个设备是否存在,假如存在,返回1,否则返回0 DimsSQLAsStringDimRSAsNewADODB.RecordsetDimbTmpAsBooleanOnErrorGoToerrSQLExistDeviceNamesSQL=“ selectCntDev=count(*)frommaster.dbo.sysdeviceswherename=‘“&sDevName&”'"RS.OpensSQL,CnIfRS!CntDev=0ThenbTmp=FalseElsebTmp= TrueRS.CloseSQLExistDeviceName=bTmpExitFunctionerrSQLExistDeviceName: SQLExistDeviceName=FalseEndFunction |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash