2015-01-23 3 views
1

UPD: У меня есть статический класс для работы с базой данных.C# метод возвращает подключение к различным базам данных

Этот класс содержит метод, который возвращает соединение с базой данных. Ранний этот метод возвращает соединение с базой данных Advantage (AdsConnection):

static private AdsConnection GetConnection(){ 
    var conn = new AdsConnection(); 
    conn.ConnectionString = here my connection string 
    return conn; 
} 

Теперь мне нужно изменить этот метод. Мне нужно, чтобы этот метод возвращал соединение с различными типами баз данных (база данных Advantage, база данных Oracle).

Метод будет работать в общедоступных методах в моем классе. Например, метод для получения данных из любой таблицы из базы данных.

public static List<entity1> GetEntities(){} 

В этом методе первым из моих шагов является разрешение типа базы данных, а затем подключение к базе данных. Затем получите данные из базы данных, а последний шаг - данные возврата (список < entity1>).

На этапе подключения к базе данных, что нужно использовать метод GetConnection("Ads")

Этот метод возвращает текущее подключение к базе данных, а затем я могу использовать это подключить к работе

Я изменил метод:

Моя первая версия

static private T GetConnection<T>(string dbType) 
     { 
      if (dbType.Equals("Oracle")) 
      { 
       OdbcConnection conn = new OdbcConnection 
       conn.ConnectionString = here my connection string 
       return (T)conn; 
      } 

      if (dbType.Equals("Ads")) 
      { 
       AdsConnection conn = new AdsConnection 
       conn.ConnectionString = here my connection string 
       return (T)conn; 
      } 

      return default(T); 
     } 

Но, мое решение не Работа. У меня есть ошибки:

  1. Невозможно преобразовать тип «System.Data.Odbc.OdbcConnection» в «T»
  2. Невозможно преобразовать тип «Advantage.Data.Provider.AdsConnection» в «T» я не знаю как решить мою проблему.

Скажите, пожалуйста, как решить мою проблему?

Теперь я использую следующий код (это решение дать мне @khlr):

static private IDbConnection GetConnection(string dbType) 
{ 
    if (dbType.Equals("Oracle")) 
    { 
     OdbcConnection conn = new OdbcConnection 
     conn.ConnectionString = here my connection string 
     return conn; 
    } 

    if (dbType.Equals("Ads")) 
    { 
     AdsConnection conn = new AdsConnection 
     conn.ConnectionString = here my connection string 
     return conn; 
    } 

    return null; 
} 

благодарственное.

+0

Я думаю, вам нужно перечитать свой код. Прямо сейчас с текущим (неправильным) синтаксисом, который я мог бы сделать (если мы забудем об этих синтаксических ошибках в течение 5 минут): 'GetConnection (« Oracle »)'. – User999999

+2

Большинство клиентов Db для .net реализует IDbConnection. Таким образом, вы можете иметь IDbConnection как возвращаемый тип. Не обязательно быть общим типом – qamar

+0

Я лично рекомендовал бы использовать совершенно другой подход. Вместо того, чтобы создавать эту генерализованную фабрику соединений, почему бы не позволить потребительскому коду просто создавать собственные соединения в простом блоке 'using'? Держите область действия/время жизни маленьким, а не глобальным. – David

ответ

1

Вы можете сделать следующее, поскольку оба соединения наследуют от IDbConnection:

static private IDbConnection GetConnection(string dbType) 
{ 
    if (dbType.Equals("Oracle")) 
    { 
     OdbcConnection conn = new OdbcConnection 
     conn.ConnectionString = here my connection string 
     return conn; 
    } 

    if (dbType.Equals("Ads")) 
    { 
     AdsConnection conn = new AdsConnection 
     conn.ConnectionString = here my connection string 
     return conn; 
    } 

    return null; 
} 
+0

Благодарим вас за ответ. Это решение для меня полезно. – netwer

2

Один из способов вы можете абстрагировать соединение Инстанциация с помощью DbProviderFactory из ADO.NET. Вы можете в основном передать ему имя провайдера, и оно даст соединение на основе провайдера. Это в основном уменьшает проверку dbtype и т. Д., И я думаю, что это разумный подход, когда вам нужно настроить таргетинг на несколько баз данных. Некоторые фрагменты кода копируются из MSDN.

В конфигурационном файле вы можете установить несколько строк подключения с разными типами баз данных и поставщиком.

<configuration> 

<add name="NorthwindAccess" 
providerName="System.Data.OleDb" 
connectionString= 
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;" 
/> 

Тогда в вас метод вы можете сделать следующее:

static DbConnection CreateDbConnection(
    string providerName, string connectionString) 
{ 
    // Assume failure. 
    DbConnection connection = null; 

    // Create the DbProviderFactory and DbConnection. 
    if (connectionString != null) 
    { 
     try 
     { 
      DbProviderFactory factory = 
       DbProviderFactories.GetFactory(providerName); 

      connection = factory.CreateConnection(); 
      connection.ConnectionString = connectionString; 
     } 
     catch (Exception ex) 
     { 
      // Set the connection to null if it was created. 
      if (connection != null) 
      { 
       connection = null; 
      } 
      Console.WriteLine(ex.Message); 
     } 
    } 
    // Return the connection. 
    return connection; 
} 
+0

Спасибо за ваш ответ. – netwer

Смежные вопросы