0

私は自分のプロジェクトで SQLCLR を使用していますが、記録としては、非常に満足しています。しかし、適切なデータ アクセス パターンに関する適切な情報源が見つかりません。

データベース用の API が常に必要なため、通常はストアド プロシージャを使用して .net と SQL 間の通信を行います。ただし、この場合、.net コードは API の一部であるため、SP は不適切に見えます。

Linq2SQL は SQL サーバーには存在しないため (ただし、DBA が好まない方法でインストールすることはできます)、オプションではありません。

私が現在持っているのは、次のような標準の ADO.NET コードで雑然としたコードです。

using (SqlCommand cmd = c.CreateCommand()) {
    cmd.CommandText = "SELECT ... FROM ...";
    using (SqlDataReader rdr = cmd.ExecuteReader()) {
        DoSomething(rdr);
    }
}

そして、それは機能しますが、それを行う方法が間違っているように思えます.

他の人はどのようにしていますか?

4

2 に答える 2

1

XSLT を使用して、DAL 用の C# コードを生成します。私は通常、データベース定義自体から XML をロードし (たとえば、何らかの形式のSELECT name, type, length, ... FROM sys.columns JOIN sys.tables JOIN sys.types FOR XML PATH)、コード生成用のカスタム XSLT 変換を開発しました。このブログのように、Visual Studio ビルド プロセス自体の一部としてそれらを追加しました: http://rusanu.com/2009/04/11/using-xslt-to-generate-performance-counters-code/はパフォーマンス カウンターの生成に関するものですが、DAL コードにも同様に適用されます)。また、XSLT コード生成を使用して結果セットの型を作成します。

重いクライアントでは、このアプローチは ORM および ADO データセット機能と重複しますが (私はまだこれらのクライアントで使用していますが、それが私の問題です...)、SQLCR では、SQLCLR 固有の制限により、最適です。

このアプローチは何よりもまず非常に柔軟であり、すべての DAL エントリ ポイントに影響するグローバルな変更をすばやく行うことができ、コード ベースを完全に制御できます (外部依存関係や外部から持ち込まれたバグはありません)。ADO データセットに比べて非常に軽量です。

IQueryable オブジェクトを渡すことで付加価値が得られるため、このアプローチは LINQ に対してのみトレードオフします。しかし SQLCLR では、ご存知のように、これはまだ実行可能なオプションではありません。

于 2009-10-07T21:22:31.657 に答える
0

SQLCLR が実際に適切なセット ベースの TSQL よりもパフォーマンスの向上を提供する限られた場所については、上記の方法で正確にデータ アクセスを行います。実際に SQLCLR を使用するには、セット ベース、XML 解析、または非常に複雑な計算では実行できない、かなり重いループ ベースの処理を実行する必要があります。データ アクセスのためだけに SQLCLR を使用している場合は、パフォーマンスが犠牲になります。このデモンストレーションが必要な場合はお知らせください。昨年のプレゼンテーションから AdventureWorks の例を引き出します。

于 2009-10-08T01:32:02.850 に答える