我发现我的代码库包含各种数据访问代码,其中我以两种不同的方式使用using语句.哪个是更好的方式,这两种方法有什么不同?在using语句中不实例化SqlConnection和SqlCommand可能引起的任何问题?忽略明显的不一致问题.
方法1:
public int SampleScalar(string query, CommandType queryType, SqlParameter[] parameters)
{
int returnValue = 0;
SqlConnection objConn = new SqlConnection(ConnString);
SqlCommand objCmd = new SqlCommand(query, objConn);
objCmd.CommandType = queryType;
if (parameters.Length > 0)
objCmd.Parameters.AddRange(parameters);
using (objConn)
{
using (objCmd)
{
objConn.Open();
try
{
returnValue = (int)objCmd.ExecuteScalar();
}
catch (SqlException e)
{
Errors.handleSqlException(e, objCmd);
throw;
}
}
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
方法2:
public int SampleScalar2(string query, CommandType queryType, SqlParameter[] parameters)
{
int returnValue = 0;
using (SqlConnection objConn = new SqlConnection(ConnString))
{
using (SqlCommand objCmd = new SqlCommand(query, objConn))
{
objConn.Open();
objCmd.CommandType = queryType;
if (parameters.Length > 0)
objCmd.Parameters.AddRange(parameters);
try
{
returnValue = (int)objCmd.ExecuteScalar();
}
catch (SqlException e)
{
Errors.handleSqlException(e, objCmd);
throw;
}
}
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
在第一个片段中,如果在IDisposable创建对象之后和开始使用之前发生任何异常,则将无法正确处理.在第二个实施中,没有这样的差距可能导致未发布的资源.
第一种方法可能出现的另一个问题是,您可以在处置后使用对象,这可能不会很好地结束.
您可能确保不会发生任何异常,也许您不是.一般来说,我永远不会使用第一种方法,因为我不相信自己(或任何其他人)永远不会在那个没有保护的空间中犯错误.如果不出意外,我需要花费时间和精力寻找非常密切的是肯定是什么都不能出差错.你也没有从使用那种不太安全的方法中获得任何好处.
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |