FILESTREAM verileri

FILESTREAM depolama özniteliği, bir sütunda depolanan ikili (BLOB) verilere yöneliktir varbinary(max) . FILESTREAM öncesinde ikili verileri depolamak için özel işleme gerekiyordu. Metin belgeleri, resimler ve video gibi yapılandırılmamış veriler genellikle veritabanının dışında depolanır ve bu da yönetilmesini zorlaştırır.

Not

SQLClient kullanarak FILESTREAM verileriyle çalışmak için .NET Framework 3.5 SP1 (veya üzeri) yüklemeniz gerekir.

Bir varbinary(max) sütunda FILESTREAM özniteliğinin belirtilmesi, SQL Server'ın verileri veritabanı dosyası yerine yerel NTFS dosya sisteminde depolamasına neden olur. Ayrı olarak depolansa da, veritabanında depolanan verilerle varbinary(max) çalışmak için desteklenen aynı Transact-SQL deyimlerini kullanabilirsiniz.

FILESTREAM için SqlClient Desteği

SQL Server, için .NET Framework Veri Sağlayıcısı, System.Data.SqlClientad alanında tanımlanan sınıfı kullanarak SqlFileStream FILESTREAM verilerini okumayı ve dosyaya System.Data.SqlTypes yazmayı destekler. SqlFileStream , veri akışlarına Stream okuma ve yazma yöntemleri sağlayan sınıfından devralır. Bir akıştan okuma işlemi, verileri akıştan bayt dizisi gibi bir veri yapısına aktarır. Yazma işlemi veri yapısındaki verileri bir akışa aktarır.

SQL Server Tablosu Oluşturma

Aşağıdaki Transact-SQL deyimleri employees adlı bir tablo oluşturur ve bir veri satırı ekler. FILESTREAM depolamayı etkinleştirdikten sonra, aşağıdaki kod örnekleriyle birlikte bu tabloyu kullanabilirsiniz.

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

Örnek: FILESTREAM Verilerini Okuma, Üzerine Yazma ve Ekleme

Aşağıdaki örnekte bir FILESTREAM'dan verilerin nasıl okunduğu gösterilmektedir. Kod, dosyasının mantıksal yolunu alır ve FileOptions olarak ayarlanır FileAccess Read.SequentialScan Kod daha sonra SqlFileStream'den arabelleğe baytları okur. Baytlar daha sonra konsol penceresine yazılır.

Örnek ayrıca tüm mevcut verilerin üzerine yazıldığı bir FILESTREAM'a nasıl veri yazıldığını da gösterir. Kod dosyanın mantıksal yolunu alır ve olarak ve FileOptions SequentialScanolarak ayarlayan FileAccess Write öğesini oluştururSqlFileStream. dosyasına tek bir bayt yazılır SqlFileStreamve dosyadaki verilerin yerini alır.

Örnek ayrıca, dosyanın sonuna veri eklemek için Seek yöntemini kullanarak bir FILESTREAM'a veri yazmayı da gösterir. Kod dosyanın mantıksal yolunu alır ve olarak ve FileOptions SequentialScanolarak ayarlayan FileAccess ReadWrite öğesini oluştururSqlFileStream. Kod, var olan dosyaya tek bir bayt ekleyerek dosyanın sonuna aramak için Seek yöntemini kullanır.

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();
            }

        }
    }
}

Başka bir örnek için bkz . İkili verileri bir dosya akışı sütununa depolama ve getirme.

SQL Server belgeleri kaynakları

FILESTREAM belgelerinin tamamı SQL Server belgelerinin aşağıdaki bölümlerinde bulunur.

Konu Açıklama
FILESTREAM (SQL Server) FILESTREAM depolamanın ne zaman kullanılacağını ve SQL Server Veritabanı Altyapısı'nı bir NTFS dosya sistemiyle nasıl tümleştirdiği açıklanır.
FILESTREAM Verileri için İstemci Uygulamaları Oluşturma FILESTREAM verileriyle çalışmaya yönelik Windows API işlevlerini açıklar.
FILESTREAM ve Diğer SQL Server Özellikleri FILESTREAM verilerini SQL Server'ın diğer özellikleriyle kullanmaya yönelik önemli noktalar, yönergeler ve sınırlamalar sağlar.

Ayrıca bkz.