【.net 深呼吸】連接Access數據庫應註意的幾點

分類:IT技術 時間:2016-10-14

本地數據庫可以有Y種選擇,比如Sqlite、SQL Server Express、SQL Local DB、SQL Server CE、Access等,本文老周選用比較著名的Access本地數據庫,在連接數據庫應該註意的幾個事情。

Access數據庫是Office家族的一員,歷史悠久,相信各位不會陌生。不過,有些東西可能你以前沒關註到,不妨咱們一起關註一下。

 

一、判斷用於連接的Provider是否可用

過去,連接Access數據庫,我們都會使用OLEDB的Microsoft.Jet.OLEDB.4.0提供程序,系統默認也帶有該驅動程序,所以使用起來也特特地方便。

但jet.oledb通常是32位的,如果應用程序編譯為x64版本,會發生異常。如下圖所示。

 

如果改為x86就可以正常運行。而且,你也發現了,改用Any CPU也可以正常運行,為啥呢。

現在你打開項目屬性窗口,然後切換到“生成”選項卡,在Any CPU選項中,是不是看到一個選項叫“首選32位”?好,現在你把“首選32位”的對勾去掉,如下圖所示。

然後,你在64位平臺上運行,同樣會發生異常。如果勾選了“首選32位”就不會發生異常。

 

萬物皆在變化之中,Access版本不斷更新,從2007起,.mdb文件變成了.accdb文件,所以,使用Jet.OLEDB引擎是不能連接.mdb文件的。

連接.accdb文件的提供程序為Microsoft.ACE.OLEDB.12.0,即連接字符串應該這樣寫:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\students.accdb

有關連接字符串,你可以到下面這個網站上抄:http://www.connectionstrings.com/

這個網站上面可以找到各種各樣數據庫的連接字符串,資源豐富,相當值得收

系統默認是不帶Microsoft.ACE.OLEDB.12.0驅動程序的,你得到這裏下載: https://www.microsoft.com/zh-cn/download/details.aspx?id=13255

在連接.accdb文件時,一定要對上版本,如果你安裝的引擎是32位的,應用程序應該生成為x86版本,如果安裝的引擎是64位的,那麽,你的應用程序應生成x64版本。

 

有大夥伴朋友一定會問了,那有沒有辦法判斷系統是否帶有特定的提供程序,如果沒有,可提示用戶安裝?答案自然是肯定的,來來來,先看看這個例子。

看代碼:

            OleDbDataReader reader = OleDbEnumerator.GetRootEnumerator();
            DataTable table = new DataTable();
            table.Load(reader);
            dataGridView1.DataSource = table.DefaultView;

 

或者,可以這樣:

            OleDbEnumerator enumerator = new OleDbEnumerator();
            DataTable dt = enumerator.GetElements();
            dataGridView1.DataSource = dt.DefaultView;

 

這樣一耍,就會把當前所支持的OLEDB的提供程序都列出來了。如下圖。

其中,SOURCES_NAME列就是提供程序的名稱,所以,在程序代碼中,只要檢測一下你要的提供程序是否存在,就可以知道有沒有安裝相關的引擎了。

 

比如,下面代碼驗證一下當前運行環境是否可以連接.accdb文件。

            string accdbPrd = "Microsoft.ACE.OLEDB.12.0";
            OleDbEnumerator enu = new OleDbEnumerator();
            DataTable dtprd = enu.GetElements();
            // Linq
            var qr = from r in dtprd.AsEnumerable()
                     where r.Field<string>("SOURCES_NAME") == accdbPrd
                     select r;
            if (qr.Count() == 0)
                messageBox.Show("唉,還沒安裝相關的提供程序。");
            else
                MessageBox.Show("可以連接數據庫了。");

 

 

二、如何連接.accdb文件

這個在上面說過了,只要把連接字符串中的Provider改為Microsoft.ACE.OLEDB.12.0就可以了,或者參考上面老周給的那個網站的信息,反正這個你都會的。

 

 

三、關於|DataDirectory|占位符

Data Source設置的是數據庫文件的路徑,為了方便,通常會這樣寫:Data Source= |datadirectory|\\mydb.accdb。DataDirectory占位符是不區分大小寫的。默認條件下,對於Web項目,datadirectory指向項目目錄下的App_Data,這是ASP.NET的慣例,老周不多介紹了。對於其他應用而言,datadirectory指向應用程序運行的目錄,如果程序是在\bin\debug目錄下運行,那麽數據目錄就是\bin\debug。

不過呢,datadirectory是可以更改的,下面例子把數據目錄改為當前登錄用戶的“文檔”目錄。

            string docpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            AppDomain.CurrentDomain.SetData("DataDirectory", docpath);

調用AppDomain的SetData方法就可以修改|datadirectory|占位符所指向的數據目錄。現在我把.accdb文件放到我的用戶名下的“文檔”下,即C:\Users\<my name>\Documents。

接著連接字符串可以這樣寫:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\pigstore.accdb

實際指向的文件路徑為:C:\Users\<my name> \Documents\pigstore.accdb。

 

 

好了好了,有用的東西就講到這裏了,沒用的話老周已省略,本文就寫到這裏了,該去填肚子了。

 


Tags: 連接數據庫 應用程序 Office 深呼吸 字符串

文章來源:


ads
ads

相關文章
ads

相關文章

ad