【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);
    }
}

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

https://gist.github.com/devlights/8779382

Leave a Reply

Your email address will not be published. Required fields are marked *