我的業務層中有這樣的方法。如何使這些方法參數化?
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;
}
我在三個獨立的類中有這些方法。我想知道的是如何改變這些方法來使用參數化查詢,因爲我在這裏使用字符串連接而不改變圖層體系結構。我怎麼能做到這一點?
永遠不要用'throw ex;'重新拋出一個異常,而只需調用'throw;'來釋放它。否則,您將丟失重新扔掉之前出現的堆棧跟蹤。 – juharr 2014-10-16 17:47:16
只要你只傳遞一個字符串,你就卡住了。就我個人而言,我會擺脫那種通用和易受攻擊的方法executeNonQueries。如果需要保留它,我會創建一個重載,它接收一個可以在執行之前添加到命令中的通用參數列表。總的來說,最大的問題是你的圖層沒有任何接近正確分離的地方。你仍然在業務層做sql。你的Party對象應該有一個Save方法,而不是傳遞一個Party對象。 save方法應該調用數據層中的保存邏輯。 – 2014-10-16 17:50:57
你可能想看看使用Dapper。它優雅地處理來自實體對象的參數映射,並擺脫您在'executeNonQuery'方法中使用的鍋爐板ADO.Net代碼。 – juharr 2014-10-16 17:51:21