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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:07:55