4

現在、さまざまなソフトウェア構成を持つ複数の異なるサーバーにインストールできる Web アプリケーションのプロジェクトに取り組んでいます。ユーザーがさまざまな SQL サーバーをインストールできるようにすることで、アプリケーションを可能な限り柔軟にしたいと考えています。問題は、2 つのサーバー ベンダーが使用する SQL 構文が一致しないことです。簡単な例として、MS SQL と MySQL の同じ SELECT ステートメントを次に示します。

MS SQL -SELECT TOP 1 * FROM MyTable ORDER BY DateCreated DESC

MySQL -SELECT * FROM MyTable ORDER BY DateCreated DESC LIMIT 1

さまざまなベンダーのステートメント作成を抽象化する標準的な方法はありますか? この問題について説明しているオンライン リソースや書籍はありますか? 私が役に立つと思うヒントやスマートアレックの発言はありますか?

詳細情報: Windows サーバー上で動作するバニラ ASP でアプリケーションを作成しています。

ありがとう、スパラ

4

3 に答える 3

4

ANSI SQL 92 に準拠できます。私が知っている主要な RDBMS はすべてそれをサポートします。

ただし、個々の RDBMS メーカーが SQL の独自のフレーバーを強化するために追加したものはたくさんあります。それがあなたが急所に入るところです。

接続している RDBMS に応じてコードを分岐し、その時点で適切な SQL ステートメントを生成/選択する必要がある場合があります。

サポートされている RDBMS ごとに DAL を作成することをお勧めします。DAL 間で DAL インターフェイスを実装して、DAL を統一します。これは、コードで切り替えるよりも簡単なはずです。

すべての人を喜ばせようとするのではなく、デプロイする予定の上位 1 つまたは 2 つのシステムをサポートするようにコードを記述し、必要に応じて他の RDBMS のサポートを追加することをお勧めします。

于 2010-04-15T14:44:25.583 に答える
2

プレーンなバニラ SQL を記述しようとするのではなく、ORM (linq、nhibernate など) を使用して SQL 方言を抽象化することをお勧めします。

編集:クラシック ASP の OR/M はありますか?

于 2010-04-15T15:00:31.490 に答える
0

ご存知のように、厳密に ansi sql を使用すればうまくいくと思いますが、多少の労力とおそらく余分な作業が必要になるだけです。すなわち

SELECT MAX(*) FROM mytable ORDER BY datecreated DESC;

実際にはすべての db 固有の構成要素は、データを取得または記述する既存の方法を短縮またはショートカットする方法であるため、ansi には回避策があります。別のオプションとして、さまざまなデータベースへのアクセスをストアド プロシージャおよびユーザー定義関数に制限することもできます。そうすれば、アプリが機能する前にデータベース固有のスクリプトを実行するという要件で、使用されることがわかっている一連のデータベースのスクリプトを作成できます。ただのアイデア。

于 2010-04-16T01:11:34.897 に答える