Как сделать эти методы параметризованными?
У меня есть метод в моем бизнес-слое, как это.
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 ответ
Ваш бизнес-уровень не имеет бизнеса, формирующего строку 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
}