Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
FILESTREAM-lagringsattributet är för binära data (BLOB) som lagras i en kolumn med varbinary(max). 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.
Anmärkning
Du måste installera .NET Framework 3.5 SP1 (eller senare) eller .NET Core för att arbeta med FILESTREAM-data med hjälp av SqlClient.
Om du anger attributet FILESTREAM i en kolumn med varbinary(max) kan SQL Server lagra data i det lokala NTFS-filsystemet i stället för i databasfilen. Även om de 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
Microsoft SqlClient-dataprovidern för SQL Server stöder Microsoft.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-instruktioner 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 med de kodexempel som följer. Länkarna till resurser i SQL Server Books Online finns i slutet av den här artikeln.
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. Bajtarna 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, och ställer in FileAccess till Write och FileOptions till SequentialScan. En enda byte skrivs till SqlFileStreamoch 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 och 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 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();
}
}
}
}
Ett annat exempel finns i Så här lagrar och hämtar du binära data i en filströmskolumn.
Resurser i SQL Server Books Online
Den fullständiga dokumentationen för FILESTREAM finns i följande avsnitt i SQL Server Books Online.
| Article | Description |
|---|---|
| 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. |