微軟公司的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 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
.判斷一個數據庫設備是否存在
Public Function SQLExistDeviceName(Cn As ADODB
Connection
sDevName As String) As Boolean
按照名稱判斷一個設備是否存在
如果存在
返回
否則返回
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 =
Then bTmp = False Else bTmp = True
RS
Close
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的版本是非常重要的
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22154.html