日期:2014-05-20  浏览次数:20440 次

sqlconnection关闭的时机,请问大家?

        //添加按钮
        public   void   AddClick(object   sender,EventArgs   e)
        {
    string   filename= " ";
   
    try
    {    
                AddData(ywkind,filename);//调用添加方法
complainDescriptionTxt.Text= " ";
yeWuAdviceTxt.Text= " ";
    }
    catch(Exception   ex)
    {
        string   errMsg= "System   is   wrong,it   is   "+ex.Message;
                errMsg   =   errMsg.Replace( "\r\n ", "\\r\\n ");
                errMsg   =   errMsg.Replace( " ' ", "\\ ' ");
                Response.Write(@ " <script> alert( ' "+errMsg+ " '); </script> ");
    }
        }

        //添加方法
        void   AddData(string   ywid,string   filename)
        {      
    string   connstr=ConfigurationManager.AppSettings[ "connectionStr "];
            SqlConnection   con=new   SqlConnection(connstr);
            con.Open();//打开
            SqlCommand   cmd=new   SqlCommand( "v3QCDataAdd ",con);
            cmd.CommandType=CommandType.StoredProcedure;
   
            SqlParameter   lastedid=new   SqlParameter( "@lastedid ",SqlDbType.VarChar,20);
            ……
   
            cmd.ExecuteNonQuery();
   
            con.Close();//关闭
        }
当我将第一次资料添加到数据时,即点击添加按钮后(输入窗口不关闭),再次填写数据点击添加时,此时数据是没有进入数据库里的,也不报错,为什么?我估计是sqlconnection关闭了,但是这个sqlconnection在什么时候关闭才好呢?因为打开sqlconnection多了,数据库连接经常会超时连接不进去。


------解决方案--------------------
你不是创建了一个新的实例并且打开了么?跟以前的连接“关闭了”没有关系。

你这里的问题纯粹是让人猜测错误语句在哪里,无法回答。你应该自己调试,单步跟踪执行和分析堆栈、变量,然后根据你调试结果来提问比较准确。

如果AddData负责打开连接,那么就应该负责关闭连接。你的程序只是初步达到了这个要求,当出现异常的时候,还不能确保关闭con连接,所以还不是很准确的。确保关闭连接,要使用finally或者using那样的结构化关键字来保证dispose或者close的执行。

如果AddData不负责打开连接,就不应该在内部负责创建和打开连接。

不要写出只管打开连接但是不负责关闭连接的方法,那才是造成“打开sqlconnection多了”的祸根。
------解决方案--------------------
如果AddData不负责打开连接,就不应该在内部负责创建和打开连接。
--> 如果AddData不负责打开连接,就不应该在内部负责关闭连接。

如果你使用DW写代码,那么你就要写程序去打印每一步的状态。你使用什么工具,都要调试。只是调试能力的高低不同而已。如果你没有抱着通过调试来自己发现底层机制的目的去开发程序,那么写程序就永远是业余的。