zoukankan      html  css  js  c++  java
  • 动态改变EnterpriseLibary数据库访问链接字符串的三种方法

    使用EnterpriseLibary做数据库访问底层是我一贯的做法,除了其能兼容多种数据库,且使用其进行数据库访问,对各种数据库操作均是透明的,基本不需要对特定的数据库进行操作,编写一次操作代码,基本在各种数据库都适用。对于一些特殊的数据库,很多同行已经编写出各种各样的扩展类库,直接适用即可。

    言归正传,动态改变EnterpriseLibary数据库访问链接字符串一般在使用Access数据库、Sqlite数据库等文件式的数据库比较常见,因为我们不知道客户会把程序拷贝到哪里进行使用(即使是做了安装包,这样动态改变连接字符串的方式,也是一种很好的处理方式)。

    1)第一种方式,使用前动态改变配置节点内容。

    这种方式很常见,一般常用在Winform程序上,在使用程序访问数据库前,先根据当前的程序运行位置,修改配置项里面的内容,然后更新配置节点,从而达到可以应用最新配置信息的操作。

    我们先来看看一个配置文件例子。

    如果要修改更新其中的配置信息,具体代码如下所示。

                string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}Database1.mdb;User ID=Admin;Jet OLEDB:Database Password=;", System.AppDomain.CurrentDomain.BaseDirectory);
                AppConfig config = new AppConfig();
                config.SetConnectionString("DataAccess", connectionString);
    
                //更新配置文件,以便起效
                ConfigurationManager.RefreshSection("dataConfiguration");
                ConfigurationManager.RefreshSection("connectionStrings");
                ConfigurationManager.RefreshSection("appSettings");

    其中数据库参数设置我封装在了公用类库的AppConfig配置类里面了,你也可以使用自己的操作进行修改。

    这样更新操作后,数据库更新为正确的路径地址,我们在EnterpriseLibary里面就不用再做任何操作,就能正常访问操作数据库了。

    2)第二种方式,在EnterpriseLibrary里面对连接字符串进行动态修改。

    有时候,我们会碰到另外一种情况,就是程序虽然是使用Access数据库或者Sqlite数据库,但是需要在Web端部署,有无更方便的修改配置参数方式呢。

    除了上面的一种方式,还有一种方式是在EnterpriseLibrary里面修改Database对象的连接字符串。

    首先我们在配置文件里面,相对路径使用参数$Start$变量进行标识,使用连接字符串创建数据库的时候,我们替换这个变量,从而达到修改数据库字符串的目的。

    然后我们定义一个创建EnterpriseLibrary的Database对象的方法,用来动态修改连接字符串。

            /// <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;
            }
    
            public string GetConnectionString()
            {
                AppConfig config = new AppConfig();
                string connectionString = config.GetConnectionString("DataAccess2");
    
                connectionString = connectionString.Replace("$Start$", AppDomain.CurrentDomain.BaseDirectory);
                return connectionString;
            }

    上面红色部分就是动态修改的核心所在,这样我们封装了一个CreateDatabase对象后,所有创建Database对象的操作,均使用这个方法即可。下面是一个Sqlite数据库查找记录的操作,调用例子如下所示。

            /// <summary>
            /// 查找记录表中最旧的一条记录
            /// </summary>
            /// <returns></returns>
            public override T FindFirst()
            {
                string sql = string.Format("Select {0} From {1} Order by {2} ASC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField));
                T entity = null;
    
                Database db = CreateDatabase();
                DbCommand command = db.GetSqlStringCommand(sql);
    
                using (IDataReader dr = db.ExecuteReader(command))
                {
                    if (dr.Read())
                    {
                        entity = DataReaderToEntity(dr);
                    }
                }
                return entity;
            }

    这样操作是不是也很方便呢?以上就是我常用的两种动态改变数据库连接字符串的操作,希望对大家在处理同类型问题的时候,有所帮助。

    3)第三种方式,使用|DataDirectory|代替运行目录

    之前在很多项目中运用了第二种方式,运行良好,不过发表文章的时候,有博友指出,还可以使用这种|DataDirectory|的方式,这个是内置的.net目录,可以替代运行时刻的当前目录,经过测试,效果非常不错,因此也作为建议使用的方式。

    使用这个|DataDirectory|关键字有一点值得注意的地方,就是如果开发Asp.net的Web应用,那么把数据库放到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;"

    再次感谢提出该思路的朋友!

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    js实现的hashMap
    vi编辑器常用命令汇总以及linux系统操作的命令(自己需要用到什么,经过测试正确的,会持续向上添加)
    使用conda,提示-bash: conda: command not found
    tmux常用命令
    OSError: [WinError 126] JVM DLL not found: C:Program FilesJavajdk1.8.0_131jreinserverjvm.dll
    python建立连接,获取动态地址,有缺陷
    python代码中,添加子进程的运行
    python通过建立长链接,获取动态ip,这种方式可以长时间保持连接
    ImportError: cannot import name PDFDocument
    http请求参数之Query String Parameters、Form Data、Request Payload
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2514258.html
Copyright © 2011-2022 走看看