2009-05-27 52 views
4

我需要一個示例C#源代碼來抽象數據庫(通過最少的代碼修改就可以輕鬆地從一個數據庫更改爲另一個數據庫)。你知道一些樣本網站或教程質量好嗎?C#Microsoft SQL Server,Oracle,MySQL和DB2的數據庫抽象

具體目標數據庫如下:
1. Microsoft SQL Server的
2.甲骨文
3. MySQL的
3. DB2

我的具體要求和遇到的問題如下:
1.數據訪問中使用的類的抽象。
2.在調用存儲過程中使用參數。在Microsoft SQL Server @中很好。其他數據庫不支持@。
3.將查詢語法從一個數據庫轉換爲另一個數據庫。我們是否有某種「通用」查詢,然後創建一些能夠將其查詢到目標數據庫的類?
4.嚴格鍵入數據訪問層中的數據集。我從經驗中記住,Visual Studio的TableAdapter和Query嚮導對MySQL失敗。

非常感謝您的專業知識和時間。

回答

6

看一看

和其他奧姆斯

+2

+1 - 像這樣的ORM可以讓你儘可能地得到你沒有不成比例的努力。對於最後一些尷尬的查詢,您可能需要編寫一些自定義代碼 - merde會發生。在這些角落案例中,將功能分爲獨立於數據庫和獨立於數據庫的層。使用標準接口和機制來設置數據庫獨立層,以插入數據庫相關模塊。 – ConcernedOfTunbridgeWells 2009-05-27 16:27:33

3

儘管我強烈建議您使用,但您也可以查看Microsoft's Enterprise Library的數據訪問應用程序塊。

當然,任何ORM都應該提供您需要的功能。

1

解決這個問題的最好方法是使用數據庫提供者提供的接口;它們在功能上幾乎是平行的。根據配置的數據庫創建一個靜態工廠類,以便爲命令適配器,數據適配器和連接創建接口。例如:

public static IDbDataAdapter GetDataAdapter (Database db) 
    { 
     switch (db) 
     { 
      default: 
      case "MsSql": 
       return new SqlDataAdapter(); 
      case "MySql" 
       return new MySqlDataAdapter(); 
     } 
    } 

    public static IDbCommand GetCommand (Database db) 
    { 
     switch (db) 
     { 
      default: 
      case "MsSql": 
       return new SqlCommand(); 
      case "MySql" 
       return new MySqlCommand(); 
     } 
    } 

您的客戶端代碼將不知道區別,但它必須傳遞配置字符串。使用VS文檔來檢查通常使用的每個對象給出的接口,並堅持使用這些接口,這將非常簡單 - 儘管您可能需要通過幾件事情來破解你的方式。