簡體   English   中英

C# - A class 用於通用數據庫連接、命令、讀取器

[英]C# - A class for Generic database connection, command, reader

假設我正在設計一個 class 可以處理任何數據庫技術來創建連接、執行命令和檢索數據等。

If I need to create a generic database handling class for existing RDBMSs (like SQL Server, Oracle, FireBird, et.), which .net abstract-class/Interface should I use {DbConnection, DbCommand, DbParameter,...} or {IDbConnection ,IDbCommand,IDbParameter,...}?

我應該使用像這樣的代碼嗎

public bool CreateConnection(DatabaseTypeEnum type)
{
    DbConnection conn ;

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

public DbDataReader GetData()
{

    DbCommand comm;
    //...
}

或者,

public bool CreateConnection(DatabaseTypeEnum type)
{
    IDbConnection conn ;

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

public IDbDataReader GetData()
{

    IDbCommand comm;
    //...
}

而且,為什么?

嗯......完全不同的問題:)

好的,不...

當你這樣做時,你將違反開放式關閉原則......那個特定地方的switch / if語句讓我感到不舒服:)。

我將實際創建保留給Factory類,您的代碼不應該關心它是否與SQL Server,DB2或Oracle或其他任何內容進行通信。

理想情況下,您的代碼應該只與IDbConnection,IDbCommand等或抽象基類(DbConnection,DbCommand等)通信。 有時我確實發現你需要向某個特定的提供者轉發(比如SqlDataReader使用特定的方法),但它很少見。

Factory會將此switch / if語句封裝到一個位置,以便於維護。 您可以在app.config中進一步抽象實際創建。 因此,在app.config中,您可以選擇支持哪種類型的DB后端,Factory將從那里獲取它並為您創建必要的DB內容。

見: 這個 閱讀有關創建DbProviderFactory和連接部分的信息......

你為什么不使用泛型?

您可以像這樣定義您的類,例如:

public class DBHelper<T, Y, W> where T: DbConnection, new() where Y : DbCommand, new()
{
        private T conn_ = new T();
        private Y comm_ = new Y();            
}

這就是我所做的,而且它很容易維護。

您應該使用IDbConnectionIDbCommand因為不同的數據庫供應商將具有不同的接口實現(對於他們的ADO.NET事物),但最好不如您發布的那樣。 您應該使整個類通用以支持通用IDbConnectionIDbCommand 可能是這樣的:

public class Db<T> where T : IDbConnection, new()
{
    public bool CreateConnection()
    {
        T conn;

        //now you dont need these lines since you dont have to worry about
        //what type of db you are using here, since they all implement
        //IDbConnection, and in your case its just T.
        //if(type==DatabaseTye.Oracle)
        //{
            //....
        //}
    }

    public DbDataReader GetData()
    {
        //get comm object from S conn
        using(var conn = new S())
            using (var comm = conn.CreateCommand())

        //...
    }

好處是您可以將要用於DbConnectionDbCommand的類型傳遞給此類,這對於MySQL .net連接器和Oracle連接器將是不同的。 所以你從課外得到某種控制。 您可以看到這個問題和我的答案,以供參考,以獲得基本實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM