首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

!关于多种数据库开发.怎么做到无缝切换(最好能用接口的方式)

2012-01-28 
求助!关于多种数据库开发.如何做到无缝切换(最好能用接口的方式)各位好!我做一个音乐网站.需要使用sql和ac

求助!关于多种数据库开发.如何做到无缝切换(最好能用接口的方式)
各位好!我做一个音乐网站.需要使用sql和access两种数据库,即设计一个sql版的,一个access版的,如果有需要还可以加入其它数据库的版本.

现在有一个问题:如何让sql和access在应用中做到无缝切换..就是说要使用哪种数据库只要在web.config中进行配置就可以了.

现在我的做法是

C# code
    public sealed class odbHelper    {    public static OleDbDataReader ExecuteDataReader(string ASqlStr)        {            OleDbConnection cn = new OleDbConnection(cnStr);            cn.Open();            OleDbDataReader dr = null;            try            {                OleDbCommand cmd = new OleDbCommand(ASqlStr, cn);                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);                return dr;            }            catch (OleDbException ex)            {                EventLog.WriteEntry(EventLogSource, ex.Message + " " + ASqlStr);                throw new Exception("SQL错误: " + ex.Message);            }            //finally            //{            //    cn.Close();            //}        }      }    public sealed class mydbHelper    {        public OleDbDataReader dr;                public mydbHelper(){        }    }


再在应用中
C# code
        mydbHelper mydb = new mydbHelper();        mydb.dr=odbHelper.ExecuteDataReader(sql);


上面是access的,如果是sql的则将OleDbDataReader对应的换为sqldatareader
这样access版本的使用一个类文件,sql版本的使用一个类文件...
但我觉得这种方法不够好...

另外在网上找到"Web C#2.0 DataSet和Reader封装组件实现自动多数据库切换(含组件源码和实例) "
http://www.cnblogs.com/xiaoyin_net/archive/2007/01/17/622692.html
觉得这种方法也不是很好.例如用到DataReade的每一个方法都要另外写一个与之一一对应...


跪求比这两种方法好的方法





[解决办法]
使用数据提供者的模式开发,首先根据功能分解成n个数据提供者。

针对具体数据提供者,定义一个抽象基类,该基类包含所有相关方法的抽象签名。

access的提供者继承该基类实现所有抽象方法(数据源当然是access)

sql的提供者继承该基类实现所有抽象方法(这里数据源就应是sql了)

。。。。。。。。。。。

抽象基类里还应包含一个静态方法,该方法按配置文件里的设置实例化一个具体的提供者并将其返回。

C# code
    public abstract class TestDataProviderBase    {        public abstract string GetTestName();        public static TestDataProviderBase Instance()        {            //这里应该从配置文件读数据,利用反射实例化当前提供者(单件)            return null;        }    };    public class OleTestDataProviderBase:TestDataProviderBase    {        public override string GetTestName()        {            return "Access";        }    }    public class SqlTestDataProviderBase:TestDataProviderBase    {        public override string GetTestName()        {            return "Sql";        }    }    public class InvokeDemo    {        public void Test()        {            string str = TestDataProviderBase.Instance().GetTestName();        }    };
[解决办法]
有现成的...

Microsoft Enterprise Library 之 Microsoft.Practices.EnterpriseLibrary.Data

你把它的代码全看懂了就成高手了...
[解决办法]
建议学习参考 petshop4.0中关于数据库部分的设计 。正好满足LZ的需求 。
[解决办法]
olu.desktopit.net 这里是一个用户在线模块,功能比较简单,就是用这种思路实现的,有全部的c#源码可下,你可以去看看
[解决办法]
理由抽象工程 加上 反射来实现

petshop cs .text 都是 看一下源码就知道了 其实简单点说就说用借口来编程
[解决办法]
接口或抽象类,低层封装,外层只管获得数据数

这个应该是基本的OO吧
[解决办法]
接口或抽象类,低层封装,外层只管获得数据数 



这个应该是基本的OO吧

这个有点难度的可以就是断判数据源,可以参考LZ说的那个链接
[解决办法]
偶是写不同的数据访问层,然后通过接口,反射实现你说的功能

热点排行