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

在C# ASP.NET Web Form中实现财年月度下拉框及营收查询

解决ASP.NET Web Form中财年月份下拉框生成与营收查询问题

我来帮你梳理并修正这段代码,解决财年月份下拉框生成和后续营收查询的问题,先看看原代码里的几个小问题:

  • 循环中直接修改start_date变量,会打乱后续的日期迭代逻辑
  • 下拉框只添加了日期字符串,没有区分用户友好的显示文本和便于查询的实际值
  • 未使用using语句管理数据库资源,存在连接泄漏风险
  • 多余的SqlDataAdapter代码块没有实际作用

修正后的完整代码

1. 财年实体类(可选,用于存储从数据库读取的起止日期)

public class Fyear 
{ 
    public DateTime FiscalY_Start { get; set; } 
    public DateTime FiscalY_End { get; set; } 
}

2. Page_Load事件:生成财年月份下拉框

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // 使用using自动释放数据库连接、命令等资源
        using (SqlConnection con = new SqlConnection(@"Data Source=serv_name;Initial Catalog=Database_name;Integrated Security=True"))
        {
            string query = @"SELECT [ST_FI], [END_FY] FROM [FiscalYear]";
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                con.Open();
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        DateTime startDate = Convert.ToDateTime(rdr["ST_FI"]);
                        DateTime endDate = Convert.ToDateTime(rdr["END_FY"]);
                        
                        // 复制起始日期,避免修改原变量影响循环逻辑
                        DateTime currentMonth = startDate;
                        while (currentMonth <= endDate)
                        {
                            // 显示文本:用户友好的"月份 年份"格式(比如"April 2018")
                            string displayText = currentMonth.ToString("MMMM yyyy");
                            // 实际值:便于查询的"yyyy-MM"格式(比如"2018-04")
                            string value = currentMonth.ToString("yyyy-MM");
                            
                            DropDownList1.Items.Add(new ListItem(displayText, value));
                            
                            // 月份递增
                            currentMonth = currentMonth.AddMonths(1);
                        }
                    }
                }
            }
        }
    }
}

3. 选中月份后的营收查询逻辑

首先在ASPX页面的下拉框标签中添加回传配置:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"></asp:DropDownList>
<!-- 用于显示营收结果的Label -->
<asp:Label ID="lblRevenue" runat="server"></asp:Label>

然后添加后台事件处理代码:

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(DropDownList1.SelectedValue))
    {
        string selectedYearMonth = DropDownList1.SelectedValue;
        // 拆分年月用于SQL查询
        string[] yearMonthParts = selectedYearMonth.Split('-');
        int targetYear = int.Parse(yearMonthParts[0]);
        int targetMonth = int.Parse(yearMonthParts[1]);
        
        decimal totalRevenue = 0;
        
        using (SqlConnection con = new SqlConnection(@"Data Source=serv_name;Initial Catalog=Database_name;Integrated Security=True"))
        {
            // 假设营收表名为Revenue,日期字段为TransactionDate,营收字段为Amount
            string query = @"SELECT ISNULL(SUM(Amount), 0) FROM Revenue 
                             WHERE YEAR(TransactionDate) = @TargetYear 
                             AND MONTH(TransactionDate) = @TargetMonth";
            
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                // 使用参数化查询防止SQL注入
                cmd.Parameters.AddWithValue("@TargetYear", targetYear);
                cmd.Parameters.AddWithValue("@TargetMonth", targetMonth);
                
                con.Open();
                object result = cmd.ExecuteScalar();
                totalRevenue = Convert.ToDecimal(result);
            }
        }
        
        // 在页面显示营收结果
        lblRevenue.Text = $"当月营收:{totalRevenue:C}";
    }
}

额外注意事项

  • 确保FiscalYear表中的ST_FI和END_FY字段是日期类型(如datetime/date),避免转换错误
  • 如果财年表存在多条记录(比如多个历史财年),可添加筛选逻辑只显示当前财年的月份
  • 始终使用参数化查询处理用户输入,避免SQL注入风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:15:06