public static SqlDataReader GetReader(string sql, SqlParameter paras)
{
using (SqlConnection connection = new SqlConnection(SqlConnectionString))
{
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Add(paras);
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
public static User GetUserByLoginId(string loginId)
{
string sql = "select * from users where loginId=@LoginId";
int userStateId;
int userRoleId;
using (SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter("@LoginId", loginId)))
{
if (reader.Read())//在此发生异常
........
}
}
如果把以上蓝色的代码改为
try
{
SqlConnection connection = new SqlConnection(SqlConnectionString);
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Add(paras);
connection.Open();
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
则正确,综上,发现是由于 using语句引起的,因为using的特性--"当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。"在此处也就是说已经释放了所有的资源,包括connection、command这样当然不能的到打开状态的SqlDataReader对象!