C#对接SQL Server开发租车计算器如何返回实际金额而非SQL字符串
修复方案
核心错误原因
- 你没有实际执行SQL命令从数据库读取租金单价,直接把3条SQL查询字符串拼接后赋值给了显示控件,所以只会输出SQL语句文本
- SQL语句语法错误,没有正确把C#中的天数、周数、月数变量传入查询逻辑
- 租期计算逻辑存在笔误和逻辑漏洞:日租计算错误乘以了周数,按月/按周折算没有做取余处理,会导致租期计算错误
- 直接拼接SQL语句存在SQL注入风险,需要用参数化查询
调整后可运行代码
private void button8_Click(object sender, EventArgs e) { DateTime startdate = dateTimePicker1.Value.Date; DateTime enddate = dateTimePicker2.Value.Date; // 租期合法性校验 if (enddate < startdate) { label12.Text = "结束日期不能早于开始日期"; return; } int no_of_days = (enddate - startdate).Days; // 修正租期计算逻辑:先算整月、剩余算整周、最后剩余算天数 int no_of_months = no_of_days / 30; // 可根据你的月定义调整,原逻辑no_of_weeks/4误差较大 int remain_days_after_month = no_of_days % 30; int no_of_weeks = remain_days_after_month /7; int remain_days = remain_days_after_month %7; // 一次性查询三个单价,减少数据库请求 string query = "SELECT daily_rent, weekly_rent, monthly_rent FROM Rent"; decimal total = 0; try { con.Open(); using(SqlCommand cmd = new SqlCommand(query, con)) { using(SqlDataReader reader = cmd.ExecuteReader()) { if(reader.Read()) { decimal dailyRent = Convert.ToDecimal(reader["daily_rent"]); decimal weeklyRent = Convert.ToDecimal(reader["weekly_rent"]); decimal monthlyRent = Convert.ToDecimal(reader["monthly_rent"]); // 计算总价 total = monthlyRent * no_of_months + weeklyRent * no_of_weeks + dailyRent * remain_days; } } } label12.Text = total.ToString("C"); // 按货币格式输出 } catch(Exception ex) { label12.Text = "计算失败:" + ex.Message; } finally { if(con.State == System.Data.ConnectionState.Open) { con.Close(); } } }
补充说明
- 如果你的Rent表存储的是多车型的租金,需要在SQL语句中增加WHERE条件,传入当前选择的车型ID做筛选
- 月租期计算如果需要按自然月而非30天折算,需要单独写日期计算逻辑替换当前的整数除法逻辑
- 参数化查询可以有效避免SQL注入风险,禁止直接把用户输入的变量拼接到SQL语句中
内容的提问来源于stack exchange,提问作者user14699972
相关产品推荐
相关产品推荐

