推奨:ASP 3.0高度なプログラミング(12) 4.2.3サーバー側の例を含む命令の例SSIディレクティブとASPサーバーオブジェクトを表示して、サンプルWebページの第4章のサブディレクトリを開きます&rdqu
9.2.3ストアドプロシージャストアドプロシージャの使用は、コマンドオブジェクトが適用される領域です。ストアドプロシージャ(ストレージクエリと呼ばれることもあります)は、データベースで事前に定義されているSQLクエリステートメントです。
コードで直接SQL文字列を使用する代わりに、ストアドプロシージャを作成して使用する必要があるのはなぜですか?いくつかの主な理由があります:
・ストアドプロシージャは、データベースによってコンパイルされています。これにより、実行計画が発生するため、データベースはそれが何をするかを正確に把握しているため、プロセスの実行を高速化します。
通常、ストアドプロシージャはデータベースによってキャッシュされているため、現時点でディスクから読み取る必要がないため、より速く実行されます。すべてのデータベースがこのキャッシュメカニズムをサポートするわけではありません。たとえば、Microsoftのアクセスはそれをサポートしていませんが、SQL Serverはサポートしています。
・データベース内のテーブルは、ストアドプロシージャによってのみ変更できることを指定することにより、データをより安全に保証できます。これは、潜在的に危険なSQL操作が実行されないことを意味します。
・ASPコードは、長いSQLステートメントと一緒に混合することを避けることができ、ASPコードの保守を容易にすることができます。
・すべてのSQLコードは、サーバーに中央に保存できます。
・出力パラメーターは、レコードセットまたはその他の値の返品を可能にするために、ストアドプロシージャで使用できます。
一般的に言えば、ストアドプロシージャは、ほぼ常に同等のSQLステートメントよりも高速です。
ストアドプロシージャを使用するには、ストアドプロシージャ名をコマンドテキストとして使用し、対応するタイプを設定します。たとえば、更新された本の価格の以前の例を考えてください。 SQL Serverでストアドプロシージャを作成すると、コードを書くことができます。
手順USP_UPDATEPRICESを作成します
として
タイトルを更新します
設定価格=価格 * 1.10
ここで、type = 'business'
Microsoftのアクセスデータベースの場合、簡単な更新クエリステートメントを使用して同じタスクを実現できます
このストアドプロシージャをASP Webページで実行するには、次のコードを使用してください。
cmdupdate = server.createobject(adodb.command)を設定します
cmdupdate.activeconnection = strconn
cmdupdate.commandtext = usp_updateprices
cmdupdate.commandtype = adcmdstoredproc
cmdupdate.execute 、、 adexecutenorecords
これは、ストアドプロシージャを実行しているだけです。データが更新されているだけなので、レコードセットは返されません。レコードが実際に必要でない限り、レコードを作成しないことを覚えておくことが重要です。
これは大丈夫ですが、1つのタイプの本のみを扱っているため、それほど柔軟ではありません。より良いアプローチは、各タイプの本のプロセスを作成する必要がないように、本の種類を選択できるプロセスを作成することです。また、固定された10%のアップデートを削除できるため、柔軟性が向上します。それで、どうすればこれを行うことができますか?非常に簡単です。パラメーターを使用してください。
1。パラメーター
ストアドプロシージャのパラメーター(または変数)は、一般的な手順と機能のパラメーターと同じです。それらを関数に渡すことができ、関数はその値を使用できます。 SQL Serverのストアドプロシージャ(Accessを含む他のデータベースにも同じことが言えます)がこの機能を持っています。
複数の種類の本を処理したり、ユーザーが価格の増加(または減少)を指定できるようにするために、いくつかのパラメーターを追加する必要があります。
手順USP_UPDATEPRICESを作成します
@type char(12)、
@percent Money
として
タイトルを更新します
SET価格=価格 *(1 @Percent / 100)
ここで、type = @type
現在、ストアドプロシージャUSP_UPDATEPRICESには2つのパラメーターが必要です。
・1つは本のタイプ(@type)です。
・1つは、帳簿価格の変化の割合(@percent)です。
VBScriptの関数と同様に、これらのパラメーターは変数です。ただし、VBScriptやその他のスクリプト言語とは異なり、これらのスクリプト言語の変数はすべて可変型であり、SQL変数には明確なタイプ(Char、お金など)があります。 SQL変数の命名仕様に従う必要があります。つまり、変数はシンボル @で開始する必要があります。
分数値としてではなく、整数としてこのプロセスに渡されたパーセンテージ(10などの10%を平均10%)があることに注意してください。これにより、ストアドプロシージャはもう少し直感的になります。
2。パラメーターコレクション
それで、今、パラメーターを備えたストアドプロシージャがありますが、ADOを通してそれをどのように呼びますか?コマンドオブジェクトを使用してパラメーターなしでストアドプロシージャを呼び出す方法を見てきましたが、実際、それらの間に違いはありません。違いは、パラメーターコレクションの使用です。
パラメーターコレクションには、ストアドプロシージャの各パラメーターのパラメーターオブジェクトが含まれています。ただし、ADOはこれらのパラメーターが何であるかを自動的に把握していないため、次の形式でcreateParameterメソッドを使用して作成する必要があります。
set parameter = command.createparameter(name、[type]、[direction]、[size]、[value]))
パラメーターと説明を表9-3に示します。
表9-3 createparameterメソッドのパラメーターと説明
パラメーター
説明します
名前
パラメーター名。これは、パラメーターコレクションのパラメーター名であり、ストアドプロシージャのパラメーター名ではありません。ただし、同じ名前を使用することは良い習慣です
タイプ
パラメーターのデータ型。それはaddatype定数になる可能性があります、詳細については付録を参照してください
方向
パラメーターの方向は、パラメーターがストアドプロシージャに情報を提供するか、ストアドプロシージャがADOに情報を返すかを示します。それは次の値のいずれかになる可能性があります。
AdParaminput、パラメーターはストアドプロシージャに渡された入力パラメーターです
adparamoutput、パラメーターはストアドプロシージャから取得された出力パラメーターです
adparaminputOutput、パラメーターは入力パラメーターと出力パラメーターの両方として使用できます
adparamreturnValue、このパラメーターには、ストアドプロシージャによって返されるステータスが含まれています
サイズ
パラメーター長。整数などの固定長さの場合、この値は無視できます
価値
パラメーターの値
パラメーターが作成されると、パラメーターコレクションに追加できます。たとえば、:
Set Parvalue = cmdupdate.createparameter(@type、advarwchar、adparaminput、_
12、ビジネス)
cmdupdate.parameters.append parvalue
Set Parvalue = cmdupdate.createparameter(@percent、adcurrency、_
adparaminput 、、 10)
cmdupdate.parameters.append parvalue
パラメーターを保存するオブジェクトを明示的に作成する必要はありません。デフォルトのバリアントタイプはすでに非常にうまく機能します。変数を作成したくない場合は、次のコードなどのショートカットを取得することもできます。
cmdupdate.parameters.append = _
cmdupdate.createparameter(@percent、adcurrency、adparaminput 、、 10)
これにより、CreateParameterメソッドを使用してパラメーターオブジェクトを返し、追加方法で受信します。この方法は、変数を使用するよりも速く実行されますが、コードの行が長くなり、読みやすくなります。趣味に応じてこれらの方法のいずれかを選択できます。
パラメーターがパラメーターコレクションに追加された後、それらが保持されるため、各パラメーターには、パラメーターが作成されたときに必ずしも値が割り当てられているわけではありません。コマンドが実行される前に、パラメーターの値をいつでも設定できます。例えば:
cmdupdate.parameters.append = _
cmdupdate.createparameter(@percent、adcurrency、adparaminput)
cmdupdate.parameters(@percent)= 10
前の章では、コレクションに値にアクセスする方法がいくつかあり、パラメーターコレクションも例外ではありません。上記の例では、パラメーターの名前を使用してセット内のパラメーターを取得するか、インデックス番号を使用して検索することもできます。
cmdupdate.parameters(0)= 10
上記のコードは、パラメーターセットに最初のパラメーターを割り当てます(0から番号の設定されたパラメーター)
共有:ASPアプリケーションの高度なASPエラーオブジェクトに関する関連知識VBScriptには、スクリプトインタープリターがランタイムエラーを無視し、スクリプトコードの実行を継続するOnerrorresumenextステートメントがあります。次に、スクリプトはERR.Numberプロパティの値を確認して、エラーが発生したかどうかを判断できます。エラーが発生した場合、ゼロ以外の値が返されます