我們有3個數據庫提供者用於連接我們的數據庫:DB2,MS SQL和Interbase。我想創建一個通用數據庫包裝類,只需傳入正確的連接字符串,用戶名,密碼和所需的提供程序即可用於與所有三個類型進行通信。是否可以在VB.NET中創建一個通用的數據庫類?
我不想在數據庫類中添加引用並導入所有三個提供程序。這可能嗎?
我之前在Java中使用Class.forName()
函數完成了此操作。
我們有3個數據庫提供者用於連接我們的數據庫:DB2,MS SQL和Interbase。我想創建一個通用數據庫包裝類,只需傳入正確的連接字符串,用戶名,密碼和所需的提供程序即可用於與所有三個類型進行通信。是否可以在VB.NET中創建一個通用的數據庫類?
我不想在數據庫類中添加引用並導入所有三個提供程序。這可能嗎?
我之前在Java中使用Class.forName()
函數完成了此操作。
有內置的.NET 2.0或更高版本的abstract factory,它的使用的一個例子是:
Dim factory As System.Data.Common.DbProviderFactory
factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient")
Dim conn As System.Data.Common.DbConnection = factory.CreateConnection()
conn.ConnectionString = "connectionString"
conn.Open()
上有DbProviderFactory像CreateCommand,CreateDataAdapter方法等
你可以使用framework 3.5 sp1嗎?
如果是的話,你應該看看LINQ到實體
如果你不希望有您的應用程序的個人提供參考,則需要以不同方式處理這一點。
我看到有兩個主要選項 - 第一個(也是最簡單的)是使用依賴注入框架在運行時插入相應的提供程序。這很簡單,乾淨,並且運作良好。
儘管如此,你也可以自己做。只需創建一個提供接口的通用基類,併爲每個提供者創建一個實現此基類的單獨程序集(以便引用是分開的)。然後您可以使用Activator.CreateInstance在運行時創建適當類型的實例。
爲了擴展Patrick McDonald的回答是,您可以將提供程序名稱和連接字符串存儲在應用程序配置文件的< connectionStrings>部分中。然後,你不需要在應用硬編碼的供應商:
ConnectionStringSettings c = ConfigurationManager.ConnectionStrings["MyConnectionName"];
if (c != null)
{
DbProviderFactory factory = DbProviderFactories.GetFactory(c.ProviderName);
IDbConnection connection = factory.CreateConnection();
connection.ConnectionString = c.ConnectionString;
...
}
如果你的應用程序配置文件中包含一個connectionStrings節是這樣的:
<connectionStrings>
<add name="MyConnectionName" providerName="System.Data.SqlClient" connectionString="Data Source=serverName;Initial Catalog=DBName;Integrated Security=True"/>
</connectionStrings>