【SQL Server】C# で `SCOPE_IDENTITY()` 関数を使って最後の挿入 ID を取得

2024-07-27

C# で SQL Server にレコードを挿入し、最後の挿入 ID を取得する方法

C# で SQL Server にデータを挿入し、その操作で生成された最後の ID を取得するには、主に以下の 2 つの方法があります。

SCOPE_IDENTITY() 関数を使用する

SCOPE_IDENTITY() 関数は、直前の INSERT ステートメントで挿入された最後の ID 値を返します。 以下のコード例は、Customers テーブルにレコードを挿入し、CustomerID (主キー) の値を取得する方法を示しています。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlCommand command = new SqlCommand("INSERT INTO Customers (FirstName, LastName, Email) VALUES (@FirstName, @LastName, @Email); SELECT SCOPE_IDENTITY();", connection))
    {
        command.Parameters.AddWithValue("@FirstName", "John");
        command.Parameters.AddWithValue("@LastName", "Doe");
        command.Parameters.AddWithValue("@Email", "[email protected]");

        int newCustomerID = (int)command.ExecuteScalar();
        Console.WriteLine("新規顧客 ID: {0}", newCustomerID);
    }
}

OUTPUT 句を使用する

OUTPUT 句を使用すると、INSERT ステートメントの実行結果をクエリ結果として取得できます。 以下のコード例は、Customers テーブルにレコードを挿入し、CustomerID と挿入された行数を同時に取得する方法を示しています。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlCommand command = new SqlCommand("INSERT INTO Customers (FirstName, LastName, Email) OUTPUT INSERTED.CustomerID VALUES (@FirstName, @LastName, @Email)", connection))
    {
        command.Parameters.AddWithValue("@FirstName", "John");
        command.Parameters.AddWithValue("@LastName", "Doe");
        command.Parameters.AddWithValue("@Email", "[email protected]");

        SqlDataReader reader = command.ExecuteReader();
        if (reader.Read())
        {
            int newCustomerID = reader.GetInt32(0);
            Console.WriteLine("新規顧客 ID: {0}", newCustomerID);
        }
    }
}
  • 上記のコード例は、SQL Server 2008 以降で使用できます。
  • 他のデータベースシステムを使用している場合は、最後の挿入 ID を取得する方法が異なる場合があります。
  • プログラミング言語に詳しくない場合は、ADO.NET チュートリアルなどのリソースを参照することをお勧めします。



using System;
using System.Data.SqlClient;

namespace InsertAndGetLastId
{
    class Program
    {
        static void Main(string[] args)
        {
            // 接続文字列を設定
            const string connectionString = "Data Source=localhost;Initial Catalog=myDatabase;Integrated Security=True";

            // 接続を開く
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                // INSERT ステートメントを作成
                using (SqlCommand command = new SqlCommand("INSERT INTO Customers (FirstName, LastName, Email) VALUES (@FirstName, @LastName, @Email); SELECT SCOPE_IDENTITY();", connection))
                {
                    // パラメータを設定
                    command.Parameters.AddWithValue("@FirstName", "John");
                    command.Parameters.AddWithValue("@LastName", "Doe");
                    command.Parameters.AddWithValue("@Email", "[email protected]");

                    // INSERT ステートメントを実行し、最後の挿入 ID を取得
                    int newCustomerID = (int)command.ExecuteScalar();

                    // 新規顧客 ID をコンソールに出力
                    Console.WriteLine("新規顧客 ID: {0}", newCustomerID);
                }
            }
        }
    }
}

このコードの説明

  1. using ステートメントを使用して、SqlConnectionSqlCommand オブジェクトを自動的に解放します。
  2. connectionString 変数に、SQL Server データベースへの接続文字列を設定します。
  3. connection.Open() メソッドを使用して、データベースへの接続を開きます。
  4. INSERT ステートメントを作成し、Customers テーブルにレコードを挿入します。
  5. @FirstName@LastName@Email パラメータを使用して、挿入するレコードの値を設定します。
  6. ExecuteScalar() メソッドを使用して、INSERT ステートメントを実行し、最後の挿入 ID を取得します。
  7. Console.WriteLine() メソッドを使用して、新規顧客 ID をコンソールに出力します。

実行方法

  1. このコードを C# ファイル (例: InsertAndGetLastId.cs) に保存します。
  2. Visual Studio などの開発環境で、この C# ファイルを開きます。
  3. ビルドして実行します。

出力例

新規顧客 ID: 101



INSERT...SELECT ステートメントを使用する

INSERT...SELECT ステートメントを使用すると、INSERT ステートメントと同じトランザクション内で SELECT ステートメントを実行できます。 以下のコード例は、Customers テーブルにレコードを挿入し、CustomerID と挿入された行数を同時に取得する方法を示しています。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlCommand command = new SqlCommand("INSERT INTO Customers (FirstName, LastName, Email) VALUES (@FirstName, @LastName, @Email); SELECT @@IDENTITY, COUNT(*) FROM Customers", connection))
    {
        command.Parameters.AddWithValue("@FirstName", "John");
        command.Parameters.AddWithValue("@LastName", "Doe");
        command.Parameters.AddWithValue("@Email", "[email protected]");

        using (SqlDataReader reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                int newCustomerID = reader.GetInt32(0);
                int rowCount = reader.GetInt32(1);
                Console.WriteLine("新規顧客 ID: {0}, 挿入行数: {1}", newCustomerID, rowCount);
            }
        }
    }
}

SqlDataAdapter と DataSet を使用する

SqlDataAdapterDataSet を使用すると、データベースとのやり取りをより柔軟に行うことができます。 以下のコード例は、Customers テーブルにレコードを挿入し、CustomerID を取得する方法を示しています。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlDataAdapter adapter = new SqlDataAdapter("INSERT INTO Customers (FirstName, LastName, Email) VALUES (@FirstName, @LastName, @Email); SELECT CustomerID FROM Customers WHERE CustomerID = SCOPE_IDENTITY()", connection))
    {
        adapter.SelectCommand.Parameters.AddWithValue("@FirstName", "John");
        adapter.SelectCommand.Parameters.AddWithValue("@LastName", "Doe");
        adapter.SelectCommand.Parameters.AddWithValue("@Email", "[email protected]");

        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet, "Customers");

        int newCustomerID = (int)dataSet.Tables["Customers"].Rows[0]["CustomerID"];
        Console.WriteLine("新規顧客 ID: {0}", newCustomerID);
    }
}

LINQ to SQL を使用する

LINQ to SQL を使用すると、C# コードから SQL Server データベースにクエリを実行するより直感的な方法を提供します。 以下のコード例は、Customers テーブルにレコードを挿入し、CustomerID を取得する方法を示しています。

using (DataContext context = new DataContext(connectionString))
{
    Customers newCustomer = new Customers
    {
        FirstName = "John",
        LastName = "Doe",
        Email = "[email protected]"
    };

    context.Customers.InsertOnSubmit(newCustomer);
    context.SubmitChanges();

    int newCustomerID = newCustomer.CustomerID;
    Console.WriteLine("新規顧客 ID: {0}", newCustomerID);
}

それぞれの方法の比較

方法利点欠点
SCOPE_IDENTITY() 関数シンプルで分かりやすいトランザクション内で他の INSERT ステートメントが実行されると誤った結果を返す可能性がある
OUTPUT挿入された行の詳細情報を取得できるSCOPE_IDENTITY() 関数よりも複雑
INSERT...SELECT ステートメント1 つのステートメントで INSERT と SELECT を実行できるトランザクション内で他の INSERT ステートメントが実行されると誤った結果を返す可能性がある
SqlDataAdapterDataSet柔軟性が高い複雑で冗長なコードになる可能性がある
LINQ to SQL直感的で簡潔習得に時間がかかる

c# sql sql-server



データ移行ツール、クラウドサービス、オープンソースツールを使って SQL Server 2005 から MySQL へデータを移行する

このチュートリアルでは、SQL Server 2005 から MySQL へデータを移行する方法について 3 つの方法を説明します。方法 1: SQL Server Management Studio を使用方法 2: bcp コマンドを使用...


SQL Serverデータベースのバージョン管理:Subversion(SVN)との連携方法

この解説では、Subversion(SVN)と呼ばれるバージョン管理システムを用いて、SQL Serverデータベースのバージョン管理を行う方法について説明します。SVNは、ファイルやディレクトリのバージョン管理に広く用いられるオープンソースツールであり、データベースのバージョン管理にも活用できます。...


SQL Server 6.5 からのアップグレードに関する専門家のサポート

SQL Server 6.5 は 2000 年にリリースされた古いバージョンであり、現在ではサポートされていません。最新の機能やセキュリティパッチを利用するためには、新しいバージョンへのアップグレードが必要です。アップグレード方法アップグレード方法はいくつかありますが、一般的には以下の 2 つの方法が選択されます。...


INSERT INTOステートメントのIGNOREオプションでMySQL REPLACE INTOを代替

MySQLのREPLACE INTOコマンドは、SQL Server 2005では完全に同じように実装されていません。しかし、いくつかの代替方法を用いることで、同様の動作を実現することができます。REPLACE INTO とはREPLACE INTOは、INSERT INTOと似ていますが、以下の点が異なります。...


Subversion を使用したデータベース構造変更のバージョン管理

データベース構造変更をバージョン管理システムで管理することは、データベースの開発と運用において非常に重要です。バージョン管理システムを使用することで、以下のメリットを得ることができます。変更履歴の追跡: 過去の変更内容を詳細に追跡することができ、どの変更が問題を引き起こしたのかを特定しやすくなります。...



SQL SQL SQL SQL Amazon で見る



SQL Server Profilerを使ってSQL Serverテーブルの変更をチェックする

Change Trackingは、テーブルレベルで変更されたデータを追跡する機能です。有効にすると、どの行が挿入、更新、削除されたかを追跡できます。メリット比較的軽量な機能設定が簡単クエリで変更内容を取得できる変更されたデータの内容は追跡できない


SQL Server Profilerを使ってSQL Serverテーブルの変更をチェックする

Change Trackingは、テーブルレベルで変更されたデータを追跡する機能です。有効にすると、どの行が挿入、更新、削除されたかを追跡できます。メリット比較的軽量な機能設定が簡単クエリで変更内容を取得できる変更されたデータの内容は追跡できない


初心者でも安心!PHPでフラットファイルデータベースを始めるためのガイド

PHPは、Web開発に広く使用されているプログラミング言語です。SQLは、データベースとのやり取りに使用される構造化照会言語です。フラットファイルデータベースは、PHPとSQLを使用して読み書きできます。軽量で高速設定と管理が簡単習得しやすい


C#/VB.NET プログラマー必見!T-SQL CAST デコードのすべて

T-SQL CAST は、データを異なるデータ型に変換する関数です。C#/VB. NET で T-SQL CAST を使用する場合、デコードが必要になることがあります。この解説では、T-SQL CAST のデコード方法について、C#/VB


C#/VB.NET プログラマー必見!T-SQL CAST デコードのすべて

T-SQL CAST は、データを異なるデータ型に変換する関数です。C#/VB. NET で T-SQL CAST を使用する場合、デコードが必要になることがあります。この解説では、T-SQL CAST のデコード方法について、C#/VB