这里的SqlDataReader 要不要显式关闭?//下面是我简化后的一个类,代码如下://想问的是,本类实例调用后,也就
这里的SqlDataReader 要不要显式关闭?
//下面是我简化后的一个类,代码如下:
//想问的是,本类实例调用后,也就是 using 大括号中 return 退出后,SqlConnection 肯定是自动关闭了,SqlDataReader 要不要显式关闭?
/// <summary>
/// 对用户表 W_USER 的一些操作
/// </summary>
public class W_User
{
public W_User()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public int selectNamePwd(string _name)
{
W_Conn c = new W_Conn();//连接方法另处已定义。
SqlConnection con = c.GetCon();
using (con)
{
SqlCommand cmd = new SqlCommand("pro_select_USER_Name", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@admin_name", SqlDbType.VarChar, 20).Value = _name;
con.Open();
SqlDataReader myDr = cmd.ExecuteReader();
if (myDr.Read()) return Convert.ToInt32(myDr["User_ID_INT"]);
else return 0;
}
}
}
[解决办法]你这样写的话就不要关闭了,如果是对象封装就要要关闭
[解决办法]关闭了你返回个屁啊
吧Reader 也写在using里面
[解决办法]没有
[解决办法]加个临时变量,后再关闭也不迟呀,再说了,你不加变变编译后,编译器也会加你加个临时变量
using(SqlDataReader myDr = cmd.ExecuteReader())
{
if (myDr.Read())
return Convert.ToInt32(myDr["User_ID_INT"]);
else
return 0;
}
或
SqlDataReader myDr = cmd.ExecuteReader();
int tmp=0;
if (myDr.Read())
tmp= Convert.ToInt32(myDr["User_ID_INT"]);
myDr.Close();
return tmp;
[解决办法]
跟站不站一块儿地儿没有关系。有些人说“释放——dispose()”的含义就是释放对象内存,这纯粹是误导初学者。
当你纠结所谓的“关闭”时,你要知道为什么要调用Dispose方法。如果没有必要调用,你就不应该去画蛇添足地去调用它。
这就是一个例子。这里的目的是及时调用那么SqlConnection类型对象的Dispose方法,根本不需要去调用SqlDataReader的Dispose方法。
[解决办法]假设你调用Dispose方法,它也不会去搞什么“释放内存”的噱头。内存占用会在将来一次或者几次GC被调用时才会被释放。
另外,就算你不调用Dispose方法,那么当GC释放SqlConnection或者SqlDataReader对象时,也会去调用Dispose方法。而你的代码中根本没有必要为了调用Dispose方法而调用Dispose方法。
及时调用SqlConnection的Dispose方法的原因,是因为它的连接池管理的需要,避免在大量用户并发访问时遇到“连接池满”的异常,因此才需要在不再需要数据库逻辑连接时尽可能快地调用Dispose方法。这绝非有些人瞎说的什么“释放占地儿”的目的。
我建议你认真回忆下是谁给你建立的这个错误的概念。如果这是你的老师说的,那么很可能他就是个专门忽悠人的。
[解决办法]ADO.NET中的所有对象都不需要显示调用Dispose方法,画蛇添足了
[解决办法]看不懂,但是感觉很厉害的样子
[解决办法]SqlDataReader 这个一般是在调用这个方法时,才关闭的
[解决办法]赞同