FILESTREAM-adatok
A FILESTREAM storage attribútum az oszlopban varbinary(max)
tárolt bináris (BLOB) adatokhoz tartozik. A FILESTREAM előtt a bináris adatok tárolása speciális kezelést igényel. A strukturálatlan adatokat, például szöveges dokumentumokat, képeket és videókat gyakran az adatbázison kívül tárolják, ami megnehezíti a kezeléseket.
Feljegyzés
Telepítenie kell .NET-keretrendszer 3.5 SP1-et (vagy újabb verziót) a FILESTREAM-adatok SqlClient használatával való használatához.
Ha egy oszlopon varbinary(max)
megadja a FILESTREAM attribútumot, az SQL Server nem az adatbázisfájlban, hanem a helyi NTFS fájlrendszerben tárolja az adatokat. Bár külön tárolva van, ugyanazokat a Transact-SQL-utasításokat használhatja, amelyek támogatottak az adatbázisban tárolt adatokkal való varbinary(max)
munkához.
SqlClient-támogatás a FILESTREAM-hez
Az SQL Server System.Data.SqlClient.NET-keretrendszer adatszolgáltatója támogatja a FILESTREAM-adatok olvasását és írását a SqlFileStream System.Data.SqlTypes névtérben definiált osztály használatával. SqlFileStream
örökli az Stream osztályt, amely metódusokat biztosít az adatok adatfolyamaiba való olvasáshoz és íráshoz. A streamből való olvasás adatokat továbbít a streamből egy adatstruktúrába, például bájtokból álló tömbbe. Az írás átviszi az adatokat az adatstruktúrából egy streambe.
Az SQL Server-tábla létrehozása
Az alábbi Transact-SQL-utasítások létrehoznak egy alkalmazottak nevű táblát, és beszúrnak egy adatsort. Miután engedélyezte a FILESTREAM-tárolót, ezt a táblát az alábbi kód példákkal együtt használhatja.
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élda: FILESTREAM-adatok olvasása, felülírása és beszúrása
Az alábbi minta bemutatja, hogyan olvashatók be adatok a FILESTREAMből. A kód lekéri a fájl logikai elérési útját, és be van állítva a FileAccess
fájlra Read
és a FileOptions
fájlra SequentialScan
. A kód ezután beolvassa a bájtokat az SqlFileStreamből a pufferbe. A bájtok ezután a konzolablakba lesznek írva.
A minta azt is bemutatja, hogyan írhat adatokat egy OLYAN FILESTREAM-fájlba, amelyben az összes meglévő adat felülírva van. A kód lekéri a fájl logikai elérési útját, és létrehozza a SqlFileStream
, majd a FileOptions
FileAccess
Write
következőt.SequentialScan
A rendszer egyetlen bájtot ír a SqlFileStream
fájlban lévő adatok helyére.
A minta azt is bemutatja, hogyan írhat adatokat a FILESTREAM-be a Seek metódussal, hogy adatokat fűzjön a fájl végéhez. A kód lekéri a fájl logikai elérési útját, és létrehozza a SqlFileStream
, majd a FileOptions
FileAccess
ReadWrite
következőt.SequentialScan
A kód a Seek metódust használja a fájl végéhez való kereséshez, egyetlen bájt hozzáfűzésével a meglévő fájlhoz.
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();
}
}
}
}
További példa: Bináris adatok tárolása és beolvasása fájlstreamoszlopba.
SQL Server-dokumentumok erőforrásai
A FILESTREAM teljes dokumentációja az SQL Server dokumentációjának következő szakaszaiban található.
Téma | Leírás |
---|---|
FILESTREAM (SQL Server) | Leírja, hogy mikor érdemes a FILESTREAM-tárolót használni, és hogyan integrálja az SQL Server adatbázismotort egy NTFS fájlrendszerrel. |
Ügyfélalkalmazások létrehozása FILESTREAM-adatokhoz | A FILESTREAM-adatok használatához használt Windows API-függvényeket ismerteti. |
FILESTREAM és egyéb SQL Server-funkciók | Megfontolandó szempontokat, irányelveket és korlátozásokat biztosít a FILESTREAM-adatoknak az SQL Server más funkcióival való használatához. |