C#、SQL Server、DapperでINSERTを実行し、挿入されたIDを取得する方法
DapperでINSERTを実行し、挿入されたIDを取得する方法
SCOPE_IDENTITY()を使用する
この方法は、SCOPE_IDENTITY()
関数を使用して、最後に挿入されたIDを取得します。
using (var connection = new SqlConnection("connection string"))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
connection.Execute(query, parameters);
var insertedId = (int)connection.ExecuteScalar("SELECT SCOPE_IDENTITY()");
// 挿入されたIDを使用する処理
}
OUTPUT句を使用する
この方法は、OUTPUT
句を使用して、INSERTステートメントの一部として挿入されたIDを取得します。
using (var connection = new SqlConnection("connection string"))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) OUTPUT INSERTED.[Id] VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
var insertedId = (int)connection.ExecuteScalar(query, parameters);
// 挿入されたIDを使用する処理
}
SCOPE_IDENTITY()
を使用する方法は、シンプルで分かりやすいです。OUTPUT
句を使用する方法は、1つのクエリでINSERTとIDの取得を実行できるため、パフォーマンスが向上します。
注意事項
SCOPE_IDENTITY()
は、SQL Server 2005以降でのみ使用できます。
using System;
using System.Data.SqlClient;
using Dapper;
namespace DapperExample
{
class Program
{
static void Main(string[] args)
{
// 接続文字列
const string connectionString = "connection string";
// INSERTする値
const string value1 = "value1";
const int value2 = 10;
// 1. SCOPE_IDENTITY()を使用する
using (var connection = new SqlConnection(connectionString))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
connection.Execute(query, parameters);
var insertedId = (int)connection.ExecuteScalar("SELECT SCOPE_IDENTITY()");
Console.WriteLine("挿入されたID: {0}", insertedId);
}
// 2. OUTPUT句を使用する
using (var connection = new SqlConnection(connectionString))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) OUTPUT INSERTED.[Id] VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
var insertedId = (int)connection.ExecuteScalar(query, parameters);
Console.WriteLine("挿入されたID: {0}", insertedId);
}
}
}
}
このコードを実行するには、以下の準備が必要です。
- .NET Framework 4.5以降
- SQL Server 2005以降
- Dapperライブラリ
Dapperライブラリは、NuGet Package Managerを使用してインストールできます。
- Visual Studioでソリューションを開きます。
- ソリューションエクスプローラーで、プロジェクトを右クリックします。
- NuGet パッケージの管理を選択します。
- オンラインタブを選択します。
- 検索ボックスに「Dapper」と入力します。
- Dapperパッケージを見つけ、インストールを選択します。
コードの実行
- Visual Studioで、ビルドメニューからソリューションのビルドを選択します。
- デバッグメニューからデバッグの開始を選択します。
出力
挿入されたID: 1
挿入されたID: 1
補足
- このサンプルコードは、基本的な例です。実際のコードでは、エラー処理などを追加する必要があります。
Table
、Column1
、Column2
などは、実際の環境に合わせて変更する必要があります。
DapperでINSERTを実行し、挿入されたIDを取得するその他の方法
IDENTITY
列を使用する方法は、テーブルにIDENTITY
列が設定されている場合に使用できます。
using (var connection = new SqlConnection("connection string"))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
var insertedId = connection.Execute(query, parameters);
// 挿入されたIDを使用する処理
}
この方法では、SCOPE_IDENTITY()
やOUTPUT
句を使用する必要はありません。ただし、テーブルにIDENTITY
列が設定されていない場合は使用できません。
SELECT @@IDENTITY
を使用する方法は、SCOPE_IDENTITY()
と似ていますが、@@IDENTITY
システム変数を使用して最後に挿入されたIDを取得します。
using (var connection = new SqlConnection("connection string"))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
connection.Execute(query, parameters);
var insertedId = (int)connection.ExecuteScalar("SELECT @@IDENTITY");
// 挿入されたIDを使用する処理
}
この方法は、SCOPE_IDENTITY()
よりも古い方法ですが、すべてのバージョンのSQL Serverで使用できます。
手動でIDを生成する方法は、パフォーマンスが低下する可能性があるため、最後の手段として使用するべきです。
using (var connection = new SqlConnection("connection string"))
{
var query = "INSERT INTO [Table] ([Column1], [Column2]) VALUES (@Value1, @Value2)";
var parameters = new DynamicParameters();
parameters.Add("@Value1", value1);
parameters.Add("@Value2", value2);
connection.Execute(query, parameters);
var insertedId = 1; // 手動でIDを生成
// 挿入されたIDを使用する処理
}
この方法は、IDがシーケンシャルである必要がない場合に使用できます。
DapperでINSERTを実行し、挿入されたIDを取得するには、いくつかの方法があります。どの方法を使用するかは、状況によって異なります。
IDENTITY
列を使用する方法は、SCOPE_IDENTITY()
やOUTPUT
句を使用する必要はありません。
c# sql-server dapper