


用ADO管理SQL Server數據庫及其設備
添加時間:2013-7-1 17:05:16
添加:
思海網絡
微 軟 公 司 的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 的 版 本 是 非 常 重 要 的。
關鍵字:SQL Server 、數據庫、ADO
---- 以 創 建 數 據 庫 設 備 的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 的 版 本 是 非 常 重 要 的。
關鍵字:SQL Server 、數據庫、ADO
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解