SQL Server にデータを挿入して ID を取得する:C# による 3 つのベストプラクティス
C# で SQL Server にデータを挿入し、挿入された ID を取得する方法
SCOPE_IDENTITY() 関数を使用する
この方法は、最もシンプルで汎用性の高い方法です。以下のコード例のように、INSERT
ステートメントを実行した後、SCOPE_IDENTITY()
関数を使用して、挿入された ID を取得します。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO Customers (Name, Email) VALUES (@name, @email)", connection))
{
command.Parameters.AddWithValue("@name", customerName);
command.Parameters.AddWithValue("@email", customerEmail);
command.ExecuteNonQuery();
int insertedId = (int)command.ExecuteScalar();
Console.WriteLine("Inserted Customer ID: {0}", insertedId);
}
}
OUTPUT 句を使用する
この方法は、SCOPE_IDENTITY()
関数よりも新しい方法で、より柔軟なオプションを提供します。以下のコード例のように、INSERT
ステートメントに OUTPUT
句を追加することで、挿入された ID を直接取得できます。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO Customers (Name, Email) OUTPUT INSERTED.ID AS CustomerID VALUES (@name, @email)", connection))
{
command.Parameters.AddWithValue("@name", customerName);
command.Parameters.AddWithValue("@email", customerEmail);
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
int insertedId = reader.GetInt32(0);
Console.WriteLine("Inserted Customer ID: {0}", insertedId);
}
}
}
}
注意事項
- 上記のコード例は、あくまでも基本的な例です。実際のアプリケーションでは、エラー処理や接続の開放処理などを適切に行う必要があります。
C# で SQL Server にデータを挿入し、挿入された ID を取得するサンプルコード
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
// 接続文字列
string connectionString = "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True";
// 挿入する顧客情報
string customerName = "山田 太郎";
string customerEmail = "[email protected]";
// データ挿入
int insertedId = InsertCustomer(connectionString, customerName, customerEmail);
// 挿入された ID の出力
Console.WriteLine("挿入された顧客 ID: {0}", insertedId);
}
static int InsertCustomer(string connectionString, string customerName, string customerEmail)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO Customers (Name, Email) VALUES (@name, @email); SELECT SCOPE_IDENTITY()", connection))
{
command.Parameters.AddWithValue("@name", customerName);
command.Parameters.AddWithValue("@email", customerEmail);
int insertedId = (int)command.ExecuteScalar();
return insertedId;
}
}
}
}
このサンプルコードの説明
using
ステートメントを使用して、SqlConnection
とSqlCommand
オブジェクトを自動的に解放します。connectionString
変数に、SQL Server への接続文字列を格納します。InsertCustomer()
関数は、顧客情報を受け取り、SQL Server に挿入します。- 取得した ID を
insertedId
変数に格納します。 insertedId
変数を返します。Main()
関数は、InsertCustomer()
関数を呼び出し、挿入された ID をコンソールに出力します。
補足
- このサンプルコードは、SQL Server 2008 以降で使用できます。
- 接続文字列は、ご自身の環境に合わせて変更してください。
- エラー処理やトランザクション処理などは、ご自身のアプリケーションに合わせて実装する必要があります。
SQL Server にデータを挿入し、挿入された ID を取得するその他の方法
ストアド プロシージャは、データベース内で定義される再利用可能なコードブロックです。INSERT
操作と SCOPE_IDENTITY()
関数を含むロジックをストアド プロシージャにカプセル化することで、コードをより簡潔でモジュール化しやすくなります。
利点:
- コードを簡潔に記述できる
- モジュール性を高められる
- データベースサーバー側で処理を実行できる
- ストアド プロシージャの作成とメンテナンスが必要
- アプリケーションコードからストアド プロシージャを呼び出す必要がある
例:
CREATE PROCEDURE InsertCustomer
@name NVARCHAR(50),
@email NVARCHAR(100),
@customerId INT OUTPUT
AS
BEGIN
INSERT INTO Customers (Name, Email)
VALUES (@name, @email);
SET @customerId = SCOPE_IDENTITY();
END;
C# コード:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand("InsertCustomer", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@name", customerName);
command.Parameters.AddWithValue("@email", customerEmail);
SqlParameter customerIdParam = new SqlParameter("@customerId", SqlDbType.Int);
customerIdParam.Direction = ParameterDirection.Output;
command.Parameters.Add(customerIdParam);
command.ExecuteNonQuery();
int insertedId = (int)customerIdParam.Value;
Console.WriteLine("Inserted Customer ID: {0}", insertedId);
}
}
EntityFramework
は、Object-Relational Mapper (ORM) として知られるライブラリであり、C# オブジェクトとデータベースエンティティ間のマッピングを自動化します。EntityFramework
を使用すると、INSERT
操作を実行し、挿入されたエンティティの ID を取得するコードをより簡潔に記述できます。
- オブジェクト指向のコードを記述しやすい
- データベースとの複雑なやり取りを簡略化できる
- 変更追跡と自動マッピング機能を提供
EntityFramework
のライブラリと概念を習得する必要がある- 追加のオーバーヘッドが発生する可能性がある
using (var context = new MyDbContext())
{
var customer = new Customer()
{
Name = "山田 太郎",
Email = "[email protected]"
};
context.Customers.Add(customer);
context.SaveChanges();
int insertedId = customer.Id;
Console.WriteLine("Inserted Customer ID: {0}", insertedId);
}
Dapper を使用する
Dapper は、軽量で高性能な ADO.NET ラッパーライブラリです。Dapper を使用すると、SQL クエリを簡潔に記述し、挿入されたレコードの ID を取得できます。
- 軽量で高速
- シンプルで使いやすい構文
- 複雑なクエリにも対応
- 低レベルな ADO.NET 操作を直接扱う必要
- エラー処理や接続管理を自分で行う必要がある
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var insertedId = connection.Query<int>("INSERT INTO Customers (Name, Email) VALUES (@name, @email); SELECT SCOPE_IDENTITY()",
new { name = customerName, email = customerEmail }).Single();
Console.WriteLine("Inserted Customer ID: {0}", insertedId);
}
どの方法を選択するかは、プロジェクトの要件や開発者の好みによって異なります。
- モジュール性を高めたい場合: ストアド プロシージャを使用する
- オブジェクト指向のコードを記述したい場合:
EntityFramework
を使用する - 軽量で高速な方法: Dapper を使用する
それぞれの方法を試し、プロジェクトに最適な方法を選択することをお勧めします。
- [ストアド プロシージャを作成および実行する方法](
c# sql sql-server