本地數據庫可以有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 深呼吸 字符串
文章來源: