C#、SQL Server、DapperでINSERTを実行し、挿入されたIDを取得する方法

2024-04-10

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を使用してインストールできます。

  1. Visual Studioでソリューションを開きます。
  2. ソリューションエクスプローラーで、プロジェクトを右クリックします。
  3. NuGet パッケージの管理を選択します。
  4. オンラインタブを選択します。
  5. 検索ボックスに「Dapper」と入力します。
  6. Dapperパッケージを見つけ、インストールを選択します。

コードの実行

  1. Visual Studioで、ビルドメニューからソリューションのビルドを選択します。
  2. デバッグメニューからデバッグの開始を選択します。

出力

挿入されたID: 1
挿入されたID: 1

補足

  • このサンプルコードは、基本的な例です。実際のコードでは、エラー処理などを追加する必要があります。
  • TableColumn1Column2などは、実際の環境に合わせて変更する必要があります。



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


もう悩まない!SQL Server レプリケーションで「プログラムの読み込み中に形式が正しくないというエラー」を解決する4つの方法

原因このエラーは以下の原因によって発生します。プログラムファイルの破損: プログラムファイルがダウンロードまたはインストール中に破損した可能性があります。互換性のないプログラムファイル: 使用している . NET Framework のバージョンとプログラムファイルのバージョンが互換性がない可能性があります。...


SQL GREATEST 関数を使って複数の列から最大値を取得する方法

複数の列から最大値を取得したい。解決策:以下の方法で複数の列から最大値を取得できます。方法 1:MAX 関数と CASE 式この例では、col1 と col2 の比較を行い、大きい方の値を max_value として取得します。方法 2:GREATEST 関数...


データベースコピーウィザード vs RESTORE DATABASE ステートメント

方法 1: データベース コピー ウィザードの使用これは、データベース全体をコピーする最も簡単な方法です。手順:データベース コピー ウィザード で、以下の項目を指定します。 コピー先のデータベース名: コピー先のデータベースの名前 オプション: コピーするデータの範囲、データベースの復元方法など...


SQL Output 句で挿入されない列を返す:詳細解説とサンプルコード

詳細説明:OUTPUT 句は、INSERT、UPDATE、または DELETE ステートメントと組み合わせて使用し、操作の影響を受けた行の情報を結果セットに含めることができます。この句は、挿入、更新、削除された行だけでなく、トリガーやチェック制約によって変更された列の値も含めて返せます。...


SQL ServerビューでORDER BY句を使用できないときの解決策:マテリアライズドビューを使用する

SQL Serverにおいて、ビュー、インライン関数、派生テーブル、サブクエリ、共通表式(CTE)などのオブジェクトでORDER BY句を使用しようとすると、「The ORDER BY clause is invalid in views...