主要封裝為MySqlHelper類
namespace CiWong.LearningLevelApi.MySqlHelp
{
/// <summary>
/// MySqlHelper 類是基於.net框架開發的數據庫操作類
/// </summary>
public class MySqlHelper
{
#region 緩存Hashtable
// 存儲緩存參數的Hashtable
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
#endregion
#region 重載+1 獲取連接字符串
/// <summary>
/// 重載+1 獲取連接字符串 [GetStrCon()]
/// </summary>
/// <returns>連接字符串(如果配置文件中無[SQL]名稱的連接字符串,則拋出異常)</returns>
public static string GetStrCon()
{
try
{
string CONN_STRING = ConfigurationManager.ConnectionStrings["QuesContext"].ConnectionString;
return CONN_STRING;
}
catch (Exception ex)
{
Console.WriteLine(string.Format("配置文件中沒有[SQL]名稱的connectionStrings!錯誤原因:{0}", ex.ToString()));
throw;
}
}
#endregion
#region 重載+2 獲取連接字符串
/// <summary>
/// 重載+2 獲取連接字符串 [GetStrCon(string strConfig)]
/// 如果配置文件中有strConfig為名稱的連接字符串,則
/// 獲取它的內容
/// 如果沒有,則默認strConfig為連接字符串
/// </summary>
/// <param name="strConfig">配置文件中連接字符串的名稱</param>
/// <returns>連接字符串</returns>
public static string GetStrCon(string strConfig)
{
string CONN_STRING = string.Empty;
if (ConfigurationManager.ConnectionStrings[strConfig] != null)
CONN_STRING = ConfigurationManager.ConnectionStrings[strConfig].ConnectionString;
else
CONN_STRING = strConfig;
return CONN_STRING;
}
#endregion
#region 重載+1 創建連接對象 [GetConn()]
/// <summary>
/// 重載+1 返回 conn連接對象 [GetConn()]
/// </summary>
/// <returns> MySqlConnection </returns>
public static MySqlConnection GetConn()
{
try
{
return new MySqlConnection(GetStrCon());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+2 創建連接對象 [GetConn()]
/// <summary>
/// 重載+2 返回 conn連接對象 [GetConn()]
/// 如果配置文件中有strConfig名稱的連拉字符串,則
/// 獲取它的內容
/// 如果沒有,則默認strConfig為連接字符串
/// </summary>
/// <param name="strConfig">配置文件中連接字符串的名稱</param>
/// <returns> MySqlConnection </returns>
public static MySqlConnection GetConn(string strConfig)
{
try
{
return new MySqlConnection(GetStrCon(strConfig));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 關閉連接[CloseConn(...)]
/// <summary>
/// 關閉 conn連接對象
/// </summary>
/// <param name="conn">連接對象</param>
public static void CloseConn(MySqlConnection conn)
{
if (conn.State != ConnectionState.Closed)
conn.Close();
}
#endregion
#region 清空與指定連接相關的連接池
/// <summary>
/// 清空與指定連接相關的連接池 [ClosePool(MySqlConnection conn)]
/// </summary>
public static void ClosePool(MySqlConnection conn)
{
MySqlConnection.ClearPool(conn);
}
#endregion
#region 清空所有連接池
/// <summary>
/// 清空所有連接池 [ClosePool()]
/// </summary>
public static void ClosePool()
{
MySqlConnection.ClearAllPools();
}
#endregion
#region 返回MySqlCommand對象[GetCmd(...)]
/// <summary>
/// 返回MySqlCommand對象
/// </summary>
/// <param name="conn">conn 連接對象</param>
/// <param name="trans">事物對象</param>
/// <param name="cmdType">SQL 執行的類型</param>
/// <param name="cmdText">SQL 執行語句</param>
/// <param name="cmdParms">MySqlParameter[] 對象</param>
/// <returns> 返回comm 對象</returns>
public static MySqlCommand GetCmd(MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandType = cmdType;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
if (cmdParms != null)
{
foreach (MySqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
return cmd;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+1 通過連接字符串,執行SqlCommand(不返回結果集)[ExecuteNonQuery(...)]
/// <summary>
/// 重載+1 通過連接字符串,執行SqlCommand(不返回結果集)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="connString">為MySqlConnection對象提供:一個有效的連接字符串</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>執行命令受影響的記錄條數</returns>
public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
MySqlCommand cmd = new MySqlCommand();
using (MySqlConnection conn = new MySqlConnection(connString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.Dispose();
return val;
}
}
catch (Exception ex)
{
//引發異常,沒有記錄受影響
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+2 通過存在的MySqlConnection對象,執行MySqlCommand(不返回結果集)[ExecuteNonQuery(...)]
/// <summary>
/// 重載+2 通過存在的MySqlConnection對象,執行MySqlCommand(不返回結果集)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="conn">一個已經存在的SqlConnection對象</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>執行命令受影響的記錄條數</returns>
public static int ExecuteNonQuery(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.Dispose();
return val;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
//引發異常,沒有記錄受影響
throw;
}
finally
{
conn.Close();
}
}
#endregion
#region 重載+3 通過存在的 MySqlTransaction,執行MySqlCommand(不返回結果集)[ExecuteNonQuery(...)]
/// <summary>
/// 重載+3 通過存在的 MySqlTransaction,執行MySqlCommand(不返回結果集)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="trans">一個已經存在的 trans</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>執行命令受影響的記錄條數</returns>
public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, cmdParms);
int val = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.Dispose();
return val;
}
catch (Exception ex)
{
//引發異常,沒有記錄受影響
Console.WriteLine(ex.ToString());
throw;
}
finally
{
trans.Connection.Close();
}
}
#endregion
#region 重載+1 通過連接字符串,執行MySqlCommand(返回結果集) [ExecuteDataSet(...)]
/// <summary>
/// 重載+1 通過連接字符串,執行MySqlCommand(返回結果集)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// DataSet ds = ExecuteDataSet(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="connString">為MySqlConnection對象提供:一個有效的連接字符串</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>返回一個結果集:DataSet對象</returns>
public static DataSet ExecuteDataSet(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
DataSet ds = new DataSet();
//使用一個異常,如果發生異常,則將連接關閉
try
{
using (MySqlConnection conn = new MySqlConnection(connString))
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
MySqlDataAdapter adp = new MySqlDataAdapter(cmd);
adp.Fill(ds);
cmd.Parameters.Clear();
cmd.Dispose();
return ds;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand(返回結果集) [ExecuteDataSet(...)]
/// <summary>
/// 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand(返回結果集)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// DataSet ds = ExecuteDataSet(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="conn">一個已經存在的MySqlConnection對象</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>返回一個結果集:DataSet對象</returns>
public static DataSet ExecuteDataSet(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
DataSet ds = new DataSet();
//使用一個異常,如果發生異常,則將連接關閉
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
MySqlDataAdapter adp = new MySqlDataAdapter(cmd);
adp.Fill(ds);
cmd.Parameters.Clear();
cmd.Dispose();
return ds;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
finally
{
conn.Close();
}
}
#endregion
#region 重載+1 通過連接字符串,執行MySqlCommand(返回結果集的一個MySqlDataReader對象)[ExecuteReader(...)]
/// <summary>
/// 重載+1 通過連接字符串,執行MySqlCommand(返回結果集的一個MySqlDataReader對象)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="connString">為MySqlConnection對象提供:一個有效的連接字符串</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>包含結果集的一個:MySqlDataReader對象</returns>
public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
MySqlConnection conn = new MySqlConnection(connString);
//使用一個異常,如果發生異常,則將連接關閉
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
cmd.Dispose();
return rdr;
}
catch (Exception ex)
{
CloseConn(conn);
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand(返回結果集的一個MySqlDataReader對象) [ExecuteReader(...)]
/// <summary>
/// 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand(返回結果集的一個MySqlDataReader對象)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// MySqlDataReader r = ExecuteReader(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="conn">一個已經存在的SqlConnection對象</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>包含結果集的一個:MySqlDataReader對象</returns>
public static MySqlDataReader ExecuteReader(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
//使用一個異常,如果發生異常,則將連接關閉
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
cmd.Dispose();
return rdr;
}
catch (Exception ex)
{
CloseConn(conn);
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+1 通過連接字符串,執行MySqlCommand [ExecuteScalar(...)]
/// <summary>
/// 重載+1 通過連接字符串,執行MySqlCommand(返回第一條記錄的第一列的值,一般是返回匯總值等;如:select max(id) from userTab)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="connString">為MySqlConnection對象提供:一個有效的連接字符串</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>返回一個對象:如果要使用具體的值,需要使用Convert.To{Type}進行轉換</returns>
public static object ExecuteScalar(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
MySqlCommand cmd = new MySqlCommand();
using (MySqlConnection conn = new MySqlConnection(connString))
{
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
cmd.Dispose();
return val;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand [ExecuteScalar(...)]
/// <summary>
/// 重載+2 通過已經存在的MySqlConnection對象,執行MySqlCommand(返回第一條記錄的第一列的值,一般是返回匯總值等;如:Select max(ColumnName) From TableName)
/// 利用提供的參數值
/// </summary>
/// <remarks>
/// e.g.:
/// Object obj = ExecuteScalar(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
/// </remarks>
/// <param name="conn">一個已經存在的SqlConnection對象</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本</param>
/// <param name="cmdParms">執行命令的參數列表</param>
/// <returns>返回一個對象:如果要使用具體的值,需要使用Convert.To{Type}進行轉換</returns>
public static object ExecuteScalar(MySqlConnection conn, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
{
try
{
MySqlCommand cmd = new MySqlCommand();
PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
cmd.Dispose();
return val;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
finally
{
CloseConn(conn);
}
}
#endregion
#region 將參數數組增加至Hashtable,緩存在緩沖區 [CacheParameters(...)]
/// <summary>
/// 存儲:將參數數組增加至緩沖區
/// </summary>
/// <param name="cacheKey">緩沖區參數的鍵名</param>
/// <param name="cmdParms">緩沖區對應鍵名的參數值</param>
public static void CacheParameters(string cacheKey, params MySqlParameter[] cmdParms)
{
parmCache[cacheKey] = cmdParms;
}
#endregion
#region 從緩沖區得到Hashtable中的參數列表的值 [GetCachedParameters(...)]
/// <summary>
/// 檢索值:得到緩沖區中的參數列表值
/// </summary>
/// <param name="cacheKey">緩沖區參數的鍵名</param>
/// <returns>緩沖區對應鍵名的參數值</returns>
public static MySqlParameter[] GetCachedParameters(string cacheKey)
{
//獲取 key 為cachekey 的值 parmCache[參數化SQL語句]=parameter[]數據組對象
MySqlParameter[] cachedParms = (MySqlParameter[])parmCache[cacheKey];
//如果不存在 則返回為空
if (cachedParms == null)
return null;
//反之 Hashtable表中存在 key為cacheky 的對象則返回 他的 副本 對象 par[]
MySqlParameter[] clonedParms = new MySqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (MySqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
#endregion
#region 執行預定義Command對象[PrepareCommand(...)]
/// <summary>
/// 要執行:預定義Command對象(PrepareCommand)
/// </summary>
/// <param name="cmd">MySqlCommand 對象</param>
/// <param name="conn">MySqlConnection 對象</param>
/// <param name="trans">MySqlTransaction 對象</param>
/// <param name="cmdType">命令類別:存儲過程、文本字符串等</param>
/// <param name="cmdText">存儲過程名稱或SQL命令文本,如:select * from UserTab</param>
/// <param name="cmdParms">Command對象需要使用的參數列表</param>
public static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
{
try
{
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 (MySqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
#endregion
#region 提交事務 [TransactionCommit(...)]
/// <summary>
/// 提交事務
/// </summary>
/// <param name="trans">事務</param>
public static void TransactionCommit(MySqlTransaction trans)
{
trans.Commit();
}
#endregion
#region 回滾事務 [TransactionRollback(...)]
/// <summary>
/// 回滾事務
/// </summary>
/// <param name="trans">事務</param>
public static void TransactionRollback(MySqlTransaction trans)
{
trans.Rollback();
}
#endregion
}
}
