萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 用ADO管理SQLServer數據庫及其設備

用ADO管理SQLServer數據庫及其設備

微 軟 公 司 的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 中, 就 可 以 確 定 我 們 現 在 可 用 的 虛 擬 設 備 號。

---- 至 於 數 據 庫 設 備 的 大 小, 我 們 不 妨 設 得 大 一 些, 或 者 讓 用 戶 指 定 一 下 也 可 以。

---- 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 SQLGetCurrentDatabaseName(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

---- 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。

---- 編 者 注: 函 數 源 代 碼 發 表 在 本 報 的WWW 站 點 上, 地 址 是:http://www.computerworld.com.cn/98/skill/default.htm。 下 同。 歡 迎 訪 問!

---- 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。

----

copyright © 萬盛學電腦網 all rights reserved