非Access資料庫在VB的程式設計及應用 (轉)

worldblog發表於2007-12-04
非Access資料庫在VB的程式設計及應用 (轉)[@more@]

非Access在VB的及應用

摘 要 有 著 強 大 的 數 據 庫 存 取 能 力 , 不 僅 能 夠 直 接 支 持 Ms Access 數 據 庫 , 而 且 通 過 其 內 部 安 裝 的 ISAM 驅 動 程 序 使 它 能 間 接 支 持 FoxPro 、 aSE 等 外 來 數 據 庫 。 本 文 不 僅 從 數 據 庫 體 系 結 構 的 角 度 探 討 了 VB 對 這 些 外 來 數 據 庫 的 支 持 , 還 結 合 了 一 些 實 例 具 體 闡 述 了 使 用 數 據 庫 存 取 對 象 變 量 的 方 法 實 現 這 些 外 來 數 據 庫 的 新 建 、 庫 結 構 修 改 、 顯 示 及 其 運 行 環 境 設 置 。 關 鍵 詞 Visual Basic Access 外 來 數 據 庫 數 據 庫 存 取 對 象 變 量 庫 結 構   作 為 一 個 功 能 較 完 備 的 軟 件 開 發 平 臺 , Visual Basic 專 業 版 提 供 了 對 數 據 庫 應 用 的 強 大 支 持 。 尤 其 提 供 了 使 用 數 據 控 件 和 綁 定 控 制 項 , 使 用 數 據 庫 存 取 對 象 變 量 ( Data Access Variable ) , 直 接 調 用 ODBC 2.0 接 口 函 數 等 三 種 訪 問 數 據 庫 的 方 法 。 對 其 標 準 內 置 的 Ms Access 數 據 庫 , 它 可 以 提 供 不 弱 於 專 業 數 據 庫 軟 件 的 支 持 , 可 以 進 行 完 整 的 數 據 庫 維 護 、 操 作 及 其 事 務 處 理 。 在 VB 中 , 將 非 Access 數 據 庫 稱 為 外 來 數 據 庫 。 對 於 FoxPro 、 dBASE 、 Paradox 等 外 來 數 據 庫 。 雖 然 借 助 VB 的 Data Manager 能 夠 對 這 些 數 據 庫 進 行 NEW 、 OPEN 、 DESIGN 、 DELETE 等 操 作 , 但 在 應 用 程 序 的 運 行 狀 態 中 並 不 能 從 底 層 真 正 實 現 這 些 功 能 。 本 文 從 使 用 數 據 庫 存 取 對 象 變 量 的 方 法 出 發 , 實 現 了 非 Access 格 式 數 據 庫 ( 以 FoxPro 數 據 庫 為 例 ) 的 建 新 庫 、 拷 貝 數 據 庫 結 構 、 動 態 調 入 等 操 作 , 闡 述 了 從 編 程 技 巧 上 彌 補 VB 對 這 些 外 來 數 據 庫 支 持 不 足 的 可 行 性 。   一 、 VB 數 據 庫 的 體 系 結 構 具 體 的 VB 的 數 據 庫 結 構 請 先 看 下 圖 。 可 見 VB 數 據 庫 的 核 心 結 構 是 所 謂 的 JET 數 據 庫 引 擎 , JET 引 擎 的 作 用 就 像 是 一 塊 “ 面 板 ” , 在 其 上 可 以 插 入 多 種 ISAM ( Indexed Sequential Access Method , 即 索 引 順 序 存 取 方 法 ) 數 據 驅 動 程 序 。 JET 引 擎 為 Access 格 式 數 據 庫 提 供 了 直 接 的 內 部 ( build-in ) 支 持 , 這 就 是 VB 對 Access 數 據 庫 具 有 豐 富 支 持 的 真 正 原 因 。 VB 專 業 版 中 提 供 了 FoxPro 、 dBASE ( 或 Xbase ) 、 Paradox 、 Btrieve 等 數 據 庫 的 ISAM 驅 動 程 序 , 這 就 使 得 VB 能 支 持 這 些 數 據 庫 格 式 。 另 外 , 其 他 的 許 多 兼 容 ISAM 的 驅 動 程 序 也 可 以 通 過 從 廠 商 的 售 後 服 務 得 到 。 因 而 從 理 論 上 說 , VB 能 支 持 所 有 兼 容 ISAM 的 數 據 庫 格 式 ( 前 提 是 只 需 獲 得 這 些 數 據 庫 的 ISAM 驅 動 接 口 程 序 ) 。 由 上 可 見 , Ms JET 引 擎 實 質 上 提 供 了 : 一 個 符 合 ANSI 標 準 的 語 法 分 析 器 ; 為 查 詢 結 果 集 的 使 用 而 提 供 的 內 存 管 理 功 能 ; 同 所 支 持 的 數 據 庫 的 外 部 接 口 ; 為 應 用 代 碼 提 供 的 內 部 接 口 。 實 際 上 , 在 VB 中 從 一 種 數 據 庫 類 型 轉 化 為 另 一 種 數 據 庫 類 型 幾 乎 不 需 要 或 只 需 要 很 少 的 代 碼 修 改 。 而 且 , 盡 管 dBASE 、 Paradox 本 身 的 DDL ( Data Definition Language , 即 數 據 定 義 語 言 ) 和 DML ( Data Manipulation Language , 即 數 據 操 縱 語 言 ) 是 非 結 構 化 查 詢 的 , 但 它 們 仍 然 可 以 使 用 VB 的 語 句 和 JET 引 擎 來 操 縱 。 從 VB 的 程 序 代 碼 的 角 度 來 看 , ODBC , ISAM 驅 動 程 序 以 及 Ms Access 數 據 庫 的 整 個 外 部 結 構 夠 可 以 統 一 為 一 個 一 致 的 編 程 接 口 。 也 即 是 說 , 提 供 給 VB 應 用 程 序 員 的 記 錄 集 對 象 視 圖 同 所 使 用 的 數 據 庫 格 式 及 類 型 是 相 互 獨 立 的 。 即 對 FoxPro 等 數 據 庫 仍 然 可 以 使 用 眾 多 的 數 據 庫 存 取 對 象 變 量 , 這 就 為 非 Access 數 據 庫 的 訪 問 提 供 了 最 重 要 的 方 法 。   二 、 使 用 非 Access 數 據 庫 時 的 參 數 設 置 及 配 置 文 件 的 參 數 讀 取 如 果 在 VB 的 程 序 中 使 用 了 數 據 庫 的 操 作 , 將 應 用 程 序 生 成 EXE 文 件 或 打 包 生 成 安 裝 程 序 後 , 則 必 須 提 供 一 個 配 置 ( .INI ) 文 件 , 在 INI 文 件 中 可 以 對 不 同 類 型 的 數 據 庫 進 行 設 置 。 如 果 找 不 到 這 個 INI 文 件 , 將 會 導 致 不 能 訪 問 數 據 庫 。 通 常 情 況 下 , INI 文 件 的 文 件 名 和 應 用 程 序 的 名 稱 相 同 , 所 以 如 果 沒 有 指 明 , VB 的 程 序 會 在 Windows 子 目 錄 中 去 找 和 應 用 程 序 同 名 的 INI 文 件 。 可 以 使 用 VB 中 的 SetDataAccessOptions 語 句 來 設 置 INI 文 件 。 SetDataAccessOptions 語 句 的 用 法 如 下 : SetDataAccessOptions 1 , IniFileName 其 中 IniFileName 參 數 指 明 的 是 INI 文 件 的 帶 路 徑 的 文 件 名 。 值 得 注 意 的 是 , 當 應 用 程 序 找 不 到 這 個 INI 文 件 時 , 或 在 調 用 OpenDataBase 函 數 時 對 其 Connect 參 數 值 沒 有 設 定 為 VB 規 定 的 標 準 值 , 如 對 FoxPro 2.5 格 式 設 定 為 了 “ FoxPro; ” ( 應 為 “ FoxPro 2.5; ” ) , 或 者 沒 有 安 裝 相 應 的 ISAM 驅 動 程 序 , 則 此 時 VB 會 顯 示 一 條 錯 誤 信 息 “ Not Found Installable ISAM ” 。 通 常 , INI 文 件 在 應 用 程 序 分 發 出 去 以 前 已 經 生 成 , 或 者 在 安 裝 時 動 態 生 成 , 也 可 以 在 應 用 程 序 中 自 己 生 成 。 通 常 這 種 INI 文 件 中 有 “ [Options] ” 、 “ [ISAM] ” 、 “ [Installed ISAMs] ” 、 “ [FoxPro ISAM] ” 、 “ [dBASE ISAM] ” 、 “ [Paradox ISAM] ” 等 設 置 段 , 對 於 一 個 完 整 的 應 用 程 序 則 還 應 有 一 個 屬 於 應 用 程 序 自 己 的 設 置 段 如 “ [MyDB] ” 。 可 在 其 中 設 置 DataType 、 Server 、 DataBase 、 OpenOnStartup 、 DisplaySQL 、 QueryTimeOut 等 較 為 重 要 的 數 據 庫 參 數 , 並 以 此 限 定 應 用 程 序 一 般 的 運 行 環 境 。 Windows API 接 口 函 數 在 Kernel.exe 動 態 鏈 接 庫 中 提 供 了 一 個 OSWritePrivateProfileString 函 數 , 此 函 數 能 按 Windows 下 配 置 文 件 ( .INI ) 的 書 寫 格 式 寫 入 信 息 。 在 通 常 情 況 下 , 應 用 程 序 還 需 要 在 運 行 時 讀 取 配 置 文 件 內 相 關 項 的 參 數 。 比 如 PageTimeOut ( 頁 加 鎖 超 時 時 限 ) 、 MaxBufferSize ( 緩 衝 區 大 小 ) 、 LockRetry ( 加 鎖 失 敗 時 重 試 次 數 ) 等 參 數 , 通 過 對 這 些 參 數 的 讀 取 對 應 用 程 序 運 行 環 境 的 設 定 、 潛 在 錯 誤 的 捕 獲 等 均 會 有 很 大 的 改 善 。 設 此 應 用 程 序 的 配 置 文 件 為 MyDB.INI , 則 具 體 過 程 如 下 :   Funtion GetINIString$( Byval Fname$ , Byval szItem$ , Byval szDeFault$ ) ’ 此 自 定 義 子 函 數 實 現 INI 文 件 內 設 置 段 內 參 數 的 讀 取 Dim Tmp As String , x As Integer Tmp = String( 2048,32 ) x = OSGetPrivateProfileString( Fname$ , szItem$ , szDefault$ , Tmp , Len(Tmp) , “ MyDB.INI ” ) GetINIString = Mid$( Tmp,1,x ) End Function 以 下 這 些 函 數 的 聲 明 可 寫 在 模 塊 文 件 內 , 且 每 個 函 數 的 聲 明 必 須 在 一 行 內 Declare Function OSGetPrivateProfileString% Lib "Kernel" Alias "GetPrivateProfileString" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal ReturnString$, ByVal NumBytes As Integer, ByVal FileName$) Declare Function OSWritePrivateProfileString% Lib "Kernel" Alias "WritePrivateProfileString" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal FileName$) Declare Function OSGetWindowsDirectory% Lib "Kernel" Alias "GetWindowsDirectory" (ByVal a$, ByVal b%) Sub Form1_Load( ) Dim st As String Dim x As Integer Dim tmp As String tmp = String$( 255, 32 ) ’ 在 INI 文 件 內 為 各 種 數 據 庫 格 式 指 明 已 安 裝 的 相 應 ISAM 驅 動 程 序 x = OSWritePrivateProfileString(" Installable ISAMS", "Paradox 3.X", "PDX110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "dBASE III", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "dBASE IV", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "FoxPro 2.0", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "FoxPro 2.5", "XBS110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "Installable ISAMS", "Btrieve", "BTRV110.DLL", "MyDB.INI" ) x = OSWritePrivateProfileString( "dBase ISAM", "Deleted", "On", "MyDB.INI" ) ’ 指 明 INI 文 件 的 位 置 x = OSGetWindowsDirectory( tmp, 255 ) st = Mid$( tmp, 1, x ) SetDataAccessOption 1, st + "mydb.ini" ’ 獲 得 INI 文 件 一 些 參 數 gwMaxGridRows = Val(GetINIString( “ MyDB.INI ” ,"MaxRows", "250" )) glQueryTimeout = Val(GetINIString( “ MyDB.INI ” ,"QueryTimeout", "5" )) glLoginTimeout = Val(GetINIString( “ MyDB.INI ” ,"LoginTimeout", "20" )) End Sub   三 、 數 據 存 取 對 象 變 量 對 外 來 數 據 庫 編 程 的 方 法 及 其 實 例 在 VB 專 業 版 數 據 庫 編 程 的 三 種 方 法 中 , 第 二 種 — 使 用 數 據 庫 存 取 對 象 變 量 ( DAO ) 的 方 法 最 具 有 功 能 強 大 、 靈 活 的 特 點 。 它 能 夠 在 程 序 中 存 取 ODBC 2.0 的 管 理 函 數 ; 可 以 控 制 多 種 記 錄 集 類 型 : Dynaset , Snapshot 及 Table 記 錄 集 合 對 象 ; 可 以 存 儲 過 程 和 查 詢 動 作 ; 可 以 存 取 數 據 庫 集 合 對 象 , 例 如 TableDefs , Fields , Indexes 及 QueryDefs ; 具 有 真 正 的 事 物 處 理 能 力 。 因 而 , 這 種 方 法 對 數 據 庫 處 理 的 大 多 數 情 況 都 非 常 適 用 。 由 於 VB 中 的 記 錄 集 對 象 與 所 使 用 的 數 據 庫 格 式 及 類 型 是 相 互 獨 立 的 , 所 以 在 非 Access 數 據 庫 中 也 可 以 使 用 數 據 庫 存 取 對 象 變 量 的 方 法 。 因 而 對 FoxPro 等 外 來 數 據 庫 而 言 , 使 用 數 據 庫 存 取 對 象 變 量 的 方 法 同 樣 也 是 一 種 最 佳 的 選 擇 。 有 一 點 需 要 注 意 的 是 , VB 的 標 準 版 中 僅 能 使 用 數 據 控 件 ( Data Control ) 對 數 據 庫 中 的 記 錄 進 行 訪 問 , 主 要 的 數 據 庫 存 取 對 象 中 也 僅 有 Database 、 Dynaset 對 象 可 通 過 數 據 控 件 的 屬 性 提 供 , 其 它 的 重 要 對 象 如 TableDef 、 Field 、 Index 、 QueryDef 、 Snapshot 、 Table 等 均 不 能 在 VB 的 標 準 版 中 生 成 , 所 以 使 用 數 據 存 取 對 象 變 量 的 方 法 只 能 用 VB 3.0 以 上 的 專 業 版 。 ( 一 ) 、 非 Access 數 據 庫 的 新 建 及 庫 結 構 的 修 改 VB 專 業 版 中 的 數 據 庫 存 取 對 象 變 量 可 以 分 為 兩 類 , 一 類 用 於 數 據 庫 結 構 的 維 護 和 管 理 , 另 一 類 用 於 數 據 的 存 取 。 其 中 表 示 數 據 庫 結 構 時 可 以 使 用 下 面 的 對 象 : DataBase 、 TableDef 、 Field 、 Index , 以 及 三 個 集 合 ( Collection ) : TableDefs 、 Fields 和 Indexes 。 每 一 個 集 合 都 是 由 若 幹 個 對 象 組 成 的 , 這 些 數 據 對 象 的 集 合 可 以 完 全 看 作 是 一 個 數 組 , 並 按 數 組 的 方 法 來 調 用 。 一 旦 數 據 庫 對 象 建 立 後 , 就 可 以 用 它 對 數 據 庫 的 結 構 進 行 修 改 和 數 據 處 理 。 對 於 非 Access 數 據 庫 , 大 部 分 都 是 對 應 於 一 個 目 錄 , 所 以 可 以 使 用 VB 的 MkDir 語 句 先 生 成 一 個 目 錄 , 亦 即 新 建 一 個 數 據 庫 。 而 每 一 個 非 Access 數 據 庫 文 件 可 看 作 是 此 目 錄 下 的 一 個 數 據 表 ( Table ) , 但 實 際 上 它 們 是 互 相 獨 立 的 。 下 面 是 新 建 一 個 FoxPro 2.5 格 式 數 據 庫 的 程 序 實 例 。 Sub CreateNew ( ) Dim Db1 As database , Td As TableDefs Dim T1 As New Tabledef , F1 As New Field , F2 As New Field , F3 As New Field Dim Ix1 As New Index Dim Path As String Const DB_TEXT = 10 , DB_INTEGER = 3 ChDir "" Path$ = InputBox( " 請 輸 入 新 路 徑 名 : ", " 輸 入 對 話 框 " ) MkDir Path$ ’ 新 建 一 個 子 目 錄 Set Db1 = OpenDatabase(Path$, True, False, "FoxPro 2.5;") Set Td = Db1.TableDefs T1.Name = "MyDB" ’ 新 建 一 個 數 據 表 , 數 據 表 名 為 MyDB F1.Name = "Name" , F1.Type = DB_TEXT , F1.Size = 20 F2.Name = "Class" , F2.Type = DB_TEXT , F2.Size = 20 F3.Name = "Grade" , F3.Type = DB_INTEGER T1.Fields.Append F1 ’ 向 數 據 表 中 添 加 這 些 字 段 T1.Fields.Append F2


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988030/,如需轉載,請註明出處,否則將追究法律責任。

相關文章