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(){} 

이 방법으로 첫 번째 단계는 데이터베이스 유형을 확인한 다음 데이터베이스에 연결하는 것입니다. 그런 다음 데이터베이스에서 데이터를 가져오고 마지막 단계는 데이터를 반환합니다 (List < 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. 'T'는
  2. 가 유형 'Advantage.Data.Provider.AdsConnection을'변환 할 수 없습니다하는 'T' 모르겠어요
  3. 에 유형 'System.Data.Odbc.OdbcConnection을'변환 할 수 없습니다 내 문제를 해결하는 방법.

문제를 해결하는 방법을 알려주십시오.

지금, 나는 다음과 같은 코드를 사용 (이 솔루션은 나를 @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; 
} 

감사합니다. 모두 연결이 IDbConnection에서 상속 이후

+0

나는 당신이 당신의 코드를 다시 읽을 필요가 있다고 생각합니다. 현재 현재 (틀린) 구문을 사용하면 (5 분 동안 구문 오류를 잊어 버리면) 할 수 있습니다. GetConnection ("Oracle")'. – User999999

+2

.net 용 Db 클라이언트의 대부분은 IDbConnection에서 구현됩니다. 따라서 리턴 유형으로 IDbConnection을 사용할 수 있습니다. 꼭 필요하지는 않습니다. 일반 유형 – qamar

+0

전적으로 다른 접근 방식을 권장합니다. 이 일반화 된 연결 팩토리를 만드는 대신 코드를 사용하면 간단한 'using'블록에서 자체 연결을 인스턴스화하는 것이 어떨까요? 연결 범위/수명은 전체가 아닌 작게 유지하십시오. – David

답변

1

당신은 다음 작업을 수행 할 수 있습니다 : 당신이 연결 인스턴스가 ADO.Net의 DbProviderFactory를 사용하여 추상적 인 수

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

한 가지 방법. 기본적으로 공급자 이름을 전달할 수 있으며 공급자를 기반으로 연결을 제공합니다. 이것은 기본적으로 dbtype 등의 점검을 줄이고 여러 데이터베이스를 대상으로 할 때 합리적인 방법이라고 생각합니다. 일부 코드 스 니펫은 MSDN에서 복사됩니다.

구성 파일에서 다른 데이터베이스 유형 및 공급자로 설정된 다중 연결 문자열을 사용할 수 있습니다.

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

그런 방법으로는 다음과 같은 작업을 수행 할 수

<configuration> 
는 :

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