Сделайте метод параметризованным
Я разработал свое приложение с многоуровневым подходом. У меня есть слой 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);
}