You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用带双输入参数的存储过程在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:36:40