2011-10-29 81 views
1

我目前正在創建一個支持MySQL和MSSQL數據庫的C#應用​​程序。我遇到的問題是用我的包裝。我有我的代碼爲MySQL工作,但我有問題修改它以支持多個數據庫。C#DB Wrapper支持多個數據庫

如果你看看我的代碼的精簡版本,你會看到我有一個DBMySQL類型的dbConn對象,如果我只想要MySQL支持,那很好。我需要將DBMySQL修改爲通用的,以便我可以運行dbConn = new DBMySQL(...)和dbConn = DBMSSQL(...),然後我可以簡單地調用dbConn.SomeMethod()並使其在適當的數據庫上工作。我寧願儘可能保持相同的設置,因爲我的DBMySQL和DBMSSQL類中有其他的東西,用於批量插入數據庫和進行特定的錯誤檢查。

我在想/試圖聲明一些類似於Object dbConn的東西,然後操縱它,但那並沒有那麼好。然後我嘗試使用對象類型的枚舉類,但是我也遇到了問題。我知道有很多第三方庫可以完成所有這些工作,但我更願意使用自己的代碼。

有沒有人有任何建議,我可能會修改我的DBWrapper來解決這個問題?

//WRAPPER CLASS THAT CALLS DBMySQL, ISSUE IS I NOW NEED TO SUPPORT 
//DBMSSQL as well, not just DBMySQL 
class DBWrapper 
{ 
    DBMySQL dbConn; 

    public DBWrapper(...,string type) 
    { 
     if(type.Equals("MySQL") 
     { 
      dbConn = new DBMySQL(...); 
     } 
     //NEED TO REWORK TO SUPPORT THIS BELOW!! 
     else if(type.Equals("MSSQL") 
     { 
      //NEED TO MODIFY TO SUPPORT MSSQL 
      //ISSUE IS DbConn is of type DBMySQL 
      //SO I CANNOT GO 
      // DbConn = new DBMSSQL(...); 
      // any ideas? 
     } 
    } 

    public void setQuery(string myquery) 
    { 
      dbConn.setQuery(myquery); 
    } 
} 

class DBMySQL 
{ 
    public string dbinfo; 
    string query; 

    public DBMySQL(...) 
    { 
     dbinfo = ...; 

    } 

    public void setQuery(...) 
    { 
     query = myquery; 
    } 
} 

//NEED TO RE-WORK WRAPPER TO SUPPORT THIS 
class DBMSSQL 
{ 
    public string dbinfo; 
    string query; 

    public DBMSSQL(...) 
    { 
     dbinfo = ...; 

    } 

    public void setQuery(...) 
    { 
     query = myquery; 
    } 
} 

在這一點上,我希望得到任何幫助可言,因此,如果您正在查看這篇文章,有一個想法,請讓我知道,我已經花了一整天在此。

+0

這個問題可以使用工廠方法設計模式來解決,看看[這裏](http://en.wikipedia.org/wiki/Factory_method_pattern) – sll

回答

6

你需要的是創建接口來描述你希望你的數據訪問類做什麼。

E.g.從您的樣品

public interface IDBAccess 
{ 
    void setQuery(...); 
} 

public class DBMySQL : IDBAccess 
{ 
    public string dbinfo; 
    string query; 

    public DBMySQL(...) 
    { 
     dbinfo = ...; 

    } 

    public void setQuery(...) 
    { 
     query = myquery; 
    } 
} 

public class DBMSSQL : IDBAccess 
{ 
    public string dbinfo; 
    string query; 

    public DBMSSQL(...) 
    { 
     dbinfo = ...; 

    } 

    public void setQuery(...) 
    { 
     query = myquery; 
    } 
} 

在這一點上,你將能夠做到這一點:

IDBAccess dbConn; 
dbConn = new DBMySQL(); 
dbConn = new DBMSSQL(); 

銘記,你是新來這也未必是有用的,建議你看看NHibernateCastle ActiveRecordCastle Windsor。但請記住他們的未來。

+0

謝謝!這正是我需要的。我將更多地關注這些界面事物,非常整潔的想法。 – user1020184

+0

是的,你應該看看面向對象的編程概念。如果我可能會建議看看http://msdn.microsoft.com/en-us/library/ms173156.aspx和http://msdn.microsoft.com/en-us/library/ms173152.aspx –

2

你不應該讓一個大的類來處理這兩個數據庫。您應該爲封裝器IDBWrapper創建一個通用接口,然後爲每個數據庫分別執行一次。

之後,您可以創建一些邏輯,爲您選擇正確的實施。每次需要包裝時,您都不想寫這樣的東西:

IDBWrapper db = (useMySQL ? new MySqlDBWrapper(...) : new MsSqlDBWrapper(...)); 

有幾個選項。你可以使用抽象工廠,但真正抽象出數據庫包裝器創建的任何東西都可以工作。

+0

我是C#的新手,仍然在學習這樣的事情的聲音外國人,但我會很快搜索谷歌,如果你仍然在附近,有幾個很好的鏈接讓我知道。感謝您的建議。 – user1020184

0

我可以從頭腦中想到一個快速入門,創建一個具有必要支持的大型課程,並基於用戶選擇的內容,使用相應的對象和類。此外,您可以爲每個數據源創建一個類,然後創建一個着陸類,根據用戶選擇的內容重新路由到正確的數據源提供者類。不是很漂亮,但可能工作的那個...

2

是否有一個特定的原因,你想在C#中重新實現數據庫層?你有沒有看過使用說; Entity FrameworkNHibernate或任何其他.NET ORM?這將很好地包裝所有數據訪問,而不必擔心實施細節太多。此外,它們還提供其他優點,例如將表映射到您的類(即它們根據表中的內容以及其他方式填充類),緩存和各種其他功能。或者,如果您確實想創建自己的,那麼您必須聲明一個接口,讓所有數據庫連接都從此接口繼承,並將連接實例存儲在接口類型的屬性中。 I.e:

public interface IDatabaseConnection 
{ 
    void setQuery(string myQuery); 
} 

public class DBWrapper 
{ 
    private IDatabaseConnection Connection { get; set; } 

    public DBWrapper(string type) 
    { 
     if(type == "MySql") 
      Connection = new DBMySQL(); 
     else if(type == "MsSql") 
      Connection = new DBMSSQL(); 
    } 
} 

public class DBMySQL : IDatabaseConnection 
{ 
    ... 
} 

public class DBMSSQL : IDatabaseConnection 
{ 
    ... 
} 
+0

我'已經看到了你之前鏈接的兩件事。我寧願從頭開始構建所有東西,這樣我就可以學習更多關於設計自己的軟件的知識,所以這真的是一種學習體驗。您的答案與之前幾分鐘發佈的內容類似,我希望我可以選擇這兩個答案作爲正確答案,但感謝您的幫助。 – user1020184

+0

不用擔心 - 最初只是發佈基於接口的解決方案,但決定確保您知道ORM,實體框架和NHibernate,以及它們絕對值得閱讀並將來使用它們,因爲它們提供了許多功能功能和一個非常好的框架。儘管如此,在構建自己的學習體驗方面沒有任何壞處,尤其是如果您稍後將自己與他們的(他們的)(Entity Framework/NHibernate)進行比較並將其用作學習體驗。 –

1

您也可以查看這些數據庫中的通用存儲庫模式和ORM。

+0

我正在研究這個。謝謝,看起來對未來會有幫助。 – user1020184

1

在ADO.NET中,所有的連接類從System.Data.Common.DbConnection繼承,所以你想要的東西實際上是建立在到.NET - 所有你需要做的是存儲而不是SqlConnection/MySqlConnectionDbConnection的連接,並使用無論如何,在System.Data.Common而不是System.Data.Sql/MySql/

您看到的主要問題是,沒有真正的SQL標準 - 除了簡單的選擇和插入之外,您需要SqlServer和MySql查詢的不同語法。要解決這個問題,你需要使用Linq to SQL - 如果你不想依賴庫,這是很多工作 - 或者,如果你只想讓你的包裝做特定操作 - 你可以有一個字典爲每個數據庫存儲這些操作的準備好的查詢模板,並在運行時應用這些操作的包裝器方法。