2016-12-15 1 views
0

SQL Server 및 mysql 데이터베이스에서 테이블, 열을 가져 와서 코드 중복이 발생합니다.두 가지 다른 유형의 객체를 처리하기위한 코드 중복을 피하는 공통 함수

저는 연결 개체를 삭제하는 것과 함께 mysql과 sql 서버 연결 (열기 및 닫기)을 모두 처리하고자하는 일반적인 기능을 유지하려고합니다.

이 MySQL을의 테이블과 MS의 SQL 점점 내 공통 기능입니다 : 그래서

public List<Columns> GetColumns(string connectionString, string database, string table, string type) 
{ 
    if (type == 'mysql') 
    { 
     using (MySqlConnection conn = new MySqlConnection(connectionString)) 
     { 
      con.Open(); 
      var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable() 
          .Select 
          (
           col => new 
           { 
            //column details 
           } 
          ).ToList(); 
      conn.Close(); 
     } 
    } 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     if (conn.State == ConnectionState.Open) 
     { 
      var list = conn.GetSchema("Columns", columnRestrictions).AsEnumerable() 
          .Select 
          (
           col => new 
           { 
            //column details 
           } 
          ).ToList(); 
      conn.Close(); 
      return list; 
     } 
     return null; 
    } 
} 

: 점점 열 경우 위의

public List<Tables> GetTables(string databaseName, string connectionString, string type) 
{ 
    var list = new List<Tables>(); 
    if (type == 'mysql') 
    { 
     using (MySqlConnection con = new MySqlConnection(connectionString)) 
     { 
      con.Open(); 
      list = con.GetSchema("Tables").AsEnumerable() 
           .Select 
             (
              t => new Tables 
              { 
               Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString() 
              } 
            ).ToList(); 
      con.Close(); 
     } 
    } 
    else 
    { 
     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
      list = con.GetSchema("Tables").AsEnumerable() 
          .Select 
            (
             t => new Tables 
             { 
              Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString() 
             } 
            ).ToList(); 
      con.Close(); 
     } 
    } 
    return list; 
} 

그래서 난 데 코드 중복과 동일 아무도 날 코드의 위의 중복을 피하고 연결 개체를 처분하는 것과 함께 열리고 닫는 1 개의 공통 함수를 유지하면서 테이블과 열을 가져 오는 동안 그것을 호출 할 수있는 방법을 안내 해줄 수 있습니까 ??

답변

2

MySqlConnectionSqlConnection은 모두 DbConnection에서 상속됩니다.

public List<Tables> GetTables(string databaseName, string connectionString, string type) 
{ 
    var connection = connectionFactory.GetConnection(connectionString, type); 

    return connection.GetTables(connection); 
} 

public List<Tables> GetColumns(string databaseName, string connectionString, string type) 
{ 
    var connection = connectionFactory.GetConnection(connectionString, type); 

    return connection.GetColumns(connection); 
} 

private IEnumerable<Table> GetTables(DbConnection connection) 
{ 
    connection.Open(); 
    list = con.GetSchema("Tables").AsEnumerable() 
       .Select(t => new Tables 
       { 
        Name = t["TABLE_SCHEMA"].ToString() + "." + t[2].ToString() 
       }).ToList(); 
    connection.Close(); 
} 

private IEnumerable<Table> GetColumns(DbConnection connection) 
{ 
    connection.Open(); 
    list = con.GetSchema("COLUMNS").AsEnumerable() 
       .Select(t => new Tables 
       { 
        Name = t["COLUMN_SCHEMA"].ToString() + "." + t[2].ToString() 
       }).ToList(); 
    connection.Close(); 
} 

public class ConnectionFactory 
{ 
    public DbConnection GetConnection(string connectionString, string type) 
    { 
      switch(type) 
      { 
       case "mysql": 
        return new MySqlConnection(connectionString); 
       case "mssql": 
        return new SqlConnection(connectionString); 
       default: 
        throw new UnsupportedException($"{type} not supported."); 
      } 

    } 
} 

그리고 난 당신이 같은 응용 프로그램의 연결을 모두 필요하다고 가정입니다, 그리고 그냥 아니라고 "경우에 나는 데이터베이스 공급자를 전환해야". 일반적으로 데이터베이스 유형별로 구현을 작성하고 인터페이스별로 추상화합니다.

+0

이제는 열을 가져 오는 기능이 있으므로이 경우에는 2 가지 방법이 필요하겠습니까 ?? –

+0

업데이트 답변 ... – Michael

+0

답변을 주셔서 대단히 감사하고 this.thanks처럼 도와주세요. :) –

0

아마도 연결 작성을 별도의 기능으로 캡슐화해야합니다.