C#

【C#】DapperでDDLを実行する

DapperではDMLだけでなく、DDLも実行することが可能です。
本記事ではテーブル作成と列追加のサンプルコードを記載します。

【検証環境】VisualStudio2019 / .NET Core 3.1

CREATE TABLE (テーブル作成)

列情報クラスを作成します。

public class ColumnInfo
{
    /// <summary>
    /// 制約
    /// </summary>
    public string Constraint { get; set; } = "";
    /// <summary>
    /// 列名
    /// </summary>
    public string Name { get; set; } = "";
    /// <summary>
    /// データ型
    /// </summary>
    public string DataType { get; set; } = "";
}


作成したいテーブル・列情報を生成して、CreateTableメソッドに渡すとテーブルが作成されます。

using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;


//接続文字列
var connectionString = "環境に合わせてください。";

using (var connection = new SqlConnection(connectionString))
{
    //接続
    connection.Open();
    //作成テーブル名
    var tableName = "TEST";

    //作成列情報
    var columnInfo = new List<ColumnInfo>() 
    { 
        new ColumnInfo() { Name = "ID",
                           DataType = "int",
                           Constraint = "NOT NULL IDENTITY(1, 1) PRIMARY KEY"},
        new ColumnInfo() { Name = "Value",
                           DataType = "nvarchar(10)",
                           Constraint = "NOT NULL"},};
    //テーブル作成
    CreateTable(connection, tableName, columnInfo);
}

void CreateTable(SqlConnection connection, string tableName, List<ColumnInfo> columnInfo)
{
    //作成前にテーブルが存在すれば削除
    try
    {
        connection.Execute($"DROP TABLE {tableName}");
    }
    catch
    {
        //noop
    }

    //テーブル作成
    try
    {
        //SQLの構築
        var sql = $"CREATE TABLE {tableName}(";
        foreach (var item in columnInfo.Select((x, i) => new { Index = i, Value = x }))
        {
            sql += $"{item.Value.Name} {item.Value.DataType} {item.Value.Constraint}";
            if (item.Index + 1 != columnInfo.Count)
            {
                sql += ",";
            }
            else
            {
                sql += ")";
            }
        }
        //SQL実行
        connection.Execute(sql);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}


テーブルが作成されたことが確認できます。

ALTER TABLE ADD(列追加)

上記のテーブル作成の後に、列の追加行ってみます。上記のコードに追記する形で記載します。

using Dapper;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;

//接続文字列
var connectionString = "環境に合わせてください。";

using (var connection = new SqlConnection(connectionString))
{
    //接続
    connection.Open();
    //作成テーブル名
    var tableName = "TEST";
    //作成列情報
    var columnInfo = new List<ColumnInfo>() 
    { 
        new ColumnInfo() { Name = "ID",
                           DataType = "int",
                           Constraint = "NOT NULL IDENTITY(1, 1) PRIMARY KEY"},
        new ColumnInfo() { Name = "Value",
                           DataType = "nvarchar(10)",
                           Constraint = "NOT NULL"},};
    //テーブル作成
    CreateTable(connection, tableName, columnInfo);

    //追加列情報1
    var addColumn = new ColumnInfo() { Name = "Date", 
    								   DataType = "smalldatetime", 
    								   Constraint = "NOT NULL",};
    AddColumn(connection, tableName, addColumn);
    
    //追加列情報2
    addColumn = new ColumnInfo() { Name = "Bin", 
    							   DataType = "varbinary(MAX)", 
    							   Constraint = "", };
    AddColumn(connection, tableName, addColumn);
}


void CreateTable(SqlConnection connection, string tableName, List<ColumnInfo> columnInfo)
{
    //作成前にテーブルが存在すれば削除
    try
    {
        connection.Execute($"DROP TABLE {tableName}");
    }
    catch
    {
        //noop
    }

    //テーブル作成
    try
    {
        //SQLの構築
        var sql = $"CREATE TABLE {tableName}(";
        foreach (var item in columnInfo.Select((x, i) => new { Index = i, Value = x }))
        {
            sql += $"{item.Value.Name} {item.Value.DataType} {item.Value.Constraint}";
            if (item.Index + 1 != columnInfo.Count)
            {
                sql += ",";
            }
            else
            {
                sql += ")";
            }
        }
        //SQL実行
        connection.Execute(sql);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

void AddColumn(SqlConnection connection, string tableName, ColumnInfo columnInfo)
{
    try
    {
        //SQLの構築
        var sql = $"ALTER TABLE {tableName} ADD ";
        sql += $"{columnInfo.Name} {columnInfo.DataType} {columnInfo.Constraint};";

        //SQL実行
        connection.Execute(sql);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}


テーブル作成後に、列が追加されたことが確認できます。

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】安心保障と豊富な案件紹介 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい

【未経験向け】自宅で現役エンジニアから学べる TechAcademy

テックアカデミーは、現役エンジニアから学べるオンラインに特化したプログラミングスクールです。
講師は全員、通過率10%の選考に合格した現役エンジニア。
確かなスキルをもとに受講生をマンツーマンサポートします。


▼こんな方におすすめ
・自宅にいながらオンライン完結で勉強できる
・受講生に1人ずつ現役エンジニアのパーソナルメンターが専属でつく
・チャットで質問すればすぐに回答が返ってくる
・オリジナルサービスやオリジナルアプリなどの開発までサポート