用ADO管理SQL Server資料庫及其裝置

來源:互聯網
上載者:User
 微軟公司的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.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

  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的版本是非常重要的。  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.