Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A FILESTREAM storage attribútum a varbinary(max) oszlopban 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.
Megjegyzés:
A FILESTREAM-adatok SqlClient használatával való használatához telepítenie kell a .NET Framework 3.5 SP1 -et (vagy újabb verziót) vagy a .NET Core-t.
Ha a FILESTREAM attribútumot egy varbinary(max) oszlopon adja meg, az SQL Server nem az adatbázisfájlban, hanem a helyi NTFS fájlrendszerben tárolja az adatokat. Bár külön van tárolva, ugyanazokat a Transact-SQL utasításokat használhatja, amelyek támogatják az adatbázisban tárolt varbinary(max) adatok használatát.
SqlClient-támogatás a FILESTREAM-hez
Az SQL Serverhez Microsoft.Data.SqlClientkészült Microsoft SqlClient-adatszolgáltató támogatja a FILESTREAM-adatok olvasását és írását a SqlFileStreamSystem.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, használhatja ezt a táblázatot az alábbi példakódokkal. Az SQL Server Books Online-ban található erőforrásokra mutató hivatkozások a cikk végén találhatók.
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, beállítva a FileAccess elemet Read értékre és a FileOptions elemet SequentialScan értékre. A kód ezután beolvassa a bájtokat az SqlFileStreamből a pufferbe. A bájtokat ezután a konzolablakba írják.
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, létrehozza a SqlFileStream, beállítva a FileAccess-t Write-re és a FileOptions-t SequentialScan-re. A rendszer egyetlen bájtot ír a SqlFileStreamfá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, létrehozza a SqlFileStream-t, beállítva a FileAccess értékét ReadWrite-re és a FileOptions-t SequentialScan-re. 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 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();
}
}
}
}
További példa: Bináris adatok tárolása és beolvasása fájlstreamoszlopba.
Erőforrások az SQL Server Books Online-ban
A FILESTREAM teljes dokumentációja az SQL Server Books Online következő szakaszaiban található.
| Cikk | Description |
|---|---|
| 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. |