如何从MS Access数据库取值并绑定到C#变量用于计费计算
如何将MS Access数据库中的费率数据绑定到C#变量实现计费计算
要把Access数据库tarriff_table里的费率数据绑定到你的C#变量,我们可以通过OleDb连接读取数据库数据,再赋值给对应变量。下面是具体实现步骤:
1. 添加必要的命名空间
确保项目引用了System.Data,然后在代码文件顶部添加OleDb相关命名空间:
using System.Data.OleDb;
2. 编写读取费率数据的方法
写一个私有方法从数据库读取tarriff_table的前两行数据,同时处理连接异常、数据不足等情况:
private void LoadTariffData() { // 替换为你的Access数据库实际路径 string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourDBPath\YourDatabase.accdb;Persist Security Info=False;"; try { using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); // 按上限升序查询,确保取到正确的阶梯费率行 string query = "SELECT upperLimit, perUnitCost FROM tarriff_table ORDER BY upperLimit ASC;"; using (OleDbCommand cmd = new OleDbCommand(query, conn)) { using (OleDbDataReader reader = cmd.ExecuteReader()) { // 读取第一行阶梯数据 if (reader.Read()) { upperLimit1 = reader.GetDouble(0); perUnitCost1 = reader.GetDouble(1); } else { MessageBox.Show("tarriff_table中没有找到费率数据"); return; } // 读取第二行阶梯数据 if (reader.Read()) { upperLimit2 = reader.GetDouble(0); perUnitCost2 = reader.GetDouble(1); } else { MessageBox.Show("tarriff_table中至少需要两行阶梯费率数据"); } } } } } catch (Exception ex) { MessageBox.Show($"加载费率数据失败: {ex.Message}"); } }
3. 在窗体初始化时加载数据
在窗体构造函数或Load事件中调用上述方法,确保点击计算按钮前变量已赋值:
public YourFormName() { InitializeComponent(); // 启动时加载费率数据 LoadTariffData(); }
4. 整合到计费计算代码
现在你的button1_Click方法可以正常使用已赋值的变量,同时建议添加输入验证避免格式错误:
// 按需初始化这两个变量,若来自数据库可在LoadTariffData中一并读取 double demandCharge = 50; double VAT = 0.1; double upperLimit1, upperLimit2; double perUnitCost1, perUnitCost2; private void button1_Click(object sender, EventArgs e) { double con_unit = 0, bill = 0, mcon_unit = 0, totalbill = 0; // 输入格式验证 if (!double.TryParse(textBox1.Text, out con_unit)) { MessageBox.Show("请输入有效的用电量数值"); return; } if (!double.TryParse(textBox2.Text, out mcon_unit)) { MessageBox.Show("请输入有效的计量用电量数值"); return; } // 阶梯计费逻辑 if (con_unit < upperLimit1) { bill = con_unit * perUnitCost1; } else if (con_unit < upperLimit2) { bill = (upperLimit1 * perUnitCost1) + ((con_unit - upperLimit1) * perUnitCost2); } else { bill = (upperLimit1 * perUnitCost1) + ((upperLimit2 - upperLimit1) * perUnitCost2); } totalbill = Math.Ceiling((((((bill + demandCharge) * VAT) + (bill + demandCharge)) / con_unit) * mcon_unit)); textBox3.Text = Convert.ToString(totalbill); }
注意事项
- 若使用旧版
.mdb格式数据库,需将连接字符串中的Provider改为Microsoft.Jet.OLEDB.4.0。 - 确保数据库文件路径正确,且程序有读取该文件的权限。
- 可根据实际需求扩展
LoadTariffData方法,读取demandCharge和VAT等其他参数。
内容的提问来源于stack exchange,提问作者Khandkar Asif Hossain
相关产品推荐
相关产品推荐

