Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ší) nebo .NET Core.
Zadání atributu FILESTREAM ve sloupci varbinary(max) způsobí, že SQL Server uloží data do místního systému souborů NTFS místo do souboru databáze. I když se ukládají samostatně, můžete použít stejné příkazy Transact-SQL, které jsou podporovány pro práci s daty varbinary(max) uloženými v databázi.
Podpora SQLClient pro FILESTREAM
Zprostředkovatel dat Microsoft SqlClient pro SQL Server Microsoft.Data.SqlClient podporuje čtení a zápis v datech FILESTREAM pomocí třídy SqlFileStream definované v oboru názvů System.Data.SqlTypes.
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 Transact-SQL vytvoří tabulku s názvem zaměstnanci a vloží řádek dat. Jakmile povolíte úložiště FILESTREAM, můžete tuto tabulku použít s následujícími příklady kódu. Odkazy na zdroje ve službě SQL Server Books Online najdete na konci tohoto článku.
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 SqlFileStreamsouboru a nahradí všechna data v souboru.
Ukázka také ukazuje, jak zapisovat data do FILESTREAM pomocí metody Seek pro připojení dat 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, aby přešel na konec souboru, a připojí k existujícímu souboru jeden bajt.
using System;
using Microsoft.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("server=(local);integrated security=true;Encrypt=True;database=myDB");
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.
Zdroje informací ve službě SQL Server Books Online
Kompletní dokumentace pro FILESTREAM se nachází v následujících částech sql Server Books Online.
| Article | Description |
|---|---|
| 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. |