Megosztás a következőn keresztül:


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 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, é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.

Lásd még