C#とMySQLを接続してCRUD操作をしてみる



#環境
Windous10 HOME
[Visual Studio 2019 Community](https://visualstudio.microsoft.com/ja/downloads/)
[MySQL 8.0](https://www.mysql.com/jp/)

#やったこと
学習のためにVisual Studio C#でMySQLのCRUD操作ができるコンソールアプリを作成する。
※CRUD → CREATE、READ、UPDATE、DELETE

#参考
https://qiita.com/yuzooho/items/5d608f3b84a2037cada0
https://qiita.com/kazumi75kitty/items/9953bb84edd7717bc90a
https://mikeda.hatenablog.com/entry/20090419/1240123566

上記を参考にさせていただきました。
ありがとうございます。

#環境設定
1. 「新しいプロジェクトの作成」からコンソールアプリ(.NET Framework)を選択して作成します。
<br>
※この時「C#」「Windows」「コンソール」と書かれている方選ばないと後々MySQLと接続できなくなります。

![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/3901984d-a514-7e52-5dc6-93b4474e21c7.png)

2. 「参照」を右クリックして「参照の追加」を選択します。
 
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/2c5c2dff-3300-e4ee-2697-1cac7c43121b.png)

 参照マネージャーの検索でMySQLと入力して「MySql.data」にチェックして「OK」を選択する。

![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/35f29fea-667d-6da1-f69e-7410a61fabdc.png)

3. MySQLのコマンドを起動してデータベース「test_database」を作成します。

```title:MySQL
CREATE DATABASE test_database;
```
「test_database」が作成されているか確認します。

```title:MySQL
SHOW DATABASES;
```
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/7e147a0e-45c9-644f-2d87-a678d1cf6a7c.png)

「test_database」が作成されました。

#コードを記述

1. CRUD操作を行うコードを記述していきます。

```title:Program.cs

using System;
using MySql.Data.MySqlClient;// MySQLを使用


namespace MySQLテスト
{
    class Program
    {

        // MySQLへの接続情報
        private static readonly string server = "localhost";
        private static readonly string database = "test_database";//使用するデータベース
        private static readonly string user = "root";//ユーザー名
        private static readonly string pass = "password";//インストール時に設定したパスワード
        private static readonly string charset = "utf8";

        // MySQLへの接続
        private static readonly string connectionString = string.Format("Server={0};Database={1};Uid={2};Pwd={3};Charset={4}", server, database, user, pass, charset);

        // テーブル作成SQL
        private static readonly string MysqlTable = "test_table";//テーブル名
        private static readonly string CreateTableSql = "CREATE TABLE IF NOT EXISTS " + database + "." + MysqlTable + "(id int, name varchar(32), address varchar(32))";

        //データ挿入SQL
        private static readonly string InsertData = "(1, 'Tarou', 'Shinjuku'), (2, 'Hiroshi', 'Shibuya'), (3, 'Yumi', 'Setagaya'), (4, 'miku', 'Chiyoda')";//挿入するデータ
        private static readonly string InsertTableSql = "INSERT INTO " + MysqlTable + " (id, name, address) VALUES " + InsertData;

        //データ抽出用SQL
        private static readonly string SelectSql = "SELECT * FROM " + MysqlTable;//全てのカラムのデータを出力

        //データ更新用SQL
        private static readonly string UpdateSql = "UPDATE " + MysqlTable + " SET address = 'Meguro' WHERE name = 'Hiroshi'";//「Hiroshi」のaddressを「Meguro」に変更

        //データ削除用SQL
        private static readonly string DeleteSql = "DELETE FROM " + MysqlTable + " WHERE id = 4";//「id」が4のレコードを削除


        static void Main(string[] args)
        {
            try
            {
                // コネクションオブジェクトとコマンドオブジェクトの生成
                using (var connection = new MySqlConnection(connectionString))
                using (var command = new MySqlCommand())
                {
                    // コネクションオープン
                    connection.Open();


                    // テーブル作成SQLを実行
                    command.Connection = connection;
                    command.CommandText = CreateTableSql;
                    Console.WriteLine("テーブル「" + MysqlTable + "」を作成しました");
                    command.ExecuteNonQuery();
                    Console.WriteLine("続行するには何かキーを押してください");
                    Console.ReadKey();


                    // データ挿入用SQLを実行
                    command.Connection = connection;
                    command.CommandText = InsertTableSql;
                    Console.WriteLine("テーブル「" + MysqlTable + "」にデータ「" + InsertData + "」を挿入しました");
                    command.ExecuteNonQuery();
                    Console.WriteLine("続行するには何かキーを押してください");
                    Console.ReadKey();


                    // データ抽出SQLを実行
                    command.Connection = connection;
                    command.CommandText = SelectSql;
                    Console.WriteLine("テーブル「" + MysqlTable + "」のデータを出力します");

                    //カラム名を出力
                    MySqlDataReader reader = command.ExecuteReader();

                    string[] column = new string[reader.FieldCount];
                    for (int i = 0; i < reader.FieldCount; i++)
                        column[i] = reader.GetName(i);
                    Console.WriteLine(string.Join("\t", column));

                    //テーブルのデータを出力
                    while (reader.Read())
                    {
                        string[] row = new string[reader.FieldCount];
                        for (int i = 0; i < reader.FieldCount; i++)
                            row[i] = reader.GetString(i);
                        Console.WriteLine(string.Join("\t", row));
                    }
                    reader.Close();
                    Console.WriteLine("続行するには何かキーを押してください");
                    Console.ReadKey();


                    //データ更新SQL
                    command.Connection = connection;
                    command.CommandText = UpdateSql;
                    Console.WriteLine("ひろしの住所を目黒に変更しました");
                    command.ExecuteNonQuery();
                    Console.WriteLine("続行するには何かキーを押してください");
                    Console.ReadKey();


                    //データ削除SQL
                    command.Connection = connection;
                    command.CommandText = DeleteSql;
                    Console.WriteLine("idが4のデータを削除しました");
                    command.ExecuteNonQuery();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
    }
}
```
テーブル作成、データ挿入・抽出・更新・削除をキー入力で進めるプログラムです。

#MySQLを確認しながら実行していく

MySQLのコマンドで確認しながら実行していきます。
Visual Studioで「デバッグ」から「デバッグなしで開始」を選択します。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/02108dbe-524d-921e-bfb2-c6620abb5b87.png)

実行するとテーブル「test_table」が作成されます。
MySQLで確認します。

```title:MySQL
USE test_database;
```

「test_database」にデータベースを切り替えます。

```title:MySQL
SHOW TABLES;
```

![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/27252d5e-d1ce-5a92-a64c-d485b0bffc8b.png)

「test_table」が作成されました。
コンソールに戻って進めます。

![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/daa67ed6-07e5-bb1f-be92-6c83dbbfc96b.png)

データが挿入されます。
MySQLで確認します。

```title:MySQL
SELECT * FROM test_table;
```

![スクリーンショット (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/eb25c75d-de6e-6367-ae75-458f65b99b1d.png)

挿入されました。
コンソールに戻って進めます。

![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/4810fd53-cab8-b966-303b-79efcdf455c0.png)

テーブルのデータを出力しました。
先ほどMySQLで確認したデータと同じです。
このまま進めます。

![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/e71b278e-93c3-258f-a42b-a9db72df2ecc.png)

「Hiroshi」の「address」が「Meguro」に変更されているか確認します

![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/fe321999-a786-153c-87be-7915f9e5363b.png)

変更されました。
コンソールに戻って進めます。

![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/83206d03-7760-71f2-d47a-f7f489bbaaa0.png)

id = 4のレコードが削除されているか確認します。

![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/9113ffd3-5040-b208-c2bd-7ac56c1e3c8e.png)

削除されてます。

#感想

今回はC#でMySQLを操作する基本を学びました。
確認しながら操作することで直感的に理解できたと思います。