使用SQLite數據庫和Access數據庫的一些經驗總結

1、簡化數據庫的地址,使用|DataDirectory|代替運行目錄

可以使用這種|DataDirectory|的方式,這個是內置的.net目錄,可以替代運行時刻的當前目錄。

使用這個|DataDirectory|關鍵字有一點值得注意的地方,就是如果開發Asp.net的Web應用或者WCF服務應用,那麼把數據庫放到App_Data目錄下,這是一個特殊的目錄;如果是開發Winform程序,就是把數據庫放到運行程序的根目錄即可,不需要在創建App_Data了,因爲Winform裏,這個不是特殊目錄,如果你創建了這樣的目錄,反而是畫蛇添足了且不能正常運行。

使用這種方式,那麼你構建的數據庫連接方式就如下所示。

Access數據庫的鏈接字符串:

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ComponentData.mdb;User ID=Admin;Jet OLEDB:Database Password=;"

Sqlite的鏈接字符串:

connectionString="Data Source=|DataDirectory|\ComponentData.db;Version=3;"

2、SQLite 數據導入的設置

SQLite 數據庫管理有很多工具,我用過很多,總還是覺得SQLite Developer最爲方便,除了創建新數據庫、註冊數據庫、加密解密、查詢修改表等、還支持各種數據庫數據的導入操作,不過一般在使用數據的導入的時候,需要注意一些地方,否則可能會出現亂碼或者不正確的地方。

SQLite Developer日期設置,在導入數據庫前,我們一般需要設置該工具的一些屬性。

導入數據後,顯示的日期格式就會正常的了。

另外,如果現存的數據庫(例如SQLServer數據庫)中的字段爲ntext(或者nvarchar(max))類型或者Access的memo類型的數據有中文的內容,導入到SQLite裏面就會出現亂碼現象,這個是一個比較頭疼的事情。

如果字段內容不太大的話,那麼可以把ntext(或者nvarchar(max))類型的字段修改爲nvarchar(4000以下),然後使用SQLite Developer導入到Sqlite數據庫裏面,那麼就正常顯示中文。

如果內容比較大,除非使用更好的SQLite管理工具或者使用C#代碼編寫例子插入數據庫內容,暫時還沒有更好的辦法。

3、SQLite語法內容

在使用SQLite的時候,你會發現它的語法既類似SQLServer,又有點類似MySql,又有些自己的特點。

SQL語法:

Select * From [Patient] where leavedate > date('2012-08-01') order by leavedate Limit 10,50

1)例如上面的語句,其中的[Patient]使用了"[]"作爲限定符,默認正常的單詞也可以不用,使用它的目的是爲了防止和保留字、關鍵字同名的。

2)上面語句date('2012-08-01')或者datetime('2012-08-01 12:30:00')這樣的格式,是爲了對字符串進行轉換爲日期進行比較,如果沒有使用這個date或者datetime關鍵字,那麼數據庫會實現字符串的對比,如果時間的格式不匹配,如日期裏面存儲的是2010-8-1這樣的內容,而sql語句比較的時候,使用 leavedate >'2010-08-01' 的字符串進行比較就會出現邏輯上不正確了。

3)limit語法。使用limit進行分頁比較簡單,這個語句類似於MySql的語法,Limit 10,50 的意思是跳過10行,取50行的意思,返回50條記錄。,Limit 10這是返回10條記錄的意思。

4)在使用參數化語句的時候,SQLite數據庫可以使用 @ 符號,也可以使用 $ 符號進行處理。

5)如果插入一條記錄,想獲取最後一條的返回自增長ID的話,那麼使用語句 Select LAST_INSERT_ROWID()就可以獲取到了。

4、Access和Sqlite數據庫的鏈接字符串

Access2000/Access2003的鏈接字符串格式:

<add name="access2000" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\WareHouse.mdb;User ID=Admin;Jet OLEDB:Database Password=;" />

Access2007的鏈接字符串格式(使用時候還需要安裝AccessDatabaseEngine的數據庫引擎):

<add name="access2007" providerName="System.Data.OleDb"
         connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database1.accdb;User ID=Admin;"/>

Sqlite數據庫鏈接字符串:

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;" />

Sqlite數據庫鏈接字符串(含加密密碼):

<add name="sqlite"  providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WareHouse.db;Version=3;Password=myPassword" />

5、Access的特殊語法

Access大多數的語法和SqlServer的語法一致,不過有一些比較特別一點。

1)參數化語句,Access也支持參數化的語句的,不過他們的順序必須和參數出現的順序一致,否則就會出錯。

2)使用EnterpriseLibrary類庫注意事項,Access參數化設置的時候,需要修改日期類型爲OleDbType.Date。

                param[i] = new OleDbParameter("@" + field, val);
                if (val is DateTime)
                {
                    param[i].OleDbType = OleDbType.Date;//日期類型特別處理,否則Access數據庫訪問出錯
                }

3)獲取最後插入的自增長ID,可以通過語句SELECT @@IDENTITY獲得。

6、動態數據庫字符串加密

我們知道,對於SQLite或者Access這些數據庫,鏈接字符串裏面的密碼必須是未加密的明文,數據庫鏈接才能被有效識別,而這樣就不能很好的保護我們的數據庫了。爲了實現有效的數據庫管理,可以對數據庫加密(使用用戶看不到數據庫密碼),而放置鏈接字符串的時候,我們沒有放置密碼部分,而在代碼裏面動態給數據庫連接字符串進行加密(硬綁定密碼),這種也是一個有效的方法,程序發佈後,程序集裏面的密碼經過混淆加密,一般不可識別。例如我的Winform開發框架採用的動態追加數據庫密碼字符串的方法如下所示。

複製代碼
        #region 連接字符串加密

        /// <summary>
        /// 根據配置數據庫配置名稱生成Database對象
        /// </summary>
        /// <returns></returns>
        protected override Database CreateDatabase()
        {
            Database db = null;
            if (string.IsNullOrEmpty(dbConfigName))
            {
                db = DatabaseFactory.CreateDatabase();
            }
            else
            {
                db = DatabaseFactory.CreateDatabase(dbConfigName);
            }

            DbConnectionStringBuilder sb = db.DbProviderFactory.CreateConnectionStringBuilder();
            sb.ConnectionString = GetConnectionString();
            GenericDatabase newDb = new GenericDatabase(sb.ToString(), db.DbProviderFactory);
            db = newDb;

            return db;
        }

        /// <summary>
        /// 動態改變或者連接字符串
        /// </summary>
        /// <returns></returns>
        protected virtual string GetConnectionString()
        {
            string connectionString = "";
            DatabaseSettings setting = ConfigurationManager.GetSection("dataConfiguration") as DatabaseSettings;
            if(setting != null)
            {
                string defaultConnection = setting.DefaultDatabase;
                connectionString = ConfigurationManager.ConnectionStrings[defaultConnection].ConnectionString;

                //嘗試加密或者解密
                if(!connectionString.EndsWith(";"))
                {
                    connectionString += ";";
                }
                connectionString += string.Format("Jet OLEDB:Database Password=mypassword;");
            }

            return connectionString;
        }

        #endregion 
複製代碼

以上就是一些關於SQLite數據庫和Access數據庫的使用經驗總結,希望讀者能夠有所收穫,並能夠分享自己的經驗總結,非常感謝您的閱讀,如果有寶貴的意見可以留言告知。

發佈了42 篇原創文章 · 獲贊 108 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章