Сделайте метод параметризованным

Я разработал свое приложение с многоуровневым подходом. У меня есть слой BusinessOP для каждого интерфейса и общий уровень доступа к данным. В моем слое доступа к данным у меня есть метод чтения данных, как это.

     public SqlDataReader executeQuerys(string query01)
    {
        SqlConnection con = null;
        SqlCommand com = null;
        try
        {
            con = new SqlConnection(DBConnect.makeConnection());
            con.Open();
            com = new SqlCommand(query01, con);
            return com.ExecuteReader(CommandBehavior.CloseConnection);
        }

        catch
        {
            com.Dispose();
            con.Close();
            throw;
        }

Это код для моего слоя DBConnection.

     public static string makeConnection()
    {
        string con = ConfigurationManager.ConnectionStrings["MyDB.Properties.Settings.ConString"].ToString();
        return con;
    }

На моем бизнес-уровне у меня есть такие методы, каждый из которых вызывает определенную хранимую процедуру.

     public SqlDataReader getLGDivID(string divName)
    {
        string query = "EXEC getLGDivID'" + divName + "'";
        return new DataAccessLayer().executeQuerys(query);
    }

Поскольку мой уровень бизнес-операций небезопасен, я хочу, чтобы он имел здесь параметризованный запрос. Я использую конкатенацию строк для передачи параметров. Может кто-нибудь намекнуть мне, как это изменить?

1 ответ

Решение

Вы можете немного изменить свою функцию:

public SqlDataReader executeQuerys(string query01, string paramName, string value)
{
    SqlConnection con = null;
    SqlCommand com = null;
    try
    {
        con = new SqlConnection(DBConnect.makeConnection());
        con.Open();
        com = new SqlCommand(query01, con);
        com.Parameters.AddWithValue(paramName, value);
        com.Dispose();
        con.Close();
    }
    catch
    {
        com.Dispose();
        con.Close();
        throw;
    }
   return com.ExecuteReader(CommandBehavior.CloseConnection);
}

затем использовать его:

public SqlDataReader getLGDivID(string divName)
{
    string query = "EXEC getLGDivID @divName";
    return new DataAccessLayer().executeQuerys(query, "@divName", divName);
}

РЕДАКТИРОВАТЬ:

Как @silvermind указал, что вы должны утилизировать ваше соединение должным образом. То, как вы сейчас это сделаете, будет уничтожать соединение только тогда, когда вы поймаете исключение.

Это плохо, использовать IDisposable, например:

public SqlDataReader executeQuerys(string query01, string paramName, string value)
{
    using (SqlConnection con = new SqlConnection(DBConnect.makeConnection()))
    {
        try
        {
            con.Open();
            com = new SqlCommand(query01, con);
            com.Parameters.AddWithValue(paramName, value);
        }
        catch(SqlException ex)
        {
            //Handle the exceptio
            //no need to dispose connection manually
            //using statement will take care of that
        }
    }
    return com.ExecuteReader(CommandBehavior.CloseConnection);
}
Другие вопросы по тегам