| 類型 | 回傳 | 典型用途 |
| 結果集型 | DataSet/DataTable | 查詢清單、報表 |
| 標量型 | 單一值 (int, string...) | 取得新 ID、統計筆數、驗證結果 |
| 行為型 | int (影響列數) | Insert/Update/Delete、批次作業 |
通用 SqlHelper 實作 (C#)
public static class SqlHelper
{
private static string ConnStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
// 1. 執行查詢,回傳 DataTable
public static DataTable ExecuteDataTable(string procName, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
using (SqlCommand cmd = new SqlCommand(procName, conn) { CommandType = CommandType.StoredProcedure })
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
}
// 2. 執行標量查詢
public static T ExecuteScalar(string procName, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
using (SqlCommand cmd = new SqlCommand(procName, conn) { CommandType = CommandType.StoredProcedure })
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
conn.Open();
object val = cmd.ExecuteScalar();
return val == null || val == DBNull.Value ? default(T) : (T)val;
}
}
// 3. 執行非查詢 (Insert/Update/Delete)
public static int ExecuteNonQuery(string procName, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
using (SqlCommand cmd = new SqlCommand(procName, conn) { CommandType = CommandType.StoredProcedure })
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
// 4. 輸出參數支援
public static int ExecuteNonQueryWithOutput(string procName, out object outputValue, params SqlParameter[] parameters)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
using (SqlCommand cmd = new SqlCommand(procName, conn) { CommandType = CommandType.StoredProcedure })
{
if (parameters != null) cmd.Parameters.AddRange(parameters);
conn.Open();
int rows = cmd.ExecuteNonQuery();
outputValue = cmd.Parameters["@ReturnValue"]?.Value; // 約定輸出參數名
return rows;
}
}
}
使用範例
// 結果集型
DataTable dt = SqlHelper.ExecuteDataTable("usp_GetUsersByDept", new SqlParameter("@DeptId", 5));
// 標量型
int newId = SqlHelper.ExecuteScalar("usp_InsertOrder", new SqlParameter("@UserId", 10), new SqlParameter("@Total", 99.9m));
// 行為型
int rows = SqlHelper.ExecuteNonQuery("usp_UpdateStock", new SqlParameter("@ProductId", 100), new SqlParameter("@Qty", -5));
// 輸出參數
object outVal;
rows = SqlHelper.ExecuteNonQueryWithOutput("usp_Transfer", out outVal,
new SqlParameter("@FromAcc", 1), new SqlParameter("@ToAcc", 2), new SqlParameter("@Amt", 500),
new SqlParameter("@ReturnValue", SqlDbType.Int) { Direction = ParameterDirection.Output });
優勢總結
- 連線自動開關、
using 確保資源釋放。
- 參數陣列傳遞,呼叫端極度精簡。
- 泛型
ExecuteScalar 強型別回傳,避免拆箱轉換。
- 易於擴充:交易支援、重試邏輯、效能記錄皆可集中在 Helper 中。
- 上一篇文章: ASP.NET MultiView 與 GridView:JavaScript 彈出視窗雙向傳值實戰
- 下一篇文章: 自訂 ASP.NET CheckBox 控制項設計思路:屬性延伸與 Render 覆寫
Copyright ©
程式碼之家 All Rights Reserved