熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

用ADO管理SQL Server數據庫及其設備

2013-11-15 14:40:20  來源: SQL Server 

  微軟公司的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 ADODBConnection) As String
  Dim sSQL As String
  Dim RS As New ADODBRecordset
  On Error GoTo errSQLGetCurrentDatabaseName
  sSQL =select CurrentDB = DB_NAME()
  RSOpen sSQL Cn
  SQLGetCurrentDatabaseName = Trim$(RS!CurrentDB)
  RSClose
  Exit Function
  errSQLGetCurrentDatabaseName:
  SQLGetCurrentDatabaseName =
  End Function
    .判斷一個數據庫設備是否存在
  
    Public Function SQLExistDeviceName(Cn As ADODBConnection sDevName As String) As Boolean
  按照名稱判斷一個設備是否存在如果存在返回否則返回
  
  
  
  Dim sSQL As String
  Dim RS As New ADODBRecordset
  Dim bTmp As Boolean
  On Error GoTo errSQLExistDeviceName
  sSQL =select CntDev=count(*) from masterdbosysdevices where name =& sDevName&
  RSOpen sSQL Cn
  If RS!CntDev = Then bTmp = False Else bTmp = True
  RSClose
  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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.