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數據庫的使用經驗總結,希望讀者能夠有所收穫,並能夠分享自己的經驗總結,非常感謝您的閱讀,如果有寶貴的意見可以留言告知。