动态改变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;"

本文转自博客园伍华聪的博客,原文链接:动态改变EnterpriseLibary数据库访问链接字符串的三种方法,如需转载请自行联系原博主。

时间: 2024-09-10 17:20:57

动态改变EnterpriseLibary数据库访问链接字符串的三种方法的相关文章

SQL Server2005杂谈(4):在SQL Server2005中按列连接字符串的三种方法

本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:SQL Server2005杂谈(3):四个排名函数(row_number.rank.dense_rank和ntile)的比较 最近做一个项目,遇到一个在分组的情况下,将某一列的字段值(varchar类型)连接起来的问题,类似于sum函数对int型字段值求和. 如有一个表t_table,结构和数据如图1                                           图1     其中要按着xh字段分组,并且将每一组na

SQL Server2005杂谈(2):按列连接字符串的三种方法

本文为原创,如需转载,请注明作者和出处,谢谢! 最近做一个项目,遇到一个在分组的情况下,将某一列的字段值(varchar类型)连接起来的问题,类似于sum函数对int型字段值求和. 如有一个表t_table,结构和数据如图1                                           图1     其中要按着xh字段分组,并且将每一组name字段值连接起来.最终结果希望如图2所示              图2 表中的th字段值对于每一个xh值是唯一的,也是有限的,也就是

SQL Server 数据库访问操作通用类五种方法

对SQL Server数据库的操作,最常见的有如下五种: 1.非连接式查询,获取DataTable. 2.连接式查询,获取DataReader. 3.查询结果只有1行1列,获取单一数据. 4.对数据库进行增.删.改操作,进行数据编辑. 5.判断与数据库是否已连接.(更新) 针对以上情况,分享的一个SQL Server数据库访问通用类.该通用类可用于ASP.NET和C/S系统中开发.  1.非连接式查询,获取DataTable. 利用SqlDataAdapter对象的Fill()返回DataTab

Oracle数据库的备份与还原三种方法

一. 导出/导入(Export/Import)  利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去.   1. 简单导出数据(Export)和导入数据(Import)   Oracle支持三种方式类型的输出:   (1).表方式(T方式),将指定表的数据导出.   (2).用户方式(U方式),将指定用户的所有对象及数据导出.   (3).全库方式(Full方式),瘵数据库中的所有对象导出.   数据导入(Import)的过程是数据导出(

C#判断空字符串的三种方法

3种方法分别是: string a=""; 1.if(a=="") 2.if(a==String.Empty) 3.if(a.Length==0) 3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题. 建立3个aspx页面(为什么用网页,主要是利用Microsoft Application Center Test ) WebForm1.aspx private void Page_Load(object sender, System.EventAr

再谈DOS批处理下格式化日期字符串的三种方法(详解)_DOS/BAT

谈到日期字符串的输出,真是让人烦. 在Linux下,简单的一句话:date '+%Y%m%d-%H%M%S'就可以得到你要的输出:20120331-064219 可是在windows下,要想得到这个,还是需要费点功夫的. 1. 直接用字符串格式化输出 比如,如果你的机器上时间的输出是这样子的: c:\>echo %date%-%time% 2012-03-31 星期六- 6:44:02.50 那么,要想得到输出20120331- 64402,可以这样截取字符串: c:\>echo %date:

C++中访问字符串的三种方法总结_C 语言

1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. 复制代码 代码如下: #include<iostream>using namespace std;int main(){ char str[]="I lvoe China!"; cout<<str<<endl; return 0;} 输出结果: 复制代码 代码如下: I love China! str是字符数组名,它代表数组首元素的地址,输出str的时候,从str

ASP.NET中把对象序列化成JSON字符串的三种方法

//方法1 //using System.Runtime.Serialization.Json; //using System.IO; //using System.Text; //using System.Text.RegularExpressions; DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(arr.GetType()); MemoryStream ms = new MemorySt

JS去除重复的字符串内容三种方法

例1  代码如下 复制代码 String.prototype.repeatOpt = function () {    var str = this + "",objStr = "";    for (var i = 0; i < this.length; i++) {        var s = str[i];        var newStr = str.replace(s, '');        var j = newStr.indexOf(s);