>パラメータ化されたクエリを使用し、異なるパラメータで再実行すると、毎回新しいクエリを作成するよりも高速になります。
実際、クエリのパフォーマンスについて言えば、Jet のパフォーマンスは向上しません。実際、JET のホワイト ペーパー「Performance Overview and Optimization Techniques」から、次のような宝石が得られます。
18ページ
ストアド クエリにはコンパイル済みのクエリ プランがあるため、インデックス付き列のパラメーターを含むパラメーター化されたクエリは効率的に実行されない場合があります。クエリ エンジンは事前にパラメーターに渡される値を認識していないため、最も効率的なクエリ プランを推測することしかできません。調査した顧客のパフォーマンス シナリオに基づいて、格納されたパラメーター化されたクエリを一時的なクエリに置き換えることで、大幅なパフォーマンスの向上を実現できる場合があることがわかりました。これは、コードで SQL 文字列を作成し、それを Database オブジェクトの DAO OpenRecordset または Execute メソッドに渡すことを意味します。
ニートえ?そして、私は上記を経験しました!
とにかく、クエリ プランのコンパイル時間は 1000 秒単位であることに注意してください。つまり、実際には、クエリ プランの時間は 0.01 から 0.0001 になります。確かに 100 倍高速ですが、全体で 100 分の 1 秒しか節約できません。クエリ プランの時間が問題にならないように、2 秒かかるレポートを実行します。
今日はGOBSの処理があります。ボトルネックとなるのは、ディスク ドライブ、メモリ、およびネットワーク I/O 速度です。また、JET に送信された新しい SQL 文字列ごとにサーバーの SQL クエリ キャッシュを浪費するという問題もありません。これらのインライン SQL クエリ プランはキャッシュされません。さらに重要なことに、JET はクライアント ベースのエンジンであるため、オフィスの LAN に 10 人のユーザーがいる場合、各マシンでローカルに実行されている JET のコピーが 10 個あります。クエリ プラン キャッシュは、SQL サーバーの場合のように問題ではありません。
上記の Jet ホワイト ペーパー (および私の経験) が示すように、パラメーターなしでその SQL の再コンパイルを強制することによる、より優れたクエリ プランの利点は、パラメーターを使用して事前にコンパイルされたクエリ プランを持つことの利点を上回ります。
ただし、軌道に乗るには、David に同意する必要があります。odbc を使用している場合、またはこの場合は dao オブジェクト モデル + ジェットを使用している場合、実際の SQL ステートメントを挿入する方法を思いつくことができないとは思いません。
おそらく、上記の「不十分な」InputBox() の例では、予期しない結果をもたらす可能性のある条件を入力できます。指摘したように、アクセスに組み込まれたアプリケーションは、このように機能することはめったにありません。
フォームを表示しているレコードを削除するなどの場合、フォームにはカスタム メニュー バー (またはリボン) が表示されるか、単に削除ボタンがフォームに配置されます。したがって、ユーザーは、このタイプの削除コードに不適切なデータを入力することはできません。
フォームでユーザーからの入力を頻繁に受け入れる場合は、フォームにデータ マスクが組み込まれていることに注意してください。結局のところ、これはまさに MS アクセスが設計されたものです。したがって、電話番号を要求している場合、ユーザーはその入力マスクに文字を入力したり、数値以外のチャーターを入力したりすることはできません。そのマスクは () と – をその電話番号の適切な場所に表示用に挿入しますが、ユーザーの実際の入力には数字のみが入ります。
他のほとんどの種類のプロンプトでは、コンボ ボックス、リスボックス、およびその他の UI 要素を使用します。これにより、フォームで許可されている以外の何かをテキスト ボックスに挿入するユーザーの能力が制限されます。
ほとんどのスクリーン ビルダーをはるかに超える豊富なマスキング機能と入力機能があるため、注入は MS アクセス ベースのアプリケーションではめったに行われません。
ユーザーがインジェクションによってSQLステートメントを実行できるJETの例を誰かが示すことができれば、dao + jetでは不可能だと思うので、私はすべて耳にします。
MS アクセス アプリケーションの場合は可能かもしれませんが、実際には非常に困難です。