在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
相关产品推荐
相关产品推荐

