当前位置: 代码迷 >> ASP.NET >> 请注意:这不是个玩笑!查了三天资料也没有想明白的一个关于数据库连接的简单有关问题(高分!)
  详细解决方案

请注意:这不是个玩笑!查了三天资料也没有想明白的一个关于数据库连接的简单有关问题(高分!)

热度:4063   发布时间:2013-02-25 00:00:00.0
请注意:这不是个玩笑!查了三天资料也没有想明白的一个关于数据库连接的简单问题(高分求助!!!)
简洁示意代码如下:
/// 保护方法,打开数据库连接。
/// </summary>
protected void Open() 
{
if (Connection == null)
{
Connection = new SqlConnection(ConnectionString);
}
if (Connection.State.Equals(ConnectionState.Closed))
{
Connection.Open();
}
}

/// <summary>
/// 公有方法,关闭数据库连接。
/// </summary>
public void Close() 
{
if (Connection != null)
Connection.Close();
}

/// <summary>
/// 公有方法,释放资源。
/// </summary>
public void Dispose() 
{
// 确保连接被关闭
if (Connection != null) 
{
Connection.Dispose();
Connection = null;
}
}
public DataSet GetDataSet(String SqlString)
{
Open();
SqlDataAdapter adapter = new SqlDataAdapter(SqlString,Connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset);
Close();
return dataset;
}

问题一:
  1:代开一个数据库连接时为什么不用我们平常的conn.open()方法,而是采用了判断?
if (Connection == null)
{
Connection = new SqlConnection(ConnectionString);
}
  2:如果连接为空,创建一个新的连接。
if (Connection.State.Equals(ConnectionState.Closed))
{
Connection.Open();
}
  3:如果连接已经关闭,那么打开一个新的连接。这样的判断有有什么好处?
  4:另外会不会出现连接已经使用的情况,如果会出现,为什么上面的判断没有涉及到这里?




问题二:
public void Close() 
{
if (Connection != null)
Connection.Close();
}
  1:关闭连接时为什么要先判断连接不为空才关闭?
  2:直接关闭不行?


问题三:释放资源部分:
public void Dispose() 
{
// 确保连接被关闭
if (Connection != null) 
{
Connection.Dispose();
Connection = null;
}
}
  1:Dispose()是不是释放资源的方法?
  2:为什么先判断连接不为空,再释放资源,再设置连接为空?顺序改为:不为空?设置为空-释放资源 这样可不可以。
  3:确保关闭过数据库连接的情况下,还有没有必要释放资源。
  4:释放资源一般用在什么情况下,是不是点击“退出”按钮时,清楚session,释放资源?有没有在其他地方用的,举个例子。

------解决方案--------------------------------------------------------
C# code
 
问题一:
  1:代开一个数据库连接时为什么不用我们平常的conn.open()方法,而是采用了判断?//这样可以在使用中减少异常的发生
if (Connection == null)
{
Connection = new SqlConnection(ConnectionString);
}
  2:如果连接为空,创建一个新的连接。
if (Connection.State.Equals(ConnectionState.Closed))
{
Connection.Open();
}
  3:如果连接已经关闭,那么打开一个新的连接。这样的判断有有什么好处?//如果关闭了,当然要重新连接阿……
  4:另外会不会出现连接已经使用的情况,如果会出现,为什么上面的判断没有涉及到这里?//代码中为:如果关闭则打开连接,如果已经打开则不作任何操作


问题二:
public void Close()
{
if (Connection != null)
Connection.Close();
}
  1:关闭连接时为什么要先判断连接不为空才关闭?//因为不能确定你是在什么时候调用CLose()方法,如果你没有实例化Connection,那么你Close的时候就会产生异常
  2:直接关闭不行?//见上


问题三:释放资源部分:
public void Dispose()
{
// 确保连接被关闭
if (Connection != null)
{
Connection.Dispose();
Connection = null;
}
}
  1:Dispose()是不是释放资源的方法?//是的,手动释放资源
  2:为什么先判断连接不为空,再释放资源,再设置连接为空?顺序改为:不为空?设置为空-释放资源  这样可不可以。//道理同CLose()方法
  3:确保关闭过数据库连接的情况下,还有没有必要释放资源。//可以不必释放
  4:释放资源一般用在什么情况下,是不是点击“退出”按钮时,清楚session,释放资源?有没有在其他地方用的,举个例子。//手动Dispose一般用在数据库连接,文件流等的操作。

------解决方案--------------------------------------------------------
C# code
    public abstract class SqlHelper {        //Database connection strings        public static readonly string ConnectionStringLocalTransaction = ConfigurationManager.ConnectionStrings["SQLConnString1"].ConnectionString;        public static readonly string ConnectionStringInventoryDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString2"].ConnectionString;        public static readonly string ConnectionStringOrderDistributedTransaction = ConfigurationManager.ConnectionStrings["SQLConnString3"].ConnectionString;        public static readonly string ConnectionStringProfile = ConfigurationManager.ConnectionStrings["SQLProfileConnString"].ConnectionString;                        // Hashtable to store cached parameters        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());        public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            using (SqlConnection conn = new SqlConnection(connectionString)) {                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);                int val = cmd.ExecuteNonQuery();                cmd.Parameters.Clear();                return val;            }        }        public static int ExecuteNonQuery(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);            int val = cmd.ExecuteNonQuery();            cmd.Parameters.Clear();            return val;        }        public static int ExecuteNonQuery(SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);            int val = cmd.ExecuteNonQuery();            cmd.Parameters.Clear();            return val;        }        public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            SqlConnection conn = new SqlConnection(connectionString);            // we use a try/catch here because if the method throws an exception we want to             // close the connection throw code, because no datareader will exist, hence the             // commandBehaviour.CloseConnection will not work            try {                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);                cmd.Parameters.Clear();                return rdr;            }            catch {                conn.Close();                throw;            }        }        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            using (SqlConnection connection = new SqlConnection(connectionString)) {                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);                object val = cmd.ExecuteScalar();                cmd.Parameters.Clear();                return val;            }        }        public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {            SqlCommand cmd = new SqlCommand();            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);            object val = cmd.ExecuteScalar();            cmd.Parameters.Clear();            return val;        }        public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {            parmCache[cacheKey] = commandParameters;        }        public static SqlParameter[] GetCachedParameters(string cacheKey) {            SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];            if (cachedParms == null)                return null;            SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];            for (int i = 0, j = cachedParms.Length; i < j; i++)                clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();            return clonedParms;        }        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {            if (conn.State != ConnectionState.Open)                conn.Open();            cmd.Connection = conn;            cmd.CommandText = cmdText;            if (trans != null)                cmd.Transaction = trans;            cmd.CommandType = cmdType;            if (cmdParms != null) {                foreach (SqlParameter parm in cmdParms)                    cmd.Parameters.Add(parm);            }        }    }
  相关解决方案