特集
SQL Server 2005の新機能「SQL CLR」(前編)

SQL Serverプログラミングを革新するSQL CLRとは?

中 博俊(Microsoft MVP 2005 - Visual C#)
2005/03/09
Page1 Page2 Page3

 マイクロソフトが提供するデータベース・サーバ「Microsoft SQL Server」(以降、SQL Server)の次期バージョンであるSQL Server 2005(開発コード名:Yukon)では、.NET Frameworkの共通言語ランタイム(CLR:Common Language Runtime)がデータベースに統合された「SQL CLR」という新機能が提供される。これにより、SQL Serverは.NETプログラムと緊密に連携できるようになる。

 そこで本稿では、そのSQL CLRが一体どのようなものなのか、またそれによって.NETにおけるデータベース・プログラミングがどのように改善されるのかについて、前編・後編の2回にわたり説明する。

1. 従来のSQLプログラミングについて

 SQL CLRプログラミングについて紹介する前に、従来のSQLプログラミングの手法について簡単に振り返ってみよう。いままで、SQL Serverデータベースを利用する.NETのプログラミング方法には、主に以下のものがあった。

  1. ADO.NETのみ(SQL文の直接実行)
  2. ストアド・プロシージャ利用(ADO.NET経由)
  3. 拡張ストアド・プロシージャ利用(ADO.NET経由)

 「ADO.NET」は.NET Frameworkに搭載されているデータ・アクセス技術である。.NETのSQLプログラミングでは、このADO.NETを利用することが一般的だ(ADO.NETプログラミングについては「ADO.NET基礎講座」が参考になる)。

 ADO.NETでは、まず上記1のようにSQL文(データの追加や取得などのSQL処理を実行するための命令文)を.NETプログラム内に直接、記述することができる。この場合には、SQL Serverは.NETプログラムから送信されたSQL文を実行することによりデータベースを操作し、その結果を.NETプログラムへと返す。

 また、あらかじめSQL Server上に手続き(関数)として記述しておいたSQL文を呼び出して実行する「ストアド・プロシージャ」「拡張ストアド・プロシージャ」という技術がある(技術内容については後述する)。これら2つの「SQL Server側」のSQL処理技術で作成したSQLプログラムは、SQL Server内のプロセスで効率的に実行されるため、その処理がより高速になる。.NETプログラムからこれらのストアド・プロシージャを呼び出すには、通常はADO.NETの機能を利用する。

 従来のSQL Serverプログラミングの主要技術には、以上のような3つがあるが、読者の中にはこれらすべてのSQL技術に精通していない読者もいるだろう。よって本稿では、これらの技術を利用したプログラミングについても、(SQL CLRプログラミングと比較するために)参考程度に紹介しておきたい。

 なお、以下でサンプルとして掲載したソース・コードでは、次のようなデータベース・テーブルの更新処理を行うことを想定している。

Key Value
1 更新前
Key Value
1 更新後
サンプル・コードで実行するデータベースの操作
Keyカラムのデータが「1」のレコードに対して、そのValueカラムのデータを更新する。

●1. ADO.NETプログラミング(SQL文の直接実行)

 ADO.NETのみを利用してこのテーブル更新処理を行うには、以下のようなコードを記述すればよい(データベースへの接続部分のコードなどは割愛した)。

com.CommandText = "UPDATE [table1] set [value]=@value where [key]=@key";
com.Parameters.Add("@value", SqlDbType.NVarChar, 100);
com.Parameters.Add("@key", SqlDbType.Int );
com.Parameters["@value"].Value = "更新後";
com.Parameters["@key"].Value = 1;
com.ExecuteNonQuery();
データベースのテーブル・データを更新するADO.NETのサンプル・コード(C#)
「com」は.NETデータ・プロバイダ(実際にデータベースに対してSQL文を発行したりするクラス群)のSqlCommandオブジェクト(System.Data.SqlClient名前空間)である。
 
com.CommandText = "UPDATE [table1] set [value]=@value where [key]=@key"
com.Parameters.Add("@value", SqlDbType.NVarChar, 100)
com.Parameters.Add("@key", SqlDbType.Int)
com.Parameters.Item("@value").Value = "更新後"
com.Parameters.Item("@key").Value = 1
com.ExecuteNonQuery()
データベースのテーブル・データを更新するADO.NETのサンプル・コード(VB.NET)
「com」は.NETデータ・プロバイダ(実際にデータベースに対してSQL文を発行したりするクラス群)のSqlCommandオブジェクト(System.Data.SqlClient名前空間)である。

 このコードでは、SQL文の1つであるUPDATE文を作成し、その中に埋め込んだパラメータ(@valueや@key)にデータを設定してから、ExecuteNonQueryメソッドを呼び出してコマンドを実行する。

●2. ストアド・プロシージャ利用したADO.NETプログラミング

 ストアド・プロシージャとは、マイクロソフト独自のSQL処理言語であるTransact-SQL(以降、T-SQL)を利用してSQL処理の手続き(プロシージャ)を実装したSQLプログラムのことで、このプログラムはSQL Server内に登録(ストアド)しておくことでSQL Serverの外部から呼び出して利用できるようになる。

 今回の例では、実装するストアド・プロシージャは、以下のようなコードになる。

CREATE PROCEDURE [dbo].[updatetable1]
(
  @key int,
  @value nvarchar(100)
)
AS
UPDATE [table1] set [value]=@value where [key]=@key
データベースのデータを更新するストアド・プロシージャのサンプル・コード
[dbo].[updatetable1]プロシージャのパラメータとして、int型の@keyとnvarchar(100)型の@valueを宣言している。それらのパラメータを使って、「UPDATE [table1] set [value]=@value where [key]=@key」というSQL文を実行している。

 このストアド・プロシージャを呼び出すADO.NET側のコードは次のとおりだ。

com.CommandType = CommandType.StoredProcedure;
com.CommandText = "updatetable1";
com.Parameters.Add("@key", SqlDbType.Int );
com.Parameters.Add("@value", SqlDbType.NVarChar, 100);
com.Parameters["@key"].Value = 1;
com.Parameters["@value"].Value = "更新後";
com.ExecuteNonQuery();
ストアド・プロシージャを呼び出すADO.NETのサンプル・コード(C#)
ストアド・プロシージャを呼び出す設定(CommandType.StoredProcedure)を行い、呼び出すプロシージャとして「updatetable1」を設定している。パラメータ経由で変数がセットされ実際のストアド・プロシージャが呼び出される。
 
com.CommandType = CommandType.StoredProcedure
com.CommandText = "updatetable1"
com.Parameters.Add("@key", SqlDbType.Int)
com.Parameters.Add("@value", SqlDbType.NVarChar, 100)
com.Parameters("@key").Value = 1
com.Parameters("@value").Value = "更新後"
com.ExecuteNonQuery()
ストアド・プロシージャを利用するADO.NETのサンプル・コード(VB.NET)
ストアド・プロシージャを呼び出す設定(CommandType.StoredProcedure)を行い、呼び出すプロシージャとして「updatetable1」を設定している。パラメータ経由で変数がセットされ実際のストアド・プロシージャが呼び出される。

●3. 拡張ストアド・プロシージャ利用したプログラミング

 拡張ストアド・プロシージャは、その文字どおり、ストアド・プロシージャが拡張されたものだ。具体的には、前述のストアド・プロシージャではT-SQL言語を使うためSQL専用の処理しか記述できないが、この拡張ストアド・プロシージャではC/C++言語により単体のDLLファイルとして作成できるので、Win32 APIを呼び出すなどのストアド・プロシージャでは実現不可能だった複雑な処理を実装できるという利点がある。

 しかし、拡張ストアド・プロシージャの実装は少し難しい。よって本稿では、この拡張ストアド・プロシージャの詳細な説明は割愛する。これについて詳しく知りたい場合は、MSDNの「拡張ストアド プロシージャの作成」などを参照してほしい。

 ADO.NETでは、ここまでに紹介したSqlCommandクラスを使う方法に加えて、DataAdapterクラスを利用する方法があるので、次のページでそれについて少し説明しておこう。

 

 INDEX
  [特集]SQL Server 2005の新機能「SQL CLR」(前編)
  SQL Serverプログラミングを革新するSQL CLRとは?
   1.従来のSQLプログラミングについて
     2.SQLプログラミングを革新するSQL CLRとは?
     3.SQL CLRの特長とストアド・プロシージャとの使い分け
  [特集]SQL Server 2005の新機能「SQL CLR」(後編)
  Visual Studio 2005でSQL CLRを実装してみる
     1.SQL CLRプログラミングの種類
     2.SQL CLRでHello World!を作成してみる
     3.Visual StudioによるSQL CLRの開発
     4.SQL CLRプログラムの実行
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間