0

我的業務層中有這樣的方法。如何使這些方法參數化?

public Boolean saveParty(Party ptObj) 
    { 
     string query1 = "EXEC insertToParty'" + ptObj.PTRegID + "','" + ptObj.PTName.Replace("'", "''") + "','" + ptObj.PTSymARR + "','" + ptObj.PTSymName + "','" + ptObj.elecRepCol + "','" + ptObj.PTSec + "','" + ptObj.phPri + "','" + ptObj.phSec + "','" + ptObj.bsAddress + "','" + ptObj.secAddress + "','" + ptObj.addedUser + "','" + ptObj.addedDate + "','" + ptObj.PTstatus + "'"; 
     return (new DataAccessLayer().executeNonQueries(query1)); 
    } 

在我的數據訪問層,我創建了這樣的非執行查詢。

public Boolean executeNonQueries(string query02) 
    { 
     Boolean flag = false; 
     SqlConnection con = null; 
     SqlCommand com = null; 
     try 
     { 
      con = new SqlConnection(DBConnect.makeConnection()); 
      con.Open(); 
      com = new SqlCommand(query02, con); 
      com.ExecuteNonQuery(); 
      flag = true; 
     } 
     catch (Exception ex) 
     { 
      flag = false; 
      throw ex; 
     } 
     finally 
     { 
      com.Dispose(); 
      con.Close(); 
     } 
     return flag; 
    } 

在我的數據庫連接層,我已經這樣實現。

 public static string makeConnection() 
    { 
     string con = ConfigurationManager.ConnectionStrings["MYDB.Properties.Settings.ConString"].ToString(); 
     return con; 
    } 

我在三個獨立的類中有這些方法。我想知道的是如何改變這些方法來使用參數化查詢,因爲我在這裏使用字符串連接而不改變圖層體系結構。我怎麼能做到這一點?

+1

永遠不要用'throw ex;'重新拋出一個異常,而只需調用'throw;'來釋放它。否則,您將丟失重新扔掉之前出現的堆棧跟蹤。 – juharr 2014-10-16 17:47:16

+2

只要你只傳遞一個字符串,你就卡住了。就我個人而言,我會擺脫那種通用和易受攻擊的方法executeNonQueries。如果需要保留它,我會創建一個重載,它接收一個可以在執行之前添加到命令中的通用參數列表。總的來說,最大的問題是你的圖層沒有任何接近正確分離的地方。你仍然在業務層做sql。你的Party對象應該有一個Save方法,而不是傳遞一個Party對象。 save方法應該調用數據層中的保存邏輯。 – 2014-10-16 17:50:57

+1

你可能想看看使用Dapper。它優雅地處理來自實體對象的參數映射,並擺脫您在'executeNonQuery'方法中使用的鍋爐板ADO.Net代碼。 – juharr 2014-10-16 17:51:21

回答

1

您的業務層沒有形成SQL字符串的業務。它應該關注域,並將持久性留給數據訪問層。如果可能的話,將這個職責完全轉移到數據訪問層。

如果項目中的實際情況阻止您將責任置於其所屬的位置,則可以考慮讓業務層使用參數佔位符傳遞SQL語句,以及包含每個參數名稱和參數值條目的字典。

在業務層

public Boolean saveParty(Party ptObj) 
{ 
    string query1 = "EXEC insertToParty @Id, @Name, etc"; 

    Dictionary<string, object) p = new Dictionary<string, object>(); 
    p.Add("@Id", ptObj.PTReqID); 
    p.Add("@Name", ptObj.PTName); 
    // etc. 

    return (new DataAccessLayer().executeNonQueries(query1)); 
} 

在數據訪問層,從詞典,例如添加參數

public Boolean executeNonQueries(string query02, Dictionary<string, object> parameters) 
{ 
    // Your existing code to setup connection 
    foreach (var param in dictionaryWithParametersAndValues) 
    { 
     com.AddWithValue(param.Key, param.Value); 
    } 
    com.ExecuteNonQuery(); 
    // Rest of your existing code 
} 
+0

可以通過字典字符串來保存屬性類型,如字節數組byte []。 ? – chathwind 2014-10-16 17:52:51

+0

是的,'Dictionary '。 – 2014-10-16 17:53:11

+0

@ EricJ我有點困惑。我如何傳遞業務層中的參數?以及如何使用該字典在DataAccess圖層中接收該圖像。 – chathwind 2014-10-16 17:59:50