2009-07-10 20 views
3

假設我設計一個類,它可以處理任何數據庫技術來創建連接,執行命令和檢索數據等C# - 一種通用的數據庫連接,命令類,讀者

如果我需要創建一個我應該使用{DbConnection,DbCommand,DbParameter,...}或者{IDbConnection,IDbCommand,IDbParameter等等。現在的RDBMS(如SQL Server,Oracle,FireBird等) ...}?

我應該使用像

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; 
    //... 
} 

而且,爲什麼呢?

+0

你有什麼要問的:我什麼時候需要創建一個通用的...?爲什麼? – 2009-07-10 05:22:06

+0

請參閱最新的問題。 – 2009-07-10 05:26:33

+0

在談論C#時要小心使用「Generic」這個詞,因爲它具有與此問題無關的非常具體的含義。 – CaptainCasey 2009-07-10 05:42:21

回答

5

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

OK,既不...

你要違背開閉原則當你這樣做......的開關/如果在那個特定的聲明地方讓我感到不舒服:)。

我會將實際創建保留爲Factory類,並且您的代碼不應該在乎它是否正在與SQL Server或DB2或Oracle等進行對話。理想情況下,您的代碼只應與IDbConnection,IDbCommand等或抽象基類(DbConnection,DbCommand等)進行交談。有時候我發現你需要上傳到一個特定的提供者(例如使用特定方法的SqlDataReader),但這種情況非常罕見。

Factory將該開關/ if語句封裝到一個地方,因此它很容易維護。你可以在app.config中進一步抽象實際創建。因此,在app.config中,您可以選擇支持哪種類型的數據庫後端,並且工廠將從那裏選取併爲您創建必要的數據庫資料。

參見:this。閱讀關於創建DbProviderFactory和連接部分...

0

爲什麼不使用泛型?

可以定義你的類像這樣的例子:

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

這就是我做的和其真正易於維護。

0

您應該使用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一個不同的類型。所以你在課外有某種控制。你可以看到這個question and my answer作爲基本實現的參考。