舊 Microsoft Access 數據的新生
2024-09-07 19:05:08
供稿:網友
在計算機和軟件世界艱難地向前發展的過程中,存在的一個不幸的事實,有時我們發現自己必須丟棄舊的數據。 我們從一個字處理 Office 程序包轉移到另一個程序包,就發現舊的文檔再也打不開了。
同樣的情況也發生在數據庫上。 一個小公司可能覺得將信息存儲在一個 PC 數據庫中就足夠了,但在該遷移信息時將發生什么? 我們可能很苦惱要丟掉有價值的信息,但的確經常扔掉這些信息。 不過,當時可能看起來不是非常主要并被丟棄的信息,有時可能會需要。
我最近就碰到這樣一個問題。 我工作的一個社區機構有一個基于 PC 的應用程序,它帶有一個相當大的 Microsoft access 格式的會員數據庫。 已經編寫了一個來自第三方的用戶程序來與該數據庫一起工作,但隨后許可過期了,再沒有方法來獲取該軟件的更新。 碰巧,忽然又非常需要這些信息。 我們備份了舊的數據庫,并將之存儲在一個 linux 系統上。 在新的開放源代碼世界中,為我們提供了許多強大的數據庫(如 Linux 上的 Oracle 數據庫)。 一種選擇是購買一份 Microsoft Access 并創建一個應用程序,但這將把我們限制在同一個特定模型中,而這本來就已經使我們陷于困境。 此外,公司希望能夠從一個安全的服務器遠程訪問這些數據。
再次依靠 Microsoft 不是我們希望的選擇。 Linux 將作為這個新的數據庫服務器的基礎,并且它將運行一個行業標準的 SQL 數據庫。 因此,假如我們著手取出限制在舊的 MDB 文件中的數據 — 而不依靠于安裝帶新的 Access 許可的 Windows 服務器(這樣將再次受限于一個單體系結構解決方案),那將如何?
到處尋找解決困境的解決方案,我來到了 Brian Burns 的網站,并知道了他的 mdBTools 程序包,該程序包是命令行工具的一個集合還有一個 GUI,它的唯一的目的是提供從 Access 數據庫中取出信息方法。
獲取和安裝 mdbtools
您需要做的第一件事是獲取一份 mdbtools 程序包。 轉至 http://mdbtools.sourceforge.net/,您將找到源代碼和適用于幾種基于 RPM 的版本的 RPM 程序包。 從源代碼進行編譯非常簡單,包括提取到構建 5 個步驟。
tar -xzvf mdbtools-0.5.tar.gz
cd mdbtools-0.5
./configure
make
su -c "make install"
還可能通過下載和從 CVS 進行構建獲得最新和最好的程序包。 這并不像它聽起來那么復雜。 從連接并匿名登錄 CVS 服務器開始。
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools login
下一個步驟是查看 mdbtools 程序包:
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mdbtools co mdbtools
注重前面的每一條命令都是完整的一行。 在輸入上面的命令之后,當下載進行時,您將看到一個包含該版本中的各種文件的列表在屏幕上逐行顯示。 當下載完成時,轉移到下載目錄(名稱為 mdbtools)并執行以下命令。
./autogen.sh --enable-sql --with-unixodbc=/usr/local
make:
su -c "make install"
對 mdbtools 進行一些研究
mdbtools 程序包自帶了一系列命令行工具以及一個 GUI,用于從 mdb 文件中處理和提取數據。 我將馬上說明這個 GUI,但首先我想向您介紹一些命令行工具。 這些工具中最基礎的是 mdb-ver,您可以用它來識別您要處理的 mdb 文件的類型。
$ mdb-ver members.mdb
JET3
這種情況下的結果是 "JET3",它告訴我我的社區會員文件是基于 Access 97 應用程序的。
返回值是 "JET4",則是 Access 2000 或 Access XP 數據庫。 使用 mdb-tables 命令將開始出現稍微有趣一點的信息。
$ mdb-tables members.mdb
ActionTaken CaseMembers ContactFollowUp ContactReason ContactSource
ContactStatus Donations Issues Location MemberInfo PersonContacted Status ToDo
默認情況下,所有的數據庫表將轉儲到一行上。 為了分別列出(每行一個表),可以使用 -1 標記。 不過,一些表不會顯示;這些是系統表(以 Msys 開頭的表)。 假如您希望這些表也列出來,那么可以使用 -S 標記。
上面的輸出為您提供了組成您的 Access 數據庫的各種表的具體分類。 有趣的是,我們實際上可以在數據庫上執行 SQL 查詢(盡管只能使用 SQL 的一個有限的子集),即使數據庫不再在一個 Microsoft 系統上運行。 這就是 mdb-sql 命令的用途。 要進入交互式的 SQL 解釋程序,可以輸入 mdb-sql,后面緊跟數據庫名稱。 您將看到 1 => 提示符,您可以在提示符處輸入單行或多行查詢。 當您完成輸入并且想運行查詢時,輸入 go,然后按 Enter 鍵。
$ mdb-sql members.mdb
1 => list tables
2 => go
在上面的例子中,我基本上重新創建了 mdb-tables 命令。 其不同之處是輸出限定在美觀的、帶有標題并且四周用虛線框起來的表中。 當調用 mdb-sql 時,您可以重載這一行為,用 -H 來取消標題,用 -p 來去除邊框。
$ mdb-sql -H -p members.mdb
您可以隨時通過輸入 quit 并按 Enter 鍵來退出 SQL 解釋程序。
要創建一條查詢,您可以使用默認的交互模式或在一行上發送一條查詢。 在下面的例子中,我使用了另一條命令 — describe table 查詢,該命令讓我能夠更深入地挖掘數據庫的表的格式。
$ echo "describe table Location" mdb-sql members.mdb
+------------------------------+--------------------+----------+
Column Name Type Size
+------------------------------+--------------------+----------+
ID Long Integer 4
Address1 Text 255
Address2 Text 255
Address3 Text 255
Phone Text 50
Fax Text 50
DefaultInd Boolean 0
+------------------------------+--------------------+----------+
為了便于使用腳本,還可以用 -I 標記從外部文件中導入查詢,以及用 -o 標記并指定一個文件名來將查詢輸出到一個文本文件中。
利用這些簡單的 SQL 查詢,我們能夠了解到關于數據庫的布局和其相關的表的許多信息。 通過加上邊框的標題和美觀的顯示格式,我們可以導出到文本文件中,并利用 shell 腳本來處理結果。 實際上,假如您所需要只是您的舊數據的一些簡單的報表,那么以上操作就足夠了。 不過,假如您希望將數據庫移植到一個基于服務器的 SQL 數據庫(如 Oracle)中,那么 mdbtools 也可以在此為您提供幫助。 (當然,一旦您達到了這個目的您將如何處理數據就是一個完全不同的主題了。)
取出數據
取出數據至少有兩個步驟。 第一步是在您的服務器上創建一個新的數據庫和它相關的表。 第二步是加載數據。 利用上述示例,您可以獲得關于組成原始的 Access 數據庫的各種表的所有具體信息。 然后利用這些信息,您可以編寫必需的腳本來專門為您的數據庫逐個地重新創建這些表。 幸運的是,您不用太費力,因為 mdbtools 程序包也為此提供了一個工具。 它就是mdb-schema。 考慮到我的社區會員表包含了一些敏感信息,所以讓我用 Microsoft Access 自帶的練習數據庫 Northwind.mdb 來進行演示。
$ mdb-schema Northwind.mdb
結果是模式的一個文本文件,該文件以 DDL(數據定義語言)格式發送至標準輸出。 假如您想捕捉該輸出(非常有用)則務必將該輸出重定向到一個文件中。 DDL 輸出默認是 Access 格式(如以下示例所示)。
DROP TABLE Customers;
CREATE TABLE Customers
(
CustomerID Text (10),
CompanyName Text (80),
ContactName Text (60),
ContactTitle Text (60),
Address Text (120),
City Text (30),
Region Text (30),
PostalCode Text (20),
Country Text (30),
Phone Text (48),
Fax Text (48)
);
上面的輸出只顯示了一個表(為簡潔起見),現在正好可以告訴您,您可以利用 -T 標記來指定單個表(我將馬上演示這一操作)。
DDL 輸出的數據庫格式稱為后端。 這時支持五個不同的后端。 它們是 "access" — 代表 Microsoft Access;"sybase" — 代表 Sybase;"oracle" — 代表 Oracle;和 "postgres" 代表 PostgreSQL(以及在 CVS 代碼中的 "MySQL" — 代表 MySQL)。 因此,要為 SavedQueries 表創建 Oracle 格式的 DDL,我使用下面的命令: