C#、.NET、SQL Server で SqlConnection オブジェクトから保留中のトランザクションへの参照を取得する方法
C#、.NET、SQL Server を使用する場合、SqlConnection
オブジェクトから保留中のトランザクションへの参照を取得することは可能です。これは、複数のクエリを 1 つのトランザクションとしてグループ化し、一貫性と原子性を確保する必要がある場合に役立ちます。
方法
SqlConnection
オブジェクトから保留中のトランザクションへの参照を取得するには、次の 2 つの方法があります。
BeginTransaction メソッドを使用する
SqlConnection
オブジェクトの BeginTransaction
メソッドを使用して、新しいトランザクションを開始できます。このメソッドは、SqlTransaction
オブジェクトを返します。このオブジェクトを使用して、トランザクション内のクエリを実行できます。
using (var connection = new SqlConnection("server=localhost;database=test"))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
// トランザクション内のクエリを実行
var command = new SqlCommand("INSERT INTO dbo.Customers (Name, Age) VALUES (@name, @age)", connection, transaction);
command.Parameters.AddWithValue("@name", "John Doe");
command.Parameters.AddWithValue("@age", 30);
command.ExecuteNonQuery();
// ...
transaction.Commit(); // トランザクションをコミット
}
}
using (var connection = new SqlConnection("server=localhost;database=test"))
{
connection.Open();
var ambientTransaction = Transaction.Current; // 現在のトランザクションを取得
if (ambientTransaction != null)
{
connection.EnlistTransaction(ambientTransaction);
// トランザクション内のクエリを実行
var command = new SqlCommand("INSERT INTO dbo.Customers (Name, Age) VALUES (@name, @age)", connection);
command.Parameters.AddWithValue("@name", "Jane Doe");
command.Parameters.AddWithValue("@age", 25);
command.ExecuteNonQuery();
// ...
ambientTransaction.Commit(); // トランザクションをコミット
}
}
注意事項
- トランザクションは、
Commit
またはRollback
メソッドを使用して明示的に終了する必要があります。 - トランザクションが終了すると、
SqlConnection
オブジェクトからトランザクションへの参照は無効になります。 - トランザクション内でエラーが発生した場合は、
Rollback
メソッドを使用してトランザクションをロールバックする必要があります。
- 上記のコードはサンプルです。実際のコードは、要件に合わせて変更する必要があります。
- トランザクションを使用する場合は、パフォーマンスとスケーラビリティを考慮する必要があります。
using System;
using System.Data.SqlClient;
namespace SqlConnectionExample
{
class Program
{
static void Main(string[] args)
{
// データベース接続文字列
string connectionString = "server=localhost;database=test";
// SqlConnection オブジェクトを作成
using (var connection = new SqlConnection(connectionString))
{
// SqlConnection オブジェクトを開く
connection.Open();
// トランザクションを開始
using (var transaction = connection.BeginTransaction())
{
// トランザクション内のクエリを実行
var command = new SqlCommand("INSERT INTO dbo.Customers (Name, Age) VALUES (@name, @age)", connection, transaction);
command.Parameters.AddWithValue("@name", "John Doe");
command.Parameters.AddWithValue("@age", 30);
command.ExecuteNonQuery();
// ...
// トランザクションをコミット
transaction.Commit();
}
}
Console.WriteLine("処理が完了しました。");
}
}
}
SqlConnection
オブジェクトを使用して、SQL Server データベースに接続する方法BeginTransaction
メソッドを使用して、新しいトランザクションを開始する方法SqlCommand
オブジェクトを使用して、トランザクション内でクエリを実行する方法Commit
メソッドを使用して、トランザクションをコミットする方法
実行方法
- Visual Studio などの C# 開発環境で、新しいコンソール アプリケーション プロジェクトを作成します。
- 上記のコードをプロジェクトに追加します。
- 必要な接続文字列に
connectionString
変数を変更します。 - プロジェクトをビルドして実行します。
出力
処理が完了しました。
SqlConnection
オブジェクトの AmbientTransaction
プロパティは、現在のトランザクションへの参照を取得するために使用できます。このプロパティは、SqlTransaction
オブジェクトまたは null
を返します。
using (var connection = new SqlConnection("server=localhost;database=test"))
{
connection.Open();
var transaction = connection.AmbientTransaction; // 現在のトランザクションを取得
if (transaction != null)
{
// トランザクション内のクエリを実行
var command = new SqlCommand("INSERT INTO dbo.Customers (Name, Age) VALUES (@name, @age)", connection);
command.Parameters.AddWithValue("@name", "Jane Doe");
command.Parameters.AddWithValue("@age", 25);
command.ExecuteNonQuery();
// ...
transaction.Commit(); // トランザクションをコミット
}
}
SqlConnection
オブジェクトの GetTransaction
メソッドは、指定された接続文字列を使用して接続されたデータベースの現在のトランザクションへの参照を取得するために使用できます。
using (var connection = new SqlConnection("server=localhost;database=test"))
{
connection.Open();
var transaction = SqlConnection.GetTransaction("server=localhost;database=test");
if (transaction != null)
{
// トランザクション内のクエリを実行
var command = new SqlCommand("INSERT INTO dbo.Customers (Name, Age) VALUES (@name, @age)", connection);
command.Parameters.AddWithValue("@name", "John Doe");
command.Parameters.AddWithValue("@age", 30);
command.ExecuteNonQuery();
// ...
transaction.Commit(); // トランザクションをコミット
}
}
AmbientTransaction
プロパティは、現在のスレッドに関連付けられたトランザクションへの参照のみを返します。GetTransaction
メソッドは、指定された接続文字列を使用して接続されたデータベースのすべてのトランザクションへの参照を返します。
c# .net sql-server