SQL Server 2008 の FILESTREAM データ (ADO.NET)
更新 : November 2007
SQL Server 2008 では、varbinary(max) 列に保存されたバイナリ (BLOB) データの FILESTREAM ストレージ属性が導入されました。これまでにも、SQL Server にはバイナリ データを保存する機能はありましたが、その操作には特別な処理が必要でした。テキスト ドキュメント、イメージ、ビデオなどの非構造化データはデータベース外に保存されることが多く、そのために管理が困難でした。
メモ : |
---|
SqlClient を使用して FILESTREAM データを操作するには、.NET Framework 3.5 SP1 以降をインストールする必要があります。 |
varbinary(max) 列に FILESTREAM 属性を指定すると、SQL Server ではデータはデータベース ファイルではなくローカルの NTFS ファイル システムに保存されます。データは個別に保存されますが、データベースに保存されている varbinary(max) データの操作をサポートする同じ Transact-SQL ステートメントを使用できます。
FILESTREAM の SqlClient サポート
.NET Data Provider for SQL Server (System.Data.SqlClient) は、System.Data.SqlTypes 名前空間に定義された SqlFileStream クラスを使用して FILESTREAM データからの読み取りと FILESTREAM データへの書き込みをサポートします。SqlFileStream は System.IO.Stream クラスを継承しますが、これによってデータのストリームへの読み込みと書き込みを行うためのメソッドを提供します。ストリームからデータを読み取ると、データはストリームからバイトの配列などのデータ構造に転送されます。書き込みを行うと、データはデータ構造からストリームに転送されます。
SQL Server テーブルの作成
次の Transact-SQL ステートメントによって、従業員の名前の付いたテーブルが作成され、データ行が挿入されます。FILESTREAM ストレージを有効にすると、このテーブルを次のようなコード例と共に使用できます。SQL Server 2008 オンライン ブックの関連トピックへのリンクは、このトピックの終わりにあります。
CREATE TABLE employees
(
EmployeeId INT NOT NULL PRIMARY KEY,
Photo VARBINARY(MAX) FILESTREAM NULL,
RowGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID()
)
GO
Insert into employees
Values(1, 0x00, default)
GO
FILESTREAM データの読み取りの例
次のコード フラグメントは、FILESTREAM からのデータの読み取り方法を示しています。コードはファイルへの論理パスを取得し、FileAccess を Read に、FileOptions を SequentialScan に設定します。次に、コードは SqlFileStream からバイトをバッファに読み取ります。バイトはコンソール ウィンドウに書き込まれます。
using (SqlConnection connection = new SqlConnection(
connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("", connection);
SqlTransaction tran = connection.BeginTransaction(
System.Data.IsolationLevel.ReadCommitted);
command.Transaction = tran;
command.CommandText =
"select Top(1) Photo.PathName(), "
+ "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// Get the pointer for the file
string path = reader.GetString(0);
byte[] transactionContext = reader.GetSqlBytes(1).Buffer;
// Create the SqlFileStream
FileStream fileStream = new SqlFileStream(path,
(byte[])reader.GetValue(1),
FileAccess.Read,
FileOptions.SequentialScan, 0);
// Read the contents as bytes and write them to the console
for (long index = 0; index < fileStream.Length; index++)
{
Console.Write(fileStream.ReadByte());
}
fileStream.Close();
}
}
tran.Commit();
}
FILESTREAM データの上書きの例
次のコード フラグメントは、すべての既存のデータを上書きする FILESTREAM へのデータの書き込み方法を示しています。コードはファイルへの論理パスを取得し、SqlFileStream を作成し、FileAccess を Write に、FileOptions を SequentialScan に設定します。1 バイトが SqlFileStream に書き込まれ、ファイルのデータは置換されます。
using (SqlConnection connection = new SqlConnection(
connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("", connection);
command.CommandText = "select Top(1) Photo.PathName(), "
+ "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";
SqlTransaction tran = connection.BeginTransaction(
System.Data.IsolationLevel.ReadCommitted);
command.Transaction = tran;
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// Get the pointer for file
string path = reader.GetString(0);
byte[] transactionContext = reader.GetSqlBytes(1).Buffer;
// Create the SqlFileStream
FileStream fileStream = new SqlFileStream(path,
(byte[])reader.GetValue(1),
FileAccess.Write,
FileOptions.SequentialScan, 0);
// Write a single byte to the file. This will
// replace any data in the file.
fileStream.WriteByte(0x01);
fileStream.Close();
}
}
tran.Commit();
}
FILESTREAM データの挿入の例
次の例は、Seek メソッドを使用してデータをファイルの末尾に追加することによって、データを FILESTREAM に書き込む方法を示しています。コードはファイルへの論理パスを取得し、SqlFileStream を作成し、FileAccess を ReadWrite に、FileOptions を SequentialScan に設定します。コードは Seek メソッドを使用してファイルの末尾をシークし、1 バイトを既存のファイルに追加します。
using (SqlConnection connection = new SqlConnection(
connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("", connection);
command.CommandText = "select Top(1) Photo.PathName(), "
+ "GET_FILESTREAM_TRANSACTION_CONTEXT () from employees";
SqlTransaction tran = connection.BeginTransaction(
System.Data.IsolationLevel.ReadCommitted);
command.Transaction = tran;
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// Get the pointer for file
string path = reader.GetString(0);
byte[] transactionContext = reader.GetSqlBytes(1).Buffer;
FileStream fileStream = new SqlFileStream(path,
(byte[])reader.GetValue(1),
FileAccess.ReadWrite,
FileOptions.SequentialScan, 0);
// Seek to the end of the file
fs.Seek(0, SeekOrigin.End);
// Append a single byte
fileStream.WriteByte(0x01);
fileStream.Close();
}
}
tran.Commit();
}
SQL Server オンライン ブックの関連トピック
FILESTREAM の詳細なドキュメントは、SQL Server 2008 オンライン ブックの次のセクションにあります。
トピック |
説明 |
---|---|
FILESTREAM ドキュメントと関連項目へのリンクを示します。 |
|
FILESTREAM ストレージを使用するタイミング、および SQL Server データベース エンジンと NTFS ファイル システムを統合する方法について説明します。 |
|
FILESTREAM を SQL Server のインスタンス上で有効にする方法、データベースと FILESTREAM データを格納するテーブルの作成方法、および FILESTREAM データを含んでいる行の操作方法について説明します。 |
|
FILESTREAM データを操作するための Win32 API 関数について説明します。 |
|
FILESTREAM データを SQL Server の他の機能と共に使用する際の注意事項、ガイドライン、および制限事項について説明します。 |