简洁示意代码如下:
/// 保护方法,打开数据库连接。
/// </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); } } }