スポンサーリンク
スポンサーリンク

ASP.NET Core Web APIで実装するシンプルで高速なDBトランザクション処理(on SQL Server)

.NET CoreASP.NET CoreC#SQL ServerSwaggerVisual StudioWeb APIデータベース

.Net 6.0 の ASP.NET Core Web APIから、Dapper+Microsoft.Data.SqlClient NuGetパッケージを使い、SQL ServerデータベースへDBトランザクション処理を行うサンプルを作成しました。
ORマッピングの主流はDapperになって来てる。
ソースコードはGitHubで公開しています。

Youtube動画だと、DBトランザクション継続中に SQL Server Management Studio側からの接続に対してレスポンスが返って来ないのは、SQL Server側でロックが発生している為です。

ビジネスロジックやデータベース処理を、Repogitoryや Interfaceを駆使して実装すると、ソースコードが複雑になり保守性が下がります。
staticクラスで実装するとソースコードがシンプルになり保守性が高くなります。
staticクラスで実装したソースコードは、ユニットテストの実装も容易です。

Repogitoryや Interfaceを駆使して無駄な処理を大量に実装し、工数が爆発して開発が終わらなくなっているプロジェクトが多過ぎる。駆使するべきはstatic。
いまだに、C#のマルチスレッド処理が分からず「staticを使うのは不安だ」と言っている人がいて、その人の意見が採用され「static禁止」になると、開発工数が爆発します。

 

ソースコード構成

今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .Net 6 + ASP.NET Core Web API アプリ の HTTPS無し。

テンプレートに対して、下記の処理を加えました。

 

ソースコード変更内容を解説

/WebApplication1.csproj

Dapper/Microsoft.Data.SqlClient NuGetパッケージをインストール。

 

/appsettings.Development.json

SQLServerへ接続するコネクションストリングを追加。

 

/Shared/SharedData.cs

・staticメンバ変数で実装した、アプリ全体で使えるコネクションストリング変数を追加。

 

/Program.cs

・アプリ起動時に環境設定ファイルを読み込み、アプリ全体で使えるコネクションストリング変数にセットする処理を追加。
 環境設定ファイルの読み込み処理をアプリ起動時1回だけにし、アプリ起動後は staticメンバ変数を直接参照することで、処理コストを減らせる。

 

/Model/TableModels.cs

・SQLServerから取得したデータに対応する、データモデルクラスを追加。

 

/Controllers/WeatherForecastController.cs

・SQLServerデータベースに対して、DBトランザクション処理を実行する、HTTP POSTリクエストWEBAPIを追加。

 

/SQL/SQL_TableA.cs

・DBトランザクション処理を行う Transaction1メソッドから、Insert SQLを発行する Insertメソッド、Select SQLを発行する Selectメソッドを呼び出しています。
・BeginTransactionでトランザクションを開始したDBコネクション変数(conn)を各メソッドに渡し、Dapperを通してSQLを発行することで、とてもシンプルで高速なDBトランザクション処理を実装しています。
・razorページには画面処理のみ、SQLフォルダ配下の staticクラスにはDB処理と、レイヤー分けをしています。
 今回は簡単なロジックなので2レイヤーにしています。業務システムだとビジネスロジックレイヤーのソースコードをDataフォルダ配下に纏め、「画面レイヤー(Pagesフォルダ) => ビジネスロジックレイヤー(Dataフォルダ) => データベースレイヤー(Sqlフォルダ)」と繋げていくイメージです。
 ビジネスロジックレイヤーを設ける場合、トランザクション処理の開始処理(BeginTransaction)はビジネスロジックレイヤーに実装します。
・データベース処理を行う、SQL文を伴うソースコードはSQLフォルダに纏まっていると分かり易い。
・Insert文のパラメータは匿名クラスにし、DapperにSQLとパラメータを渡して、Insert SQLを発行しています。
・データベースとC#側のデータ型が一致していれば、あとは Dapperがバインドしてくれる。
・SQL文は定数化しておくことで処理コストを減らしています。

 

Select対象のDBテーブル構成

コメント

タイトルとURLをコピーしました