2016-08-03 26 views
2

ich diese Methode haben, die mit Npgsql funktioniert:Code-Duplizierung, gleiche Funktionalität verschiedene Typen

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

jetzt brauche ich die gleiche Methode genau haben, sondern mit Odbc. Ich würde nur diese Änderungen

  1. NpgsqlCommand machen müssen
  2. NpgsqlDataAdapter zu OdbcDataAdapter
  3. NpgsqlException zu OdbcException

ObdcCommand Wie kann ich fusionieren dies, um Code Doppelarbeit zu vermeiden und haben nur eine Methode?

+0

Haben Sie einen Boolean, useODBC oder etwas, und Code entsprechend? – BugFinder

+0

Ok, und wie vermeide ich die Vervielfältigung der try finally Blöcke? – jankes

+0

Während ich nicht verwendet NGpgsql Befehle, sie nicht anders aussehen, so dass die einzige offensichtliche Änderung wäre, die Odbcexception zu erfassen .. also nur einen weiteren Fang .. – BugFinder

Antwort

0

können Sie versuchen Signatur Ihrer Methode für das ich denke,

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

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

oder verwenden eine Art Fabrik

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

oder Sie in der Lage zu verwenden Vererbung zu ändern Das Fabrikmuster ist der richtige Weg. Vielen Dank.