C# - 通用数据库连接,命令,阅读器的类

use*_*312 3 c# ado.net

假设我正在设计一个可以处理任何数据库技术的类来创建连接,执行命令和检索数据等.

如果我需要为现有的RDBMS(如SQL Server,Oracle,FireBird等)创建一个通用的数据库处理类,我应该使用.net abstract-class/Interface {DbConnection,DbCommand,DbParameter,...}或{ IDbConnection,IDbCommand,IDbParameter,...}?

我应该使用像这样的代码吗?

public bool CreateConnection(DatabaseTypeEnum type)
{
    DbConnection conn ;

    if(type==DatabaseTye.Oracle)
    {
        //....
    }    
}

public DbDataReader GetData()
{

    DbCommand comm;
    //...
}
Run Code Online (Sandbox Code Playgroud)

要么,

public bool CreateConnection(DatabaseTypeEnum type)
{
    IDbConnection conn ;

    if(type==DatabaseTye.Oracle)
    {
        //....
    } 
}

public IDbDataReader GetData()
{

    IDbCommand comm;
    //...
}
Run Code Online (Sandbox Code Playgroud)

而且,为什么?

Jim*_*dra 5

嗯......完全不同的问题:)

好的,不...

当你这样做时,你将违反开放式关闭原则......那个特定地方的switch/if语句让我感到不舒服:).

我将实际创建保留给Factory类,您的代码不应该关心它是否与SQL Server,DB2或Oracle或其他任何内容进行通信.

理想情况下,您的代码应该只与IDbConnection,IDbCommand等或抽象基类(DbConnection,DbCommand等)通信.有时我确实发现你需要向某个特定的提供者转发(比如SqlDataReader使用特定的方法),但它很少见.

Factory会将此switch/if语句封装到一个位置,以便于维护.您可以在app.config中进一步抽象实际创建.因此,在app.config中,您可以选择支持哪种类型的DB后端,Factory将从那里获取它并为您创建必要的DB内容.

见:这个.阅读有关创建DbProviderFactory和连接部分的信息......