读书人

这边的SqlDataReader 要不要显式关闭

发布时间: 2013-07-04 11:45:32 作者: rapoo

这里的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里面
[解决办法]
引用:
如上面回复内容://到这里,SqlDataReader 有没有被自动关闭?

没有
[解决办法]
加个临时变量,后再关闭也不迟呀,再说了,你不加变变编译后,编译器也会加你加个临时变量

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;
[解决办法]

引用:
to: hutao93 && wyd1520

显式关闭我知道,加临时变量关闭后再退出,我也知道。
上面实例中,出了 using 大括号,SqlDataReader赖以存在的数据连接SqlConnection都已关闭了,为什么SqlDataReader 还没自动关闭?

对于SqlDataReader ,如果永远没有显式关闭,它是不是永远占一块地儿?


跟站不站一块儿地儿没有关系。有些人说“释放——dispose()”的含义就是释放对象内存,这纯粹是误导初学者。

当你纠结所谓的“关闭”时,你要知道为什么要调用Dispose方法。如果没有必要调用,你就不应该去画蛇添足地去调用它。

这就是一个例子。这里的目的是及时调用那么SqlConnection类型对象的Dispose方法,根本不需要去调用SqlDataReader的Dispose方法。
[解决办法]
假设你调用Dispose方法,它也不会去搞什么“释放内存”的噱头。内存占用会在将来一次或者几次GC被调用时才会被释放。

另外,就算你不调用Dispose方法,那么当GC释放SqlConnection或者SqlDataReader对象时,也会去调用Dispose方法。而你的代码中根本没有必要为了调用Dispose方法而调用Dispose方法。

及时调用SqlConnection的Dispose方法的原因,是因为它的连接池管理的需要,避免在大量用户并发访问时遇到“连接池满”的异常,因此才需要在不再需要数据库逻辑连接时尽可能快地调用Dispose方法。这绝非有些人瞎说的什么“释放占地儿”的目的。

我建议你认真回忆下是谁给你建立的这个错误的概念。如果这是你的老师说的,那么很可能他就是个专门忽悠人的。
[解决办法]
ADO.NET中的所有对象都不需要显示调用Dispose方法,画蛇添足了
[解决办法]
看不懂,但是感觉很厉害的样子
[解决办法]
SqlDataReader 这个一般是在调用这个方法时,才关闭的
[解决办法]
引用:
加个临时变量,后再关闭也不迟呀,再说了,你不加变变编译后,编译器也会加你加个临时变量

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;


赞同

读书人网 >asp.net

热点推荐