元のアドレス: http://www.51la.org/webjx/htmldata/2005-12-24/1135405777.html
要約 ストアド プロシージャ呼び出しは、b/s システムでよく使用されます。従来の呼び出し方法は時間がかかるだけでなく、ストアド プロシージャの数が増えるとコードが拡大し続けるため、メンテナンスが困難になります。新しい方法はこれらの問題をある程度解決します。
キーワード asp.net; ストアド プロシージャ .net を使用するプロセスにおいて、データベース アクセスは非常に重要な部分であり、特に b/s システムの構築プロセスでは、データベースの操作はほぼ必須の操作となっています。ストアド プロシージャを呼び出してデータベース操作を実装することは、多くのプログラマが使用する方法であり、ほとんどのプログラマは可能であればストアド プロシージャを使用し、SQL ステートメントを直接使用することはほとんどないため、ストアド プロシージャは非常に便利で重要です。
ストアド プロシージャの概要
簡単に言えば、ストアド プロシージャは、いくつかの SQL ステートメントと制御ステートメントで構成されるカプセル化されたプロシージャであり、データベース内に常駐し、クライアント アプリケーションまたは別のプロシージャやトリガーから呼び出すことができます。そのパラメータは渡したり返したりできます。アプリケーションの関数プロシージャと同様に、ストアド プロシージャは名前で呼び出すことができ、入力パラメータと出力パラメータもあります。
さまざまな戻り値の型に応じて、ストアド プロシージャは、レコードセットを返すストアド プロシージャ、数値を返すストアド プロシージャ (スカラー ストアド プロシージャとも呼ばれます)、および動作ストアド プロシージャの 3 つのカテゴリに分類できます。名前が示すように、レコード セットを返すストアド プロシージャの実行結果は、データベースから 1 つまたは複数の条件を満たすレコードを取得することです。数値を返すストアド プロシージャは値を返します。実行後、たとえばデータベース内で戻り値のある関数またはコマンドを実行します。最後に、動作ストアド プロシージャは、データベース内の更新操作や削除操作など、戻り値を持たないデータベースの特定の機能を実装するためにのみ使用されます。 。
ストアド プロシージャを使用する利点
SQL ステートメントを直接使用する場合と比較して、アプリケーションでストアド プロシージャを直接呼び出すことには次の利点があります。
(1) ネットワーク トラフィックが削減されます。行数が少ないストアド プロシージャを呼び出す場合と SQL ステートメントを直接呼び出す場合とでは、ネットワーク トラフィックに大きな違いはありません。ただし、ストアド プロシージャに数百の SQL ステートメントが含まれている場合は、SQL ステートメントを 1 つずつ呼び出すよりもパフォーマンスが明らかに優れています。 1つ。
(2) 実行速度が速くなります。理由は 2 つあります。1 つは、ストアド プロシージャの作成時に、データベースがすでに一度解析して最適化していることです。次に、ストアド プロシージャが実行されると、ストアド プロシージャのコピーがメモリに保持されるため、次回同じストアド プロシージャを実行するときにメモリから直接呼び出すことができます。
(3) より強力な適応性: ストアド プロシージャはストアド プロシージャを通じてデータベースにアクセスするため、データベース開発者はストアド プロシージャ インターフェイスを変更せずにデータベースに変更を加えることができ、これらの変更はデータベースに影響を与えません。
(4) 分散作業:アプリケーションとデータベースのコーディング作業がお互いを抑制することなく独立して実行できます。
上記の分析から、アプリケーションではストアド プロシージャを使用する必要があることがわかります。
ストアド プロシージャを呼び出す 2 つの異なる方法
新しい方法の利点を強調するために、まず .net でストアド プロシージャを呼び出す「公式」方法を紹介します。さらに、この記事のすべてのサンプル プログラムは sqlserver データベース上で動作します。他の状況も同様であるため、今後は個別に説明しません。この記事のすべての例は C# 言語で説明されています。
アプリケーションでデータベースにアクセスするための一般的な手順は次のとおりです。まずデータベース接続 sqlconnection を宣言し、次にデータベース コマンド sqlcommand を宣言して SQL ステートメントとストアド プロシージャを実行します。これら 2 つのオブジェクトを使用すると、必要に応じてさまざまな実行方法を使用して目標を達成できます。追加する必要があるのは、using system.data.sqlclient という参照ステートメントをページに忘れずに追加することです。
ストアド プロシージャの実行に関する限り、最初のタイプのストアド プロシージャが実行される場合、データ アダプタを使用して結果をデータセットに入力する必要があり、データ グリッド コントロールを使用して結果をページに表示できます。 2 番目と 3 番目のストアド プロシージャの場合、このプロシージャは必要ありません。特定の戻り値に基づいて操作が正常に完了したかどうかを判断するだけです。
(1) パラメータなしでストアド プロシージャを実行するコードは次のとおりです。
sqlconnection conn=new sqlconnection("接続文字列");
sqldataadapter da = 新しい sqldataadapter();
da.selectcommand = 新しい sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "プロシージャの名前";
da.selectcommand.commandtype = コマンドタイプ.ストアドプロシージャ;
次に、さまざまな目的に応じて、ここでプロセスを実行する適切な方法を選択するだけです。
(2) パラメーターを使用してストアド プロシージャを実行するコードは次のとおりです (ストアド プロシージャを呼び出す関数を exeprocedure(string inputdate) として宣言できます)。
sqlconnection conn=new sqlconnection("接続文字列");
sqldataadapter da = 新しい sqldataadapter();
da.selectcommand = 新しい sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "プロシージャの名前";
da.selectcommand.commandtype = コマンドタイプ.ストアドプロシージャ;
(上記コードは同じですが、以下が追加するコードです)
param = new sqlparameter("@パラメータ名", sqldbtype.datetime);
param.direction = パラメータ方向.入力;
param.value = Convert.todatetime(inputdate);
da.selectcommand.parameters.add(param);
これにより、入力パラメータが追加されます。出力パラメータを追加する必要がある場合:
param = new sqlparameter("@パラメータ名", sqldbtype.datetime);
param.direction = パラメータ方向.出力;
param.value = Convert.todatetime(inputdate);
da.selectcommand.parameters.add(param);
パラメーター ストアド プロシージャの戻り値を取得するには、次の手順を実行します。
param = new sqlparameter("@パラメータ名", sqldbtype.datetime);
param.direction = パラメータ方向.戻り値;
param.value = Convert.todatetime(inputdate);
da.selectcommand.parameters.add(param);
上記のコードから、ストアド プロシージャが多数ある場合、またはストアド プロシージャ内のパラメータが多数ある場合、この方法は開発速度に大きく影響することがわかります。一方、プロジェクトが比較的大規模な場合は、これらの関数を使用します。データベースロジックは将来のメンテナンスにも大きな負担となります。では、この問題を解決する改善された方法はあるのでしょうか?パラメーターなしでストアド プロシージャを実行する場合、ストアド プロシージャの名前を渡すだけで対応するストアド プロシージャを呼び出すことができ、sqlserver データベースでは「ストアド プロシージャ名 (パラメーター リスト)」を直接入力できると考えていました。 " クエリ アナライザーで。ストアド プロシージャは、このような文字列を使用して実行できます。では、このアイデアはアプリケーションに適用できるでしょうか?
したがって、コンパイラに対応するコードを入力します。これらのコードは、パラメーターなしでストアド プロシージャを呼び出すコードに基づいて変更されます。具体的なコードは次のとおりです。
sqlconnection conn=new sqlconnection("接続文字列");
sqldataadapter da = 新しい sqldataadapter();
da.selectcommand = 新しい sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "手続きの名前('para1','para2',para3)";
da.selectcommand.commandtype = コマンドタイプ.ストアドプロシージャ;
コードをよりわかりやすくするために、呼び出されるストアド プロシージャの最初と 2 番目のパラメータは文字列型で、3 番目のパラメータは整数型です。実行後、期待どおりの結果が得られることがわかりました。
2 つの呼び出し方法の比較 比較すると、2 番目の方法には明らかな利点があることがわかります。つまり、開発速度が向上し、開発時間が節約され、コードの保守が容易になり、システム サイズも削減されます。ある程度は。ただし、ストアドプロシージャのパラメータの処理は比較的一般的なため、出力パラメータを取得したい場合やストアドプロシージャの戻り値を取得したい場合には、この方法では対応できません。それでも、この方法を使用すると、開発者はコードの大部分を保存できます。出力パラメータと戻り値を取得する必要がない場合は、ほぼ「一度だけ」で実行できます。したがって、実際のプログラム開発において、この方法は依然として一定の実用的価値を持っています。