はじめに
データは文字列や数値のみとは限りません。SQL Serverのテーブルには、大量のデータを格納する必要が生じます。例えば、文書、Rawファイル、XMLドキュメント、写真などです。SQL Serverには、このような大容量データ用の特殊なデータ型が用意されています。本稿では、SQL Server 2005とADO.NETを用いて、BLOB(バイナリラージオブジェクト)を読み書きする方法について説明します。
LOBの種類
LOB(ラージオブジェクト)には多くの種類があります。LOBは、CLOB(キャラクタラージオブジェクト)とBLOB(バイナリラージオブジェクト)に大きく分類することができます。幸いなことにSQL Serverには、これらの多様なデータを扱うためのさまざまなデータ型が用意されています。表1は、LOBに関連して使用されるSQL Serverのさまざまなデータ型を示したものです。
LOBの種類 | SQL Serverデータ型 | 最大サイズ |
BLOB | varbinary(MAX) Image |
2,147,483,647 - |
CLOB | varchar(MAX) Text |
2,147,483,647 - |
CLOB - Unicode | nvarchar(MAX) NText |
1,073,741,823 - |
XMLデータ | xml | 2,147,483,647 |
Text、NText、Imageの各データ型は、SQL Serverの以前のバージョンで使用されていたものです。これらの代わりに新しいデータ型であるvarchar(MAX)、nvarchar(MAX)、varbinary(MAX)を使用することをお勧めします。
表1から分かるように、大きなバイナリデータを扱うためのデータ型はvarbinary(MAX)です。従って以下では、.NETアプリケーションにおいてvarbinary(MAX)データを使用する方法について説明します。
BLOBをSQL Serverに格納する
バイナリデータにはさまざまな種類のものがあります。Word文書、PDF形式の送り状、写真、製品画像、Rawデータはすべて、BLOBデータの例です。.NETアプリケーションにおいてBLOBを格納するには、次の2つの方法があります。
- BLOBをディスクファイルとして格納する
- BLOBを直接SQL Serverデータベース内に格納する
どちらの方法にも長所と短所があります。上記(1)の方法は、次のような場合に適しています。
- SQL Serverの容量が小さい。
- BLOBデータが第三者によって使用されている。例えば、画像がグラフィックスデザイナーによって作成中である場合など。
- バイナリデータをファイルシステムベースのエディタで操作したい。例えば、Microsoft Office Suiteを用いてWordやExcelファイルを編集する可能性がある場合など。
バイナリデータを物理的なファイルとして格納する方法の最大の欠点は、データベース内でバイナリデータを見失ってしまう可能性が高いという点です。例えば、製品画像のURLを含む列があったとします。アプリケーションをあるサーバーから別のサーバーへと移す場合、製品画像に対する物理的なファイルがきちんとアプリケーションに付随しているかどうかを、手作業で確認する必要が生じます。また、データベースのレコードを削除する際には、物理的な画像ファイルも削除しなければなりません。
BLOBを直接SQL Serverデータベース内に格納する方法には、次のような長所があります。
- BLOBとそれに関連するデータは常に一体であるため、不整合が生じる可能性はない。
- BLOBは、通常のデータ転送プロセスによってあるサーバーから別のサーバーへと移されるため、整合性を保つための手作業は不要である。
- 通常のSQL ServerデータとともにBLOBデータもバックアップされる。
- コンテンツ管理システムやフォトアルバムなどのアプリケーションは、それが使用するBLOBデータに密接に依存している。このようなアプリケーションでは、BLOBが直接データベース内に格納されていれば、非常に都合がよい。
以上より、開発するアプリケーションによって、BLOBデータをSQL Server内に格納するべきかどうかを判断することになります。BLOBをSQL Server内に格納した方が良い最も一般的な例として、CMSシステム、フォトアルバム、スライドショーアプリケーション、ドキュメント管理システムなどがあげられます。
BLOBとADO.NET
BLOBデータは、.NETではバイト配列として表されます。BLOBデータを読み出すには、ADO.NETのSqlDataReaderクラスを使用します。SqlDataReaderクラスを用い、BLOBデータを読み出す方法について、例を示して説明します。
以下では、SQL Serverデータベースに格納された写真を管理するための、簡単なアプリケーションを作成します。この例の全体を通して、Photosという名前のテーブルを持つSQL Serverデータベースが必要となります。表2に、Photosテーブルのスキーマを示します。
列名 | データ型 | 説明 |
PhotoID | int (Identity, Primary Key) | 写真を一意に識別するID |
Title | varchar(255) | 写真のタイトル |
Description | varchar(MAX) | 写真の説明 |
Photo | varbinary(MAX) | バイナリ形式の実際の写真 |
Photo列では、旧式のImageデータ型ではなく、varbinary(MAX)データ型を使用している点に注意してください。