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