首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

这边的SqlDataReader 要不要显式关闭

2013-07-04 
这里的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里面
[解决办法]
引用:
如上面回复内容://到这里,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;


赞同

热点排行