2016-08-03 8 views
2

コードの重複、同じ機能の異なる種類

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これらの変更を加える必要があると思います1つの方法?

  • +0

    応じブール、useODBCか何か、およびコードをお持ちですか? – BugFinder

    +0

    [OK]を、どのように私は、try finallyブロックの重複を避けるのですか? – jankes

    +0

    アイブ氏はNGpgsqlコマンドを使用していないが、彼らはあなたがポイントの後にコードの重複を防ぐことはできません – 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

    の継承を使用することのいくつかの種類を使用しての署名を変更しようとすることができます工場のパターンはその後の道です。ありがとうございました。

    関連する問題