FILESTREAM-data
FILESTREAM-lagringsattributet är för binära data (BLOB) som lagras i en varbinary(max)
kolumn. Före FILESTREAM krävde lagring av binära data särskild hantering. Ostrukturerade data, till exempel textdokument, bilder och video, lagras ofta utanför databasen, vilket gör det svårt att hantera.
Kommentar
Du måste installera .NET Framework 3.5 SP1 (eller senare) för att arbeta med FILESTREAM-data med hjälp av SqlClient.
Om du anger attributet FILESTREAM i en varbinary(max)
kolumn kan SQL Server lagra data i det lokala NTFS-filsystemet i stället för i databasfilen. Även om den lagras separat kan du använda samma Transact-SQL-instruktioner som stöds för att arbeta med varbinary(max)
data som lagras i databasen.
SqlClient-stöd för FILESTREAM
.NET Framework-dataprovidern för SQL Server stöder System.Data.SqlClientläsning och skrivning till FILESTREAM-data med hjälp av klassen SqlFileStream som definierats i System.Data.SqlTypes namnområdet. SqlFileStream
ärver från Stream klassen, vilket ger metoder för att läsa och skriva till dataströmmar. Läsning från en ström överför data från strömmen till en datastruktur, till exempel en matris med byte. När du skriver överförs data från datastrukturen till en dataström.
Skapa SQL Server-tabellen
Följande Transact-SQL-uttryck skapar en tabell med namnet employees och infogar en rad med data. När du har aktiverat FILESTREAM-lagring kan du använda den här tabellen tillsammans med de kodexempel som följer.
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
Exempel: Läsa, skriva över och infoga FILESTREAM-data
Följande exempel visar hur du läser data från en FILESTREAM. Koden hämtar den logiska sökvägen till filen och anger FileAccess
till Read
och FileOptions
till SequentialScan
. Koden läser sedan byteen från SqlFileStream till bufferten. Byte skrivs sedan till konsolfönstret.
Exemplet visar också hur du skriver data till en FILESTREAM där alla befintliga data skrivs över. Koden hämtar den logiska sökvägen till filen och skapar SqlFileStream
inställningen FileAccess
, till Write
och FileOptions
till SequentialScan
. En enda byte skrivs till SqlFileStream
och ersätter alla data i filen.
Exemplet visar också hur du skriver data till en FILESTREAM med hjälp av metoden Sök för att lägga till data i slutet av filen. Koden hämtar den logiska sökvägen till filen och skapar SqlFileStream
inställningen FileAccess
, till ReadWrite
och FileOptions
till SequentialScan
. Koden använder metoden Sök för att söka till slutet av filen och lägger till en enda byte till den befintliga filen.
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();
}
}
}
}
Ett annat exempel finns i Så här lagrar och hämtar du binära data i en filströmskolumn.
SQL Server-dokumentresurser
Den fullständiga dokumentationen för FILESTREAM finns i följande avsnitt i SQL Server-dokumenten.
Område | beskrivning |
---|---|
FILESTREAM (SQL Server) | Beskriver när du ska använda FILESTREAM-lagring och hur den integrerar SQL Server Database Engine med ett NTFS-filsystem. |
Skapa klientprogram för FILESTREAM-data | Beskriver Funktionerna i Windows API för att arbeta med FILESTREAM-data. |
FILESTREAM och andra SQL Server-funktioner | Innehåller överväganden, riktlinjer och begränsningar för att använda FILESTREAM-data med andra funktioner i SQL Server. |