代碼演示了使用 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) {
// 業務邏輯處理...
}
arParms[2] 訪問索引 2,但數組長度為 2(最大索引 1)。應改為 new SqlParameter[3] 或調整索引為 1。DataSet、DataTable 用完應及時 Dispose(),或使用 using 塊(若 SqlHelper 內部未管理連接)。SqlCommand 原生 API 或成熟 ORM(Dapper/EF Core)替代舊式 SqlHelper。