如何利用带双输入参数的存储过程在GridView展示数据及修正C#调用
解决Oracle存储过程参数传递与GridView数据绑定问题
咱们先梳理下你代码里的几个关键错误,再一步步修正,帮你顺利把存储过程的数据展示到GridView里:
代码里的核心问题
- Oracle参数命名错误:Oracle不使用
@前缀标识参数,你写的@frm_date、@ p_cur(还多了空格)都是无效的,必须和存储过程里的参数名完全一致:frm_date、to_date1、p_cur。 - 日期类型转换不严谨:直接把
string类型的日期赋值给OracleDbType.Date参数,很容易引发格式解析异常,应该先把字符串转成DateTime类型。 - 输出游标参数未指定类型:输出游标
p_cur需要明确设置OracleDbType.RefCursor,不然ADO.NET没法正确识别这个输出参数。 - 参数配置顺序错误:你在添加输出参数前就设置了方向,应该先创建参数、指定类型,再配置方向。
修正后的完整代码
public DataTable retdt1(string frmdate, string todate) { DataTable dt = new DataTable(); try { // 先校验并转换日期格式,推荐用TryParseExact指定固定格式,避免区域差异问题 if (!DateTime.TryParseExact(frmdate, "yyyy-MM-dd", null, System.Globalization.DateTimeStyles.None, out DateTime fromDate) || !DateTime.TryParseExact(todate, "yyyy-MM-dd", null, System.Globalization.DateTimeStyles.None, out DateTime toDate)) { throw new ArgumentException("日期格式不正确,请使用yyyy-MM-dd格式"); } // 用using自动释放资源,比手动Dispose更安全简洁 using (OracleConnection con = new OracleConnection("你的数据库连接字符串")) using (OracleCommand objCmd = new OracleCommand("AGENCY_STATE_REPORT", con)) { objCmd.CommandType = CommandType.StoredProcedure; // 添加输入日期参数 objCmd.Parameters.Add("frm_date", OracleDbType.Date).Value = fromDate; objCmd.Parameters.Add("to_date1", OracleDbType.Date).Value = toDate; // 添加并配置输出游标参数 OracleParameter outputCursor = new OracleParameter("p_cur", OracleDbType.RefCursor); outputCursor.Direction = ParameterDirection.Output; objCmd.Parameters.Add(outputCursor); using (OracleDataAdapter dap = new OracleDataAdapter(objCmd)) { dap.Fill(dt); } return dt.Rows.Count > 0 ? dt : null; } } catch (Exception ex) { HttpContext.Current.Response.Write("查询出错:" + ex.Message); throw; // 保留异常栈信息,方便上层排查问题 } }
绑定到GridView的步骤
获取到正确的DataTable后,在页面后台代码(比如Page_Load事件)里完成绑定即可:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 这里可以替换为从TextBox等控件获取用户输入的日期 string inputFromDate = "2024-01-01"; string inputToDate = "2024-06-30"; DataTable reportDt = retdt1(inputFromDate, inputToDate); if (reportDt != null) { GridView1.DataSource = reportDt; GridView1.DataBind(); } else { // 无数据时显示提示 GridView1.EmptyDataText = "未查询到符合条件的报表数据"; GridView1.DataBind(); } } }
额外优化建议
- 数据库连接字符串建议放在Web.config里,方便后期维护,不要硬编码在代码中。
- 生产环境不要用
Response.Write输出错误信息,建议用日志框架(比如NLog、Serilog)记录异常详情,避免暴露敏感信息给用户。
内容的提问来源于stack exchange,提问作者gowtham
相关产品推荐
相关产品推荐

