SQL Server 2008 の FILESTREAM データ (ADO.NET)

更新 : November 2007

SQL Server 2008 では、varbinary(max) 列に保存されたバイナリ (BLOB) データの FILESTREAM ストレージ属性が導入されました。これまでにも、SQL Server にはバイナリ データを保存する機能はありましたが、その操作には特別な処理が必要でした。テキスト ドキュメント、イメージ、ビデオなどの非構造化データはデータベース外に保存されることが多く、そのために管理が困難でした。

Cc716724.alert_note(ja-jp,VS.90).gifメモ :

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 ドキュメントと関連項目へのリンクを示します。

FILESTREAM の概要

FILESTREAM ストレージを使用するタイミング、および SQL Server データベース エンジンと NTFS ファイル システムを統合する方法について説明します。

FILESTREAM ストレージの概要

FILESTREAM を SQL Server のインスタンス上で有効にする方法、データベースと FILESTREAM データを格納するテーブルの作成方法、および FILESTREAM データを含んでいる行の操作方法について説明します。

クライアント アプリケーションでの FILESTREAM ストレージの使用

FILESTREAM データを操作するための Win32 API 関数について説明します。

FILESTREAM と SQL Server のその他の機能

FILESTREAM データを SQL Server の他の機能と共に使用する際の注意事項、ガイドライン、および制限事項について説明します。

参照

概念

コード アクセス セキュリティと ADO.NET

その他の技術情報

SQL Server データ型と ADO.NET

ADO.NET でのデータの取得および変更

SQL Server のバイナリ データと大きな値のデータ (ADO.NET)