【SQL Server】C# で `SCOPE_IDENTITY()` 関数を使って最後の挿入 ID を取得
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);
}
}
}
}
}
このコードの説明
using
ステートメントを使用して、SqlConnection
とSqlCommand
オブジェクトを自動的に解放します。connectionString
変数に、SQL Server データベースへの接続文字列を設定します。connection.Open()
メソッドを使用して、データベースへの接続を開きます。INSERT
ステートメントを作成し、Customers
テーブルにレコードを挿入します。@FirstName
、@LastName
、@Email
パラメータを使用して、挿入するレコードの値を設定します。ExecuteScalar()
メソッドを使用して、INSERT
ステートメントを実行し、最後の挿入 ID を取得します。Console.WriteLine()
メソッドを使用して、新規顧客 ID をコンソールに出力します。
実行方法
- このコードを C# ファイル (例:
InsertAndGetLastId.cs
) に保存します。 - Visual Studio などの開発環境で、この C# ファイルを開きます。
- ビルドして実行します。
出力例
新規顧客 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 を使用する
SqlDataAdapter
と DataSet
を使用すると、データベースとのやり取りをより柔軟に行うことができます。 以下のコード例は、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 ステートメントが実行されると誤った結果を返す可能性がある |
SqlDataAdapter と DataSet | 柔軟性が高い | 複雑で冗長なコードになる可能性がある |
LINQ to SQL | 直感的で簡潔 | 習得に時間がかかる |
c# sql sql-server