.Net 6.0 の Blazor Serverから、Dapper+Microsoft.Data.SqlClient NuGetパッケージを使い、SQL Serverデータベースのストアドプロシージャ(Transact-SQL)を使用する場合の、DBトランザクション処理を行うサンプルを作成しました。
ソースコードはGitHubで公開しています。
Youtube動画だと、DBトランザクション継続中に SQL Server Management Studio側からの接続に対してレスポンスが返って来ないのは、SQLServer側でロックが発生している為です。
ソースコード構成
Blazor Serverで実装するシンプルで高速なDBトランザクション処理(on SQLServer) で作成したソースコードに、下記の修正を加えました。
ソースコード変更内容を解説
/SQL/SQL_TableA.cs
C#側に定数として持っていた、Select文、Insert文をストアドプロシージャ側へ移したので、C#側のSQL文は削除し、Dapperにはストアドプロシージャ名を渡すように変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
using System.Data; using BlazorApp1.Model; using BlazorApp1.Shared; using Dapper; using Microsoft.Extensions.Logging; using Microsoft.Data.SqlClient; namespace BlazorApp1.SQL { public class SQL_TableA { public static void Transaction1(TableA insertTableA) { using (var conn = new SqlConnection(SharedData.ConnectionString)) { conn.Open(); using (var tran = conn.BeginTransaction(IsolationLevel.ReadCommitted)) { try { var tableAList = Select(conn, tran); Insert(conn, tran, insertTableA); var tableAList2 = Select(conn, tran); tran.Commit(); } catch(Exception ex) { tran.Rollback(); throw; } } } } public static IEnumerable<TableA> Select(SqlConnection conn, SqlTransaction tran) { return conn.Query<TableA>("spTableA_Select", null, tran, commandType: CommandType.StoredProcedure); } public static void Insert(SqlConnection conn, SqlTransaction tran, TableA _TableA) { var sqlParam = new { id = _TableA.Id, code = _TableA.Code, valueString = _TableA.ValueString, valueDate = _TableA.ValueDate }; conn.Execute("spTableA_Insert", sqlParam, tran, commandType: CommandType.StoredProcedure); } } } |
ストアドプロシージャ定義
C#から呼び出しているストアドプロシージャの実装内容は、C#側に定数として持っていた、Select文、Insert文をそのままストアドプロシージャ(Transact-SQL)へ移しています。
※SQLをストアドプロシージャ側に纏めると、C#側のソースコードはシンプルになり、SQL実行時にSQLServerがSQLの実行プランを毎回解析する必要はなくなり、処理コストを少なくできます。
ストアドプロシージャをの作り方は SQL Serverのストアドプロシージャを SQL Server Management Studioで作成する手順 を参照下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
USE [TestDb] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[spTableA_Select] AS BEGIN SET NOCOUNT ON; SELECT [Id] ,[ValueString] ,[Code] ,[ValueDate] FROM [dbo].[TableA] END GO |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
USE [TestDb] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[spTableA_Insert] @Id bigint, @ValueString [nvarchar](50), @Code [nvarchar](50), @ValueDate datetime AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[TableA] ( [Id], [ValueString], [Code], [ValueDate] ) VALUES ( @Id, @ValueString, @Code, @ValueDate ) END GO |
コメント