[Tips] .NETからMySQLを使う ~その2・Entity Data Modelを使用する2~

前回は実際のテーブルからモデルを作成しました。

今回はEntity Frameworkを使用してテーブルにデータを登録していく方法について見ていきます。

最初におさらいですが、前回はtestというデータベースに対しuserテーブルを作成し、そこからEntity Data Modelを作成しました。

これによりObjectContextを継承したtestEntitiesが作成されました。これはソリューションエクスプローラーでEntity Data Modelを展開し、「モデル名.Designer.cs」を開いて確認することができます(下図)。


この作成されたtestEntitiesのインスタンスを使用してデータの登録を行うことができます。

まず、実験のためにuserテーブルに合わせて下図のようなフォームを作成しました。


各コントロールとプロパティは下表の通りです。

コントロール名(コントロール) プロパティ
label1(Label) Text 氏名
label2(Label) Text メール
label3(Label) Text 電話番号
txtName(TextBox) なし なし
txtMail(TextBox) なし なし
txtTel(TextBox) なし なし
btnAdd(Button) Text 登録

コードは下記の通りです。

[登録]ボタンが押されると、testEntitiesのインスタンスを作成し、ユーザーがフォームに入力したデータを元に登録するデータを作成します。

次に、AddTouserメソッドでデータを追加し、最後にSaveChangesメソッドでデータを登録します。

AddTouserメソッドはEntity Data Modelを作成したときに自動で作成されたメソッドです。モデルの名称が異なればこのメソッド名も異なるものが付けられます。

そしてSaveChangesメソッドですが、データを反映させるためには必ず実行させる必要があります。忘れてしまうとデータが登録されないので注意が必要です。

// [登録]ボタンクリック時の処理
private void btnAdd_Click(object sender, EventArgs e)
{
    var container = new testEntities();

    // 登録データを作成する
    user userData = new user()
    {
        Name = txtName.Text,
        Email = txtMail.Text,
        TEL = txtTel.Text
    };

    // データを追加
    container.AddTouser(userData);
    // テーブルにデータを反映させる
    container.SaveChanges();
}

フォームに下図のようにデータを入力して[登録]ボタンを押してみます。


phpMyAdminで確認してみると、無事入力したとおりデータが登録されました。

[Tips] .NETからMySQLを使う ~その2・Entity Data Modelを使用する1~

前回は.NETでMySQLが使用できるようにConector/Netのインストールを行いました。

今回はMySQLでEntity Data Modelを使用する方法を見ていきます。(最初にモデルを作成し、その後モデルからテーブルを作成する例とします)

1.あらかじめMySQLにデータベースがあるものとします。データベース名をtest、テーブル名をuserとします。

userテーブルは下表のように作成しました。

userテーブル
 カラム 種別  その他 説明
ID int(11) AUTO_INCREMENT, PRIMARY KEY ユーザー識別用ID
Name varchar(255) 氏名
Email varchar(255) メールアドレス
TEL varchar(15) 電話番号

2.Visual Studio を起動し新規プロジェクトを作成します(今回はC#を使用し、プロジェクト名はデフォルトのままにしています)。

3.ソリューションエクスプローラーでプロジェクトを右クリックし、コンテキストメニューから[追加]-[新しい項目]をクリックします。

4.[新しい項目の追加]ダイアログが表示されるので、一覧から[ADO.NET Entity Data Model]を選択し、名前を「UserModel.edmx」とし、[追加]ボタンをクリックします。

5.[Entity Data Model]ウィザードが表示されるので「データベースから生成」を選択し[次へ]をクリックします。

6.[Entity Data Modelウィザード]ダイアログが表示されるので[新しい接続]ボタンをクリックします。次に[接続のプロパティ]ダイアログが表示されるので[変更]ボタンをクリックし、[データソースの変更]ダイアログで「MySQL Database」を選択し[OK]ボタンをクリックします。

7.[接続のプロパティ]ダイアログが表示されるので、「Server name」にMySQLサーバー名を、「Username」と「Password」に接続の際に使用するユーザー名とパスワードを入力します。「Database name」にはデータベース名を入力します。

入力が終わったら[テスト接続]をクリックして確認します。「テスト接続に成功しました」と表示されればOKです。最後に[OK]ボタンをクリックしてダイアログを閉じます。

8.「Entity Data Modelウィザード」ダイアログに戻るので、「はい、重要情報を接続文字列に含めます」を選択し(もちろん「いいえ」の方を選択しても構いません)、エンティティ名を付けて(ここではTestEntitiesとしました)[次へ]ボタンをクリックします。

9.次に「データベースオブジェクトの選択」が表示されます。使用するテーブルにチェックを付け[完了]ボタンをクリックします。

10.以上でEntity Data Modelが作成され Visual Studioの表示は下図のようになります。

[Tips] .NETからMySQLを使う ~その1・インストール~

C#からMySQLへ接続できるようにするには、はじめに Conector/Netと呼ばれるものをインストールする必要があります。

Conector/NetとはMySQLのADO.NET接続用ドライバーで http://www-jp.mysql.com/downloads/connector/net/ よりダウンロードすることができます。

MSI Installer と ZIP Archiveの2種類あるのですが、今回はMSI Installerを使用しました。

MSI Installerをダウンロードしたら、ダブルクリックしてインストールを開始します。

次に[Typical]ボタンをクリックします。(CustomやCompleteもありますが、特に設定が必要なければTypicalでいいと思います。)

次の画面が表示されるので[Install]ボタンをクリックします。

インストールが始まるのでしばし待ちます。

インストールが完了したら[Finish]ボタンをクリックして、インストーラを終了します。

正常にインストールができた場合には、下図のようにデータソースとしてMySQLを選択できるようになります。

実際の接続については次回説明する予定です。

 

補足

今回 Windows 7 Ultimate 64bitにインストールしてみましたが、インストールにおいて特に問題は見られませんでした。

[Chart][Tips] コードから折れ線グラフを作成する

今回はコードから折れ線グラフを作成する例を紹介します。

といっても前回の「コードから棒グラフを作成する」で紹介したコードの一部を変更するだけです。

グラフを折れ線にするにはChartTypeプロパティSeriesChartType.Lineを指定します。

下記は、コードから折れ線グラフを作成する例です。

データとしてアクセス数を表示しています。

VBの例

Imports System.Windows.Forms.DataVisualization.Charting

' フォームロード時の処理
Private Sub Form4_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    '初期化
    Chart1.Series.Clear()

    'データの取得
    Dim ds As DataSet = GetData()

    'Chartコントロールにデータソースを設定
    Chart1.DataSource = ds

    'Chartコントロールにタイトルを設定
    Chart1.Titles.Add("アクセス数とユニークユーザー数")

    'グラフの種類,系列,軸の設定
    For I As Integer = 1 To ds.Tables(0).Columns.Count - 1
        '列名の取得
        Dim columnName As String = ds.Tables(0).Columns(I).ColumnName

        '系列の設定
        Chart1.Series.Add(columnName)

        '★★★グラフの種類を折れ線グラフにする★★★
        Chart1.Series(columnName).ChartType = SeriesChartType.Line

        'X軸
        Chart1.Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False

        'Y軸
        Chart1.Series(columnName).YValueMembers = columnName
    Next

    'X軸タイトル
    Chart1.ChartAreas(0).AxisX.Title = "月"

    Chart1.DataBind()
End Sub

' データの設定
Private Function GetData() As DataSet
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim dtRow As DataRow

    '列の作成
    dt.Columns.Add("月", Type.GetType("System.String"))
    dt.Columns.Add("アクセス数", Type.GetType("System.Int32"))
    ds.Tables.Add(dt)

    'データの追加
    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/01"
    dtRow(1) = "945"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/02"
    dtRow(1) = "1023"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/03"
    dtRow(1) = "2121"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/04"
    dtRow(1) = "2179"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/05"
    dtRow(1) = "2063"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/06"
    dtRow(1) = "2107"
    ds.Tables(0).Rows.Add(dtRow)

    Return (ds)
End Function

C#の例

using System.Windows.Forms.DataVisualization.Charting;

// フォームロード時の処理
private void Form4_Load(object sender, EventArgs e)
{
    // 初期化
    chart1.Series.Clear();

    // データの取得
    DataSet ds = GetData();

    // Chartコントロールにデータソースを設定
    chart1.DataSource = ds;

    // Chartコントロールにタイトルを設定
    chart1.Titles.Add("アクセス数とユニークユーザー数");

    // グラフの種類,系列,軸の設定
    for (int i = 1; i < ds.Tables[0].Columns.Count; i++)
    {
        // 列名の取得
        string columnName = ds.Tables[0].Columns[i].ColumnName;

        // 系列の設定
        chart1.Series.Add(columnName);

        // ★★★グラフの種類を折れ線グラフにする★★★
        chart1.Series[columnName].ChartType = SeriesChartType.Line;

        // X軸
        chart1.Series[columnName].XValueMember = ds.Tables[0].Columns[0].ColumnName.ToString();
        chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisX.MinorGrid.Enabled = false;

        // Y軸
        chart1.Series[columnName].YValueMembers = columnName;
    }

    // X軸タイトル
    chart1.ChartAreas[0].AxisX.Title = "月";

    chart1.DataBind();
}

// データの設定
private DataSet GetData()
{
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    DataRow dtRow;

    // 列の作成
    dt.Columns.Add("月", Type.GetType("System.String"));
    dt.Columns.Add("アクセス数", Type.GetType("System.Int32"));
    dt.Columns.Add("ユニークユーザー数", Type.GetType("System.Int32"));
    ds.Tables.Add(dt);

    // データの追加
    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/01";
    dtRow[1] = "945";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/02";
    dtRow[1] = "1023";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/03";
    dtRow[1] = "2121";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/04";
    dtRow[1] = "2179";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/05";
    dtRow[1] = "2063";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/06";
    dtRow[1] = "2107";
    ds.Tables[0].Rows.Add(dtRow);

    return ds;
}

[Chart][Tips] コードから棒グラフを作成する


コードから棒グラフを作成する例を紹介します。

Chartコントロールに表示するデータは1つずつ追加することも可能ですが、データベースから取得して表示する場合もあるのではないでしょうか?

このような場合にはDataSourceプロパティを使用して、取得したデータをバインドして使用することが可能です。

グラフのタイトルはTitlesプロパティAddメソッドで追加します。

データ系列はSeriesプロパティAddメソッドで追加を行います。紹介するサンプルコードの中ではデータテーブルの2列目と3列目が系列になるように設定しています。

グラフの種類はSeriesプロパティのChartTypeプロパティで設定を行います。今回は棒グラフとするためSeriesChartType.Columnを指定しています。

軸値の設定はSeriesプロパティのXValuMemberプロパティYValueMemberプロパティで行います。

また、今回はX軸のグリッドを非表示にしたいのでMajorGridMinorGridプロパティのEnabledプロパティにFalseを設定しています。

最後に軸のタイトルですがAxisXおよびAxisYプロパティのTitleプロパティで設定します。

下記はコードから棒グラフを作成する例です。

VBの例

Imports System.Windows.Forms.DataVisualization.Charting

' フォームロード時の処理
Private Sub Form3_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    '初期化
    Chart1.Series.Clear()

    'データの取得
    Dim ds As DataSet = GetData()

    'Chartコントロールにデータソースを設定
    Chart1.DataSource = ds

    'Chartコントロールにタイトルを設定
    Chart1.Titles.Add("アクセス数とユニークユーザー数")

    'グラフの種類,系列,軸の設定
    For I As Integer = 1 To ds.Tables(0).Columns.Count - 1
        '列名の取得
        Dim columnName As String = ds.Tables(0).Columns(I).ColumnName

        '系列の設定
        Chart1.Series.Add(columnName)

        'グラフの種類
        Chart1.Series(columnName).ChartType = SeriesChartType.Column

        'X軸
        Chart1.Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False

        'Y軸
        Chart1.Series(columnName).YValueMembers = columnName
    Next

    'X軸タイトル
    Chart1.ChartAreas(0).AxisX.Title = "月"

    Chart1.DataBind()
End Sub

' データの設定
Private Function GetData() As DataSet
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim dtRow As DataRow

    '列の作成
    dt.Columns.Add("月", Type.GetType("System.String"))
    dt.Columns.Add("アクセス数", Type.GetType("System.Int32"))
    dt.Columns.Add("ユニークユーザー数", Type.GetType("System.Int32"))
    ds.Tables.Add(dt)

    'データの追加
    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/01"
    dtRow(1) = "945"
    dtRow(2) = "4203"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/02"
    dtRow(1) = "1023"
    dtRow(2) = "3302"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/03"
    dtRow(1) = "2121"
    dtRow(2) = "7065"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/04"
    dtRow(1) = "2179"
    dtRow(2) = "7753"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/05"
    dtRow(1) = "2063"
    dtRow(2) = "6373"
    ds.Tables(0).Rows.Add(dtRow)

    dtRow = ds.Tables(0).NewRow
    dtRow(0) = "2011/06"
    dtRow(1) = "2107"
    dtRow(2) = "4210"
    ds.Tables(0).Rows.Add(dtRow)

    Return (ds)
End Function

C#の例

using System.Windows.Forms.DataVisualization.Charting;

// フォームロード時の処理
private void Form3_Load(object sender, EventArgs e)
{
    // 初期化
    chart1.Series.Clear();

    // データの取得
    DataSet ds = GetData();

    // Chartコントロールにデータソースを設定
    chart1.DataSource = ds;

    // Chartコントロールにタイトルを設定
    chart1.Titles.Add("アクセス数とユニークユーザー数");

    // グラフの種類,系列,軸の設定
    for( int i = 1; i < ds.Tables[0].Columns.Count; i++ )
    {
        // 列名の取得
        string columnName = ds.Tables[0].Columns[i].ColumnName;

        // 系列の設定
        chart1.Series.Add(columnName);

        // グラフの種類
        chart1.Series[columnName].ChartType = SeriesChartType.Column;

        // X軸
        chart1.Series[columnName].XValueMember = ds.Tables[0].Columns[0].ColumnName.ToString();
        chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
        chart1.ChartAreas[0].AxisX.MinorGrid.Enabled = false;

        // Y軸
        chart1.Series[columnName].YValueMembers = columnName;
    }

    // X軸タイトル
    chart1.ChartAreas[0].AxisX.Title = "月";

    chart1.DataBind();
}

/// データの設定
private DataSet GetData()
{
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    DataRow dtRow;

    // 列の作成
    dt.Columns.Add("月", Type.GetType("System.String"));
    dt.Columns.Add("アクセス数", Type.GetType("System.Int32"));
    dt.Columns.Add("ユニークユーザー数", Type.GetType("System.Int32"));
    ds.Tables.Add(dt);

    // データの追加
    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/01";
    dtRow[1] = "945";
    dtRow[2] = "4203";
    ds.Tables[0].Rows.Add(dtRow);
    
    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/02";
    dtRow[1] = "1023";
    dtRow[2] = "3302";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/03";
    dtRow[1] = "2121";
    dtRow[2] = "7065";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/04";
    dtRow[1] = "2179";
    dtRow[2] = "7753";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/05";
    dtRow[1] = "2063";
    dtRow[2] = "6373";
    ds.Tables[0].Rows.Add(dtRow);

    dtRow = ds.Tables[0].NewRow();
    dtRow[0] = "2011/06";
    dtRow[1] = "2107";
    dtRow[2] = "4210";
    ds.Tables[0].Rows.Add(dtRow);

    return ds;
}