C#でMySQLを使う - 2.SELECTと画面表示編

# 前提と準備

## C#の記事
- [C#でMySQLを使う - 1.開発環境インストール](https://qiita.com/kazumi75kitty/items/9953bb84edd7717bc90a)
- C#でMySQLを使う - 2.SELECT・画面表示【この記事】
- [C#でMySQLを使う - 3.追加更新と削除](https://qiita.com/kazumi75kitty/items/65f8ae261bbe61964627)
- [C#でのデータベースのデータのNULLかどうかの判定](https://qiita.com/kazumi75kitty/items/64002467350a1ea08ab0)
- [C#のdelegate(デリゲート)と=>(ラムダ式)はC言語の関数へのポインタに似た扱い](https://qiita.com/kazumi75kitty/items/fdf4e1d2ea8e9c9326ba)
- [動的にコントロールを追加 - 1.ボタンクリック](https://qiita.com/kazumi75kitty/items/2e3f4c10a93d26032382)
- [動的にコントロールを追加 - 2.テキストボックスの参照](https://qiita.com/kazumi75kitty/items/093b1d679e016782d3af)
- [動的にコントロールを追加 - 3.DB(MySQL)から動的に作成](https://qiita.com/kazumi75kitty/items/3bbb8afdfbc21fb6b3f1)

[前回](https://qiita.com/kazumi75kitty/items/9953bb84edd7717bc90a)はVisual StudioにMySQL Connectors .NETを用いて、開発環境を準備する作業でしたが、実際にMySQL Connectors .NETでMySQLに接続して、SELECTを用いてデータの内容を画面に表示します(˶ ･ᴗ･ )੭

## 環境
- OS：Windows 10 Pro
- 開発環境：Visual Studio 2019 (MySQL Connectors .NET利用。2022でもMySQLは利用可能であることを確認済み)
- データベース：MySQL 5.7

### MySQLサーバー
テスト用ユーザー：*test* (パスワード：test1)
データベース：**manutest**
テーブル名：**testtb**

||id|name|memo|
|:-:|:-:|:-:|:-:|
|型|INT|VARCHAR(64)|VARCHAR(256)|
|必須属性|PRIMARY KEY|NOT NULL|初期値NULL|
|その他属性|AUTO_INCREMENT|-|-|

## 前提
[前回](https://qiita.com/kazumi75kitty/items/9953bb84edd7717bc90a)のように、Visual Studio 2019とMySQLをインストールし、かつMySQL Connectors .NETがインストールされていること(Visual Studioは自動でMySQL Connectorsのライブラリを認識してくれる)

# 作業手順

## Visual Studio 2019でのコーディング
### コンポーネント・コントロールの配置
今回はボタンを押下→MySQLでデータを拾ってくる→画面に表示
という、簡単な使い方について記事にしました。

とりあえず、WindowsのC#フォームのプロジェクトを新規作成し、Form1.csがデフォルトで開かれると思うので、まずはフォームに、

- 左上：データグリッド dataGridView1
- 右上：リストボックス2つ listBox1・listBox2
- 左下：SQLを読み込むボタン button1

これらを貼り付けます。
データグリッドとリストボックスはSQLのデータを表示させるために配置しました

![コンポーネントの配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/37c4079f-277a-ca9f-8bf7-8e5c38fcfcec.png)

### MySQL Connector .NETの参照を追加
[前回](https://qiita.com/kazumi75kitty/items/9953bb84edd7717bc90a)の記事の通り、参照を追加していきます。

![MySql.Data](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/6e02427c-925e-2f9f-b1f5-0ccf6785f84e.png)

「アセンブリ」の中に実際自動で認識してくれるので、参照マネージャーで、右上の検索画面に「mysql」を入力すると、↑の画面のように「**MySql.Data**」が何行も出てくるので、とりあえず1つだけ、どれでもいいので選択して(行左にマウスを当てると出てくるチェックボックスをON)「OK」を選択すると…

![MySQLを使う](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/9e206a77-07e1-e99b-b84f-e9e9cd0b4f0c.png)

「**MySql.Data**」が追加されました(\*˘꒳˘\*)
この中にMySQLを扱うC#オブジェクトが入っているのです。

### ボタンクリック時のソースを記述する
今回はSQLをボタンクリックで読み込むだけなので、Form1.csのコード部分だけをコーディングするので、button1コントロールをダブルクリックして、クリックイベントを自動で生成するので、そのイベント動作をコーディングします。

もちろんMySQLに接続するので[「前提と準備」の「環境」で「MySQLサーバー」に記載されているユーザーとテーブル](https://qiita.com/kazumi75kitty/items/dd391cab06762555dc5d#mysql%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)を使います。

```c#:Form1.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace MySqlFormsTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /** Visual Studioではボタンコントロールをダブルクリックすると、自動で生成される
         * 接続ボタン(MySQLサーバーに接続し、一覧データを取得する)
         * */
        private void button1_Click(object sender, EventArgs e)
        {
            string connStr = "server=127.0.0.1;user id=test;password=test1;database=manutest";
            MySqlConnection conn = new MySqlConnection(connStr);

            try
            {
                // 接続を開く
                conn.Open();

                // データを取得するテーブル
                DataTable tbl = new DataTable();

                // SQLを実行する
                MySqlDataAdapter dataAdp = new MySqlDataAdapter("SELECT id, name, memo FROM testtb", conn);
                dataAdp.Fill(tbl);

                // データグリッドに表示させる
                dataGridView1.DataSource = tbl;

                // 実行結果を1行ずつ参照する場合
                for (int i = 0; i < tbl.Rows.Count; i++)
                {
                    DataRow row = tbl.Rows[i];  // データ行

                    // 右のリストボックスにアイテムを追加
                    listBox1.Items.Add(row[1]);
                    listBox2.Items.Add(row[2]);
                }

                // 接続を閉じる
                conn.Close();
            }
            catch (MySqlException mse)
            {
                MessageBox.Show(mse.Message, "データ取得エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
```

MySQL ConnectorsのC#に関する公式の根拠が出回っていなかったので、第三者の情報と実際Visual Studioのコーディングでポップアップされるトピックを頼りにするしかなかったのです…( ´ •̥  ̫ •̥ ` )…なので、データの取得に「MySqlDataAdapter」だったり「MySqlCommand」だったり統一されずに混在している状態で、用途もはっきりしていないが、私はMySqlDataAdapterを使っています

```c#
string connStr = "server=127.0.0.1;user id=test;password=test1;database=manutest";
```
これが接続コマンドで、serverはサーバーのホスト、user idにMySQLのID、passwordはパスワード、そしてdatabaseは接続するDB名ですが、他の記事を見ていると、uidだったりUserIdだったり混在していて、あまり統一されていないように見えました。。。

```c#
MySqlDataAdapter dataAdp = new MySqlDataAdapter("SELECT id, name, memo FROM testtb", conn);
dataAdp.Fill(tbl);
```
ここの部分は「*SELECT id, name, memo FROM testtb*」というSQLを実行し、実行結果をデータテーブルに格納する部分です。

```c#
// データグリッドに表示させる
dataGridView1.DataSource = tbl;
```
この部分は左上のデータグリッドdataGridView1にSELECTで取得したデータを表示することを意味し、DataSourceにSQLを実行したテーブルをセットするだけで簡単に表示できます。

一方、

```c#
// 実行結果を1行ずつ参照する場合
for (int i = 0; i < tbl.Rows.Count; i++)
{
    DataRow row = tbl.Rows[i];  // データ行
    
    // 右のリストボックスにアイテムを追加
    listBox1.Items.Add(row[1]);
    listBox2.Items.Add(row[2]);
}
```
こんなふうに、**取得したテーブルtblの各行は、tbl.Rows[i]で行を取得することができて、その中の各データを配列の形で取り出すことができるんです**。このことはC#のMySQLに限らずC#のDataRowやDataTableの話になるのであまり細かいことは触れず。

それぞれの取得した個別のデータを右上のlistBoxに表示させています。

## 実行結果

![表示成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/f6e2e8c0-b920-9d77-3bfc-6b38db02e9a5.png)


# 次回
Visual StudioでMySQLのデータを表示できたので、次はデータの追加や修正、削除を予定しています٩(.› ‹.♡)۶

# 参考文献
  1. 【Visual Studio】C#からMySqlの使い方　接続するには？SQL文を実行するには？ - 困ったー(ページは削除された可能性)