在应用程序中使用SQLite和Enterprise Library
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");
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; } }