【C#】Accessのテーブルデータの値をC#のグラフに表示させるには

この記事では、Accessのテーブルデータの値をC#のグラフに表示させる方法についてご説明します。

【動画】Accessのテーブルデータの値をC#のグラフに表示させる実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Accessのデータベースファイルを開き、テーブル内にあるデータを取得し、グラフに表示させます。

参照設定が必要

今回のコードを実行するのに参照設定が必要です。

今回は以下の参照設定を行います。

  1. System.Windows.Forms.DataVisualization(System.Windows.Forms.DataVisualization.dll)
  2. System.Configuration(System.Configuration.dll)

①System.Windows.Forms.DataVisualization(System.Windows.Forms.DataVisualization.dll)

System.Windows.Forms.DataVisualizationを参照設定すると、グラフの作成や取得したデータのグラフ表示など、グラフに関する様々な操作ができるようになります。

今回はCSVファイルから表のデータをグラフ表示させるので、この参照設定が必要になります。

②System.Configuration(System.Configuration.dll)

System.Configurationを参照設定すると、アプリケーションの設定をapp.configのような外部の設定ファイルに分けることができ、コンパイルの必要が無く設定値を変更することができるようになります。

System.Configurationを参照設定しないと、「ConfigurationManager」が存在しないとのことでエラーになってしまうので、この参照設定が必要になります。

コードの流れ

STEP.1
必要な名前空間をインポートする
必要な名前空間をインポートします。
インポートする名前空間には、データの取得やグラフ描画などがあります。
STEP.2
グラフのインスタンスを生成する
グラフのインスタンスを生成します。
STEP.3
グラフのサイズや位置、チャートエリアなどの基本的な設定を行う
グラフのサイズや位置、チャートエリアなどの基本的な設定を行います。
STEP.4
Accessのデータベースファイルを開く
Accessのデータベースファイルを開きます。
STEP.5
テーブルデータを取得する
テーブルデータを取得します。
STEP.6
取得したテーブルデータをグラフに出力する
取得したテーブルデータをグラフに出力します。

Accessのテーブルデータとフォームの例

Accessのテーブルデータ

今回は下のAccessのテーブルデータを用意しました。

「T_item」のテーブルにデータが存在しています。

今回は「単価」の値をグラフに出力します。

C#のフォーム

今回は下のC#のフォームを用意しました。

フォームにある「グラフの出力」ボタンをクリックすると、下のとおりAccessのテーブルデータをグラフ表示します。

C#のコード(例)

App.configのコード

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <appSettings>
        <!-- 接続文字列 -->
        <add key="DBConnString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" />

        <!-- Accessのデータベースファイルのパス -->
        <add key="DBPath" value="C:\work\10_勉強\21_C#\0070\0070.mdb" />

    </appSettings>
</configuration>

注目すべきコード

最初に見て頂きたいのは8行目と11行目です。

8行目は、Accessのデータベースファイルに接続するのに必要な接続文字列を「DBConnString」というキーに設定しているコードです。

11行目は、Accessのデータベースファイルのパスを「DBPath」というキーに設定しているコードです。

「DBConnString」と「DBPath」のキーの値をフォーム側のコードが参照して使います。

フォームのコード

using System;
using System.Configuration;
using System.Data.OleDb;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using Chart = System.Windows.Forms.DataVisualization.Charting.Chart;

namespace wfcs_0070
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // チャートを初期化するメソッドを呼び出す
            Chart chart = InitializeChart();

            // Accessデータベースからデータを読み込み、シリーズを作成し、グラフに追加する
            SeriesFromAccess(chart);
        }
        private Chart InitializeChart()
        {
            // グラフ用のインスタンスを生成する
            Chart chart = new Chart
            {
                // グラフの縦と横の幅を設定する(横幅・縦幅)
                Size = new System.Drawing.Size(800, 400),

                // フォーム上に設置するグラフの位置を設定する(横・縦)
                Location = new System.Drawing.Point(120, 20)
            };

            // チャートエリア用のインスタンスを生成する
            ChartArea chartArea = new ChartArea();

            // グラフにチャートエリアを追加する
            chart.ChartAreas.Add(chartArea);

            // X軸のラベル間隔を設定する
            chartArea.AxisX.LabelStyle.Interval = 1;

            // 設定を施したchartオブジェクトを返す
            return chart;
        }
        private void SeriesFromAccess(Chart chart)
        {
            // App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数「connStrTemplate」に格納する
            string connStrTemplate = ConfigurationManager.AppSettings["DBConnString"];

            // App.configのappSettingsタグ内に記述した「DBPath」のキーの値を取得して変数「dbPathStr」に格納する
            string dbPathStr = ConfigurationManager.AppSettings["DBPath"];

            // connStrTemplateの{0}の部分を、「dbPathStr」の値に置き換える
            string connectionString = string.Format(connStrTemplate, dbPathStr);

            // Accessの「syain」テーブルからデータを取得するSELECT文を用意する
            string query = "SELECT 名前, 在庫 FROM t_item";

            // OleDbConnectionオブジェクトを作成し、接続文字列を使用してデータベースに接続する
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                // SELECT文を実行するためのOleDbCommandインスタンスを生成する
                OleDbCommand command = new OleDbCommand(query, connection);

                // データベース接続を開く
                connection.Open();

                // SELECT文を実行し、結果をreaderに格納する
                OleDbDataReader reader = command.ExecuteReader();

                // シリーズの名前を用意する
                string srsStr = "SeriesTest";

                // シリーズ用のインスタンスを生成する
                Series series = new Series(srsStr)
                {
                    // シリーズのポイント幅を設定する
                    ["PointWidth"] = "0.5",

                    // シリーズのチャートタイプを設定
                    ChartType = SeriesChartType.Column
                };

                // シリーズをチャートに追加する
                chart.Series.Add(series);

                // シリーズのポイントをクリアする
                chart.Series[srsStr].Points.Clear();

                // 取得したデータの最終行まで処理を繰り返すwhileループ
                while (reader.Read())
                {
                    // Accessのテーブルから取得した「名前」の値を変数nameに格納する
                    string name = reader["名前"].ToString();

                    // Accessのテーブルから取得した「在庫」の値を変数stockに格納する
                    int stock = (int)reader["在庫"];

                    // シリーズにデータポイントを追加する
                    chart.Series[srsStr].Points.AddXY(name, stock);
                }

                // readerを閉じる
                reader.Close();
            }

            // フォームにチャートを追加する
            this.Controls.Add(chart);
        }
    }
}

注目すべきコード①

最初に見て頂きたいのは1行目から10行目です。

using System;
using System.Configuration;
using System.Data.OleDb;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using Chart = System.Windows.Forms.DataVisualization.Charting.Chart;

コードの説明

以上のコードは、必要な名前空間の使用宣言およびエイリアス宣言のコードです。

コードの詳細

1行目は、.NET Frameworkの基本クラスのセットを参照する名前空間です。

2行目は、ウィンドウやダイアログボックスを使う名前空間です。

3行目は、アプリケーションの実行時設定やカスタム設定を読み込み、保存することができる名前空間です。

アプリケーションの設定をapp.configのような外部の設定ファイルに分けることができ、コンパイルの必要が無く設定値を変更することができるようになります。

4行目は、ファイル読み書きなど入出力に関連するクラスへのアクセスを提供する名前空間です。

5行目は、チャートやグラフを作成し、表示するためのクラスとコントロールを提供する名前空間です。

6行目は、System.Windows.Forms.DataVisualization.Charting.Chartクラスに対してChartという名前を定義しています。

注目すべきコード②

次に見て頂きたいのは19行目から22行目です。

            // チャートを初期化するメソッドを呼び出す
            Chart chart = InitializeChart();

            // Accessデータベースからデータを読み込み、シリーズを作成し、グラフに追加する
            SeriesFromAccess(chart);

コードの説明

以上のコードは、使用するグラフを初期化するInitializeChartメソッドと、Accessのテーブルデータをグラフに出力するメソッドSeriesFromAccessを呼び出す処理のコードです。

InitializeChartメソッドが何行目にあるのかというと24行目にあります。

        private Chart InitializeChart()

また、SeriesFromAccessメソッドが何行目にあるのかというと48行目にあります。

        private void SeriesFromAccess(Chart chart)

SeriesFromAccessメソッドを呼び出す際は初期化したグラフ用のインスタンスを引数に渡します。

注目すべきコード②

次に見て頂きたいのは24行目から47行目です。

        private Chart InitializeChart()
        {
            // グラフ用のインスタンスを生成する
            Chart chart = new Chart
            {
                // グラフの縦と横の幅を設定する(横幅・縦幅)
                Size = new System.Drawing.Size(800, 400),

                // フォーム上に設置するグラフの位置を設定する(横・縦)
                Location = new System.Drawing.Point(120, 20)
            };

            // チャートエリア用のインスタンスを生成する
            ChartArea chartArea = new ChartArea();

            // グラフにチャートエリアを追加する
            chart.ChartAreas.Add(chartArea);

            // X軸のラベル間隔を設定する
            chartArea.AxisX.LabelStyle.Interval = 1;

            // 設定を施したchartオブジェクトを返す
            return chart;
        }

コードの説明

以上のコードは、グラフの各設定を行う処理のコードです。

コードの詳細

27行目のコードでは、グラフ用のインスタンスを生成し、グラフの横幅と縦幅(30行目)、設置する位置(縦・横)(33行目)を設定します。

37行目のコードではチャートエリア用のインスタンスを生成し、40行目でグラフにチャートエリアを追加します。

43行目のコードでは、X軸のラベル間隔を設定します。

1を設定すると、X軸のラベルをすべて表示させます。

46行目のコードでは、各設定したchartオブジェクトを返します。

この処理により、このメソッドを呼び出したところでグラフを使うことができるようになります。

注目すべきコード②

次に見て頂きたいのは48行目から112行目です。

        private void SeriesFromAccess(Chart chart)
        {
            // App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数「connStrTemplate」に格納する
            string connStrTemplate = ConfigurationManager.AppSettings["DBConnString"];

            // App.configのappSettingsタグ内に記述した「DBPath」のキーの値を取得して変数「dbPathStr」に格納する
            string dbPathStr = ConfigurationManager.AppSettings["DBPath"];

            // connStrTemplateの{0}の部分を、「dbPathStr」の値に置き換える
            string connectionString = string.Format(connStrTemplate, dbPathStr);

            // Accessの「syain」テーブルからデータを取得するSELECT文を用意する
            string query = "SELECT 名前, 在庫 FROM t_item";

            // OleDbConnectionオブジェクトを作成し、接続文字列を使用してデータベースに接続する
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                // SELECT文を実行するためのOleDbCommandインスタンスを生成する
                OleDbCommand command = new OleDbCommand(query, connection);

                // データベース接続を開く
                connection.Open();

                // SELECT文を実行し、結果をreaderに格納する
                OleDbDataReader reader = command.ExecuteReader();

                // シリーズの名前を用意する
                string srsStr = "SeriesTest";

                // シリーズ用のインスタンスを生成する
                Series series = new Series(srsStr)
                {
                    // シリーズのポイント幅を設定する
                    ["PointWidth"] = "0.5",

                    // シリーズのチャートタイプを設定
                    ChartType = SeriesChartType.Column
                };

                // シリーズをチャートに追加する
                chart.Series.Add(series);

                // シリーズのポイントをクリアする
                chart.Series[srsStr].Points.Clear();

                // 取得したデータの最終行まで処理を繰り返すwhileループ
                while (reader.Read())
                {
                    // Accessのテーブルから取得した「名前」の値を変数nameに格納する
                    string name = reader["名前"].ToString();

                    // Accessのテーブルから取得した「在庫」の値を変数stockに格納する
                    int stock = (int)reader["在庫"];

                    // シリーズにデータポイントを追加する
                    chart.Series[srsStr].Points.AddXY(name, stock);
                }

                // readerを閉じる
                reader.Close();
            }

            // フォームにチャートを追加する
            this.Controls.Add(chart);
        }

コードの説明

以上のコードは、値をグラフに追加する処理のコードです。

コードの詳細

51行目のコードは、App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数に格納するコードです。

「DBConnString」のキーの値は変数「connStrTemplate」に格納します。

54行目のコードは、App.configのappSettingsタグ内に記述した「DBConnString」のキーの値を取得して変数に格納するコードです。

「DBConnString」のキーの値は変数「connStrTemplate」に格納します。

57行目のコードは、connStrTemplateの{0}の部分を、「dbPathStr」の値に置き換える処理のコードです。

connStrTemplateの{0}の部分を、「dbPathStr」の値に置き換える、とはどういうことかというと、{0}の部分をAccessのデータベースファイルのフルパスに置き換える、ということです。

今回は接続文字列と、Accessのデータベースのフルパスを分けてそれぞれ「DBConnString」と「DBPath」とキーを分けてあるので、フォームのコード側で接続文字列と、Accessのデータベースのフルパスを一つの文字列に組み立てています。

参考までに、string.Format実行前と実行後の状態を以下にお見せします。

以上のように、{0}の部分が「C:\work\10_勉強\21_C#\0070\0070.mdb」に置き換わっています。

参考:string.Format実行前

Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}

参考:string.Format実行後

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\work\10_勉強\21_C#\0070\0070.mdb

60行目のコードでは、Accessの「syain」テーブルからデータを取得するSELECT文を用意しています。

63行目のコードでは、OleDbConnectionオブジェクトを作成し、接続文字列を使用してデータベースに接続しています。

66行目のコードでは、SELECT文を実行するためのOleDbCommandインスタンスを生成しています。

69行目のコードでは、Accessのデータベース接続を開いています。

72行目のコードでは、SELECT文を実行し、結果をreaderに格納しています。

75行目のコードは、シリーズ用のインスタンス名に設定する名前を取得するコードです。

78行目のコードでは、シリーズ用のインスタンスを生成します。

81行目のコードでは、シリーズのポイント幅を設定します。

84目のコードでは、リーズのチャートタイプを設定します。

今回は「Column」(縦の棒グラフ)を指定しています。

88行目のコードでは、シリーズをチャートに追加します。

91目のコードでは、シリーズのポイントをクリアします。

94行目のコードは、取得したデータの最終行まで処理を繰り返すwhile文です。

今回は10件あるテーブルデータを取得しているので10件目まで処理を繰り返します。

97行目のコードでは、Accessのテーブルから取得した「名前」の値を変数nameに格納しています。

100行目のコードでは、Accessのテーブルから取得した「在庫」の値を変数stockに格納しています。

103行目のコードでは、シリーズにカテゴリ(name)とデータ(stock)を追加します。(カテゴリの数だけ繰り返す)

107行目のコードでは、readerを閉じています。

111行目のコードでは、フォームにチャートを追加します。

動作確認

Accessのテーブルデータとフォームの例」をご覧ください。

最後に

この記事では、Accessのテーブルデータの値をC#のグラフに表示させる方法についてご説明します。

ccessのテーブルデータの値をC#のグラフに表示させたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら