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

ASP.NET WebForms中DataTable日期范围过滤异常排查求助

ASP.NET WebForms日期范围过滤RadGrid异常问题

问题描述

开发ASP.NET WebForms应用时,通过FromMonth、ToMonth、FromYear、ToYear下拉框选择日期范围,过滤DataTable中的记录并在RadGrid展示,但过滤逻辑异常:选择有效日期范围后,网格要么无数据显示,要么结果错误。

已完成的调试步骤

  • 确认数据库中PADate字段为正确的DateTime格式
  • 检查下拉框(FromMonth、ToMonth、FromYear、ToYear)的取值正确
  • 确保过滤逻辑中PADate已正确解析为DateTime类型

期望结果

网格仅展示PADate处于所选日期范围(FromMonth/FromYear至ToMonth/ToYear)内的记录

当前过滤方法代码

protected void PCApplicationStatus()
{
    try
    {
        // Get the selected values from dropdowns
        int fromMonth = int.Parse(FromMonth.SelectedValue);
        int toMonth = int.Parse(ToMonth.SelectedValue);
        int fromYear = int.Parse(FromYear.SelectedValue);
        int toYear = int.Parse(ToYear.SelectedValue);

        // Create date range
        DateTime startDate = new DateTime(fromYear, fromMonth, 1);
        DateTime endDate = new DateTime(toYear, toMonth, DateTime.DaysInMonth(toYear, toMonth));

        // Validate that 'From' date is earlier than 'To' date
        if (fromYear > toYear || (fromYear == toYear && fromMonth > toMonth))
        {
            throw new InvalidOperationException("The 'From' date must be earlier than the 'To' date.");
        }

        // Fetch data from database
        AdDAL obj = new AdDAL();
        DataSet ds = obj.ExecutePaymentClaimQuery();

        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            DataTable dt = ds.Tables[0];
            DataTable filteredDt = dt.Clone();  // Clone the structure of the original table

            // Filter rows based on the date range
            foreach (DataRow dr in dt.Rows)
            {
                DateTime? paDate = dr["PADate"] is DBNull ? (DateTime?)null : Convert.ToDateTime(dr["PADate"]);
                
                if (paDate.HasValue && paDate.Value >= startDate && paDate.Value <= endDate)
                {
                    filteredDt.ImportRow(dr);  // Import rows that fall within the date range
                }
            }

            // Bind the filtered data to the grid
            if (filteredDt.Rows.Count > 0)
            {
                Grid.DataSource = filteredDt;
            }
            else
            {
                Grid.DataSource = null;  // No matching rows found
            }

            Grid.DataBind();  // Rebind the grid with the filtered data
        }
        else
        {
            // No data available
            Grid.DataSource = null;
            Grid.DataBind();
        }
    }
    catch (Exception ex)
    {
        // Log the error
        Console.WriteLine("Error: " + ex.ToString());
    }
}

问题排查与修复方案

1. 日期边界判断的核心问题

当前代码中endDate设为当月最后一天的00:00:00,如果数据库中PADate包含非零时间部分(比如2024-05-31 14:30:00),该时间会大于2024-05-31 00:00:00,导致这类有效记录被错误过滤。

修复方式:将endDate改为次月第一天的00:00:00,同时调整判断条件为小于endDate,确保包含当月所有时间的记录:

// 修改endDate计算逻辑
DateTime endDate = new DateTime(toYear, toMonth, 1).AddMonths(1);

// 修改过滤条件
if (paDate.HasValue && paDate.Value >= startDate && paDate.Value < endDate)

2. 日期范围验证顺序调整

当前代码先构造日期再验证合法性,若用户选择了起始日期晚于结束日期的情况,可能先触发日期构造的异常(比如非法月份)。应先验证再构造日期:

// 优先验证日期范围合法性
if (fromYear > toYear || (fromYear == toYear && fromMonth > toMonth))
{
    throw new InvalidOperationException("起始日期必须早于结束日期。");
}

// 再构造日期范围
DateTime startDate = new DateTime(fromYear, fromMonth, 1);
DateTime endDate = new DateTime(toYear, toMonth, 1).AddMonths(1);

3. 数据绑定逻辑优化

当filteredDt无数据时设置DataSource = null,会导致RadGrid丢失列结构。建议直接绑定空的filteredDt,保持网格结构一致:

// 无论是否有数据,统一绑定filteredDt
Grid.DataSource = filteredDt;
Grid.DataBind();

4. 异常日志适配Web环境

WebForms中Console.WriteLine的输出无法直接查看,建议改用Trace日志或写入持久化存储:

catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine($"PCApplicationStatus错误:{ex.ToString()}");
    // 可添加前端提示:
    // lblError.Text = "数据过滤失败,请稍后重试。";
}

5. 性能优化:数据库层面过滤

若数据量较大,建议在ExecutePaymentClaimQuery中传入日期参数,直接在数据库层面过滤数据,减少内存占用和传输量:

// 修改DAL方法调用,传入日期范围
DataSet ds = obj.ExecutePaymentClaimQuery(startDate, endDate);

对应SQL查询添加条件:WHERE PADate >= @StartDate AND PADate < @EndDate


内容的提问来源于stack exchange,提问作者Mangala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:47:28