3

いくつかの基本的なAPIを利用して生のクエリをMSSQLServerに送信するC++アプリケーションがあります。プログラム内のさまざまな変換ユニットに散在しているため、C ++文字列として単純な1〜​​2行のクエリがあり、20行を超える可能性のあるより複雑なクエリが表示されることがあります。

より大きなクエリ、特に20行以上のクエリは、定数文字列としてC++コードに埋め込むべきではないと思わざるを得ません。これらをC++アプリケーションによってオンデマンドでロードされる個別のテキストファイルにプルすることを提案したいのですが、これが最善のアプローチかどうかはわかりません。

このような状況では、どのような設計上の選択が一般的ですか?間違いなく改善が必要だと感じています。SQLクエリをデータファイル(テキストファイル)に移動することが最善のアイデアかどうかはわかりません。

4

6 に答える 6

3

DAL(データアクセス層)を作成できます。

プログラムの残りの部分が通信するのはAPIです。次に、メインプログラムを邪魔することなく、あらゆるもの(ストアドプロシージャ、キャッシングなど)をいじって試すことができます。

于 2012-04-09T21:23:41.833 に答える
1

それらを独自のファイルに移動するか、独自のストアドプロシージャに移動します。アプリケーションに埋め込まれているクエリは、再コンパイルせずに変更することはできません。リリース手順によっては、緊急事態への対応やホットフィックスの展開が大幅に損なわれる可能性があります。その道を進んだ場合は、ファイルの内容をキャッシュするようにアプリを変更したり、ファイルの更新を定期的にチェックしたりすることもできます。

于 2012-04-09T21:19:07.827 に答える
1

さまざまな理由から、最良の「設計上の選択」は、可能な限りいつでもどこでもMSSQLストアドプロシージャを使用することです。

SQLクエリを共通のモジュールに分離するコードを見たことがありますが、SQLクエリをモジュール内で文字列リテラルとしてスペルアウトするよりも、一般的な「クエリモジュール」(またはスタンドアロンのテキストファイル)にはあまりメリットがないと思います。それは彼らを呼んでいます。

一方、ストアドプロシージャは、モジュール性を高め、セキュリティを強化し、パフォーマンスを大幅に向上させることができます。

私見では...

于 2012-04-09T21:19:13.267 に答える
1

SQLを使用するC++関数にSQLを埋め込んだままにしておきます。コードの機能を読み、理解するのが簡単になります。

コードの周りにSQLクエリが散在している場合は、使用しているクラスの全体的な構造に問題があると思います。データベース、およびコードの残りの部分はこれらのクラスを使用します。

私は個人的にストアドプロシージャを使用するのが好きではありません。別のデータベースサーバーをサポートする必要がある場合、移植が面倒になります。パフォーマンスがそれほど向上することはなく、コード間を行き来する必要があることを理解することもできません。ストアドプロシージャとC++。

于 2012-04-09T21:26:46.793 に答える
1

それは本当に異なります、ここにいくつかのメモがあります:

1)すべてのSQLコードがアプリケーションに存在する場合、アプリケーションはロジックの観点からほぼ自己完結型です。これは、現在のアプリケーションで行ったように適切です。速度の点では、これらのクエリを実行するときにSQLを解析する必要があるため、これは少し遅くなる可能性があります(Preparedステートメントなどを使用して速度を上げることができるかどうかにも依存します)。

2)2番目のアプローチは、すべてのSQLロジックをストアドプロシージャとしてサーバーに配置することです。これは、1行であるかどうかに関係なく、小さなSQLクエリでも非常に好ましいアプローチです。DAL層を構築するだけです。パフォーマンスの点では、これは非常に優れていますが、ロジックはC++アプリとSQLサーバーの2つの異なるシステムに存在します。ストアドプロシージャの入力と出力をテンプレートコード(C ++またはその他)に変換できる小さなユーティリティアプリケーションを作成して、作業を楽にする必要があります。

3)上記の2つとの混合アプローチ。このルートはお勧めしません。

于 2012-04-15T07:19:33.927 に答える
0

これらのクエリが時間の経過とともにどのように変化する可能性があるかを考え、関連するC++コードがどのように変化する可能性があるかを比較する必要があります。クエリがコードから比較的独立していて、変更される可能性が高い場合は、実行時に別のファイルからクエリをロードするか、代わりにストアドプロシージャを使用します。このアプローチにより、C++コードを再コンパイルせずにクエリを変更できます。一方、クエリがC ++コードと高度に結合されており、一方に変更を加えると他方に変更が加えられる可能性がある場合は、クエリをコードに保持します。このアプローチにより、変更がよりローカライズされ、エラーが発生しにくくなります。

于 2012-04-09T21:27:49.697 に答える