Data FILESTREAM
Atribut úložiště FILESTREAM je určený pro binární data (BLOB) uložená ve sloupci varbinary(max)
. Před fileSTREAMem se při ukládání binárních dat vyžadují speciální zpracování. Nestrukturovaná data, jako jsou textové dokumenty, obrázky a video, se často ukládají mimo databázi, což ztěžuje správu.
Poznámka:
Abyste mohli pracovat s daty FILESTREAM pomocí SqlClient, musíte nainstalovat rozhraní .NET Framework 3.5 SP1 (nebo novější).
Zadání atributu FILESTREAM ve varbinary(max)
sloupci způsobí, že SQL Server uloží data do místního systému souborů NTFS místo do souboru databáze. I když je uložen samostatně, můžete použít stejné příkazy jazyka Transact-SQL, které jsou podporovány pro práci s daty uloženými varbinary(max)
v databázi.
Podpora SQLClient pro FILESTREAM
Rozhraní .NET Framework Zprostředkovatel dat pro SQL Server System.Data.SqlClientpodporuje čtení a zápis do dat FILESTREAM pomocí SqlFileStream třídy definované v System.Data.SqlTypes oboru názvů. SqlFileStream
dědí z Stream třídy, která poskytuje metody pro čtení a zápis do datových proudů. Čtení z datového proudu přenáší data z datového proudu do datové struktury, jako je například pole bajtů. Zápis přenáší data z datové struktury do datového proudu.
Vytvoření tabulky SQL Serveru
Následující příkazy Jazyka Transact-SQL vytvoří tabulku s názvem employees a vloží řádek dat. Jakmile povolíte úložiště FILESTREAM, můžete tuto tabulku použít ve spojení s následujícími příklady kódu.
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
Příklad: Čtení, přepsání a vkládání dat FILESTREAM
Následující ukázka ukazuje, jak číst data ze FILESTREAM. Kód získá logickou cestu k souboru, nastaví FileAccess
na Read
a FileOptions
na .SequentialScan
Kód pak přečte bajty z SqlFileStream do vyrovnávací paměti. Bajty se pak zapíšou do okna konzoly.
Ukázka také ukazuje, jak zapisovat data do FILESTREAM, ve kterém jsou všechna existující data přepsána. Kód získá logickou cestu k souboru a vytvoří SqlFileStream
, nastaví FileAccess
na Write
a FileOptions
na SequentialScan
. Jeden bajt se zapíše do SqlFileStream
souboru a nahradí všechna data v souboru.
Ukázka také ukazuje, jak zapisovat data do FILESTREAM pomocí metody Seek připojit data na konec souboru. Kód získá logickou cestu k souboru a vytvoří SqlFileStream
, nastaví FileAccess
na ReadWrite
a FileOptions
na SequentialScan
. Kód používá metodu Seek k vyhledání na konec souboru a k existujícímu souboru připojí jeden bajt.
using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data;
using System.IO;
namespace FileStreamTest
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("...");
ReadFileStream(builder);
OverwriteFileStream(builder);
InsertFileStream(builder);
Console.WriteLine("Done");
}
private static void ReadFileStream(SqlConnectionStringBuilder connStringBuilder)
{
using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);
SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
command.Transaction = tran;
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
using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Read, FileOptions.SequentialScan, allocationSize: 0))
{
// Read the contents as bytes and write them to the console
for (long index = 0; index < fileStream.Length; index++)
{
Console.WriteLine(fileStream.ReadByte());
}
}
}
}
tran.Commit();
}
}
private static void OverwriteFileStream(SqlConnectionStringBuilder connStringBuilder)
{
using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);
SqlTransaction tran = connection.BeginTransaction(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
using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Write, FileOptions.SequentialScan, allocationSize: 0))
{
// Write a single byte to the file. This will
// replace any data in the file.
fileStream.WriteByte(0x01);
}
}
}
tran.Commit();
}
}
private static void InsertFileStream(SqlConnectionStringBuilder connStringBuilder)
{
using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);
SqlTransaction tran = connection.BeginTransaction(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;
using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.ReadWrite, FileOptions.SequentialScan, allocationSize: 0))
{
// Seek to the end of the file
fileStream.Seek(0, SeekOrigin.End);
// Append a single byte
fileStream.WriteByte(0x01);
}
}
}
tran.Commit();
}
}
}
}
Další ukázku najdete v tématu Ukládání a načítání binárních dat do sloupce datového proudu souboru.
Prostředky dokumentace k SQL Serveru
Kompletní dokumentace pro FILESTREAM se nachází v následujících částech dokumentace k SQL Serveru.
Téma | Popis |
---|---|
FILESTREAM (SQL Server) | Popisuje, kdy použít fileSTREAM úložiště a jak se integruje databázový stroj SQL Serveru se systémem souborů NTFS. |
Vytváření klientských aplikací pro data FILESTREAM | Popisuje funkce rozhraní API systému Windows pro práci s daty FILESTREAM. |
FILESTREAM a další funkce SQL Serveru | Poskytuje důležité informace, pokyny a omezení pro používání dat FILESTREAM s dalšími funkcemi SQL Serveru. |