queensf
总版主
总版主
  • 注册日期2003-12-04
  • 发帖数735
  • QQ
  • 铜币3枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1739回复:5

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

楼主#
更多 发布于:2004-02-21 17:18
微软公司的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中,就可以确定我们现在可用的虚拟设备号。

  至于数据库设备的大小,我们不妨设得大一些,或者让用户指定一下也可以。
喜欢0 评分0
[color=blue][size=4][i][b][u] 【 解决不了的事情,就不要想。世界不会因为我而改变。 】 [/size][/u][/b][/i][/color]
queensf
总版主
总版主
  • 注册日期2003-12-04
  • 发帖数735
  • QQ
  • 铜币3枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-02-21 17:19
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


上一
[color=blue][size=4][i][b][u] 【 解决不了的事情,就不要想。世界不会因为我而改变。 】 [/size][/u][/b][/i][/color]
举报 回复(0) 喜欢(0)     评分
queensf
总版主
总版主
  • 注册日期2003-12-04
  • 发帖数735
  • QQ
  • 铜币3枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-02-21 17:19
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的版本是非常重要的。

[color=blue][size=4][i][b][u] 【 解决不了的事情,就不要想。世界不会因为我而改变。 】 [/size][/u][/b][/i][/color]
举报 回复(0) 喜欢(0)     评分
wangjh
论坛版主
论坛版主
  • 注册日期2003-08-22
  • 发帖数994
  • QQ55359982
  • 铜币2579枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-04-20 23:45
小天使 辛苦了,我帮你顶
网 站: www.52xoo.com (3S,信息融合,数字图像处理,模式识别与人工智能等专业电子书、学术文章及源代码共享) E-mail: Jianhong72@163.com QQ: 88128745 (55359982用了近10年,最近被盗了,郁闷!!!)
举报 回复(0) 喜欢(0)     评分
whyerect
路人甲
路人甲
  • 注册日期2003-10-16
  • 发帖数2827
  • QQ
  • 铜币14枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-04-28 08:47


好帖

很好帖

确实好帖

少见的好帖

真 TMD 好帖

难得一见的好帖

千年等一回的好帖

好得不能再好的好帖

惊天地且泣鬼神的好帖

让人阅毕击掌三叹的好帖

让人佩服得五体投地的好帖

让人奔走相告曰须阅读的好帖

让斑竹看后决定加精固顶的好帖

让人看后在各论坛纷纷转贴的好帖

让人看后连成人网站都没兴趣的好帖

让人看完后就要往上顶往死里顶的好帖

让人看后不断在各种场合重复引用的好帖

让人一见面就问你看过某某好帖没有的好帖

让人半夜上厕所都要打开电脑再看一遍的好帖

让个读过后都下载在硬盘里详细研究欣赏的好帖

让人走路吃饭睡觉干什么事连做梦都梦到它的好帖

让人翻译成36种不同外语流传国内外世界各地的好帖

让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖

让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖

让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖

让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖

让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖

让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖

让某名导演跟据此帖改拍的电影在奥斯卡上一连拿了11个奖项的好帖

让人大代表们看完后联名要求根据该帖的内容对宪法做适当修改的好帖

让人为了谁是它的原始作者纷纷地闹上法院打官司要争得它的版权的好帖

让各大学府纷纷邀请该帖作者去就如何发表优秀网络文学为题目演讲的好帖

让人为了该帖而成立了各种学会来研究并为不同的理解争得眼红脖子粗的好帖

让美国警察于今后逮捕人说你有权保持沉默还有权阅读某某帖子要不要啊的好帖

让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖

让萨达姆被捕时被发现他随身携带的除了一把手枪之外还有的就是它的复印件的好帖

让比尔盖茨在懂事会上发给与会者人手一份该帖命令仔细阅读后才讨论其他事宜的好帖

让诺贝儿奖理事会破天荒地因该帖的出现而开会讨论一直决定今后设立最佳帖子奖的好帖

让联合国安理会决定将它译成宇宙语由中国神州六号升空后不断播放看有没有外星人的好帖

让人看完后IE锁死连瑞星诺顿都没法修复只好格式化硬盘重装启动后主页显示的还是它的好帖
[face=隶书]
强极则辱 情深不寿
谦谦君子 温润如玉
[/face]
______________________________________
举报 回复(0) 喜欢(0)     评分
thesame
路人甲
路人甲
  • 注册日期2004-06-11
  • 发帖数1
  • QQ
  • 铜币112枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-06-21 12:13
楼下的这位朋友真是语言天才
举报 回复(0) 喜欢(0)     评分
游客

返回顶部