簡體   English   中英

在C#/ ADO.NET中抽象出DB Server類型

[英]Abstracting away DB Server type in C#/ADO.NET

C#/ ADO.NET具有:

SqlConnection / NpgsqlConnection / ...
SqlCommand / NpgsqlCommand / ...
SqlDataReader / NpgsqlDataReader / ...
...

這意味着您所有的數據庫代碼最終都是特定於數據庫供應商的。 如果更改數據庫供應商,則必須更改所有數據庫調用。 而且,您不能使您的代碼數據庫供應商不可知。

我不介意創建數據庫供應商特定的連接,但是從那時起,我希望所有數據庫調用都是通用的,例如Command和DataReader。

我知道我可以通過創建Command和DataReader等類來做到這一點,這些類可以包含調用適當的供應商特定調用的switch語句,但是我寧願做些更優雅的事情。 我感覺到一種標准的設計模式可能會有所幫助,但是我還沒有找到一種優雅的解決方案。 任何幫助將不勝感激。

這意味着您所有的數據庫代碼最終都是特定於數據庫供應商的。 如果更改數據庫供應商,則必須更改所有數據庫調用。 而且,您不能使您的代碼數據庫供應商不可知。

是。 除非您閱讀文檔並意識到它們都實現了通用接口。 它所需要的只是一種易於替換的小型工廠方法。

然后問題開始了。 SQL方言是非常不同的,參數的附加方式(不是C#部分-而是如何在SQL代碼中命名和引用它們)。

易於標准化的編程接口完全是微不足道的。

除了使用完整的驅動程序模型外,沒有其他方法可以概括SQL級別,即具有一個抽象(如LINQ),然后使用特定的生成器從那里獲取它。

    abstract class AbstractFactory  {
        public abstract System.Data.Common.DbConnection CreateConnection(string cs);
        public abstract System.Data.Common.DbCommand  CreateCommand(string stmt, System.Data.Common.DbConnection conn);
    }

    class ConcreteFactorySql : AbstractFactory {
        public override System.Data.Common.DbConnection CreateConnection(string cs) {
            return new SqlConnection(cs);
        }
        public override System.Data.Common.DbCommand CreateCommand(string stmt, System.Data.Common.DbConnection conn) {
            return new SqlCommand(stmt, (SqlConnection) conn);
        }
    }

    class ConcreteFactoryPg : AbstractFactory {
        public override System.Data.Common.DbConnection CreateConnection(string cs) {
            return new NpgsqlConnection(cs);
        }
        public override System.Data.Common.DbCommand CreateCommand(string stmt, System.Data.Common.DbConnection conn) {
            return new NpgsqlCommand(stmt, (NpgsqlConnection) conn);
        }
    }

暫無
暫無

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

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