在应用程序中使用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");

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;
    }
}

posted on 2009-03-22 21:32  wen.jian  阅读(2210)  评论(1编辑  收藏  举报