2013-11-28 127 views
-1

在這個問題中,我將詢問基本的實踐。今天我面臨的情況是,我需要用這段代碼更新數據庫表值。更好的清潔功能代碼或大塊代碼

public void updateUsrProfileName(string usrId, string name) 
    { 
     query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 
     try 
     { 
      com = new SqlCommand(query,con); 
      com.Parameters.AddWithValue("@name",name); 
      com.Parameters.AddWithValue("@usrid",usrId); 
      con.Open(); 
      com.ExecuteNonQuery(); 
      con.Close(); 
     } 
     catch (Exception e) 
     { 
      con.Close(); 
      throw e; 
     } 
    } 

我需要重複上面的表中的每一列函數,所以我想出了一個共同的功能,以減少代碼

public void Commonfunction(SqlCommand com, string var) 
    { 
     try 
     { 
      com.Parameters.AddWithValue("@usrid", var); 
      con.Open(); 
      com.ExecuteNonQuery(); 
      con.Close(); 
     } 
     catch (Exception e) 
     { 
      con.Close(); 
      throw e; 
     } 
    } 

,並調用上面的函數類似這樣的

 public void updateUsrProfileName(string usrId, string name) 
    { 
     query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 
     try 
     { 
      com = new SqlCommand(query,con); 
      com.Parameters.AddWithValue("@name",name); 
      Commonfunction(SqlCommand com, string name); 
     } 
      catch (Exception e) 
      { 
       con.Close(); 
       throw e; 
      } 
     } 

優點: - 乾淨的代碼沒有冗餘。 更少的代碼長度,其在差

缺點非常少: - 由於沒有函數調用提高性能下降,因爲它需要匹配參數,映射函數調用等

在這種情況下非常較小的代碼是多餘的移動是否具有共同的功能,以及在哪些條件下我們應該考慮功能劃分還是不划算。

+1

更新整個記錄。只寫一個'updateUserProfile(UserProfile配置文件)'函數。 – sbenitezb

+0

我認爲這會浪費資源,好像只需要更新名稱爲什麼我應該向上移動整行就會影響性能 –

+0

您每秒更新一次用戶配置文件多少次?不是一次,我猜想。 – sbenitezb

回答

0

總是「移動它」(共享方法而不是重複代碼)。直到概要分析顯示您在該區域遇到問題爲止。

+0

性能問題比.. –

+0

什麼性能問題?你是否認爲它存在一些性能問題?你的數據有多大?多少次更新?我會開始讓代碼儘可能簡單,衡量性能,然後調整是否真的有必要。否則,你會無緣無故地重複代碼。 – sbenitezb

+1

重複您的代碼,而不是第一次正確寫入它幾乎從來沒有解決性能問題... – John3136

0

將一些通用邏輯放在單獨的方法中是一個好主意。我已通過刪除過多的try/catch塊來簡化代碼,並添加了finally子句。

public void Commonfunction(SqlCommand com, string var) 
{ 
    try 
    { 
     com.Parameters.AddWithValue("@usrid", var); 
     con.Open(); 
     com.ExecuteNonQuery(); 
    } 
    finally 
    { 
     if (con != null) 
     { 
      con.Dispose(); 
     } 
    } 
} 

public void updateUsrProfileName(string usrId, string name) 
{ 
    query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 

    com = new SqlCommand(query, con); 
    com.Parameters.AddWithValue("@name", name); 
    Commonfunction(com, name); 
} 
+0

kirill我懷疑如果我從updateUsrProfileName(字符串usrId,字符串名稱)刪除嘗試捕獲將它拋出異常業務邏輯調用方。 –

+1

如果你不抓住它們,異常會傳播調用堆棧。 – sbenitezb

+0

@HotCoolStud,在你的源代碼中,你在'catch'塊中重新拋出異常...... –