2013-10-08 23 views
2

我有一個使用Oracle客戶端訪問Oracle數據庫的.NET應用程序。使用獨立於底層數據庫的數據訪問代碼創建.NET應用程序

如果有一天我們將數據庫從Oracle遷移到任何其他關係數據庫,我不會被迫更改我的應用程序中的數據訪問代碼。

我想只是改變一些東西,驅動程序或DLL或者連接字符串,以便代碼的其餘部分從合適的數據庫中選擇數據。

我該怎麼做?

回答

0

ADO .NET包含了一組抽象類和工廠,這意味着你不必考慮你連接的數據庫類型是什麼,只要有一個ADO.NET驅動程序

您需要使用工廠方法來創建您使用的各個類,以便您不受限於特定的提供者。

更多信息,在此msdn article

當然,只要能夠創造連接並運行對多種類型的數據庫查詢是隻是問題的一半。您還需要確保查詢本身與您打算使用的任何數據庫兼容。

您可以使用可能被主要SQL服務器理解的SQL子集,或者實體框架有許多提供程序,它們可以從Linq生成特定於數據庫的SQL。這仍然不是萬無一失,但你仍然可以編寫不支持它們的供應商不能翻譯的查詢

0

你需要的東西可以在System.Data.Common命名空間中找到,它包含在系列專門設計來處理這種必要的課程。

那裏的類使用了一個名爲Abstract Factory的設計模式,主要思想是您的連接字符串向提供者提供了抽象工廠,即SQL Client或Oracle Client,並且基於該抽象工廠可以創建一個特定工廠生成連接以與特定數據庫引擎進行通信。足夠的說話,這是代碼:

string providerName = ConfigurationManager.ConnectionStrings["DbConn"].ProviderName; 
string connectionString = ConfigurationManager.ConnectionStrings["DbConn"].ConnectionString; 

DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 

DbConnection connection = factory.CreateConnection(); 
connection.ConnectionString = connectionString; 

您可以閱讀更多關於該here。 關於您需要的抽象,我建議您執行以下操作,首先實現所有類以訪問數據模型,然後從這些類中提取接口。

依靠這些接口實現您的業務層代碼,並使用Abstract Factory設計模式在幕後創建具體的實現類。

關於抽象工廠,SO有一個很好的答案here,請看看。 另外請記住,如果您使用抽象工廠,那麼您可以擁有兩個世界,也就是說,您可以擁有一個與大部分數據庫進行對話的通用提供程序,並且您可以擁有一個特定的對於Oracle。

通用提供程序是使用DbConnection對象的通用提供程序,適用於所有數據庫。但是有時候你可能想要獲取特定數據庫的大部分價值,想象一下,如果你的系統安裝在拓撲中,那麼在某些機器上它只有一個專用的Oracle應用,並且你希望代碼在那裏非常有效。那麼對於這種配置,您可以使用專門針對Oracle的提供程序,關於抽象工廠的美妙之處在於,只要上層代碼只是通過接口進行通信,他們就可以讓您使用具體類型。

最終對於抽象工廠,您可以在Web或app.config中指定一個設置,指明您想要的模式,如「Generic」,「OracleSpecific」,「SqlServerSpecific」。這個值只是您可以創建自己的約定。

相關問題