我的业务层中有这样的方法。如何使这些方法参数化?
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