2011-09-08 80 views
0

您好,我有兩個方法,如和三個以上的方法(在這個問題上沒有提及)..我如何重構這兩種方法

我如何重構這些的..

方法1

public DataTable GetVisits(System.DateTime startdate , System.DateTime enddate) 
    { 


     const string sql = @"SELECT CONCAT(UPPER(SUBSTRING(visit_Status, 1, 1)), SUBSTRING(visit_Status FROM 2)) as Status, COUNT('x') AS Visits 
           FROM visits 
           WHERE visit_Date BETWEEN @startdate AND @enddate 
           GROUP BY visit_Status"; 

     var tblvisits = new DataTable(); 

     using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring)) 
     { 
      conn.Open(); 

      var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn); 


      var ds = new DataSet(); 

      var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter.Direction = ParameterDirection.Input; 
      parameter.Value = startdate.ToString(dateformat); 
      cmd.Parameters.Add(parameter); 

      var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter2.Direction = ParameterDirection.Input; 
      parameter2.Value = enddate.ToString(dateformat); 
      cmd.Parameters.Add(parameter2); 

      var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd); 

      da.Fill(ds); 
      try 
      { 
       tblvisits = ds.Tables[0]; 

      } 
      catch 
      { 
       tblvisits = null; 

      } 

     } 
     return tblvisits; 
    } 

方法2:

 public DataTable sales(System.DateTime startdate, System.DateTime enddate) 
     { 
     const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value 
           FROM memberacctrans 
           WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate 
           GROUP BY memberAccTran_Source"; 

     var memacctvalues = new DataTable(); 
     using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring)) 
     { 
      conn.Open(); 

      var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn); 

      var ds = new DataSet(); 

      var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter.Direction = ParameterDirection.Input; 
      parameter.Value = startdate.ToString(dateformat); 
      cmd.Parameters.Add(parameter); 

      var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
      parameter2.Direction = ParameterDirection.Input; 
      parameter2.Value = enddate.ToString(dateformat); 
      cmd.Parameters.Add(parameter2); 

      var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd); 

      da.Fill(ds); 
      try 
      { 
       memacctvalues = ds.Tables[0]; 

      } 
      catch 
      { 
       memacctvalues = null; 
      } 
     } 
     return memacctvalues;   
    } 

會不會有人有任何想法我怎麼可以重構這兩種方法

我有三個方法更喜歡這一點,但唯一不同的是SQL查詢 )

+0

你覺得你需要重構它們的原因是什麼?你想達到什麼。 – Kolja

回答

6

如果方法的所有風格之間的唯一區別是SQL代碼,那麼爲每個方法創建一個公共方法,並讓它們全部調用一個私有方法,該私有方法具有通信在代碼中傳入正確的sql字符串。

private DataTable PerformQuery(string sql, System.DateTime startdate, System.DateTime enddate) 
{ 
    var tblvisits = new DataTable(); 

    using (var conn = new MySql.Data.MySqlClient.MySqlConnection(connectionstring)) 
    { 
     conn.Open(); 

     var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn); 


     var ds = new DataSet(); 

     var parameter = new MySql.Data.MySqlClient.MySqlParameter("@startdate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
     parameter.Direction = ParameterDirection.Input; 
     parameter.Value = startdate.ToString(dateformat); 
     cmd.Parameters.Add(parameter); 

     var parameter2 = new MySql.Data.MySqlClient.MySqlParameter("@enddate", MySql.Data.MySqlClient.MySqlDbType.DateTime); 
     parameter2.Direction = ParameterDirection.Input; 
     parameter2.Value = enddate.ToString(dateformat); 
     cmd.Parameters.Add(parameter2); 

     var da = new MySql.Data.MySqlClient.MySqlDataAdapter(cmd); 

     da.Fill(ds); 
     try 
     { 
      tblvisits = ds.Tables[0]; 

     } 
     catch 
     { 
      tblvisits = null; 

     } 

    } 
    return tblvisits; 
} 

然後對公立:

public DataTable Sales(System.DateTime startdate, System.DateTime enddate) 
    { 
    const string sql = @"SELECT memberAccTran_Source as Category, sum(memberAccTran_Value) as Value 
          FROM memberacctrans 
          WHERE memberAccTran_DateTime BETWEEN @startdate AND @enddate 
          GROUP BY memberAccTran_Source"; 

     return PerformQuery(sql, startdate, enddate); 
    } 



    public DataTable GetVisits(System.DateTime startdate , System.DateTime enddate) 
    { 
     const string sql = @"SELECT CONCAT(UPPER(SUBSTRING(visit_Status, 1, 1)), SUBSTRING(visit_Status FROM 2)) as Status, COUNT('x') AS Visits 
           FROM visits 
           WHERE visit_Date BETWEEN @startdate AND @enddate 
           GROUP BY visit_Status"; 
      return PerformQuery(sql, startdate, enddate); 
     } 

,並重復每個人的。正如您似乎表明的那樣,假設所有參數都是相同的,唯一的區別是正在運行的SQL。

+0

非常感謝詹姆斯..... –

+0

沒問題!樂意效勞。 –

1

只需將SQL查詢放在方法外並將其作爲參數傳遞。