Можно ли создать общий класс базы данных в VB.NET? - PullRequest
1 голос
/ 12 июня 2009

У нас есть 3 поставщика баз данных, которые мы используем для подключения к нашим базам данных: DB2, MS SQL и Interbase. Я хотел бы создать единый универсальный класс-оболочку базы данных, который можно использовать для общения со всеми тремя, просто передав правильную строку подключения, имя пользователя, пароль и желаемого поставщика.

Я не хочу добавлять ссылки и импортировать всех трех провайдеров в классе базы данных. Это возможно?

Я делал это раньше в Java, используя функцию Class.forName().

Ответы [ 4 ]

3 голосов
/ 12 июня 2009

Если вы не хотите, чтобы в вашем приложении были ссылки на отдельных провайдеров, вам нужно будет справиться с этим немного по-другому.

Есть два основных варианта, которые я вижу - первый (и самый простой) - использовать инфраструктуру внедрения зависимостей, чтобы просто подключить соответствующего поставщика во время выполнения. Это просто, чисто и хорошо работает.

Вы могли бы сделать это самостоятельно без этого, хотя. Просто создайте базовый класс общего назначения, который предоставляет интерфейс, и для каждого поставщика создайте отдельную сборку (чтобы ссылки были разделены), которая реализует этот базовый класс. Затем вы можете использовать Activator.CreateInstance для создания экземпляра соответствующего типа во время выполнения.

3 голосов
/ 12 июня 2009

Существует абстрактная фабрика , встроенная в .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 и т. Д.

1 голос
/ 12 июня 2009

Чтобы расширить ответ Патрика Макдональда, вы можете сохранить имя поставщика и строку подключения в разделе вашего файла конфигурации приложения. Тогда вам не нужно, чтобы провайдеры были жестко закодированы в приложении:

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>
0 голосов
/ 12 июня 2009

можете ли вы использовать framework 3.5 sp1?

если да, вы должны посмотреть на Linq to Entity

...