我以分层方式设计了我的应用程序。我为每个接口和一个公共数据访问层都有一个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);
}
由于我的业务操作层不安全,我希望在此处使用参数化查询,我使用字符串连接来传递参数。任何人都可以提示我如何修改它吗?
答案 0 :(得分:3)
你可以稍微改变你的功能:
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);
}