欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

程序员文章站 2022-03-24 11:22:00
如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 使用接口的抽象数据提供程序 ADO.NET数据提供程序工厂模型 .NET数据提供程序工厂模式能让我们用多种数据访问类型构建单个代码库。而且通过应用程序配置文件(和全新的<connectionstri ......

如何在ado中使用接口的抽象数据提供程序

在cofig中 appsettings下,配置数据连接类型

 <appsettings>
    <!--这个键值映射到枚举值中的某个值-->
    <add key="provider" value="sqlserver"/>
    <add key="connectionstring" value="server=服务器名;user id=用户名;password=密码;database=数据库名;max pool size=3000;connect timeout=60;pooling=true"/>
  </appsettings>

使用接口的抽象数据提供程序

            console.writeline("******simple connecion factory*****");
            idbconnection mycon = getconnection(dataprovider.sqlserver);
            console.writeline(mycon.gettype());

            //通过配置文件
            string dataprovstring = configurationsettings.appsettings["provider"];
            dataprovider dp = dataprovider.none;
            if (enum.isdefined(typeof(dataprovider), dataprovstring))
            {
                dp = (dataprovider)enum.parse(typeof(dataprovider), dataprovstring);
            }
            else
            {
                console.writeline("soryy");
            }
            idbconnection mycn = getconnection(dp);
            if (mycn != null)
            {
                console.writeline(mycn.gettype().name);
            }



        enum dataprovider
        {
            sqlserver,
            oledb,
            odbc,
            none
        }

        static idbconnection getconnection(dataprovider dp)
        {
            idbconnection con = null;
            switch (dp)
            {
                case dataprovider.sqlserver:
                    con = new sqlconnection();
                    break;
                case dataprovider.oledb:
                    con = new oledbconnection();
                    break;
                case dataprovider.odbc:
                    con = new odbcconnection();
                    break;
                case dataprovider.none:
                    break;
                default:
                    break;
            }
            return con; ;
        }

 

ado.net数据提供程序工厂模型

.net数据提供程序工厂模式能让我们用多种数据访问类型构建单个代码库。而且通过应用程序配置文件(和全新的<connectionstrings>片段),我们无需重新编译、重新部署程序集就能够更改和获取提供程序和连接字符串。
* 数据提供程序中的类都从相同基类继承并且都被定义在system.data.command命名空间内。
*dbcommand:所有命令类的抽象基类
*dbconnction:所有连接类的抽象基类
*dbdataadapter:所有数据适配器类的抽象基类。
*dbdatareader:所有数据读取器类的抽象基类。
*dbparameter:所有参数类的抽象基类
*dbtransaction :所有事务类的抽象基类
另外,每个微软提供的数据提供程序都有一个继承自system.data.dbproviderfactory 的类。这个基类定义了一些方法来获取某数据提供程序的数据对象

完整的数据提供程序工厂的例子

  string dp = configurationsettings.appsettings["provider"];
            string constr = configurationsettings.appsettings["connectionstring"];

            dbproviderfactory df = dbproviderfactories.getfactory(dp);
            using (dbconnection cn = df.createconnection())
            {
                console.writeline(cn.gettype().name);
                cn.connectionstring = constr;
                cn.open();

                dbcommand cmd = df.createcommand();
                console.writeline(cmd.gettype().name);
                cmd.connection = cn;
                cmd.commandtext = "select * from tcustomer";
                using (dbdatareader dr = cmd.executereader())
                {
                    console.writeline(dr.gettype().name);
                    while (dr.read())
                    {
                        console.writeline(dr["createtime"].tostring());
                    }
                }
            }

 

数据提供程序工厂模型的潜在缺陷

 

尽管这个模型很强.但是你要知道,代码库其实只能通过抽象基类的成员来使用所有提供程序通用的一些类型和方法。因此在写代码库的时候.你会被局限于system.data.common命名空间下的
dbconnection 、 dbcommand 等其他类型公开的成员。

这样,你会发现这种“泛化的”方式使得我们不能直接访问特定dbms的漂亮功能。如果我们必须调用基础提供程序(比如sqlconnection)的特殊成员,那么可以通过显式强制类型转换就能实现

然而,这样会使代码变得不易维护(也缺乏灵活性).因为我们必须增加许多运行时检测。但如果你希望以最灵活的方式构建数据访问阵,数据提供程序工厂模划提供了一个很好的机制

 

[connectionstrings]元素

我们的连接字符串数据现在在*.config文件的<appsettings>元素中,应用程序配置文件定义了一个新的元素,叫做<connectionstrings>;你能在这个元素内设置任意多的名称/值组合并且能通过
configurationmanager.connectionstrings 索引器以编程方式访问。这种方式的(相比使用<appsettings>元素和configurationmanager.appsettings 索引器来访问)好处在于它能为你的应用程序以一个统一的方式定义多个连接字符串

具体配置如下

<connectionstrings>
    <add name="ecpublic" connectionstring="server=服务器名;user id=用户名;password=密码;database=数据库名;min pool size=100;max pool size=200;"/>
    <add name="crm" connectionstring="server=服务器名;user id=用户名;password=密码;database=数据库名;min pool size=100;max pool size=200;"/>
 </connectionstrings>