public class DbHelperOleDb
    {
        private string connectionString = string.Empty;
        public DbHelperOleDb(string conn)
        {
            connectionString = conn;
        }        #region  执行简单SQL语句        /// <summary>
        /// 执行SQL语句,返回影响的记录数
        /// </summary>
        /// <param name="SQLString">SQL语句</param>
        /// <returns>影响的记录数</returns>
        public int ExecuteSql(string SQLString)
        {
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand(SQLString, connection))
                {
                    try
                    {
                        connection.Open();
                        int rows = cmd.ExecuteNonQuery();
                        return rows;
                    }
                    catch (System.Data.OleDb.OleDbException E)
                    {
                        connection.Close();
                        throw new Exception(E.Message);
                    }
                }
            }
        }        #endregion
}请问上述的C#代码,使用using方式来打开数据库,虽然可以用完后扔掉资源,我的问题是:ExecuteSql执行完了之后会保证关闭打开的数据库吗?(不出现异常的情况下),谢谢各位大神,本人这两天开始接触C#

解决方案 »

  1.   

    using(var connection = new Connection())
    {
        connection.Open();
    }相当于try
    {
        var connection = new Connection();
        connection.Open();
    }
    finally
    {
        connection.Close();
    }
      

  2.   

    可以关闭打开的连接.因为Using会调用OleDbConnection的IDispot接口.catch(System.Data.OleDb.OleDbException E)
    {
           connection.Close();//这是一条无意义的代码
           throw new Exception(E.Message);
    }
      

  3.   

    using里面的try catch都毫无意义(对于你的异常捕获没有任何特殊处理情况下)
      

  4.   

    在异常处理后面加个finally{  connection.Close();    }     ;把关闭数据库放在这个里面就可以了,不管程序是正常执行,还是出现异常处理,都会执行这条语句。
      

  5.   

    Code Original:
    //连接数据库的字符串.
                string strConn = ConfigurationManager.ConnectionStrings["ADONetTest.Properties.Settings.DBTestConnectionString"].ConnectionString;
                using (SqlConnection conn = new SqlConnection(strConn)) {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand()) {
                        cmd.CommandText = "Insert into T_Persons(FName) values('King')";
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("Done!");
                    }
                }
    Reflector Code:
    bool flag;
                string strConn = ConfigurationManager.ConnectionStrings["ADONetTest.Properties.Settings.DBTestConnectionString"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);
                try {
                    conn.Open();
                    SqlCommand cmd = conn.CreateCommand();
                    try {
                        cmd.CommandText = "Insert into T_Persons(FName) values('King')";
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("Done!");
                    }
                    finally {
                        flag = cmd == null;
                        if (!flag) {
                            ((IDisposable)cmd).Dispose();
                        }
                    }
                }
                finally {
                    flag = conn == null;
                    if (!flag) {
                        ((IDisposable)conn).Dispose();
                    }
                }
    这个微软还是会想到了,放心吧...两层的Try catch...