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

C#代码的数据库打开关闭有关问题

2013-04-20 
C#代码的数据库打开关闭问题public class DbHelperOleDb{private string connectionString string.Empty

C#代码的数据库打开关闭问题


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#
------解决方案--------------------


using(var connection = new Connection())
{
    connection.Open();
}

相当于

try
{
    var connection = new Connection();
    connection.Open();
}
finally
{
    connection.Close();
}
[解决办法]
可以关闭打开的连接.因为Using会调用OleDbConnection的IDispot接口.catch(System.Data.OleDb.OleDbException E)
{
       connection.Close();//这是一条无意义的代码
       throw new Exception(E.Message);
}

[解决办法]
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...

热点排行