System.Data.SqLite:
http://sqlite.phxsoftware.com/
Enterprise Library 3.1 (May 2007):
http://www.microsoft.com/downloads/details.aspx?FamilyID=4c557c63-708f-4280-8f0c-637481c31718&displaylang=en
EntLibContrib Project at codeplex:
http://www.codeplex.com/entlibcontrib
最近,在一個小應用程式中嘗試使用了SQLite和Enterprise Library,在此將一些注意點記錄如下。
SQLite和Enterprise Library的結合請參考Peter Bromberg的文章:ASP.NET: Using SQLite with Enterprise Library 3.1
App.config的配置效果:
<configuration> <configSections> <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </configSections> <dataConfiguration defaultDatabase="ConnectionString"> <providerMappings> <add databaseType="EntLibContrib.Data.SQLite.SQLiteDatabase, EntLibContrib.Data.SqLite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="System.Data.SQLite" /> </providerMappings> </dataConfiguration> <connectionStrings> <add name="ConnectionString" connectionString="Data Source=./Fintronx.db3;Version=3;" providerName="System.Data.SQLite" /> </connectionStrings></configuration>
這兒需要注意的是,EntLibContrib要求對應的System.Data.SqLite版本為1.0.43.0。
初始化樣本:
db = DatabaseFactory.CreateDatabase("ConnectionString");
SQL操作樣本:
string strSql = "INSERT INTO tp_PlayList (ListID, ListName, CreateTime) VALUES (NULL, @ListName, @CreateTime)";DbCommand cmd = Global.Instance.CommonDatabase.GetSqlStringCommand(strSql);Global.Instance.CommonDatabase.AddInParameter(cmd, "@ListName", DbType.String, ListName);Global.Instance.CommonDatabase.AddInParameter(cmd, "@CreateTime", DbType.DateTime, DateTime.Now);Global.Instance.CommonDatabase.ExecuteNonQuery(cmd);
上面顯示的INSERT操作是我從一個Web項目中搬過來的,其中表結構和SQL只針對自增欄位進行了調整(如何在SQLite中建立自增欄位),別的不變,一切正常。
但開發過程中還是遇到了新的問題,在某些SQL操作時,會報“no such table : ...”的異常,出現位置不固定,弄得很是鬱悶。
糾纏了好久,最後終於發現,原來是因為程式中使用了FolderBrowserDialog或OpenFileDialog,操作後都會導致預設目錄變化,結果找不到SQLite資料庫檔案了!
其實Peter Bromberg文章中的方法已經能解決這個問題,他的代碼構造了資料庫檔案的完整實體路徑,是我沒引起注意而已。
知道問題所在,餘下就是解決它了,我採用了另一種並不算好的方法,代碼如下:
public Database CommonDatabase{ get { if (db == null) { string ConnectionName = "ConnectionString"; #region 在運行時更新資料庫連接串資訊 //解決使用SQLite資料庫時,當程式中使用了FolderBrowserDialog或OpenFileDialog,會導致預設目錄變化,導致SQL操作報“no such table : ...”的異常 string ConnectionString = "Data Source=" + Application.StartupPath + @"\Fintronx.db3;Version=3;"; //建立配置資訊 ConnectionStringSettings ConnectionSettings = new ConnectionStringSettings(ConnectionName, ConnectionString, "System.Data.SQLite"); //儲存配置資訊 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.ConnectionStrings.ConnectionStrings.Remove(ConnectionName); config.ConnectionStrings.ConnectionStrings.Add(ConnectionSettings); config.Save(ConfigurationSaveMode.Modified); //強制重新載入設定檔的ConnectionStrings配置節 ConfigurationManager.RefreshSection("ConnectionStrings"); #endregion //db = DatabaseFactory.CreateDatabase(ConnectionName); DatabaseProviderFactory factory = new DatabaseProviderFactory(new FileConfigurationSource(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)); db = factory.Create(ConnectionName); } return db; }}