SQL Server 2008 中的 FILESTREAM 資料 (ADO.NET)
更新: November 2007
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 命名空間 (Namespace) 中定義的 SqlFileStream 類別 (Class) 來讀取和寫入 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 儲存體的時機,以及它如何整合 SQL Server Database Engine 與 NTFS 檔案系統。 |
|
描述如何在 SQL Server 執行個體 (Instance) 上啟用 FILESTREAM、如何建立資料庫和資料表來儲存 FILESTREAM 資料,以及如何管理包含 FILESTREAM 資料的資料列。 |
|
描述可用於處理 FILESTREAM 資料的 Win32 API 函式。 |
|
針對使用 FILESTREAM 資料搭配其他 SQL Server 功能提供相關的考量、指導方針和限制。 |