2009-11-04 103 views
3

我正在嘗試在C#中使用MySQL 5。我在mysql.com上下載了MySQL驅動並安裝了它。現在我可以使用以下代碼連接到C#中的MySQL。MySQL數據庫抽象層?

string ConString = "SERVER=192.168.10.104;"; 
    ConString += "DATABASE=test;"; 
    ConString += "UID=user;"; 
    ConString += "PASSWORD=password;"; 

    MySqlConnection connection = new MySqlConnection(ConString); 

    MySqlCommand command = connection.CreateCommand(); 
    MySqlDataReader Reader; 
    command.CommandText = "select * from j_people"; 
    connection.Open(); 

    Reader = command.ExecuteReader(); 

問題是,如果我以後將數據庫服務器更改爲MS SQL Server或Oracle,該怎麼辦?

C#中沒有數據庫抽象層嗎?

我想這應該是ADO.NET,但我似乎無法找到一個與MySQL的ADO.NET的實際例子。

回答

1

您也可以結帳iBatis.NET。我認爲iBatis的學習曲線比Hibernate/Linq以及小型項目和熟悉SQL的人都要低,iBatis是一個不錯的幫手。

1

有真的兩件事情是很重要的記住這裏:

  1. 你可以讓你的具體的.NET代碼數據庫無關的通過編寫代碼對界面,MySQL的庫實現,即的IDbConnection ,IDbCommand,IDataParameters等。您的總體策略是將您使用MySql特定類的點儘可能地分離到儘可能少的地方(理想情況下,它只能在工廠方法中,稍後可以擴展到使用Oracle,SQL Server或另一個RDBMS

  2. 一旦你的.NET代碼是數據庫-a gnostic,你傳入的SQL代碼也必須是。在一個理想的世界裏,所有的RDBMS都會用一種通用的語言說話,但是不同的提供者存在着各種各樣的「SQL」風格。簡單的選擇,插入和更新可能是可能的,但你會遇到困難,需要在早期使用特定於供應商的功能。這是您可以考慮使用ORM技術的地方 - 否則,您需要引入某種分支來爲您支持的每個數據庫供應商提供特定的SQL。

5

添加一個抽象自己...創建爲您需要檢索/添加/刪除/更新和實施與使用MySQL驅動類接口數據的方法名稱的接口。如果您以後需要使用其他連接器(MS SQL Server或Oracle),則只需實現不同連接器的接口即可。這使得數據訪問層自成一體,並且隱藏了其他代碼中的實現。

您可以使用任何您想要的技術來實現此接口:LINQNHibernate或ADO等。如果數據庫管理系統發生變化,這是唯一需要觸及的層。

public interface IDataLayer 
{ 
    IList<Data> GetData(); 
    void SaveData(Data dataToSave); 
    void DeleteData (Data dataToDelete); 
} 

public class MySqlDataLayer : IDataLayer 
{ 
    public IList<Data> GetData() 
    { 
     //Use MySQL connector to get data. 
     return data; 
    } 

    public void SaveData(Data dataToSave) 
    { 
     //Use MySQL connector to save to data. 
    } 

    public void DeleteData(Data dataToDelete) 
    { 
     //Use MySQL connector to delete passed in data. 
    } 
} 
+0

我喜歡這個解決方案,因爲它打開了許多可能性。它不會將您限制爲僅限ADO.NET System.Data.Common接口。 – 2009-11-04 20:52:37

0

MySQL的.NET連接器API中的類實現在System.Data命名空間(的IDbConnection,IDbCommand的等定義的平臺無關的接口)

您可以使用Gateway模式在抽象層後隱藏供應商特定的數據訪問API詳細信息。然後,您可以將您的Gateway實例的創建委託給Castle,StructureMap等IoC容器。這將允許您在不必重構代碼的情況下在不同的數據訪問策略之間進行交換。