首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實用工具類別庫:SQLHelper、DataTable 轉 List 與自訂訊息控制項

     編輯:關於C語言

專案開發中,累積可復用的工具類別能大幅提升開發效率。本文分享三個實戰驗證的 C# 工具類別:SQLHelper(資料存取封裝)、MyTool(DataTable 泛型轉換)與 MsgDiv(自動計時訊息提示控制項),附完整程式碼與使用範例。

1. SQLHelper - 資料庫存取統一封裝

設計重點

  • 靜態類別,免實例化直接呼叫
  • 連線字串從 ConfigurationManager 讀取,支援多環境部署
  • 完整支援 ExecuteNonQuery、ExecuteDataReader、ExecuteDataTable、ExecuteScalar 四大操作
  • 所有方法皆提供「SQL 指令」與「預存程序」雙重多載
  • 善用 using 區塊確保連線、命令、DataReader 正確釋放資源
  • 含交易支援版 ExecuteScalar,自動處理 Commit/Rollback

核心程式碼結構

public 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);
}

2. MyTool - DataTable 轉泛型 List<T>

核心價值

透過反射自動比對 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);

3. MsgDiv - 可自動消失的訊息提示控制項

功能特色

  • 繼承 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 訊息提示元件化三大常見需求。直接納入專案共用函式庫,即可在後續開發中大幅減少重複造輪子的時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved