共用方式為


SQL Server 2008 中的 FILESTREAM 資料 (ADO.NET)

SQL Server 2008 針對儲存在 varbinary(max) 資料行中的二進位 (BLOB) 資料導入了 FILESTREAM 儲存體屬性。 雖然 SQL Server 一直都提供儲存二進位資料的功能,但是使用這種資料需要進行特殊處理。 文字文件、影像和視訊等非結構化資料通常會儲存在資料庫外部,因而難以管理。

注意事項注意事項

您必須安裝 .NET Framework 3.5 SP1 (或更新版本) 才能使用 SqlClient 來處理 FILESTREAM 資料。

針對 varbinary(max) 資料行指定 FILESTREAM 屬性會導致 SQL Server 將資料儲存在本機 NTFS 檔案系統上,而非資料庫檔案中。 雖然系統會以不同的方式儲存資料,但是您可以使用支援使用儲存在資料庫中之 varbinary(max) 資料的相同 Transact-SQL 陳述式 (Statement)。

FILESTREAM 的 SqlClient 支援

.NET Data Provider for SQL Server (System.Data.SqlClient) 支援使用 System.Data.SqlTypes 命名空間中定義的 SqlFileStream 類別來讀取和寫入 FILESTREAM 資料。 SqlFileStream 繼承自 System.IO.Stream 類別,可提供讀取和寫入資料流的方法。 讀取資料流會將資料從資料流傳送至資料結構中,例如位元組的陣列。 寫入則會將資料從資料結構傳送至資料流中。

建立 SQL Server 資料表

下列 Transact-SQL 陳述式會建立名為 employees 的資料表並插入一個資料列。 一旦您啟用了 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。 然後,單一位元組會寫入 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 方法來搜尋至檔案的結尾,並將單一位元組附加至現有的檔案。

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 Database Engine 與 NTFS 檔案系統。

FILESTREAM 儲存體使用者入門

描述如何在 SQL Server 執行個體 (Instance) 上啟用 FILESTREAM、如何建立資料庫和資料表來儲存 FILESTREAM 資料,以及如何管理包含 FILESTREAM 資料的資料列。

在用戶端應用程式中使用 FILESTREAM 儲存體

描述可用於處理 FILESTREAM 資料的 Win32 API 函式。

FILESTREAM 和其他 SQL Server 功能

針對使用 FILESTREAM 資料搭配其他 SQL Server 功能提供相關的考量、指導方針和限制。

請參閱

概念

程式碼存取安全性和 ADO.NET

其他資源

SQL Server 資料型別和 ADO.NET

擷取和修改 ADO.NET 中的資料

SQL Server 二進位和大數值資料 (ADO.NET)