2016-08-03 5 views
2

내가 Npgsql 작동이 방법이 있습니다 코드 중복, 동일한 기능 여러 종류의

private DataTable GetTableN(string sql, string[] pars) 
    { 
     NpgsqlCommand zapytanie = new NpgsqlCommand(sql, connn, trann); 
     NpgsqlDataAdapter da = new NpgsqlDataAdapter(); 
     DataSet ds = new DataSet(); 
     try 
     { 
      if (pars != null) 
      { 
       for (int i = 0; i < pars.Length; i++) 
       { 
        zapytanie.Parameters.AddWithValue("@param" + i, pars[i]); 
       } 
      } 
      connn.Open(); 
      da.SelectCommand = zapytanie; 
      da.Fill(ds); 
      return ds.Tables[0]; 
     } 
     catch (NpgsqlException e) 
     { 
      throw (new SqlException(e.Message.ToString())); 
     } 
     finally 
     { 
      connn.Close(); 
      zapytanie.Dispose(); 
      da.Dispose(); 
      ds.Dispose(); 
     } 
    } 

가 지금은 정확히 같은 방법 대신 ODBC를 사용이 필요합니다. 난 단지 내가 코드 중복을 피하기 위해이 병합 만이 어떻게 OdbcException

에 OdbcDataAdapter

  • NpgsqlException에
  • NpgsqlDataAdapter을 ObdcCommand하는

    1. NpgsqlCommand 이러한 변경을 필요 했어 하나의 방법?

  • +0

    boolean, useODBC 또는 기타 코드가 있습니까? – BugFinder

    +0

    그래, try finally 블록의 중복을 피하려면 어떻게해야합니까? – jankes

    +0

    필자는 NGpgsql 명령을 사용하지 않지만 다른 모양은 보이지 않으므로 명백한 변경은 odbcexception을 캡처하는 것입니다. 그래서 다른 캐치를 추가하십시오. – BugFinder

    답변

    0

    당신은 당신의 방법

    private DataTable GetTableN(string sql, string[] pars, DbCommand zapytanie, DbDataAdapter da) 
    { 
        DataSet ds = new DataSet(); 
        try 
        { 
         if (pars != null) 
         { 
          for (int i = 0; i < pars.Length; i++) 
          { 
           zapytanie.Parameters.AddWithValue("@param" + i, pars[i]); 
          } 
         } 
         connn.Open(); 
         da.SelectCommand = zapytanie; 
         da.Fill(ds); 
         return ds.Tables[0]; 
        } 
        catch (DbException e) 
        { 
         throw (new SqlException(e.Message.ToString())); 
        } 
        finally 
        { 
         connn.Close(); 
         zapytanie.Dispose(); 
         da.Dispose(); 
         ds.Dispose(); 
        } 
    } 
    

    의 서명을 변경하거나

    private DataTable GetTableN(string sql, string[] pars, MyFactory factory) 
    { 
        DbCommand zapytanie = factory.CreateCommand(...); 
        DbDataAdapter da = new factory.CreateAdapter(...); 
        ... 
    } 
    

    공장의 어떤 종류를 사용하려고하거나 할 것 같아요 그

    public abstract class MyClass 
    { 
        private DataTable GetTableN(string sql, string[] pars) 
        { 
         DbCommand zapytanie = CreateCommand(); 
         DbDataAdapter da = CreateAdapter(); 
         ... 
        } 
    
        protected abstract DbCommand CreateCommand(); 
        protected abstract DbDataAdapter CreateAdapter(); 
    } 
    
    public class OdbcClass : MyClass 
    { 
        protected override DbCommand CreateCommand() 
        { 
         // create for odbc 
        } 
    
        protected override DbDataAdapter CreateAdapter() 
        { 
         // create for odbc 
        } 
    } 
    
    public class PostgrClass : MyClass 
    { 
        protected override DbCommand CreateCommand() 
        { 
         // create for postgr 
        } 
    
        protected override DbDataAdapter CreateAdapter() 
        { 
         // create for postgr 
        } 
    } 
    
    0

    에 대한 상속을 사용하는 공장 패턴은 그때가는 길입니다. 고맙습니다.