2010-09-23 54 views
3

我正在開發的ASP.NET Web應用程序需要支持兩種不同類型的數據庫,即Access和MS SQL Server 2008 Express。ASP.NET:如何在一個應用程序中支持兩種數據庫類型? (Access,MS SQL Server 2008 Express)

我已經有存儲在web.config中的每個數據庫類型的連接字符串,並且我有另一個web.config值指定要使用哪一個。所以我可以得到正確的連接字符串,沒有問題。

數據庫對象帶來了大問題。對於我已經實現的Access,我使用代碼中的對象OleDbConnection,OleDbCommand和OleDbDataReader來進行數據庫調用。

看來,對於SQL Server,我不能使用這些對象,而是我需要使用對象SqlConnection,SqlCommand和SqlDataReader來做基本相同的事情。

我想盡可能多地重用我當前的代碼,而不必爲每種數據庫類型創建兩個單獨的塊。 (我有很多以OleDbDataReader爲參數的方法 - 例如,我不希望每個方法都生成2個)。我注意到連接對象都是從DbConnection繼承的。數據讀取器(DbDataReader)和命令(DbCommand)也是如此。

是否可以將現有代碼用於Access,將所有Ole對象替換爲Db對象,然後根據當前數據庫類型將這些對象轉換爲適當類型?

在一個ASP.NET應用程序中是否有支持兩種數據庫類型的最佳實踐?

我可以添加一些我的代碼,如果這將有所幫助。謝謝。

回答

0

是的,從框架2.0開始,所有數據讀取器都從DbDataReader類繼承,因此您的方法可能需要DbDataReader而不是OleDbDataReader,您可以在任何數據庫中使用這些方法。

但是,數據庫具有不同的SQL方言,因此您必須保留在您使用的所有數據庫中工作的功能的狹窄路徑上,或者對某些任務有單獨的查詢。

差異的一個具體示例是Access使用數據文字如#2010-09-24#而SQL Server使用日期文字如'2010-09-24'。一般來說,與日期有關的大部分不同。

+0

感謝您的日期提示。 – Jeremy 2010-09-24 12:21:52

+0

另一個SQL方言的不同之處在於:在Access中,要將「10」作爲整數來使用,我使用CInt('10')但是在SQL Server中,我使用Cast('10'AS Int) – Jeremy 2010-09-24 15:26:27

+0

這是有效的。我更改了所有期望OleDbDataReader對象期望DbDataReader對象的方法。在創建閱讀器的方法中,根據給定的數據庫類型,我返回OleDbDataReader對象或SqlDataReader對象。 – Jeremy 2010-09-24 15:28:51

0

您可能會丟失的鏈接是DbProviderFactories類的功能。使用這個類(以及System.Data.Common中的相關幫助器),您可以抽象提供者並使用對基類的引用(如DbConnection和DbCommand)來完成這項工作。它會是這個樣子:

private void DoSomething(string provider, string connectionString, string something) 
{  
    DbProviderFactory factory = DbProviderFactories.GetFactory(provider); 
    DbConnection connection = factory.CreateConnection(); 
    connection.ConnectionString = connectionString; 
    DbCommand command = connection.CreateCommand(); 
    command.CommandText = something; 
    DbDataReader reader = command.ExecuteReader(); 
    //etc... 
} 

提供程序名稱是一個有點棘手得到,但應該是不變的類名相匹配那些DbProviderFactories.GetFactoryClasses返回的一個()。或者,您可以簡單地對它們進行硬編碼。它們變化不大,但它嵌入代碼中的魔術字符串,最終可能會導致問題。

可以通過factory.CreateCommandBuilder來訪問其他功能,它可以幫助您遍歷提供程序如何處理參數等的差異。

相關問題