專案開發中,累積可復用的工具類別能大幅提升開發效率。本文分享三個實戰驗證的 C# 工具類別:SQLHelper(資料存取封裝)、MyTool(DataTable 泛型轉換)與 MsgDiv(自動計時訊息提示控制項),附完整程式碼與使用範例。
ConfigurationManager 讀取,支援多環境部署ExecuteNonQuery、ExecuteDataReader、ExecuteDataTable、ExecuteScalar 四大操作using 區塊確保連線、命令、DataReader 正確釋放資源ExecuteScalar,自動處理 Commit/Rollbackpublic static class SQLHelper
{
static string Constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
public static int ExecuteNonQuery(string cmdTxt, params SqlParameter[] parames) { ... }
public static int ExecuteNonQuery(string cmdTxt, CommandType cmdType, params SqlParameter[] parames) { ... }
public static SqlDataReader ExecuteDataReader(string cmdTxt, params SqlParameter[] parames) { ... }
public static SqlDataReader ExecuteDataReader(string cmdTxt, CommandType cmdType, params SqlParameter[] parames) { ... }
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parames) { ... }
public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] parames) { ... }
public static object ExecuteScalar(string cmdTxt, params SqlParameter[] parames) { ... }
public static object ExecuteScalar(string cmdTxt, CommandType cmdType, params SqlParameter[] parames) { ... }
public static object ExecuteScalar(string cmdTxt, CommandType cmdType, SqlTransaction sqltran, params SqlParameter[] parames) { ... }
}
// 以 DataTable 繫結下拉選單
public DataTable LoadCombox()
{
string sql = "SELECT * FROM Grade";
return SQLHelper.ExecuteDataTable(sql);
}
透過反射自動比對 DataColumn.ColumnName 與 PropertyInfo.Name(不分大小寫),將 DataRow 快速映射為強型別實體集合,免除手工逐欄位賦值的繁瑣程式碼。
public List<T> DataTableToList<T>(DataTable dt)
{
if (dt == null) return null;
var list = new List<T>();
for (int i = 0; i < dt.Rows.Count; i++)
{
T entity = Activator.CreateInstance<T>();
var props = entity.GetType().GetProperties();
foreach (var prop in props)
{
int colIndex = -1;
for (int j = 0; j < dt.Columns.Count; j++)
if (dt.Columns[j].ColumnName.Equals(prop.Name, StringComparison.OrdinalIgnoreCase))
{ colIndex = j; break; }
if (colIndex >= 0)
prop.SetValue(entity, dt.Rows[i][colIndex] == DBNull.Value ? null : dt.Rows[i][colIndex]);
}
list.Add(entity);
}
return list;
}
// 傳統手工映射
foreach (DataRow row in dt.Rows) {
var grade = new Grade { GradeId = Convert.ToInt32(row["gradeid"]), GradeName = row["gradename"].ToString() };
list.Add(grade);
}
// 一行搞定
var tool = new MyTool();
list = tool.DataTableToList<Grade>(dt);
Label,可直接加入 Form、Panel、GroupBox 等容器Timer 計時自動隱藏,預設 3 秒可自訂MsgDivShow 提供「純顯示」、「指定秒數」、「帶回呼」、「指定秒數+回呼」四種模式public delegate void DGMsgDiv();
public class MsgDiv : Label
{
private Timer timerLable = new Timer();
private DGMsgDiv dgCallBack;
private int hiddenClick, countNumber = 3, constCountNumber = 3;
public MsgDiv() { InitallMsgDiv(7, 7); }
public MsgDiv(int x, int y) { InitallMsgDiv(x, y); }
private void InitallMsgDiv(int x, int y) { /* 樣式、事件、Timer 設定 */ }
public void AddToControl(Form form) { form.Controls.Add(this); }
public void AddToControl(GroupBox gb) { gb.Controls.Add(this); }
public void AddToControl(Panel p) { p.Controls.Add(this); }
public void MsgDivShow(string msg) { /* 基礎顯示 */ }
public void MsgDivShow(string msg, DGMsgDiv callback) { /* 帶回呼 */ }
public void MsgDivShow(string msg, int seconds) { /* 指定秒數 */ }
public void MsgDivShow(string msg, int seconds, DGMsgDiv callback) { /* 完整參數 */ }
public void MsgDivHidden() { /* 隱藏、停止計時、觸發回呼 */ }
}
private void Form1_Load(object sender, EventArgs e)
{
// 顯示「呵呵」3 秒後自動呼叫 Test() 彈出「哈哈」
msgDiv1.MsgDivShow("呵呵", 3, Test);
}
public void Test()
{
MessageBox.Show("哈哈");
}
這三個類別分別解決了資料存取標準化、資料實體映射自動化與UI 訊息提示元件化三大常見需求。直接納入專案共用函式庫,即可在後續開發中大幅減少重複造輪子的時間。