首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SqlHelper 參數化執行存儲過程代碼詳細註釋解析

     編輯:程式設計綜合問答

代碼演示了使用 SqlHelper 執行帶輸入/輸出參數的存儲過程,並處理返回結果集。以下為逐行詳細註釋:

// 1. 定義存儲過程參數數組,共 2 個參數(索引 0 和 1,但代碼中用了 0 和 2,存在索引跳躍)
SqlParameter[] arParms = new SqlParameter[2];

// 2. 參數 0:輸入參數 @userid,值為 enamestr 變量
arParms[0] = new SqlParameter("@userid", enamestr);
arParms[0].Direction = ParameterDirection.Input; // 明確指定為輸入方向

// 3. 參數 1:輸出參數 @right,類型 VarChar 長度 1
// 注意:此處索引為 2,但數組長度只有 2(索引 0,1),實際運行會拋出 IndexOutOfRangeException
arParms[2] = new SqlParameter("@right", SqlDbType.VarChar, 1);
arParms[2].Direction = ParameterDirection.Output; // 指定為輸出方向

// 4. 執行存儲過程 p_uis_save,無返回結果集,僅通過輸出參數返回值
SqlHelper.ExecuteNonQuery(
    connectionString,           // 數據庫連接字符串
    CommandType.StoredProcedure, // 命令類型:存儲過程
    "p_uis_save",               // 存儲過程名稱
    arParms                     // 參數數組
);

// 5. 獲取輸出參數 @right 的值並轉為字符串
string oknot = Convert.ToString(arParms[2].Value);

// 6. 執行另一個存儲過程 p_sys_djget,返回 DataSet(含 DataTable 集合)
DataSet userds = SqlHelper.ExecuteDataset(
    connectionString,
    CommandType.StoredProcedure,
    "p_sys_djget",
    arParms  // 復用參數數組,注意:此處傳遞的參數可能不匹配新存儲過程定義
);

// 7. 取第一張表構建 DataView 便於篩選/排序
System.Data.DataTable table = userds.Tables[0];
System.Data.DataView view = new System.Data.DataView(table);

// 8. 判斷是否有數據行
if (view.Count > 0) {
    // 業務邏輯處理...
}

代碼中存在的問題(必須修復)

  1. 數組越界: arParms[2] 訪問索引 2,但數組長度為 2(最大索引 1)。應改為 new SqlParameter[3] 或調整索引為 1。
  2. 參數復用風險: 兩個不同存儲過程參數定義通常不同,建議分別定義參數數組。
  3. 資源釋放: DataSet、DataTable 用完應及時 Dispose(),或使用 using 塊(若 SqlHelper 內部未管理連接)。

最佳實踐建議

  • 使用 SqlCommand 原生 API 或成熟 ORM(Dapper/EF Core)替代舊式 SqlHelper。
  • 參數方向、類型、長度嚴格對應存儲過程定義。
  • 輸出參數執行後立即讀取,避免後續操作覆蓋。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved