2017年3月26日日曜日

ASP.NET MVC でデータベースにテーブルを追加する方法

まずはモデルを用意します。

public class MyModel
{
    public int Id { get; set; }
    public string Description { get; set; }
}

続いて、Application_Start() 内で、Database.SetInitializer メソッドにデータイニシャライザーを生成して渡します。

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...
        Database.SetInitializer<DataContext>(new DataInitializer());
        ...
    }
}

データベースとモデルの紐づけは DbContext 継承クラス内で行います。

public partial class DataContext : DbContext
{
    public DataContext()
        : base("name=DataContext")
    {
    }

    //モデル
    public virtual DbSet<MyModel> MyModels { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
        modelBuilder.Entity<MyModel>();
    }
}

2017年3月18日土曜日

Visual Studio 「スタートページ」ボタンをツールバーに表示

備忘録としてメモ。

仕事柄、いろいろなソリューションファイルを開くことがあるのですが、「スタートページ」ボタンが重宝しています。時々ツールバーから消えてしまうので、都度表示するようにしています。

ツールバーの「ボタンの追加または削除」 → 「カスタマイズ」を選択。

















ダイアログのカテゴリから「表示」 → コマンドから「スタートページ」を選択。

2017年3月16日木曜日

MySQL JOIN による3つのテーブルを結合

つなぎ合わせるテーブル3つは下記のとおりです。

受注一覧テーブル
SELECT * FROM order_master;
+----+------------+-----------+
| id | product_id | vendor_id |
+----+------------+-----------+
|  1 |          1 |         2 |
|  2 |          2 |         1 |
|  3 |          4 |         3 |
|  4 |          3 |         2 |
+----+------------+-----------+

商品一覧テーブル
SELECT * FROM product_master;
+----+----------------+
| id | product_name   |
+----+----------------+
|  1 | 調味料A        |
|  2 | 調味料B        |
|  3 | 佃煮           |
|  4 | コーンフレーク |
+----+----------------+

配送業者テーブル
SELECT * FROM vendor_master;
+----+-------------+---------------------+
| id | vendor_name | contract_date       |
+----+-------------+---------------------+
|  1 | 東京配送    | 2017-03-03 00:00:00 |
|  2 | なにわ屋    | 2017-05-03 00:00:00 |
|  3 | 桃山Express | 2018-03-03 00:00:00 |
+----+-------------+---------------------+


① 配送業者テーブル(vendor_master)から、有効期限内である業者からの受注情報を取得します。有効期限を判定するには、配送業者テーブル(vendor_master)の contract_date が今日よりも大きい日付であることを調べます。

② ①の結果取得される配送業者テーブル(vendor_master)を、RIGHT OUTER JOIN で受注一覧テーブル(order_master)と結合します。

③ ②の結果と商品一覧テーブル(product_master)を結合します。

SQL 文はこちらです。

SELECT
 o.id '注文 ID'
 ,o.product_id '商品 ID'
 ,p.product_name '商品名'
 ,v.vendor_name '配送業者'
FROM
 order_master o
 RIGHT OUTER JOIN /*②の処理*/
 (SELECT id, vendor_name FROM vendor_master WHERE contract_date > CURDATE()) v /*①の処理*/
 ON
 o.vendor_id = v.id
 JOIN /*③の処理*/
 product_master p
 ON
 o.product_id = p.id
;

2017年3月14日火曜日

MySQL ログイン方法

下記、root としてログインするコマンドです。

mysql -u root -p

root にパスワードが設定されている場合、続いてパスワードの入力が求められます。


※ログインユーザーは下記で確認することができます。
select user();


リンク:SQL 基本コマンド一覧
http://kainobi2.blogspot.com/2017/03/sql.html

2017年3月13日月曜日

Visual Studio から MySQL に接続してデータを DataGridView に表示する

今回は xampp の MySQL データベースのデータテーブルを取得して Windows Forms の DataGridView に表示する例を紹介します。

NuGet を利用して MySQL のドライバー(MySql.Data)をダウンロード、参照します。
次のスクリーンショットは、MySql.Data をインストールし、プロジェクトでの参照設定がなされた後の状態です。


続いて、フォーム上にボタンを配置してクリックイベントのハンドラーを用意します。イベントハンドラー内に、下記のように実装します。
接続文字列は、MySqlConnectionStringBuilder を利用していますが、代わりに string に直接接続文字列を記述することも可能です。

private void button1_Click(object sender, EventArgs e)
{
    //方法1:MySqlConnectionStringBuilder を利用して接続情報を作成
    MySqlConnectionStringBuilder conBuilder = new MySqlConnectionStringBuilder
    {
        UserID = "root",
        Database = "test",
        Server = "127.0.0.1"
    };

    //方法2:もしくはこのように string で接続文字列を作成
    //string conString = "host=127.0.0.1; user=root; database=test";

    //方法1、方法2で、using を使わずにコネクションオブジェクトを生成する場合、下記2行が利用可能
    //try 内で connection.Open() メソッドでデータベースと接続できるかを確認する
    //MySqlConnection connection = new MySqlConnection(conBuilder.ConnectionString);
    //MySqlConnection connection = new MySqlConnection(conString);

    //using 内でコネクションオブジェクトを生成(利用後に確実に破棄されるようにする)
    using (var connection = new MySqlConnection(conBuilder.ConnectionString))
    //using (var connection = new MySqlConnection(conString))
    {
        try
        {
            // データベースとの接続をオープン
            connection.Open();
            // データを保存するテーブルを作成
            DataTable dt = new DataTable();
            // SQL 文と接続情報を引数に、データアダプターを作成
            MySqlDataAdapter da = new MySqlDataAdapter("select * from books", connection);
            // SQL 文で指定したデータを DataTable に格納
            da.Fill(dt);
            // DataTable を DataGridView に表示
            dataGridView1.DataSource = dt;
            // データベースとの接続をクローズ
            connection.Close();

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

参考情報:

Connect Visual Studio 2015 (VB.net) with XAMPP Tutorial (EASY WAY)
https://www.youtube.com/watch?v=UQ_C8c6rev8

2017年3月10日金曜日

MySQL 集計関数

MySQL で利用できる集計関数の一覧です。

関数機能
AVG平均値を計算する
COUNTレコード数を計算する
MAX最大値を調べる
MIN最小値を調べる
SUM合計値を計算する


下記テーブルを例に、これら集計関数を利用してみましょう。

SELECT * FROM person;
+----+-------+------+--------+---------+
| id | name  | age  | gender | dept_no |
+----+-------+------+--------+---------+
|  1 | kai   |   27 |      1 |       1 |
|  2 | gerda |   25 |      2 |       2 |
|  3 | ragi  |   33 |      1 |       1 |
+----+-------+------+--------+---------+


AVG 関数
AVG 関数で平均年齢を求めます。

SELECT AVG(age) FROM person;
+----------+
| AVG(age) |
+----------+
|  28.3333 |
+----------+


COUNT 関数
COUNT 関数で、person テーブルのレコード数を求めます。

SELECT COUNT(*) FROM person;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+


MAX 関数
MAX 関数で一番年上を求めます。

SELECT MAX(age) FROM person;
+----------+
| MAX(age) |
+----------+
|       33 |
+----------+


MIN 関数
MIN 関数で一番年下を求めます。

SELECT MIN(age) FROM person;
+----------+
| MIN(age) |
+----------+
|       25 |
+----------+


SUM 関数
今回のテーブルではあまり意味はないかもしれませんが、SUM 関数で全員の延べ年齢を求めてみます。

SELECT SUM(age) FROM person;
+----------+
| SUM(age) |
+----------+
|       85 |


リファレンス
12.19.1 GROUP BY (集約) 関数

2017年3月9日木曜日

MySQL GROUP BY 句によるグループ化

person テーブルと gender テーブルのデータを確認します。

SELECT * FROM person;
+----+-------+------+--------+---------+
| id | name  | age  | gender | dept_no |
+----+-------+------+--------+---------+
|  1 | kai   |   27 |      1 |       1 |
|  2 | gerda |   25 |      2 |       2 |
|  3 | ragi  |   33 |      1 |       1 |
+----+-------+------+--------+---------+


SELECT * FROM gender;
+----+-------+
| id | label |
+----+-------+
|  0 | 不明  |
|  1 | 男性  |
|  2 | 女性  |
+----+-------+


それでは GROUP BY 句を利用して person テーブルの性別ごとにグループ化を行います。グループ化を行い、更に COUNT 関数を利用してグループごとのレコード数を集計します。

SELECT g.label AS '性別',  COUNT(p.name) AS '人数' FROM person AS p, gender AS g 
WHERE g.id = p.gender GROUP BY p.gender;
+------+------+
| 性別 | 人数 |
+------+------+
| 男性 |    2 |
| 女性 |    1 |
+------+------+

※ GROUP BY 句を利用する際には、「グループ化を行う列」「集計関数(ここでは COUNT 関数)の対象列」のみ選択(SELECT)の対象とすることができます。

2017年3月8日水曜日

MySQL AS 句によりテーブルに別名を付ける

まずはテーブルの構成を確認します。今回も person テーブルと department テーブルを利用します。

MariaDB [test]> SELECT * FROM person;
+----+-------+------+--------+---------+
| id | name  | age  | gender | dept_no |
+----+-------+------+--------+---------+
|  1 | kai   |   27 |      1 |       1 |
|  2 | gerda |   25 |      2 |       2 |
|  3 | ragi  |   33 |      1 |       1 |
+----+-------+------+--------+---------+
3 rows in set (0.00 sec)

MariaDB [test]> SELECT * FROM department;
+----+----------------+
| no | name           |
+----+----------------+
|  1 | sales          |
|  2 | human resource |
+----+----------------+
2 rows in set (0.00 sec)


person テーブルは p、department は d という別名を付けています。一度別名を付けると、後続の WHERE 句では p、d と短い別名を使うことで簡潔な記述になっています。

MariaDB [test]> SELECT p.name, d.name from person AS p, department AS d 
WHERE p.dept_no = d.no;
+-------+----------------+
| name  | name           |
+-------+----------------+
| kai   | sales          |
| gerda | human resource |
| ragi  | sales          |
+-------+----------------+
3 rows in set (0.00 sec)

2017年3月7日火曜日

MySQL AS 句により列に別名を付ける

MySQL SELECT 文」では下記のようにテーブルを結合して name 列を表示しました。

MariaDB [test]> SELECT person.name, department.name 
FROM person, department 
WHERE person.dept_no = department.no;
+-------+-------------------+
| name  | name                |
+-------+-------------------+
| kai      | sales                 |
| gerda  | human resource |
| ragi     | sales                 |
+-------+-------------------+

→ 左の name 列は person テーブルから、右の name 列は department テーブルから取得されています。このままでは分かりづらいのでそれぞれの列に別名を付けます。


AS 句を使って列に別名をつける

MariaDB [test]> SELECT person.name AS 'person name', department.name  AS 'department name' 
FROM person, department 
WHERE person.dept_no = department.no;
+-------------+-----------------------+
| person name | department name |
+-------------+-----------------------+
| kai                | sales                   |
| gerda            | human resource   |
| ragi               | sales                   |
+-------------+-----------------------+

→ それぞれの列がどのような意味を持つのかがひと目でわかるようになりました。

2017年3月6日月曜日

MySQL SELECT 文

person テーブルと department テーブルを結合してみましょう。

まずはそれぞれのテーブルの定義とレコードの確認です。


person テーブル

MariaDB [test]> desc person;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| name    | varchar(30) | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
| gender  | smallint(2) | YES  |     | NULL    |       |
| dept_no | int(11)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+


MariaDB [test]> select * from person;
+----+-------+------+--------+---------+
| id | name  | age  | gender | dept_no |
+----+-------+------+--------+---------+
|  1 | kai   |   27 |      1 |       1 |
|  2 | gerda |   25 |      2 |       2 |
|  3 | ragi  |   33 |      1 |       1 |
+----+-------+------+--------+---------+


department テーブル

MariaDB [test]> desc department;
+-------+-------------+------+-----+---------+-------+
| Field   | Type            | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no      | int(11)         | NO   | PRI | NULL    |         |
| name  | varchar(30) | YES  |       | NULL    |         |
+-------+-------------+------+-----+---------+-------+


MariaDB [test]> select * from department;
+----+-------------------+
| no | name                |
+----+-------------------+
|  1 | sales                  |
|  2 | human resource  |
+----+-------------------+


まずは person テーブルと department テーブルの全列を表示してみましょう。
WHERE 句により、person テーブルの dept_no 列と department テーブルの no 列を結合しています。

MariaDB [test]> SELECT * FROM person, department
WHERE person.dept_no = department.no;
+----+-------+------+--------+---------+----+-------------------+
| id | name  | age  | gender | dept_no | no | name                |
+----+-------+------+--------+---------+----+-------------------+
|  1 | kai     |   27 |          1 |           1 |   1 | sales                 |
|  2 | gerda |   25 |          2 |           2 |   2 | human resource |
|  3 | ragi    |   33 |          1 |           1 |   1 | sales                 |
+----+-------+------+--------+---------+----+-------------------+


続いて、表示する列を絞ってみましょう。person テーブル、department テーブルの name 列のみを表示してみます。

MariaDB [test]> SELECT person.name, department.name 
FROM person, department 
WHERE person.dept_no = department.no;
+-------+-------------------+
| name  | name                |
+-------+-------------------+
| kai      | sales                 |
| gerda  | human resource |
| ragi     | sales                 |
+-------+-------------------+

2017年3月5日日曜日

SQL 基本コマンド一覧

MySQL で検証していますが、標準 SQL の範囲だと思います。


データベースの一覧表示
SHOW DATABASES;

データベースの選択
USE test;

テーブルの一覧表示
SHOW TABLES;

テーブルの作成
CREATE TABLE person(id int not null primary key, name nvarchar(30), age int, gender smallint(2));

テーブルの構造表示
DESC person;

テーブルの削除
DROP TABLE person;

行の挿入(単一行)
INSERT INTO 
person(id, name, age, gender) 
VALUES (1, 'kai', 27, 1);

行の挿入(複数行)
INSERT INTO 
person(id, name, age, gender) 
VALUES (2, 'gerda', 25, 2), (3, 'ragi', 33, 1);

テーブルに列を追加
ALTER TABLE person ADD dept_no int;

行の更新
UPDATE person SET dept_no = 1 WHERE name = 'kai';

行の選択1
--person テーブルの dept_no 列と、department テーブルの no 列を結合。両方のテーブルの全列を選択。
SELECT * 
FROM person, department 
WHERE person.dept_no = department.no;

行の選択2
--person テーブルの dept_no 列と、department テーブルの no 列を結合。
--person テーブルの name 列と department テーブルの name 列を選択。
SELECT person.name, department.name 
FROM person, department 
WHERE person.dept_no = department.no;

2017年3月4日土曜日

Visual Studio Code のデバッグがとても便利

Visual Studio Code のデバッグですが、Visual Studio ゆずりでとっても便利ですね。

Superglobals の変数をウォッチ式に入れるのも Visual Studio 同様簡単です。



Visual Studio Code で XAMPP Lite と組み合わせたデバッグ環境

Visual Studio Code をインストール後、XAMPP Lite の php.ini に下記を追記。
※ XAMPP は D フォルダ配下にインストールしています。


D:\xampp\php\php.ini
[XDebug]
zend_extension="D:\XAMPP\php\ext\php_xdebug.dll"
;xdebug.remote_enable=On
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler=dbgp


D:\xampp\htdocs\.vscode\launch.json
{
    "version""0.2.0",
    "configurations": [
        {
            "name""Listen for XDebug",
            "type""php",
            "request""launch",
            "port"9000
        },
        {
            "name""Launch currently open script",
            "type""php",
            "request""launch",
            "program""${file}",
            "cwd""${fileDirname}",
            "port"9000
        }
    ]
}

XAMPP Lite の Apache 設定(IIS との共存)


IIS をインストールしている環境だと localhost:80 は先に使われているので、XAMPP には localhost:8080 を利用するように変更します。下記手順です。

1.httpd.config の編集
























80 を 8080 に変更

























2.httpd-ssl.config の編集
httpd.config と同様に、443 を 4499 に変更



3.XAMPP Control Panel の設定変更

XAMPP Control Panel の「Admin」ボタンクリックで表示するページの URL も 8080, 4499 ポートに対応するための設定変更です。















※追記
httpd.config と httpd-ssl.config にある Listen ポートやサーバーのポート指定も 80 → 8080, 443 → 4499 に全て変更する必要があります。