用ADO管理SQL Server數據庫及其設備
2024-08-31 00:48:30
供稿:網友
 
微 軟 公 司 的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 stringdim ssql as stringdim rs as new adodb.recordseton error goto errsqlgetcurrentdatabasenamessql = “select currentdb = db_name()"rs.open ssql, cnsqlgetcurrentdatabasename = trim $(rs!currentdb)rs.closeexit functionerrsqlgetcurrentdatabasename:sqlgetcurrentdatabasename = “"end function
---- 2 . 判 斷 一 個 數 據 庫 設 備 是 否 存 在 
---- public function sqlexistdevicename(cn as adodb.connection, sdevname as string) as boolean 
---- '--按 照 名 稱 判 斷 一 個 設 備 是 否 存 在, 如 果 存 在, 返 回1, 否 則 返 回0 
dim ssql as stringdim rs as new adodb.recordsetdim btmp as booleanon error goto errsqlexistdevicenamessql = “select cntdev=count( *) from master.dbo.sysdevices where name = 
‘“ & sdevname & ”'"rs.open ssql, cnif rs!cntdev = 0 then btmp = false else btmp = truers.closesqlexistdevicename = btmpexit functionerrsqlexistdevicename:sqlexistdevicename = falseend 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。 
---- 在 即 將 發 行 的sql server 7.0 中, 不 再 有 數 據 庫 設 備 的 概 念, 創 建 數 據 庫 也 將 變 得 更 加 簡 單。 在 創 建 特 定 的 用 戶 數 據 庫 時, 為 了 區 分 不 同 的 版 本 進 行 不 同 的 操 作, 取 得sql server 的 版 本 是 非 常 重 要 的。 
---- “ 用visual studio 開 發 分 布 式web 應 用” 系 列 文 章( 之 九), 讀 者 有 何 意 見 或 建 議, 請 發e mail 至:[email protected]。