我的业务层中有这样的方法。
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;
}
在我的DataBase连接层中,我已经实现了这样的功能。
public static string makeConnection()
{
string con = ConfigurationManager.ConnectionStrings["MYDB.Properties.Settings.ConString"].ToString();
return con;
}
我将这些方法分为三个单独的类。我想知道的是如何更改这些方法以使用参数化查询,因为我在这里使用字符串连接而不更改层架构。我怎么能实现呢?
答案 0 :(得分: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
}