多趣味ブログ

いろいろな事を広く浅く楽しむブログ

UnityでMySQLを操作する覚え書き

   

mysql_unity

unityからMySQLに作った名簿表からデータ取得と、データ書き込みをします。

SQL文でいうSELECTとINSERTですね。コードの解説などもして行こうかと。

MySQL Connectorのリファレンス

前回の記事でダウンロードしたMySQL Connectorの中にリファレンスがあります。

mysql-connector-net-6.9.8-noinstall>Documentation>ConnectorNET.chm

ここを参照しながら組んでいこうかと。

MySQLへの接続

前回の続きなのでUnityはasset>PluginsにMySql.Data.dllが入っているものとします。

リファレンスのをちょっといじって。

using UnityEngine;
using System;
using System.Collections;

using MySql.Data;
using MySql.Data.MySqlClient;

public class MySqlConnectTest : MonoBehaviour {

    string SERVER = "localhost";
    string DATABASE = "test01_schema";
    string USERID = "root";
    string PORT = "3306";
    string PASSWORD = "********";

	void Start () {

        string connCmd =
               "server=" + SERVER + ";" +
               "database=" + DATABASE + ";" +
               "userid=" + USERID + ";" +
               "port=" + PORT + ";" +
               "password=" + PASSWORD;

        MySqlConnection conn = new MySqlConnection(connCmd);
        
        try
        {
            Debug.Log("MySQLと接続中...");
            conn.Open();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.ToString());
        }
        conn.Close();
        Debug.Log("接続を終了しました");
    }
}

サーバー用変数を書き換えてUnityのオブジェクトに貼り付けてください。

25行目の MySqlConnection conn = new MySqlConnection(connCmd); というところでMySqlConnectionオブジェクトをconnという名前で生成しています。

引数のconnCmdは10~14行目のサーバ接続用変数を18~23行目で成形したものですね。unityならインスペクターで設定できるようにすると楽かも。

そのあとMySqlConnectionオブジェクトのconnでOpen()メソッドを呼び出せばMySQLへの接続ができます。

このあたりは例外処理が組まれているので、何かしらが原因でconn.Open()が実行できなかった場合は32行目のcatch文に飛ばされエラーの内容が出力されます。

最後にconn.Close()で接続を閉じます。これを書かないとスクリプトの実行が終わっても接続しっぱなしになるので気を付けます。

まとめるとMySqlConnectionオブジェクトでサーバー設定用の変数を引数にしてオブジェクトを作り、Open()メソッドを使い、最後にClose()メソッドで終了という流れになりますね。

SELECT文を投げる

テーブルの内容を返す簡単なSQLを投げてみます。

using UnityEngine;
using System;
using System.Collections;

using MySql.Data;
using MySql.Data.MySqlClient;

public class MySqlSelectTest : MonoBehaviour
{

    string SERVER = "localhost";
    string DATABASE = "test01_schema";
    string USERID = "root";
    string PORT = "3306";
    string PASSWORD = "********";

    void Start()
    {

        string connCmd =
               "server=" + SERVER + ";" +
               "database=" + DATABASE + ";" +
               "userid=" + USERID + ";" +
               "port=" + PORT + ";" +
               "password=" + PASSWORD;

        MySqlConnection conn = new MySqlConnection(connCmd);

        try
        {
            Debug.Log("MySQLと接続中...");
            conn.Open();

            string sql = "SELECT * FROM test01_schema.member;";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Debug.Log(rdr[0] + " -- " + rdr[1] + " -- " + rdr[2]);
            }
            rdr.Close();

        }
        catch (Exception ex)
        {
            Debug.Log(ex.ToString());
        }
        conn.Close();
        Debug.Log("接続を終了しました");
    }
}

サーバー設定変数と34行目のSQL文は適当に書き換えてください。

35行目でcmdというMySqlCommandオブジェクトを作成しています。

MySqlCommandはSQL文を実行してテーブルを参照したり書き込んだりするメソッドを持っているオブジェクトですね。引数はMySqlCommand(string型 SQL文,MySqlConnection型 ここではconn)となっています。

今回は表の読み取りなのでMySqlCommandオブジェクトのcmdのExecuteReader()というメソッドを使用します(36行目)。このメソッドはMySqlDataReaderという型で値を返しますのでrdrに格納します。

38行目のwhileループではrdr.Read()というメソッドを判定式で実行し、コンソールに出力しています。出力の成形などは自由にどうぞ。

MySqlDataReader.Read()は次のレコードにMySqlReaderを進めるメソッドってリファレンスに書いてます。が、一回もRead()しないままだとrdr[0]とかの参照ができないので少なくとも一回は参照する前に実行する必要があります。

出力が終わったらrdr.Close()でセッションを閉じます。閉じるまでMySqlConnectionに関わる操作はできなくなるので必ず閉じます。

では実行してみます。

イメージ1452

ちゃんとできてるみたいですね。

 INSERT文を投げる

using UnityEngine;
using System;
using System.Collections;

using MySql.Data;
using MySql.Data.MySqlClient;

public class MySqlInsertTest : MonoBehaviour
{

    string SERVER = "localhost";
    string DATABASE = "test01_schema";
    string USERID = "root";
    string PORT = "3306";
    string PASSWORD = "********";

    void Start()
    {
        string connCmd =
               "server=" + SERVER + ";" +
               "database=" + DATABASE + ";" +
               "userid=" + USERID + ";" +
               "port=" + PORT + ";" +
               "password=" + PASSWORD;

        MySqlConnection conn = new MySqlConnection(connCmd);

        try
        {
            Debug.Log("MySQLと接続中...");
            conn.Open();

            string sql = "INSERT INTO test01_schema.member (ID, 苗字, 名前) VALUES (001,'加藤','四朗');";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Debug.Log(ex.ToString());
        }
        conn.Close();
        Debug.Log("接続を終了しました");
    }
}

INSERT文は基本なにかデータを返してもらうわけではないのでシンプルですね(リファレンス訳)。

35行目のcmd.ExecuteNonQuery() というのが新しく出てきたのですが、これはINSERTやDELETE文を投げる時に使うMySqlCommandオブジェクトのメソッドです。

実行してテーブルに書き込み、一個前のコードを使ってテーブルの内容を確認してみましょう。
イメージ1453

MySQL側の設計がぐだぐだですがデータの挿入はできてるようなので良しとします。

お疲れさまでした

次はSQL文の投げ方の続きと、汎用性のあるものを書こうかと。

前回に引き続き参考にしました。

Qiita:UnityでMySQLを使用する

 - MySQL, Unity, おぼえ書き