呃,想问个问题一个数据库操作的类,里面当然有数据库的连接SqlConnection之类的东西这样是不是也应该实现IDispose接口来释放资源,而且不应该在捕捉到异常后释放资源...... 我还想问下,异步执行SQL命令平常用的多吗,例如SqlCommand.BeginExecuteNonQuery这个方法~~~~~希望各位可以帮忙解答一下,谢谢~~~~

解决方案 »

  1.   

    SqlConnection最好不要保存在类的实例变量中,如果保存了SqlConnection,就应该实现IDispose接口,并且用using来创建这个类的实例,确保Dispose方法被调用,另外,实现IDispose接口时应该调用SqlConnection.Dispose方法,
      

  2.   

    异步执行SQL命令会让程序变得很复杂,并且很难看懂,如果不是非常必要不要使用,好的程序是容易看懂的程序,简单的程序,复杂的程序是不好的程序,异步操作能改进界面,耗时操作时可以不会假死,如果你有某个操作很耗时,可以考虑用异步SQL命令,一般等待几秒十几秒的操作还是可以忍受的,用同步执行方式就可以了,
      

  3.   

    using(...){}
    using结束后会自动调用对象的Dispose方法来释放资源
    所以一般都是using(var c = new SqlConnection(...)){}
    另外,一般异步都直接开线程来做,还是看你帖子才知道有BeginExecuteNonQuery,回去研究一下
      

  4.   


    谢谢。
    还想问下
    “SqlConnection最好不要保存在类的实例变量中”是什么意思,如果是一个数据库操作的类,可能里面有
    有执行SQL指令之类的方法,方法里面应该会用到SqlConnection的
      

  5.   

    SqlConnection是一个轻量级对象(Light Object),使用时建议每次new,每次Open,不要一个对象从头用到底,系统会维持连接对象池,其次你可以在Thread中去取数据,采用异步的方式避免UI挂起,然后通过Try..Catch,捕捉SqlConnection在连接失败时产生的异常信息。
      

  6.   

    我的意思是不要放在类的成员变量中,因为这样SqlConnection的对象就不能用using来创建和释放,应该在方法中用到的时候用using()创建,用完后就在方法内释放,不要长期保存在类的变量中,
      

  7.   

    首先,数据库连接也是一种资源,所以最好是用的时候申请不用的时候立刻释放,记得看过一本国外ADO.net的书,作者都是一线的程序员,他们给过一个建议就是SqlConnection的作用域不要超过一个函数,也就是说每个需要用到SqlConnection的函数在函数体内自行申请连接用完后立即释放(conn.Dispose();),正确写法如下:
    using (SqlConnection conn = new SqlConnection(...))
    {
       //各种使用Conn
    }
    其次,类实现 IDisposable 接口并在接口函数Dispose()中释放所占用的资源。这样可以让我们在一个确定的时刻释放资源(非内存资源,比如文件句柄、数据库连接等等),同时一个好处就是我们定义的类就支持using语句了(就像我上面的写法)。这个可以参考一下MSDN的这篇文章IDisposable
      

  8.   

    conn.close()和conn.Dispose()有什么区别?
      

  9.   

    各位,我昨晚看了一个数据库操作的类,里面关于SqlConnection的使用跟你们说的一样,都是用到的时候
    才声明,
    可是那个类把SqlCommand,SqlDataAdapter这些都全部作为函数里面的一个临时的对象,这样当频繁地使用这些函数时是不是就产生了很多垃圾,这样是不是应该把SqlCommand、SqlDataAdapter这些变量作为类的成员变量
      

  10.   

    两者没有区别 Close方法其实就是调用Dispose方法
      

  11.   

    对于SqlConnection来说Close和Dispose的区别就是调用Close关闭连接后还可以通过调用Open打开,但是调用Dispose后就不能再用了。
      

  12.   


    看看下面这个http://developer.51cto.com/art/200909/151182.htm
      

  13.   

    当然可以,不过多线程的时候就有问题了。比如两个线程分别调用同一个数据操作类实例的两个不同的方法。每个方法都对SqlCommand等成员进行修改。那就有可能出错了。个人觉得像SqlCommand这些对象应该只跟一个数据库操作有关这样比较好。至于产生的垃圾应该不是主要问题,有垃圾回收器呢。如果内存比较紧张那就另当别论了。
      

  14.   

    各位,我这样实现IDisposable接口有问题吗 
             //打开数据库连接,注意在执行SQL指令前调用此方法
            private void Open()
            {
                if (!isOpen)
                {
                    sqlConnection = new SqlConnection(ConnectionString);
                    try
                    {
                        sqlConnection.Open();
                        sqlCommand = new SqlCommand(ConnectionString);
                        isOpen = true;
                    }
                    catch (InvalidOperationException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    catch (SqlException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }        //关闭数据库连接
            public void Close()
            {
                Dispose(false);
            }
            //当对象不再使用时应调用此方法
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }        private void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    //清理资源
                    if (disposing)
                    {
                        sqlCommand.Dispose();
                        DataAdapter.Dispose();
                    }                //关闭连接
                    if (isOpen && sqlConnection != null)
                    {
                        try
                        {
                            sqlConnection.Close();
                        }
                        catch (SqlException ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                    }
                    this.disposed = true;
                    isOpen = false;
                }
            }
      

  15.   

    一般来说,Command和DataAdapter没有分配非托管资源,没有必要Dispose,只有Connection需要Close或者Dispose,
      

  16.   

    可是看msdn上的 // Dispose(bool disposing) executes in two distinct scenarios.
            // If disposing equals true, the method has been called directly
            // or indirectly by a user's code. Managed and unmanaged resources
            // can be disposed.
            // If disposing equals false, the method has been called by the
            // runtime from inside the finalizer and you should not reference
            // other objects. Only unmanaged resources can be disposed.
            protected virtual void Dispose(bool disposing)
            {
                // Check to see if Dispose has already been called.
                if(!this.disposed)
                {
                    // If disposing equals true, dispose all managed
                    // and unmanaged resources.
                    if(disposing)
                    {
                        // Dispose managed resources.
                        component.Dispose();
                    }                // Call the appropriate methods to clean up
                    // unmanaged resources here.
                    // If disposing is false,
                    // only the following code is executed.
                    CloseHandle(handle);
                    handle = IntPtr.Zero;                // Note disposing has been done.
                    disposed = true;            }
            }
    好像是托管资源也要释放~~~~~
      

  17.   

    先Dispose();后Close()
    前者是释放资源,后者关闭连接;至于能否省略Dispose(),不清楚