1

我们有 3 个用于连接数据库的数据库提供程序:DB2、MS SQL 和 Interbase。我想创建一个单一的通用数据库包装类,只需传入正确的连接字符串、用户名、密码和所需的提供者,就可以与这三个类进行对话。

我不想在数据库类中添加引用并导入所有三个提供程序。这可能吗?

我以前在 Java 中使用该Class.forName()函数做过这个。

4

4 回答 4

3

如果您不想在应用程序中引用各个提供程序,则需要稍作不同的处理。

我看到有两个主要选项——第一个(也是最简单的)是使用依赖注入框架在运行时插入适当的提供程序。这很简单,干净,效果很好。

不过,你可以自己做。只需创建一个提供接口的通用基类,并为每个提供者创建一个实现此基类的单独程序集(因此引用是分开的)。然后,您可以使用Activator.CreateInstance在运行时创建适当类型的实例。

于 2009-06-12T16:23:55.173 回答
3

.NET 2.0 或更高版本中内置了一个抽象工厂,其使用示例如下:

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 等。

于 2009-06-12T16:26:31.893 回答
1

要扩展 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>
于 2009-06-12T17:33:38.940 回答
0

你可以使用框架 3.5 sp1 吗?

如果是,您应该查看 Linq to Entity

于 2009-06-12T16:23:31.057 回答