マネージド コードでストアド プロシージャとユーザー定義関数を作成する (C#)
Microsoft SQL Server 2005 は.NET 共通言語ランタイムと統合され、開発者はマネージド コードを使用してデータベース オブジェクトを作成できます。 このチュートリアルでは、Visual Basic または C# コードを使用して、マネージド ストアド プロシージャとマネージド ユーザー定義関数を作成する方法について説明します。 また、これらのエディションの Visual Studio を使用して、このようなマネージド データベース オブジェクトをデバッグする方法についても説明します。
はじめに
Microsoft SQL Server 2005 のようなデータベースでは、データの挿入、変更、取得に Transact-構造化照会言語 (T-SQL) が使用されます。 ほとんどのデータベース システムには、一連の SQL ステートメントをグループ化するためのコンストラクトが含まれています。その後、1 つの再利用可能なユニットとして実行できます。 ストアド プロシージャは 1 つの例です。 もう 1 つは、手順 9 で詳しく調べるコンストラクトである ユーザー定義関数 (UDF) です。
その中核となる SQL は、一連のデータを操作するように設計されています。 、UPDATE
、および DELETE
ステートメントはSELECT
、本質的に対応するテーブル内のすべてのレコードに適用され、句WHERE
によってのみ制限されます。 ただし、一度に 1 つのレコードを操作したり、スカラー データを操作したりするために設計された多くの言語機能があります。 CURSOR
では 、一連のレコードを一度に 1 つずつループできます。 、CHARINDEX
、 などのLEFT
文字列操作関数は、PATINDEX
スカラー データを操作します。 SQL には、 や WHILE
などのIF
制御フロー ステートメントも含まれています。
Microsoft SQL Server 2005 より前では、ストアド プロシージャと UDF は T-SQL ステートメントのコレクションとしてのみ定義できました。 ただし、SQL Server 2005 は、すべての .NET アセンブリで使用されるランタイムである共通言語ランタイム (CLR) との統合を提供するように設計されています。 そのため、SQL Server 2005 データベース内のストアド プロシージャと UDF は、マネージド コードを使用して作成できます。 つまり、ストアド プロシージャまたは UDF を C# クラスのメソッドとして作成できます。 これにより、これらのストアド プロシージャと UDF は、.NET Frameworkおよび独自のカスタム クラスの機能を利用できます。
このチュートリアルでは、マネージド ストアド プロシージャと User-Defined Functions を作成する方法と、それらを Northwind データベースに統合する方法について説明します。 始めましょう。
注意
マネージド データベース オブジェクトには、対応する SQL に比べていくつかの利点があります。 言語の豊富さと知識、既存のコードとロジックを再利用する機能は、メインの利点です。 ただし、多くの手続き型ロジックを含まないデータ セットを操作する場合、マネージド データベース オブジェクトの効率は低下する可能性があります。 マネージド コードと T-SQL を使用する利点について詳しく説明するには、「マネージド コードを使用してデータベース オブジェクトを作成する利点」をチェック。
手順 1: Northwind データベースをApp_Dataから移動する
ここまでのすべてのチュートリアルでは、Web アプリケーションの App_Data
フォルダー内の Microsoft SQL Server 2005 Express Edition データベース ファイルを使用してきました。 すべてのファイルが 1 つのディレクトリ内にあり、チュートリアルをテストするための追加の構成手順は必要なかったので App_Data
、これらのチュートリアルの配布と実行を簡略化してデータベースを配置しました。
ただし、このチュートリアルでは、Northwind データベースを からApp_Data
移動し、SQL Server 2005 Express Edition データベース インスタンスに明示的に登録します。 フォルダー内App_Data
のデータベースを使用してこのチュートリアルの手順を実行できますが、SQL Server 2005 Express Edition データベース インスタンスにデータベースを明示的に登録することで、いくつかの手順がはるかに簡単になります。
このチュートリアルのダウンロードには、 と という NORTHWND.MDF
NORTHWND_log.LDF
2 つのデータベース ファイルが という名前 DataFiles
のフォルダーに配置されています。 チュートリアルの独自の実装に従っている場合は、Visual Studio を閉じて、 ファイルと NORTHWND_log.LDF
ファイルを NORTHWND.MDF
Web サイトのApp_Data
フォルダーから Web サイトの外部のフォルダーに移動します。 データベース ファイルが別のフォルダーに移動されたら、Northwind データベースを SQL Server 2005 Express Edition データベース インスタンスに登録する必要があります。 これは、SQL Server Management Studioから行うことができます。 コンピューターに SQL Server 2005 の Express Edition 以外のエディションがインストールされている場合は、既に Management Studio がインストールされている可能性があります。 お使いのコンピューターにSQL Server 2005 Express Editionがある場合は、Microsoft SQL Server Management Studioをダウンロードしてインストールしてください。
SQL Server Management Studio を起動します。 図 1 に示すように、Management Studio はまず、接続するサーバーを確認します。 サーバー名に「localhost\SQLExpress」と入力し、[認証] ドロップダウン リストで [Windows 認証] を選択し、[接続] をクリックします。
図 1: 適切なデータベース インスタンスに接続する
接続すると、[オブジェクト エクスプローラー] ウィンドウに、データベース、セキュリティ情報、管理オプションなど、SQL Server 2005 Express Edition データベース インスタンスに関する情報が一覧表示されます。
Northwind データベースをフォルダー (または移動した場所) にDataFiles
SQL Server 2005 Express Edition データベース インスタンスにアタッチする必要があります。 [データベース] フォルダーを右クリックし、コンテキスト メニューから [アタッチ] オプションを選択します。 これにより、[データベースのアタッチ] ダイアログ ボックスが表示されます。 [追加] ボタンをクリックし、適切な NORTHWND.MDF
ファイルにドリルダウンして、[OK] をクリックします。 この時点で、画面は図 2 のようになります。
図 2: 適切なデータベース インスタンスに接続する (クリックするとフルサイズの画像が表示されます)
注意
Management Studio を使用してSQL Server 2005 Express Edition インスタンスに接続する場合、[データベースのアタッチ] ダイアログ ボックスでは、[マイ ドキュメント] などのユーザー プロファイル ディレクトリにドリルダウンできません。 そのため、 ファイルと NORTHWND_log.LDF
ファイルはNORTHWND.MDF
必ずユーザー以外のプロファイル ディレクトリに配置してください。
[OK] ボタンをクリックしてデータベースをアタッチします。 [データベースのアタッチ] ダイアログ ボックスが閉じ、オブジェクト エクスプローラーに接続されているデータベースが一覧表示されます。 Northwind データベースに のような 9FE54661B32FDD967F51D71D0D5145CC_LINE ARTICLES\DATATUTORIALS\VOLUME 3\CSHARP\73\ASPNET_DATA_TUTORIAL_75_CS\APP_DATA\NORTHWND.MDF
名前が付いている可能性があります。 データベースを右クリックし、[名前の変更] を選択して、データベースの名前を Northwind に変更します。
図 3: データベースの名前を Northwind に変更する
手順 2: Visual Studio で新しいソリューションとSQL Server プロジェクトを作成する
SQL Server 2005 でマネージド ストアド プロシージャまたは UDF を作成するには、ストアド プロシージャと UDF ロジックを C# コードとしてクラスに記述します。 コードが記述されたら、このクラスをアセンブリ (.dll
ファイル) にコンパイルし、アセンブリを SQL Server データベースに登録してから、アセンブリ内の対応するメソッドを指すストアド プロシージャまたは UDF オブジェクトをデータベースに作成する必要があります。 これらの手順はすべて手動で実行できます。 任意のテキスト エディターでコードを作成し、C# コンパイラ (csc.exe
) を使用してコマンド ラインからコンパイルし、コマンドまたは Management Studio を使用して CREATE ASSEMBLY
データベースに登録し、同様の方法でストアド プロシージャまたは UDF オブジェクトを追加できます。 幸いにも、Visual Studio の Professional および Team Systems バージョンには、これらのタスクを自動化する SQL Server プロジェクトの種類が含まれています。 このチュートリアルでは、SQL Server プロジェクトの種類を使用して、マネージド ストアド プロシージャと UDF を作成する方法について説明します。
注意
Visual Web Developer または Visual Studio の Standard エディションを使用している場合は、代わりに手動のアプローチを使用する必要があります。 手順 13 では、これらの手順を手動で実行するための詳細な手順を示します。 これらの手順には、使用している Visual Studio のバージョンに関係なく適用する必要がある重要なSQL Server構成手順が含まれているので、手順 13 を読む前に手順 2 から 12 を読むことをお勧めします。
まず、Visual Studio を開きます。 [ファイル] メニューの [新しいプロジェクト] を選択して、[新しいプロジェクト] ダイアログ ボックスを表示します (図 4 を参照)。 [データベース] プロジェクトの種類にドリルダウンし、右側に一覧表示されている [テンプレート] から、新しい SQL Server プロジェクトを作成することを選択します。 私はこのプロジェクト ManagedDatabaseConstructs
に名前を付け、 という名前 Tutorial75
のソリューション内に配置しました。
図 4: 新しいSQL Server プロジェクトを作成する (フルサイズの画像を表示する をクリックします)
[新しいプロジェクト] ダイアログ ボックスの [OK] ボタンをクリックして、ソリューションを作成し、プロジェクトをSQL Serverします。
SQL Server プロジェクトは、特定のデータベースに関連付けられています。 その結果、新しいSQL Serverプロジェクトを作成した後、すぐにこの情報を指定するように求められます。 図 5 は、手順 1 でSQL Server 2005 Express Edition データベース インスタンスに登録した Northwind データベースを指すように入力された [新しいデータベース参照] ダイアログ ボックスを示しています。
図 5: SQL Server プロジェクトを Northwind データベースに関連付ける
このプロジェクト内で作成するマネージド ストアド プロシージャと UDF をデバッグするには、接続に対する SQL/CLR デバッグのサポートを有効にする必要があります。 SQL Server プロジェクトを新しいデータベースに関連付けるたびに (図 5 のように)、接続で SQL/CLR デバッグを有効にするかどうかが Visual Studio から確認されます (図 6 を参照)。 [はい] をクリックします。
図 6: SQL/CLR デバッグを有効にする
この時点で、新しいSQL Server プロジェクトがソリューションに追加されました。 これには、 という名前 Test Scripts
のファイル Test.sql
を含む という名前のフォルダーが含まれています。これは、プロジェクトで作成されたマネージド データベース オブジェクトのデバッグに使用されます。 デバッグについては、手順 12 で見ていきます。
このプロジェクトに新しいマネージド ストアド プロシージャと UDF を追加できるようになりましたが、その前に、ソリューションに既存の Web アプリケーションを含めてみましょう。 [ファイル] メニューの [追加] オプションを選択し、[既存の Web サイト] を選択します。 適切な Web サイト フォルダーを参照し、[OK] をクリックします。 図 7 に示すように、これにより、Web サイトと SQL Server プロジェクトの 2 つのプロジェクトが含まれるようにソリューションがManagedDatabaseConstructs
更新されます。
図 7: ソリューション エクスプローラーには 2 つのプロジェクトが含まれるようになりました
の値はNORTHWNDConnectionString
現在、 フォルダー内のNORTHWND.MDF
ファイルをApp_Data
参照Web.config
しています。 このデータベースを からApp_Data
削除し、SQL Server 2005 Express Edition データベース インスタンスに明示的に登録したので、それに対応して値を更新するNORTHWNDConnectionString
必要があります。 Web サイトでファイルをWeb.config
開き、接続文字列が を読み取るように値を変更NORTHWNDConnectionString
しますData Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=True
。 この変更後、 <connectionStrings>
の Web.config
セクションは次のようになります。
<connectionStrings>
<add name="NORTHWNDConnectionString" connectionString=
"Data Source=localhost\SQLExpress;Initial Catalog=Northwind;
Integrated Security=True;Pooling=false"
providerName="System.Data.SqlClient" />
</connectionStrings>
注意
前のチュートリアルで説明したように、ASP.NET Web サイトなどのクライアント アプリケーションからSQL Server オブジェクトをデバッグする場合は、接続プールを無効にする必要があります。 上記の接続文字列では、接続プール ( Pooling=false
) が無効になります。 ASP.NET Web サイトからマネージド ストアド プロシージャと UDF のデバッグを計画していない場合は、接続プールを有効にします。
手順 3: マネージド ストアド プロシージャを作成する
Northwind データベースにマネージド ストアド プロシージャを追加するには、最初にストアド プロシージャを SQL Server Project のメソッドとして作成する必要があります。 ソリューション エクスプローラーからプロジェクト名をManagedDatabaseConstructs
右クリックし、新しい項目を追加することを選択します。 [新しい項目の追加] ダイアログ ボックスが表示されます。このダイアログ ボックスには、プロジェクトに追加できるマネージド データベース オブジェクトの種類が一覧表示されます。 図 8 に示すように、これにはストアド プロシージャと User-Defined 関数などが含まれます。
まず、廃止されたすべての製品を返すストアド プロシージャを追加します。 新しいストアド プロシージャ ファイルに という名前を付けます GetDiscontinuedProducts.cs
。
図 8: 名前付きの GetDiscontinuedProducts.cs
新しいストアド プロシージャを追加する (フルサイズの画像を表示する をクリックします)
これにより、次の内容を含む新しい C# クラス ファイルが作成されます。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetDiscontinuedProducts()
{
// Put your code here
}
};
ストアド プロシージャは、 という名前StoredProcedures
のクラス ファイル内のstatic
partial
メソッドとして実装されることに注意してください。 さらに、 GetDiscontinuedProducts
メソッドは、 で SqlProcedure attribute
修飾され、メソッドがストアド プロシージャとしてマークされます。
次のコードでは、 オブジェクトをSqlCommand
作成し、フィールドSELECT
CommandText
が 1 の製品Discontinued
のテーブルからすべての列をProducts
返すクエリに 設定します。 次に、コマンドを実行し、結果をクライアント アプリケーションに送信します。 GetDiscontinuedProducts
メソッドにこのコードを追加します。
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE Discontinued = 1";
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
すべてのマネージド データベース オブジェクトは、呼び出し元のコンテキストをSqlContext
表す オブジェクトにアクセスできます。 はSqlContext
、そのPipe
プロパティをSqlPipe
介して オブジェクトにアクセスします。 このSqlPipe
オブジェクトは、SQL Server データベースと呼び出し元アプリケーションの間で情報を渡すために使用されます。 その名前が示すように、 メソッドはExecuteAndSend
渡されたSqlCommand
オブジェクトを実行し、結果をクライアント アプリケーションに返します。
注意
マネージド データベース オブジェクトは、セット ベースのロジックではなく手続き型ロジックを使用するストアド プロシージャと UDF に最適です。 手続き型ロジックには、行ごとにデータのセットを操作するか、スカラー データを操作する必要があります。 ただし、先ほど作成したメソッドには GetDiscontinuedProducts
、手続き型ロジックは必要ありません。 そのため、T-SQL ストアド プロシージャとして実装するのが理想的です。 マネージド ストアド プロシージャの作成と展開に必要な手順を示すために、マネージド ストアド プロシージャとして実装されます。
手順 4: マネージド ストアド プロシージャをデプロイする
このコードが完了したら、Northwind データベースにデプロイする準備ができました。 SQL Server Project を配置すると、コードがアセンブリにコンパイルされ、アセンブリがデータベースに登録され、対応するオブジェクトがデータベースに作成され、アセンブリ内の適切なメソッドにリンクされます。 [デプロイ] オプションによって実行されるタスクの正確なセットは、手順 13 で詳しく示されています。 ソリューション エクスプローラーでManagedDatabaseConstructs
プロジェクト名を右クリックし、[配置] オプションを選択します。 ただし、デプロイは次のエラーで失敗します。'EXTERNAL' の近くの構文が正しくありません。 現在のデータベースの互換性レベルを高い値に設定し、この機能を有効にする必要があります。 ストアド プロシージャ sp_dbcmptlevel
のヘルプを参照してください。
このエラー メッセージは、アセンブリを Northwind データベースに登録しようとしたときに発生します。 SQL Server 2005 データベースにアセンブリを登録するには、データベースの互換性レベルを 90 に設定する必要があります。 既定では、新しいSQL Server 2005 データベースの互換性レベルは 90 です。 ただし、Microsoft SQL Server 2000 を使用して作成されたデータベースの既定の互換性レベルは 80 です。 Northwind データベースは最初は Microsoft SQL Server 2000 データベースであるため、その互換性レベルは現在 80 に設定されているため、マネージド データベース オブジェクトを登録するには 90 に増やす必要があります。
データベースの互換性レベルを更新するには、Management Studio で [新しいクエリ] ウィンドウを開き、次のように入力します。
exec sp_dbcmptlevel 'Northwind', 90
ツール バーの [実行] アイコンをクリックして、上記のクエリを実行します。
図 9: Northwind データベースの互換性レベルを更新する (フルサイズの画像を表示する をクリックします)
互換性レベルを更新した後、SQL Server Project を再デプロイします。 今回は、エラーなしでデプロイを完了する必要があります。
SQL Server Management Studioに戻り、オブジェクト エクスプローラーで Northwind データベースを右クリックし、[更新] を選択します。 次に、[プログラミング] フォルダーにドリルダウンし、[アセンブリ] フォルダーを展開します。 図 10 に示すように、Northwind データベースにプロジェクトによって生成されたアセンブリが ManagedDatabaseConstructs
含まれるようになりました。
図 10: アセンブリが ManagedDatabaseConstructs
Northwind データベースに登録されました
[ストアド プロシージャ] フォルダーも展開します。 そこに という名前 GetDiscontinuedProducts
のストアド プロシージャが表示されます。 このストアド プロシージャは、配置プロセスによって作成され、アセンブリ内の GetDiscontinuedProducts
メソッドを ManagedDatabaseConstructs
指します。 ストアド プロシージャが GetDiscontinuedProducts
実行されると、 メソッドが GetDiscontinuedProducts
実行されます。 これはマネージド ストアド プロシージャであるため、Management Studio では編集できません (したがって、ストアド プロシージャ名の横にあるロック アイコン)。
図 11: ストアド プロシージャが GetDiscontinuedProducts
ストアド プロシージャ フォルダーに一覧表示されている
マネージド ストアド プロシージャを呼び出す前に克服しなければならないハードルがもう 1 つあります。データベースはマネージド コードの実行を防ぐよう構成されています。 これを確認するには、新しいクエリ ウィンドウを開き、ストアド プロシージャを GetDiscontinuedProducts
実行します。 次のエラー メッセージが表示されます。.NET Frameworkでのユーザー コードの実行が無効になっています。 'clr enabled 構成オプションを有効にします。
Northwind データベースの構成情報を調べるには、クエリ ウィンドウで コマンド exec sp_configure
を入力して実行します。 これは、clr が有効な設定が現在 0 に設定されていることを示しています。
図 12: clr が有効な設定は現在 0 に設定されています (フルサイズの画像を表示する をクリックします)
図 12 の各構成設定には、最小値と最大値、構成値と実行値の 4 つの値が一覧表示されていることに注意してください。 clr enabled 設定の構成値を更新するには、次のコマンドを実行します。
exec sp_configure 'clr enabled', 1
を再実行 exec sp_configure
すると、上記のステートメントで clr enabled 設定の構成値が 1 に更新されましたが、実行値は 0 に設定されていることがわかります。 この構成変更が影響を受けるためには、 コマンドをRECONFIGURE
実行する必要があります。これにより、実行値が現在の構成値に設定されます。 クエリ ウィンドウに「」と入力 RECONFIGURE
し、ツール バーの [実行] アイコンをクリックするだけです。 ここでを実行 exec sp_configure
すると、clr 対応の設定の構成と実行の値に 1 の値が表示されます。
clr 対応の構成が完了したら、マネージド GetDiscontinuedProducts
ストアド プロシージャを実行する準備ができました。 クエリ ウィンドウで、コマンド を入力して実行します exec
GetDiscontinuedProducts
。 ストアド プロシージャを呼び出すと、 メソッド内の対応するマネージド コードが GetDiscontinuedProducts
実行されます。 このコードは、SELECT
廃止されたすべての製品を返すクエリを発行し、このデータを呼び出し元のアプリケーションに返します。このアプリケーションは、このインスタンスでSQL Server Management Studio。 Management Studio は、これらの結果を受け取り、[結果] ウィンドウに表示します。
図 13: ストアド プロシージャは GetDiscontinuedProducts
、廃止されたすべての製品を返します (フルサイズの画像を表示する をクリックします)
手順 5: 入力パラメーターを受け入れるマネージド ストアド プロシージャを作成する
これらのチュートリアル全体で作成したクエリとストアド プロシージャの多くは 、パラメーターを使用しています。 たとえば、Typed DataSet s TableAdapters の新しいストアド プロシージャの作成に関するチュートリアルでは、 という@CategoryID
名前の入力パラメーターを受け入れる という名前GetProductsByCategoryID
のストアド プロシージャを作成しました。 その後、ストアド プロシージャは、フィールドが CategoryID
指定されたパラメーターの値と一致するすべての製品を返しました @CategoryID
。
入力パラメーターを受け取るマネージド ストアド プロシージャを作成するには、メソッドの定義でこれらのパラメーターを指定するだけです。 これを説明するために、 という名前GetProductsWithPriceLessThan
のプロジェクトに別のマネージド ストアド プロシージャをManagedDatabaseConstructs
追加してみましょう。 このマネージド ストアド プロシージャは、価格を指定する入力パラメーターを受け取り、フィールドがパラメーターの値より小さいすべての製品 UnitPrice
を返します。
新しいストアド プロシージャをプロジェクトに追加するには、プロジェクト名を ManagedDatabaseConstructs
右クリックし、新しいストアド プロシージャを追加することを選択します。 そのファイルに GetProductsWithPriceLessThan.cs
という名前を付けます。 手順 3 で説明したように、 という名前GetProductsWithPriceLessThan
のメソッドが クラス 内に配置された新しい C# クラス StoredProcedures
ファイルがpartial
作成されます。
メソッドの定義をGetProductsWithPriceLessThan
更新して、 という名前price
の入力パラメーターをSqlMoney
受け取り、実行するコードを記述し、クエリ結果を返すようにします。
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceLessThan(SqlMoney price)
{
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE UnitPrice < @MaxPrice";
myCommand.Parameters.AddWithValue("@MaxPrice", price);
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
}
メソッドの定義とコードは GetProductsWithPriceLessThan
、手順 3 で作成した GetDiscontinuedProducts
メソッドの定義とコードによく似ています。 唯一の違いは、メソッドがGetProductsWithPriceLessThan
入力パラメーター (price
) SqlCommand
として受け取り、s クエリにパラメーター (@MaxPrice
) が含まれており、パラメーターが のParameters
コレクションにSqlCommand
追加され、変数のprice
値が割り当てられる点です。
このコードを追加した後、SQL Server Project を再デプロイします。 次に、SQL Server Management Studioに戻り、ストアド プロシージャ フォルダーを更新します。 新しいエントリ GetProductsWithPriceLessThan
が表示されます。 図 14 に示すように、クエリ ウィンドウで コマンド exec GetProductsWithPriceLessThan 25
を入力して実行します。これにより、25 ドル未満のすべての製品が一覧表示されます。
図 14: $25 以下の製品が表示されます (クリックするとフルサイズの画像が表示されます)
手順 6: データ アクセス層からマネージド ストアド プロシージャを呼び出す
この時点で、 および GetProductsWithPriceLessThan
マネージド ストアド プロシージャをプロジェクトにManagedDatabaseConstructs
追加GetDiscontinuedProducts
し、Northwind SQL Server データベースに登録しました。 また、SQL Server Management Studioからこれらのマネージド ストアド プロシージャを呼び出しました (図 13 と 14 を参照)。 ただし、ASP.NET アプリケーションでこれらのマネージド ストアド プロシージャを使用するには、アーキテクチャの Data Access と Business Logic Layer に追加する必要があります。 この手順では、型指定された DataSet の に 2 つの新しいメソッドをProductsTableAdapter
追加します。これは、最初は、Typed DataSet の TableAdapters の新しいストアド プロシージャの作成に関するチュートリアルで作成されました。NorthwindWithSprocs
手順 7 では、対応するメソッドを BLL に追加します。
NorthwindWithSprocs
Visual Studio で型指定された DataSet を開き、まず、 という名前GetDiscontinuedProducts
の に新しいメソッドをProductsTableAdapter
追加します。 TableAdapter に新しいメソッドを追加するには、Designerで TableAdapter の名前を右クリックし、コンテキスト メニューから [クエリの追加] オプションを選択します。
注意
Northwind データベースをフォルダーから App_Data
SQL Server 2005 Express Edition データベース インスタンスに移動したので、この変更を反映するために、 内の対応する接続文字列 Web.config 更新する必要があります。 手順 2 では、 のWeb.config
値のNORTHWNDConnectionString
更新について説明しました。 この更新を忘れた場合は、クエリを追加できませんでしたというエラー メッセージが表示されます。 TableAdapter に新しいメソッドを追加しようとすると、ダイアログ ボックスでオブジェクトWeb.config
の接続NORTHWNDConnectionString
が見つかりません。 このエラーを解決するには、[OK] をクリックし、手順 2 で説明されているように に Web.config
移動して値を更新 NORTHWNDConnectionString
します。 次に、 メソッドを TableAdapter に再追加してみてください。 今回はエラーなしで動作するはずです。
新しいメソッドを追加すると、TableAdapter クエリ構成ウィザードが起動します。このウィザードは、過去のチュートリアルで何度も使用しました。 最初の手順では、アドホック SQL ステートメントまたは新規または既存のストアド プロシージャを使用して、TableAdapter がデータベースにアクセスする方法を指定するように求められます。 既にマネージド ストアド プロシージャを GetDiscontinuedProducts
作成してデータベースに登録しているため、[既存のストアド プロシージャを使用する] オプションを選択し、[次へ] をクリックします。
図 15: [既存のストアド プロシージャを使用する] オプションを選択します (クリックするとフルサイズの画像が表示されます)
次の画面では、メソッドが呼び出すストアド プロシージャの入力を求められます。 GetDiscontinuedProducts
ドロップダウン リストからマネージド ストアド プロシージャを選択し、[次へ] をクリックします。
図 16: マネージド ストアド プロシージャを GetDiscontinuedProducts
選択します (クリックするとフルサイズのイメージが表示されます)
次に、ストアド プロシージャが行、1 つの値、または何も返すかどうかを指定するように求められます。 廃止された製品行のセットを返すの GetDiscontinuedProducts
で、最初のオプション (表形式データ) を選択し、[次へ] をクリックします。
図 17: 表形式データ オプションを選択します (クリックするとフルサイズの画像が表示されます)
最後のウィザード画面では、使用するデータ アクセス パターンと、結果のメソッドの名前を指定できます。 両方のチェックボックスをオンのままにし、メソッドに と という名前を FillByDiscontinued
付 GetDiscontinuedProducts
けます。 [完了] をクリックしてウィザードを終了します。
図 18: メソッドに名前を付け FillByDiscontinued
、 GetDiscontinuedProducts
(クリックするとフルサイズの画像が表示されます)
これらの手順を繰り返して、マネージド ストアド プロシージャの と という名前FillByPriceLessThan
GetProductsWithPriceLessThan
のProductsTableAdapter
メソッドを GetProductsWithPriceLessThan
作成します。
図 19 は、 および GetProductsWithPriceLessThan
マネージド ストアド プロシージャの にメソッドProductsTableAdapter
を追加した後の DataSet DesignerのGetDiscontinuedProducts
スクリーンショットを示しています。
図 19: ProductsTableAdapter
この手順で追加された新しいメソッドを含む (フルサイズの画像を表示する をクリックします)
手順 7: 対応するメソッドをビジネス ロジック レイヤーに追加する
手順 4 と 5 で追加されたマネージド ストアド プロシージャを呼び出すためのメソッドを含むようにデータ アクセス層を更新したので、対応するメソッドをビジネス ロジックレイヤーに追加する必要があります。 クラスに次の 2 つのメソッドを ProductsBLLWithSprocs
追加します。
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetDiscontinuedProducts()
{
return Adapter.GetDiscontinuedProducts();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable
GetProductsWithPriceLessThan(decimal priceLessThan)
{
return Adapter.GetProductsWithPriceLessThan(priceLessThan);
}
どちらのメソッドも、対応する DAL メソッドを呼び出してインスタンスを ProductsDataTable
返すだけです。 DataObjectMethodAttribute
各メソッドの上にあるマークアップにより、ObjectDataSource s データ ソースの構成ウィザードの [SELECT] タブのドロップダウン リストにこれらのメソッドが含まれます。
手順 8: プレゼンテーション レイヤーからマネージド ストアド プロシージャを呼び出す
ビジネス ロジックとデータ アクセスレイヤーが拡張され、ストアド プロシージャとマネージド ストアド プロシージャの呼び出しGetDiscontinuedProducts
GetProductsWithPriceLessThan
のサポートが含まれるようになったため、これらのストアド プロシージャの結果を ASP.NET ページで表示できるようになりました。
フォルダー内のManagedFunctionsAndSprocs.aspx
ページをAdvancedDAL
開き、[ツールボックス] から GridView をDesignerにドラッグします。 GridView の ID
プロパティを に DiscontinuedProducts
設定し、そのスマート タグから という名前 DiscontinuedProductsDataSource
の新しい ObjectDataSource にバインドします。 ObjectDataSource を構成して、クラスの GetDiscontinuedProducts
メソッドからデータをProductsBLLWithSprocs
プルします。
図 20: クラスを使用するように ObjectDataSource を構成する ProductsBLLWithSprocs
(クリックするとフルサイズの画像が表示されます)
図 21: SELECT タブの Drop-Down リストからメソッドを選択 GetDiscontinuedProducts
する (フルサイズの画像を表示する をクリックします)
このグリッドは製品情報の表示のみに使用されるため、UPDATE、INSERT、DELETE タブのドロップダウン リストを (なし) に設定し、[完了] をクリックします。
ウィザードが完了すると、Visual Studio によって、 の各データ フィールドに対して BoundField または CheckBoxField が自動的に ProductsDataTable
追加されます。 と Discontinued
を除くProductName
これらのフィールドをすべて削除します。この時点で、GridView と ObjectDataSource の宣言型マークアップは次のようになります。
<asp:GridView ID="DiscontinuedProducts" runat="server"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="DiscontinuedProductsDataSource">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:CheckBoxField DataField="Discontinued"
HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="DiscontinuedProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetDiscontinuedProducts" TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>
ブラウザーからこのページを表示するには、少し時間を取ります。 ページにアクセスすると、ObjectDataSource は クラスの メソッドGetDiscontinuedProducts
をProductsBLLWithSprocs
呼び出します。 手順 7 で説明したように、このメソッドは DAL のクラス s ProductsDataTable
GetDiscontinuedProducts
メソッドを呼び出し、ストアド プロシージャを GetDiscontinuedProducts
呼び出します。 このストアド プロシージャはマネージド ストアド プロシージャであり、手順 3 で作成したコードを実行し、廃止された製品を返します。
マネージド ストアド プロシージャによって返される結果は、DAL によって にパッケージ化 ProductsDataTable
され、BLL に返されます。この結果は、GridView にバインドされて表示されるプレゼンテーション レイヤーに返されます。 予想どおり、グリッドには、廃止された製品が一覧表示されます。
図 22: 廃止された製品が一覧表示されます (クリックするとフルサイズの画像が表示されます)
さらに練習するには、TextBox と別の GridView をページに追加します。 この GridView に、クラスの GetProductsWithPriceLessThan
メソッドを呼び出して TextBox に入力した量より小さい製品をProductsBLLWithSprocs
表示させます。
手順 9: T-SQL UDF の作成と呼び出し
User-Defined Functions (UDF) は、プログラミング言語の関数のセマンティクスを厳密に模倣するデータベース オブジェクトです。 C# の関数と同様に、UDF には可変数の入力パラメーターを含め、特定の型の値を返すことができます。 UDF は、スカラー データ (文字列、整数など) または表形式データを返すことができます。 スカラー データ型を返す UDF から始めて、両方の種類の UDF を簡単に見てみましょう。
次の UDF は、特定の製品の在庫の見積もり値を計算します。 これは、3 つの入力パラメーター (特定の製品の UnitPrice
、 UnitsInStock
、および Discontinued
の値) を受け取ることによって行われ、 型 money
の値が返されます。 インベントリの見積もり値を計算します。これには、 と を UnitPrice
乗算します UnitsInStock
。 廃止されたアイテムの場合、この値は半分になります。
CREATE FUNCTION udf_ComputeInventoryValue
(
@UnitPrice money,
@UnitsInStock smallint,
@Discontinued bit
)
RETURNS money
AS
BEGIN
DECLARE @Value decimal
SET @Value = ISNULL(@UnitPrice, 0) * ISNULL(@UnitsInStock, 0)
IF @Discontinued = 1
SET @Value = @Value * 0.5
RETURN @Value
END
この UDF がデータベースに追加されると、 [プログラミング] フォルダー、次に [関数] 、 [スカラー値関数] の順に展開することで、Management Studio から見つけることができます。 これは、次のようなクエリで SELECT
使用できます。
SELECT ProductID, ProductName, dbo.udf_ComputeInventoryValue
(UnitPrice, UnitsInStock, Discontinued) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC
UDF を udf_ComputeInventoryValue
Northwind データベースに追加しました。図 23 は、Management Studio で表示した場合の上記 SELECT
のクエリの出力を示しています。 また、UDF は、オブジェクト エクスプローラーの [スカラー値関数] フォルダーの下に表示されることにも注意してください。
図 23: 各製品の在庫値が一覧表示されます (クリックするとフルサイズの画像が表示されます)
UDF は表形式のデータを返すこともできます。 たとえば、特定のカテゴリに属する製品を返す UDF を作成できます。
CREATE FUNCTION dbo.udf_GetProductsByCategoryID
(
@CategoryID int
)
RETURNS TABLE
AS
RETURN
(
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID
)
UDF は udf_GetProductsByCategoryID
入力パラメーターを @CategoryID
受け取り、指定された SELECT
クエリの結果を返します。 作成した UDF は、クエリの FROM
(または JOIN
) 句 SELECT
で参照できます。 次の例では、各飲料の ProductID
、 ProductName
、および CategoryID
の値を返します。
SELECT ProductID, ProductName, CategoryID
FROM dbo.udf_GetProductsByCategoryID(1)
UDF を udf_GetProductsByCategoryID
Northwind データベースに追加しました。図 24 は、Management Studio で表示した場合の上記 SELECT
のクエリの出力を示しています。 表形式のデータを返す UDF は、オブジェクト エクスプローラーの Table-value Functions フォルダーにあります。
図 24: ProductID
各飲料の 、 ProductName
、および CategoryID
が一覧表示されている (フルサイズの画像を表示する をクリックします)
注意
UDF の作成と使用の詳細については、「User-Defined 関数の概要」をチェック。 また、User-Defined 関数の利点と欠点もチェックします。
手順 10: マネージド UDF の作成
上記の udf_ComputeInventoryValue
例で作成した UDF と udf_GetProductsByCategoryID
UDF は T-SQL データベース オブジェクトです。 SQL Server 2005 ではマネージド UDF もサポートされています。これは、手順 3 と 5 のマネージド ストアド プロシージャと同様にプロジェクトに追加ManagedDatabaseConstructs
できます。 この手順では、マネージド コードに UDF を udf_ComputeInventoryValue
実装してみましょう。
マネージド UDF をプロジェクトにManagedDatabaseConstructs
追加するには、ソリューション エクスプローラーのプロジェクト名を右クリックし、[新しい項目の追加] を選択します。 [新しい項目の追加] ダイアログ ボックスから [User-Defined テンプレート] を選択し、新しい UDF ファイルに という名前を付けます udf_ComputeInventoryValue_Managed.cs
。
図 25: 新しいマネージド UDF をプロジェクトに ManagedDatabaseConstructs
追加する (クリックするとフルサイズの画像が表示されます)
User-Defined 関数テンプレートは、クラス ファイルの名前 (udf_ComputeInventoryValue_Managed
このインスタンスでは) と同じ名前の メソッドを持つ という名前UserDefinedFunctions
のクラスを作成partial
します。 このメソッドは、 属性をSqlFunction
使用して装飾されます。この属性は、メソッドにマネージド UDF としてフラグを設定します。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString udf_ComputeInventoryValue_Managed()
{
// Put your code here
return new SqlString("Hello");
}
};
メソッドはudf_ComputeInventoryValue
現在、 オブジェクトをSqlString
返し、入力パラメーターを受け入れていません。 メソッド定義を更新して、3 つの入力パラメーター UnitPrice
(、 UnitsInStock
、および Discontinued
) を受け入れ、オブジェクトを SqlMoney
返すようにする必要があります。 インベントリ値を計算するためのロジックは、T-SQL udf_ComputeInventoryValue
UDF のロジックと同じです。
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlMoney udf_ComputeInventoryValue_Managed
(SqlMoney UnitPrice, SqlInt16 UnitsInStock, SqlBoolean Discontinued)
{
SqlMoney inventoryValue = 0;
if (!UnitPrice.IsNull && !UnitsInStock.IsNull)
{
inventoryValue = UnitPrice * UnitsInStock;
if (Discontinued == true)
inventoryValue = inventoryValue * new SqlMoney(0.5);
}
return inventoryValue;
}
UDF メソッドの入力パラメーターは、対応する SQL 型SqlMoney
であることに注意してください。フィールドの場合UnitPrice
は 、、 SqlBoolean
SqlInt16
UnitsInStock
のDiscontinued
場合は です。 これらのデータ型は、テーブルUnitPrice
で定義されている型をProducts
反映しています。列は 型、UnitsInStock
型money
のsmallint
列、および 型bit
のDiscontinued
列です。
このコードは、値 0 が割り当てられた という名前inventoryValue
のインスタンスを作成SqlMoney
することから始まります。 テーブルではProducts
、 列と UnitsInStock
列のデータベースNULL
値をUnitsInPrice
使用できます。 したがって、最初にチェックして、これらの値に が含まれているNULL
かどうかを確認する必要があります。これは、オブジェクトの IsNull
プロパティをSqlMoney
介して行います。 と のUnitsInStock
両方UnitPrice
に非NULL
値が含まれている場合は、 を 2 つの積として計算inventoryValue
します。 次に、 が true の場合 Discontinued
は、値を半分にします。
注意
オブジェクトは SqlMoney
、2 つの SqlMoney
インスタンスを乗算することのみを許可します。 インスタンスに SqlMoney
リテラル浮動小数点数を乗算することはできません。 したがって、半分 inventoryValue
に値 0.5 を持つ新しい SqlMoney
インスタンスを乗算します。
手順 11: マネージド UDF のデプロイ
マネージド UDF が作成されたので、Northwind データベースにデプロイする準備ができました。 手順 4 で説明したように、SQL Server プロジェクトのマネージド オブジェクトは、ソリューション エクスプローラーのプロジェクト名を右クリックし、コンテキスト メニューから [配置] オプションを選択して配置されます。
プロジェクトを配置したら、SQL Server Management Studioに戻り、スカラー値 Functions フォルダーを更新します。 これで、次の 2 つのエントリが表示されます。
dbo.udf_ComputeInventoryValue
- 手順 9 で作成された T-SQL UDF とdbo.udf ComputeInventoryValue_Managed
- デプロイしたばかりの手順 10 で作成されたマネージド UDF。
このマネージド UDF をテストするには、Management Studio 内から次のクエリを実行します。
SELECT ProductID, ProductName,
dbo.udf_ComputeInventoryValue_Managed(
UnitPrice,
UnitsInStock,
Discontinued
) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC
このコマンドでは、T-SQL udf_ComputeInventoryValue
UDF の代わりにマネージド udf ComputeInventoryValue_Managed
UDF を使用しますが、出力は同じです。 図 23 を参照して、UDF の出力のスクリーンショットを確認してください。
手順 12: マネージド データベース オブジェクトのデバッグ
「ストアド プロシージャのデバッグ」チュートリアルでは、Visual Studio を使用してSQL Serverデバッグするための 3 つのオプションについて説明しました。Direct Database Debugging、Application Debugging、Debugging from a SQL Server Project。 マネージド データベース オブジェクトは、ダイレクト データベース デバッグを使用してデバッグすることはできませんが、クライアント アプリケーションから直接、SQL Server Project からデバッグできます。 ただし、デバッグを機能させるには、SQL Server 2005 データベースで SQL/CLR デバッグを許可する必要があります。 Visual Studio プロジェクトを ManagedDatabaseConstructs
初めて作成したときに、SQL/CLR デバッグを有効にするかどうかを確認したことを思い出してください (手順 2 の図 6 を参照)。 この設定は、[サーバー エクスプローラー] ウィンドウからデータベースを右クリックすることで変更できます。
図 26: データベースで SQL/CLR デバッグが許可されていることを確認する
マネージド ストアド プロシージャをデバッグ GetProductsWithPriceLessThan
したいとします。 まず、 メソッドのコード内にブレークポイントを GetProductsWithPriceLessThan
設定します。
図 27: メソッドでブレークポイントを設定する GetProductsWithPriceLessThan
(クリックするとフルサイズの画像が表示されます)
まず、SQL Server Project からマネージド データベース オブジェクトをデバッグする方法を見てみましょう。 ソリューションには、SQL Server プロジェクトと Web サイトの 2 つのプロジェクトManagedDatabaseConstructs
が含まれているので、SQL Server プロジェクトからデバッグするには、デバッグを開始するときにSQL Server プロジェクトを起動ManagedDatabaseConstructs
するように Visual Studio に指示する必要があります。 ソリューション エクスプローラーでプロジェクトをManagedDatabaseConstructs
右クリックし、コンテキスト メニューから [スタートアップ プロジェクトとして設定] オプションを選択します。
プロジェクトが ManagedDatabaseConstructs
デバッガーから起動されると、 フォルダーにあるファイル内の Test.sql
SQL ステートメントが Test Scripts
実行されます。 たとえば、マネージド ストアド プロシージャをGetProductsWithPriceLessThan
テストするには、既存Test.sql
のファイルコンテンツを次のステートメントに置き換えます。このステートメントでは、14.95 の値を渡すマネージド ストアド プロシージャが@CategoryID
呼び出GetProductsWithPriceLessThan
されます。
exec GetProductsWithPriceLessThan 14.95
に上記のスクリプト Test.sql
を入力したら、[デバッグ] メニューに移動して [デバッグの開始] を選択するか、ツールバーの F5 または緑色の再生アイコンを押してデバッグを開始します。 これにより、ソリューション内にプロジェクトがビルドされ、マネージド データベース オブジェクトが Northwind データベースにデプロイされ、スクリプトが実行されます Test.sql
。 この時点でブレークポイントがヒットし、 メソッドを GetProductsWithPriceLessThan
ステップ実行したり、入力パラメーターの値を調べたりすることができます。
図 28: メソッドのブレークポイントが GetProductsWithPriceLessThan
ヒットしました (フルサイズの画像を表示するをクリックします)
クライアント アプリケーションを使用して SQL データベース オブジェクトをデバッグするには、アプリケーションのデバッグをサポートするようにデータベースを構成する必要があります。 [サーバー エクスプローラー] でデータベースを右クリックし、[アプリケーション デバッグ] オプションがオンになっていることを確認します。 さらに、SQL デバッガーと統合し、接続プールを無効にするように、ASP.NET アプリケーションを構成する必要があります。 これらの手順については、「 ストアド プロシージャのデバッグ 」チュートリアルの手順 2 で詳しく説明しました。
ASP.NET アプリケーションとデータベースを構成したら、ASP.NET Web サイトをスタートアップ プロジェクトとして設定し、デバッグを開始します。 ブレークポイントを持つマネージド オブジェクトのいずれかを呼び出すページにアクセスすると、アプリケーションは停止し、図 28 に示すようにコードをステップ実行できるデバッガーに制御が引き継がれます。
手順 13: マネージド データベース オブジェクトの手動コンパイルと配置
SQL Server プロジェクトを使用すると、マネージド データベース オブジェクトを簡単に作成、コンパイル、デプロイできます。 残念ながら、SQL Server プロジェクトは、Visual Studio の Professional および Team Systems エディションでのみ使用できます。 Visual Web Developer または Visual Studio の Standard Edition を使用していて、マネージド データベース オブジェクトを使用する場合は、手動で作成してデプロイする必要があります。 これには、次の 4 つの手順が含まれます。
- マネージド データベース オブジェクトのソース コードを含むファイルを作成します。
- オブジェクトをアセンブリにコンパイルします。
- アセンブリを SQL Server 2005 データベースに登録し、
- アセンブリ内の適切なメソッドを指すデータベース オブジェクトをSQL Serverに作成します。
これらのタスクを説明するために、指定した値より大きい製品 UnitPrice
を返す新しいマネージド ストアド プロシージャを作成しましょう。 コンピューターに という名前 GetProductsWithPriceGreaterThan.cs
の新しいファイルを作成し、ファイルに次のコードを入力します (これを行うには、Visual Studio、メモ帳、または任意のテキスト エディターを使用できます)。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceGreaterThan(SqlMoney price)
{
// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText =
@"SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued
FROM Products
WHERE UnitPrice > @MinPrice";
myCommand.Parameters.AddWithValue("@MinPrice", price);
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);
}
};
このコードは、手順 5 で作成した GetProductsWithPriceLessThan
メソッドとほぼ同じです。 唯一の違いは、 WHERE
クエリで使用されるメソッド名、句、およびパラメーター名です。 メソッドにGetProductsWithPriceLessThan
戻ると、 句がWHERE
読み取られます。 WHERE UnitPrice < @MaxPrice
ここでは、 で GetProductsWithPriceGreaterThan
を使用します。 WHERE UnitPrice > @MinPrice
次に、このクラスをアセンブリにコンパイルする必要があります。 コマンド ラインから、ファイルを保存 GetProductsWithPriceGreaterThan.cs
したディレクトリに移動し、C# コンパイラ (csc.exe
) を使用してクラス ファイルをアセンブリにコンパイルします。
csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
を含む csc.exe
フォルダーが システム内 PATH
にない場合は、次のように、 %WINDOWS%\Microsoft.NET\Framework\version\
そのパスを完全に参照する必要があります。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs
図 29: アセンブリにコンパイル GetProductsWithPriceGreaterThan.cs
する (クリックするとフルサイズの画像が表示されます)
フラグは /t
、C# クラス ファイルを (実行可能ファイルではなく) DLL にコンパイルすることを指定します。 フラグは /out
、結果のアセンブリの名前を指定します。
注意
コマンド ラインからクラス ファイルを GetProductsWithPriceGreaterThan.cs
コンパイルするのではなく、 Visual C# Express Edition を使用するか、Visual Studio Standard Edition で別のクラス ライブラリ プロジェクトを作成することもできます。 S ren Jacob Lauritsen は、このような Visual C# Express Edition プロジェクトにストアド プロシージャの GetProductsWithPriceGreaterThan
コードと、手順 3、5、10 で作成された 2 つのマネージド ストアド プロシージャと UDF を提供しました。 S ren s プロジェクトには、対応するデータベース オブジェクトを追加するために必要な T-SQL コマンドも含まれています。
コードをアセンブリにコンパイルすると、SQL Server 2005 データベース内にアセンブリを登録する準備が整いました。 これは、T-SQL、コマンドCREATE ASSEMBLY
、またはSQL Server Management Studioを使用して実行できます。 Management Studio の使用に焦点を当ててみましょう。
Management Studio から、Northwind データベースの [プログラミング] フォルダーを展開します。 サブフォルダーの 1 つがアセンブリです。 新しいアセンブリをデータベースに手動で追加するには、[アセンブリ] フォルダーを右クリックし、コンテキスト メニューから [新しいアセンブリ] を選択します。 [新しいアセンブリ] ダイアログ ボックスが表示されます (図 30 を参照)。 [参照] ボタンをクリックし、コンパイルしたアセンブリを ManuallyCreatedDBObjects.dll
選択し、[OK] をクリックしてアセンブリをデータベースに追加します。 オブジェクト エクスプローラーにManuallyCreatedDBObjects.dll
アセンブリが表示されません。
図 30: アセンブリを ManuallyCreatedDBObjects.dll
データベースに追加する (クリックするとフルサイズの画像が表示されます)
図 31: ManuallyCreatedDBObjects.dll
がオブジェクト エクスプローラーに一覧表示されている
アセンブリを Northwind データベースに追加していますが、ストアド プロシージャをアセンブリ内の GetProductsWithPriceGreaterThan
メソッドに関連付ける必要はまだありません。 これを行うには、新しいクエリ ウィンドウを開き、次のスクリプトを実行します。
CREATE PROCEDURE [dbo].[GetProductsWithPriceGreaterThan]
(
@price money
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [ManuallyCreatedDBObjects].[StoredProcedures].[GetProductsWithPriceGreaterThan]
GO
これにより、 という名前GetProductsWithPriceGreaterThan
の新しいストアド プロシージャが Northwind データベースに作成され、それをマネージド メソッド GetProductsWithPriceGreaterThan
(アセンブリManuallyCreatedDBObjects
内の クラス StoredProcedures
内にあります) に関連付けられます。
上記のスクリプトを実行した後、オブジェクト エクスプローラーのストアド プロシージャ フォルダーを更新します。 新しいストアド プロシージャ エントリが表示されます。このエントリ GetProductsWithPriceGreaterThan
の横にロック アイコンが表示されます。 このストアド プロシージャをテストするには、クエリ ウィンドウで次のスクリプトを入力して実行します。
exec GetProductsWithPriceGreaterThan 24.95
図 32 に示すように、上記のコマンドでは、$24.95 を超える製品 UnitPrice
の情報が表示されます。
図 32: ManuallyCreatedDBObjects.dll
が オブジェクト エクスプローラーに一覧表示されます (フルサイズの画像を表示する をクリックします)
まとめ
Microsoft SQL Server 2005 では、共通言語ランタイム (CLR) と統合されています。これにより、マネージド コードを使用してデータベース オブジェクトを作成できます。 以前は、これらのデータベース オブジェクトは T-SQL を使用してのみ作成できましたが、C# などの .NET プログラミング言語を使用してこれらのオブジェクトを作成できるようになりました。 このチュートリアルでは、2 つのマネージド ストアド プロシージャとマネージド User-Defined 関数を作成しました。
Visual Studio の SQL Server プロジェクトの種類により、マネージド データベース オブジェクトの作成、コンパイル、および配置が容易になります。 さらに、豊富なデバッグサポートを提供します。 ただし、SQL Server プロジェクトの種類は、Visual Studio の Professional および Team Systems エディションでのみ使用できます。 Visual Web Developer または Visual Studio の Standard Edition を使用する場合は、手順 13 で説明したように、作成、コンパイル、配置の手順を手動で実行する必要があります。
幸せなプログラミング!
もっと読む
このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。
- User-Defined 関数の利点と欠点
- マネージド コードでの SQL Server 2005 オブジェクトの作成
- 方法: CLR SQL Server ストアド プロシージャを作成して実行する
- 方法: CLR SQL Server User-Defined 関数を作成して実行する
- 方法: スクリプトを編集して
Test.sql
SQL オブジェクトを実行する - ユーザー定義関数の概要
- マネージド コードとSQL Server 2005 (ビデオ)
- Transact-SQL リファレンス
- チュートリアル: マネージ コードでのストアド プロシージャの作成
著者について
7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。
特別な感謝
このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、S ren Jacob Lauritsen でした。 この記事を確認するだけでなく、S ren は、マネージド データベース オブジェクトを手動でコンパイルするために、この記事のダウンロードに含まれる Visual C# Express Edition プロジェクトも作成しました。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示