黑马程序员技术交流社区

标题: 关闭连接连接为什么要在这里关闭??求解答 [打印本页]

作者: 赵威    时间: 2013-4-29 16:31
标题: 关闭连接连接为什么要在这里关闭??求解答
            //获取输入的字符串和密码
            string strName = txtUserName.Text.Trim();
            string strPwd = txtPassword.Text.Trim();
            //定义连接字符串
            string connString="data source=127.0.0.1;initial catalog=itcast;integrated security=true";
            //定义连接变量conn
            using (SqlConnection conn = new SqlConnection(connString))
            {
                //定义Sql语句
                string sql = string.Format ("select userpwd from tblUser where username='{0}'",strName );
                //定义操作变量cmd,并调用函数传入Sql语句和连接conn
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    //打开连接
                    conn.Open();
                    //调用ExecuteScalar()方法,来返回一个单元格的值得(相当于根据键来找相对应的值)
                    string newStr=cmd.ExecuteScalar().ToString ();
                    //关闭连接
                    conn.Close();//这里需要遵循最晚连接,最早关闭,但为什么要在这里关闭,求高手解答????
                    //判断登录情况
                     if (strPwd == null)
                    {
                        MessageBox.Show("用户名不存在");
                    }
                    if (newStr == strPwd)
                    {
                        MessageBox.Show("登陆成功");
                    }
                    else
                    {
                        MessageBox.Show("用户名或密码错误");
                    }
                }
            }
连接和关闭要遵循最晚连接和最早关闭,但为什么要在此处关闭?求高手解答??


作者: 陈晖    时间: 2013-4-29 16:38
因为关闭上面的语句:string newStr=...
已经获得查询的结果,当然是这里最早关闭了。
不过你既然有了ustin语句块,那么就会自动释放资源。:)
作者: 清朗的晨风    时间: 2013-4-30 10:51
数据库连接,如果可以,最早关闭,数据的连接能力有限,使用完就立即关闭释放资源,不然以后做网站,服务器的数据库会卡死的。。。
我们老师说,数据库连接尽可能早的关闭,使用完后立即关闭,不是最晚关闭。
作者: 闫常国    时间: 2013-4-30 22:04
既然你的SQL语句已经执行完成,就没有继续连接着数据库的必要了,在这里关闭可以尽早的释放资源。不过既然你已经使用了Using,这里不关闭,他也会到执行完Using语句块时自动释放资源的。
作者: 张伟86    时间: 2013-5-1 02:00
楼主的意思可能是在问conn.Close();为何要放到那里?是不是一定要放到那个位置吧?
1、首先,这段代码调用数据库中的代码语句的只有一句 string newStr=cmd.ExecuteScalar().ToString ();,其他代码段没有语句再对数据库进行读取操作,那么在此句之后就可以关闭数据库连接了。代码作者对内存很珍惜,也遵循原则,就在这句之后执行了数据库关闭操作。
2、这段代码也可以置于其他位置,比如if代码块中,比如else块中,但是就需要每个代码块都加上这么一句,类似于
  1. if (strPwd == null)
  2.     {
  3.          MessageBox.Show("用户名不存在");
  4.          conn.Close();
  5.     }
  6.     if (newStr == strPwd)
  7.     {
  8.          MessageBox.Show("登陆成功");
  9.          conn.Close();
  10.     }
  11.     else
  12.     {
  13.          MessageBox.Show("用户名或密码错误");
  14.          conn.Close();
  15.     }  
复制代码
逻辑性不强,也较繁琐。
除此之外最好的位置在else之后的语句
  1. if (strPwd == null)
  2.     {
  3.          MessageBox.Show("用户名不存在");         
  4.     }
  5.     if (newStr == strPwd)
  6.     {
  7.          MessageBox.Show("登陆成功");        
  8.     }
  9.     else
  10.     {
  11.          MessageBox.Show("用户名或密码错误");         
  12.     }
  13.     conn.Close();
复制代码
条理也清楚,估计楼主也想到这个了。{:soso_e100:}
3、就是大家说的using块自动释放问题,就是不加close语句,也会在using块生命期结束时释放的。
总的来说,程序员自动释放内存是一种很好的习惯。比起C++语法来说,C#安全性在这里很有体现。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2