12

アプリを作成するときは、System.Dataインターフェイス(IDbConnection、IDbCommand、IDataReader、IDbDataParameterなど)を使用します。これは、ベンダーの依存関係を減らすために行います。簡単なテストアプリをやっていない限り、相談するときは倫理的なことのように思えます。

ただし、表示されるすべてのコードは、System.Data.SqlClient名前空間クラスまたは他のベンダー固有のクラスを使用しているようです。雑誌や本では、これをMicrosoftの影響力と、SQLServerに対してのみプログラムするためのマーケティングスピンに簡単に当てはめることができます。しかし、私が見るほとんどすべての.NETコードがSQLServer固有のクラスを使用しているように見えます。

ベンダー固有のクラスにはより多くの機能があることに気付きました。たとえば、SqlCommandオブジェクトにパラメーターを追加するのは1つのメソッドですが、IDbCommandにパラメーターを追加するのは4行以上のコードです。しかし、再び; これらの制限のために少しヘルパークラスを書くのはとても簡単です。

また、SQLServerが現在のターゲットクライアントである場合のインターフェイスに対するプログラミングは、すぐには必要ないため、過剰に設計されているのではないかと思いました。しかし、インターフェイスに対するプログラミングのコストが非常に低いためだとは思いませんが、ベンダーの依存関係を減らすことで大きなメリットが得られます。

ベンダー固有のデータクラスまたはインターフェイスを使用していますか?

編集:以下の答えのいくつかを要約し、それらを読んでいる間に私が持っていたいくつかの考えを投げ入れます。

ベンダーの中立性のためにインターフェースを使用する際に考えられる落とし穴:

  • SELECTステートメントに埋め込まれたベンダー固有のキーワード(私のins、upd、delはすべてprocにあるので、問題ありません)
  • データベースを直接バインドすると、おそらく問題が発生します。
  • 接続のインスタンス化が一元化されていない限り、とにかくベンダー固有のクラスを呼び出す必要があります。

インターフェースを使用する前向きな理由:

  • 私の経験では、(行使されていなくても)別のベンダーに移動する能力は、常に顧客から高く評価されてきました。
  • 再利用可能なコードライブラリのインターフェイスを使用する
4

6 に答える 6

5

考慮すべきことの 1 つは、データベースを切り替える実際の可能性です。ほとんどの場合、これは決して起こりません。たとえそうなったとしても、データベースに中立なクラスを使用していても、大幅な書き直しになります。この場合、より機能が豊富で、プロジェクトをより迅速に完了するのに役立つ方を使用するのがおそらく最善です。

そうは言っても、ほとんどの場合、実際の.Net APIの上に自分で作成したレイヤーを使用する必要があると思います。問題。同じデータベースを使用していても、いつデータベースへのアクセス方法を切り替える必要があるかわかりません。ASP から ASP.Net (ADODB と ADO.Net) に移行したことのある人なら誰でも、これがどれほどの苦痛であるかがわかります。

したがって、最善の解決策は、より機能豊富なデータベース固有の API を使用し、その上に独自のレイヤーを構築して、必要に応じて簡単に交換できるようにすることだと思います。

于 2008-12-08T19:44:38.050 に答える
3

話しているデータベースエンジンのタイプに応じて、クラスに与える必要があるSQLには違いがあるため、インターフェースを使用するためにすべてのコードを書くことができたとしても、まだ書く必要があります複数の SQL セット。

または、私たちが行ったことを実行して、使用するすべての構文を処理する独自のレイヤーを作成することもできます。これは、さまざまなエンジンによって提供されるすべての構文ではありませんが、以前に適切に書き換えられる 1 つの SQL を作成するのに十分です。実行。

基本的に、関数の名前の前に を付けた関数構文を作成しましたSQL::。これにより、コードが書き換えが必要な特別な関数を識別できるようになります。その後、これらは解析され、必要に応じて引数の順序を交換する場合でも、適切に書き換えられます。

現在のサーバーの日付と時刻を返す関数の名前などの小さなことは実行できますが、クエリの最初の N 行を選択する方法などの大きなことも実行できます。

さらに、SQL Server のパラメーターは @name として記述されますが、OleDb は位置指定を使用し (パラメーターが必要な場所に ? を追加するだけです)、コードはそれらの違いも処理します。

書く必要のある SQL についてあまり心配しなくてよいという意味で、これは報われます。

于 2008-12-08T19:42:51.160 に答える
2

私は lassevk が言ったことに似たようなことを書いていましたが、彼は私を打ちのめしました。

さらに、ある時点で実際のデータベースと対話する必要があります。ほとんどのデータ アクセスをインターフェイス コードでラップすることから逃れることができるかもしれません。それは良い考えです。しかし、最終的に SQL Server を使用している場合は、SqlClient.SqlConnection の実際のインスタンスを作成する必要があります。Access、Oracle、または MySQL と同じです。

于 2008-12-08T19:46:45.660 に答える
2

コード データベースにとらわれずに作成するようにしてください。現時点では役に立たないかもしれませんが、将来的には利用することになるでしょう。

于 2008-12-08T19:50:24.327 に答える
1

私は、直接データベースの作業を行っているベンダー固有のクラスを使用します (別のデータベースを使用する可能性があると言われている場合を除きます - 発生した回数: 1 回)。

ただし、db 固有ではないコードを別のクラスに分割することになった場合は、メソッド パラメーター インターフェイスを作成することがよくあります。ダイレクト アクセス クラスの機能。

基本的に、アインシュタインの言葉を言い換えると、解決策を可能な限りシンプルにしますが、それ以上シンプルにしないでください。

于 2008-12-08T19:41:22.037 に答える
0

MicrosoftのPatternsandPracticesグループのEnterpriseライブラリをご覧ください。彼らが持っているデータアクセスコードは、プロバイダーの独立性のいくつかの良い実装を示しています。

http://msdn.microsoft.com/en-us/library/cc467894.aspx

于 2009-02-18T14:39:08.553 に答える