声明: この記事は、「Computer Applications」第 23 巻、第 11 号に掲載されています。
要約: さまざまなシステムの開発において、ストアド プロシージャを使用することは良い習慣です。これにより、一時テーブル、関数、カーソルなどの機能がもたらされるだけでなく、デバッグ、アップグレード、メンテナンスが便利になります。ただし、ほとんどすべてのストアド プロシージャ呼び出しは同じモードであり、主な違いは各ストアド プロシージャのパラメータが異なることです。では、すべてのストアド プロシージャ呼び出しを統合し、不要なプログラミングを減らす方法を使用することは可能でしょうか? SQL Server データベースと ASP.NET の研究に基づいて、このメソッドは呼び出すストアド プロシージャの名前を指定し、呼び出し時に特定のパラメータ値を指定するだけで済むように、統合された呼び出しメソッドを実装しました。プロシージャを呼び出すことができます。
キーワード:ストアドプロシージャ、システムテーブル、情報構造ビュー、ADO.NET 文書識別コード:②技術実践成果報告書(技術)、理論学習と社会実践のまとめ(社会科学)
.NET で同じ方法でストアド プロシージャを呼び出す
要約: ストアド プロシージャを使用することは、プロジェクトの開発において良い習慣です。ストアド プロシージャを使用すると、一時テーブル、関数、カーソルが提供され、デバッグ、アップグレード、メンテナンスにもメリットが得られます。ただし、ストアド プロシージャの呼び出しはほとんどすべて同じパターンです。それらの違いは、すべてのストアド プロシージャのパラメータです。では、違いにもかかわらず、同じ方法でストアド プロシージャを呼び出して、プログラミング コードを減らすことができるでしょうか。提供された情報は、SQL Server と .NET のみです。ストアド プロシージャ名とそのパラメータの値を指定する場合、パラメータを自分で作成する必要はありません。 キーワード: Stord プロシージャ、システム テーブル、情報スキーマ、ADO.NET
概要: プロジェクトの開発では、ストアド プロシージャ。ただし、ほとんどすべてのストアド プロシージャ呼び出しは同じパターンになります。主な違いは、作成される各パラメータの型と値にあります。では、1 つの関数 (またはクラス) を通じてすべてのストアド プロシージャを呼び出すことは可能でしょうか?この記事では、データベースによって提供されるシステム テーブルを使用するという原則に基づいて統合呼び出しメソッドを実装します。このメソッドでは、呼び出すストアド プロシージャの名前を指定し、呼び出し時に特定のパラメーター値を指定するだけで済みます。ストアド プロシージャを呼び出すことができます。
要約: プロジェクトの開発中にデータベース システムのストアド プロシージャを呼び出す必要がありますが、ストアド プロシージャの呼び出しはほとんど同じであり、主な違いはパラメータの型や値などの違いです。関数 (またはクラス) ですか? データベース システムによって提供されるシステム テーブルに基づいて、ストアド プロシージャを呼び出すためのクラスを作成しました。ストアド プロシージャを呼び出すために指定するのは、ストアド プロシージャの名前と名前だけです。ストアド プロシージャのすべてのパラメータの値。
<DIV class=text4><B>1.はじめに</B></DIV>
さまざまなシステムの開発において、ストアド プロシージャを使用することは、一時テーブル、関数、カーソルなどの機能をもたらすだけでなく、デバッグ、アップグレード、メンテナンスも容易になります。保存プロセス中にデータを処理して返すことができるため、データの分析と制御をさらに強化できます。ストアド プロシージャの呼び出しでは、ストアド プロシージャの呼び出しがほぼ次のパターンにあることがわかりました。
1. SqlConnectionの宣言
2. SqlCommand を宣言し、その Connection プロパティを宣言したばかりの SqlConnection インスタンスに設定し、CommandName をストアド プロシージャ名に、CommandType をストアド プロシージャに設定します。
3.ストアド プロシージャの呼び出しに必要なすべてのパラメーターを、宣言したばかりの SqlCommand インスタンスの Parameters コレクションに追加します (4)。 SqlCommand の ExecuteReader() メソッドを呼び出して、ストアド プロシージャによって返された行セットを取得します。
4. SqlDataAdapter と DataSet を宣言し、SqlDataAdapter の SelectCommand プロパティを 3 で宣言したインスタンスに設定し、その Fill メソッドを呼び出して、返された行セットを DataSet に埋めます。
5. SqlConnection オブジェクトを閉じます
6.宣言された各オブジェクト インスタンスを解放します (注: 4 は 2 つのデータ抽出メソッドを指します)。この呼び出しプロセス中に、ほとんどすべてのストアド プロシージャ呼び出しがこのモードであることがわかりました。違いは、ステップ 2 のストレージにあります。手順 3 の各ストアド プロシージャ呼び出しで使用されるパラメータとは異なります。パラメータ名、方向、データ型、長さなどに違いがあります。では、すべてのストアド プロシージャ呼び出しを実装する方法はあるのでしょうか?つまり、ストアド プロシージャ名を指定し、パラメータ値を呼び出しメソッドに渡してストアド プロシージャの呼び出しを実現し、特定のデータ構造を使用して返された行セット、送信パラメータ値、および戻り値を処理します。 SQL Server のシステム テーブルを研究した結果、このアイデアが実現可能であることがわかりました。
2.システムテーブルと情報構造ビュー
SQL Server などのリレーショナル データベースは、何らかの方法でデータベースにメタデータを保存します。SQL Server では、メタデータがシステム データベースとシステム テーブルになります。 SQL Server をインストールすると、master、model、msdb、tempdb の 4 つのシステム データベースが自動的に生成されます。マスター データベースは、SQL Server 内のすべてのシステム レベルの情報の倉庫です。ログイン アカウント、構成設定、システム ストアド プロシージャ、および他のデータベースの存在は、マスター データベースに記録されます。 msdb データベースには、SQL Server エージェント情報が保存されます。ジョブ、オペレーター、およびアラートが定義されると、それらは msdb に保存されます。 model は、すべてのユーザー生成データベースのテンプレートです。新しいデータベースを生成するときは、モデルをコピーし、必要なオブジェクトを作成します。 tempdb は一時オブジェクトを SQL Server に保存します。生成された一時テーブルと一時ストアド プロシージャ、およびシステム生成された一時オブジェクトの表示はすべて tempdb を使用します。 [1] そして、各データベースには独自のシステム テーブルがあります。これらのシステム テーブルは、構成情報とオブジェクト情報を保存するために使用されます。これらのシステム テーブルから、各ストアド プロシージャのすべてのパラメータに関する情報を取得できます。この情報は syscolumns テーブルに保存されます。私たちのメソッドで使用する必要があるパラメータ名、タイプ、長さ、方向などがあります。 ただし、システム テーブルのフィールドは SQL Server のバージョンに応じて変更されます。たとえば、syscolumns の type と xtype は、両方とも型情報を格納する例です。この方法を SQL Server のバージョン変更に適応させるには、情報構造ビューを使用する必要があります。 ANSI-92 では、情報構造ビューをシステム データを提供するビューのセットとして定義しています。このビューを利用すると、実際のシステム テーブルをアプリケーションから隠すことができます。システム テーブルへの変更はアプリケーションに影響を与えないため、アプリケーションはデータベース ベンダーやバージョンに依存せずに済みます。 [1] ANSI-92 および SQL Server は、ローカル サーバー上のオブジェクトを参照するための 3 セグメントの名前付け構造の使用をサポートしています。 ANSI-92 の用語は、catalog.schema.object と呼ばれますが、SQL Server では、database.owner.object と呼ばれます。 [1] たとえば、すべてのストアド プロシージャのすべてのパラメータ情報を検索したい場合は、 select * from INFORMATION_SCHEMA.PARAMETERS を使用できます。 特定のストアド プロシージャのすべてのパラメータ情報を検索したい場合は、次のようになります。 * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME ='Proc1 ' 情報構造ビューを使用すると、問題の半分以上が解決されました。次に、.NET でメソッドを実装する方法を見ていきます。
3.この実装方法の焦点は、名前に基づいてストアド プロシージャのすべてのパラメータ情報を取得し、これらのパラメータ情報に基づいて各パラメータを自動的に作成する方法にあります。これらのアクションを自動化するには、SqlConnection、SqlCommand、および SqlParameter を宣言するプロセスと、各 SqlParameter を作成するプロセスがユーザーには見えないようにする必要があります。ユーザーが指定する必要があるのはストアド プロシージャの名前だけです。その後、呼び出し時にさまざまなパラメータを指定し、その型さえも指定する必要はありません。
3.1 ストアド プロシージャのパラメータの取得と作成 呼び出すストアド プロシージャのパラメータをどのように取得して作成するかが重要なポイントであり、情報構造ビューを通じてこのステップを自動的に実装できます。
// ストアド プロシージャのパラメータを取得および作成します
private void GetProcedureParameter(params object[]parameters)
{ SqlCommand myCommand2 = new SqlCommand();
myCommand2.Connection = this.myConnection;
myCommand2.CommandText = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME = '" + this.ProcedureName + "' order by ORDINAL_POSITION";
SqlDataReader Reader = null; Reader = myCommand2.ExecuteReader(); // 戻りパラメータを作成
myParameter = new SqlParameter();
myParameter.ParameterName = "@Value";
myParameter . SqlDbType = SqlDbType.Int;
myParameter.Direction = ParameterDirection.ReturnValue;
myCommand.Parameters.Add(myParameter);
// ここで、SqlParameter の型、値、方向などの属性を自動的に作成します。
while(reader.Read())
{
myParameter = new SqlParameter();
myParameter.ParameterName = Reader["PARAMETER_NAME"].ToString();
myParameter.Direction = Reader["PARAMETER_MODE"].ToString()=="IN" ?ParameterDirection.Input:ParameterDirection.Output;
switch(reader["DATA_TYPE"].ToString()) {
case "int" :
if(myParameter.Direction == ParameterDirection.Input)
myParameter.Value = (int)parameters[i] ;
myParameter.SqlDbType = SqlDbType.Int
;
//
...
多くの特定の型の処理は省略され
ます
。
3.2 返される結果データ セット、戻り値、および送信パラメータ セット ストアド プロシージャのパラメータを作成した後、ストアド プロシージャを呼び出すことができます。 .NET では、結果セットを返す一般的に使用されるクラスは SqlDataReader と DataSet であり、SqlDataReader は接続を維持している間のみ使用できますが、DataSet は使用できません。私たちの実装では、呼び出し後に接続を切断する必要があるため、返された結果セットを保存するために DataSet が使用されます。
public SqlResult Call(params object[]parameters){ // SqlResult は、結果データ セット、戻り値、送信パラメータ セットを保存するために使用される自己定義クラスです。 SqlResult result = new SqlResult(); // 独自の接続を定義します。必要な String
myConnection = new SqlConnection(ConnectionString);
myCommand =new
SqlCommand(this.ProcedureName, myConnection);
myCommand.CommandType = CommandType.StoredProcedure
; // 取得および作成プロシージャのパラメータを保存し、値を設定します
。 GetProcedureParameter(parameters)
; // ストアド プロシージャの送信パラメータ値と名前のペアを取得し、ハッシュテーブルに保存します。 GetOutputValue(result) ; // ここでさまざまなリソースを解放し、
myCommand.Dispose
()
; myConnection.Dispose
()
;
4.今後の作業 ここでの実装は SQL Server データベース用ですが、このメソッドは、情報構造ビューを提供する、ANSI-92 標準に準拠する、またはメタデータを提供するあらゆるデータベースに使用できます。これを SqlProcedure クラスにカプセル化すると、必要に応じてストアド プロシージャを簡単に呼び出すことができるため、基本的に反復的なコード作業の多くが削減されます。 SqlProcedure クラスがより多くのデータ型をサポートするには、GetProcedureParameter() メソッドで、必要に応じて各パラメーターの型、方向、長さ、既定値、その他の情報を分析し、このパラメーターを作成する必要があります。基本的に任意の型を実装でき、画像型もこの方法で作成できます。このようにして、クラスは非常に一般的で、あらゆるプロジェクトで役立ちます。
参考文献
[1] Ray Rankins、Paul Jensen、Paul Bertucci、『SQL Server 2000 Practical Book』、北京: Electronic Industry Press、2002
[2] MSDN ライブラリ、2003 年 1 月、Microsoft Corporation
著者について: Liu Zhibo (1979-)、男性、湖南省新華市出身、修士号、主な研究方向: ニューラル ネットワークとパターン認識、オフィス オートメーション情報システム
電子メール:[email protected]