Windows Form Chart从数据库加载仅显示单个柱形的问题求助
问题:WinForm Chart控件仅显示单个柱形,无法展示所有数据库数据
我的数据库表Sonuc中有3条数据,但Windows Form的Chart控件仅显示一个柱形,且始终是第一个PartyName对应的最大Vote值,希望图表能展示数据库中的所有行。以下是编写的C#代码:
OleDbConnection AConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Windows\\Temp\\DATABASE\\secim.accdb"); private void button1_Click(object sender, EventArgs e) { foreach (var series in chart1.Series) { series.Points.Clear(); } AConnection.Open(); OleDbCommand command = new OleDbCommand("SELECT * FROM Sonuc", AConnection); command.ExecuteNonQuery(); OleDbDataReader reader = command.ExecuteReader(); try { while (reader.Read()) { chart1.Series["VOTES"].Points.AddXY(reader["PartyName"].ToString(), reader["Vote"].ToString()); } } catch (Exception ex) { MessageBox.Show(ex.Message); } AConnection.Close(); }
数据库表包含3条不同PartyName和Vote的数据,Chart控件仅显示第一个PartyName对应的柱形。
解决方案
问题根源有两处:
- 多余的
ExecuteNonQuery()调用:该方法用于执行增删改操作,查询语句无需调用,直接使用ExecuteReader()即可。 - Vote值以字符串传入:Chart控件的
AddXY方法第二个参数若为字符串,会导致数值解析异常,需转换为数值类型(如int或double)。
修改后的代码
OleDbConnection AConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Windows\\Temp\\DATABASE\\secim.accdb"); private void button1_Click(object sender, EventArgs e) { foreach (var series in chart1.Series) { series.Points.Clear(); } try { AConnection.Open(); OleDbCommand command = new OleDbCommand("SELECT * FROM Sonuc", AConnection); // 移除无效的ExecuteNonQuery()调用 OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { string partyName = reader["PartyName"].ToString(); // 将Vote转换为int类型(根据数据库字段类型调整) int voteCount = Convert.ToInt32(reader["Vote"]); chart1.Series["VOTES"].Points.AddXY(partyName, voteCount); } reader.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { // 确保连接一定会关闭 if (AConnection.State == System.Data.ConnectionState.Open) { AConnection.Close(); } } }
额外优化建议
使用using语句自动管理资源,避免连接泄漏:
private void button1_Click(object sender, EventArgs e) { foreach (var series in chart1.Series) { series.Points.Clear(); } string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Windows\\Temp\\DATABASE\\secim.accdb"; using (OleDbConnection AConnection = new OleDbConnection(connectionString)) { try { AConnection.Open(); using (OleDbCommand command = new OleDbCommand("SELECT * FROM Sonuc", AConnection)) { using (OleDbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { string partyName = reader["PartyName"].ToString(); int voteCount = Convert.ToInt32(reader["Vote"]); chart1.Series["VOTES"].Points.AddXY(partyName, voteCount); } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
同时确认Chart控件的Series类型设置为Column(柱形图),避免因类型错误导致显示异常。
内容的提问来源于stack exchange,提问作者HYA
相关产品推荐
相关产品推荐

