2016-08-03 85 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代替。我只需要做出这些改变

  1. NpgsqlCommand到ObdcCommand
  2. NpgsqlDataAdapter到OdbcDataAdapter的
  3. NpgsqlException到OdbcException

我如何才能避免重复代码合并这一点,只有一种方法?

+0

有一个布尔,useODBC什么的,并相应的代码? – BugFinder

+0

好的,我如何避免try finally块的重复? – jankes

+0

虽然我没有使用NGpgsql命令,但它们看起来不一样,所以唯一明显的变化就是捕获odbcexception ..所以只需添加另一个catch。 – 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

我猜工厂模式是当时的出路。谢谢。

相关问题