Как сделать эти методы параметризованными?

У меня есть метод в моем бизнес-слое, как это.

    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
}
Другие вопросы по тегам