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

ASP.NET 呼叫存儲過程新解:封裝通用輔助類簡化代碼

     編輯:關於ASP.NET

傳統呼叫存儲過程代碼冗長、重複。本文提出封裝 SqlHelper 靜態類,統一處理參數、連線、執行邏輯,大幅減少樣板代碼,並支援三類存儲過程:回傳結果集、回傳標量值、無回傳值 (行為型)。

存儲過程三類型

通用 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 中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型回傳典型用途
結果集型DataSet/DataTable查詢清單、報表
標量型單一值 (int, string...)取得新 ID、統計筆數、驗證結果
行為型int (影響列數)Insert/Update/Delete、批次作業