DbUtility v3

7585 ワード

DbUtility v3
歴史
7年前、2007年、私はブログ園で博文を書いて、オープンソースで恐らく私の最初のオープンソースプロジェクト、DbUtilityを発表しました.その設計の初志はADOを簡略化することである.NETの煩雑なデータベースアクセスプロセスは、非常に簡潔でスムーズな構文アクセスデータベースを提供します.
dbUtility.ExecuteSingleRow("SELECT username, userdata FROM Users WHERE ID = {0}", userId );

この行コードは、データベース・リンクの自動作成とオープン、コマンド・オブジェクトの作成、パラメータのパッケージング、クエリーの実行、結果をDataRowにパッケージングして返します.
時は移り、7年後の現在、NHibernate、EntityFrameworkなどの非常に多くの重量級のORM、データベースへの迅速なアクセスのフレームワークがあります.しかし、簡単なSQLクエリーを実行し、結果を得ることを望んでいる場合もあります.
この時、DbUtilityというやつをよく思い出すので、7年後の今日、DbUtilityのすべてのコードを書き直して、この超軽量級データベースアクセスヘルプの最新バージョン、DbUtility v 3、現在GitHubでオープンソースを発売しました.
単純なクエリー
これを聞いたことがなくても大丈夫な場合は、DbUtilityは超軽量レベル(追加の構成を必要とせず、未知の動作は発生しません)に設計され、使いやすい(文法が簡単で、直接的で、明瞭)データベース・アクセス・ヘルプです.
典型的なDbUtility v 3のコードは次のようになります.
db.T( "SELECT Username FROM Users WHERE ID = {0};", userId ).ExecuteScalar<string>();

ほとんどのデータベースのクエリーの差は多くありません.この形式では、3つの部分に分けることができます.
クエリー・エフェクタ、すなわち上のコードのdbは、データベースに直接関連するクエリーを実行する責任を負います.一般的には、接続文字列構成または接続文字列を使用してクエリー・エフェクタのインスタンスを作成できます.
var db = new SqlDbUtility( "        " );

var db = SqlDbUtility.Create( "       " );

 
クエリー・エフェクタに続く部分は、データベースが実行するクエリーを決定するクエリー・ビルダーです.つまり、上記のコードの中のものです.T( "SELECT Username FROM Users WHERE ID = {0};", userId)セクションでは、TはTemplate、すなわちテンプレートを意味し、これもDbUtilityの最も基本的なクエリー構築方式であり、SQL命令テンプレートによって構築される.stringのようなものを使うことができますFormatの構文は、文字列テンプレートとテンプレートパラメータを指定します.ただしstringを直接呼び出す.Formatとは異なり、このテンプレートのパラメータはパラメトリッククエリのパラメータに変換され、注入ホールの危険性はありません.つまり、上記のクエリテンプレートが最終的に変換されたSQLは、概ね次のようになります.
DECLARE @Param0 AS int = userId-value;
SELECT Username FROM Users WHERE ID =@Param0;

TまたはTemplateメソッド(実際にはTは略)は、クエリーテンプレートを解析して抽象的なパラメトリッククエリーオブジェクトを作成し、パラメトリッククエリーオブジェクトは特定のデータベースに基づいて対応するパラメトリッククエリーを生成して実行します.
 
最後の部分は結果コンストラクタ、すなわち上記のコードの中のものである.ExecuteScalar()、ExecuteScalarはクエリ結果の最初の行の最初の列です.
DbUtility v 3は、ExecuteScalar、ExecuteNonQuery、ExecuteDataTable、ExecuteFirstRowといった一般的によく使われる他、結果を自動的にエンティティにパッケージするExecuteEntityやExecuteEntities、ダイナミックオブジェクトにパッケージするExecuteDynamicObjectやExecuteDynamicsなど、豊富な結果ビルダーを提供しています.豊富な結果ビルダーは、データベースへのアクセスコードを大幅に簡素化します.
しかし、最も重要なのは、DbUtility v 3が拡張しやすいアーキテクチャを設計したことです.すべてのクエリー・ビルダー、結果ビルダーは、すべて簡単に拡張をカスタマイズすることができます.あるいは、実際にはDbUtility全体が提供するすべてのクエリー・ビルダーとクエリー結果ビルダーは、もともと拡張方法で拡張されています.
ステップアップ
データベース・トランザクションを開くには、DbUtilityを使用するのも便利です.
using( var transaction = db.BeginTransaction() )
{
  transaction.T( "SELECT Username FROM Users WHERE ID = {0}", userId ).ExecuteScalar<string>();//

//... transaction.Commit();// , using , 。 }

 
非同期クエリー・データベースも簡単です.
var username = await db.T("SELECT Username FROM Users WHERE ID = {0};", userId ).ExecuteScalarAsync<string>();//  Async          。

 
JumonyのサンプルアイテムすべてのデータベースアクセスをDbUtilityに変更した後、EntityFrameworkよりも構成が消失しただけでなく、パフォーマンスも向上した(DbUtilityは超軽量級であるため)、さらに重要なのはMVC 4の非同期Actionと組み合わせて、非常に簡単にASP.NETでのデータベースへの非同期アクセスにより、より大きなスループットが得られます.
public async Task<ActionResult> Index()
{
  return View( "index", await dbUtility.T( "SELECT ID, Title, Completed FROM Tasks" ).ExecuteEntitiesAsync<TodoTask>() );
}

 
の最後の部分
すぐに公開される更新では、複数のパラメトリッククエリー・オブジェクトを、パッチ文字列のように簡単にパッチできます.
var query = db.T( "SELECT * FROM Users" );

query += "WHERE" + Db.Join( "AND", Db.T( "Age > {0}", age ), Db.T( "FirstName LIKE '%'+{0}+'%'", name ) );

var result = query.ExecuteEntities<User>();

 
今後のバージョンでは、Excelなどのより多くのデータベース・タイプ、より良いクエリー構築(期待される超軽量SQL構文:db.Q(「users.username?users.userId=@0」)がサポートされます.
 
DbUtility v 3は、NuGetを介して取得できるようになりました.
 
 
全線オープンソースプロジェクトはすべてGitHubでApacheプロトコルでオープンソース、DbUtility:超軽量データアクセスヘルプ、Jumony:本格的なHTML分析、処理、バインド、ビューエンジン、WebTest:ASP.NET環境は直接ユニットテストを行い、LogUtility:テキストログ記録利器.
 
これらのアイテムはいずれもNuGetでダウンロードできます.