Aracılığıyla paylaş


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ı, SqlFileStream sınıfını System.Data.SqlTypes ad alanında tanımlayarak FILESTREAM verilerini okumayı ve 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 FileAccess öğesini Read olarak, FileOptions öğesini ise SequentialScan olarak ayarlar. 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 SqlFileStream öğesini oluşturur, FileAccess değerini Write ve FileOptions değerini SequentialScan olarak ayarlar. 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 SqlFileStream nesnesini oluşturur, FileAccess değerini ReadWrite, FileOptions değerini SequentialScan olarak ayarlar. Seek yöntemini kullanarak dosyanın sonuna ilerleyip, var olan dosyaya tek bir bayt ekler.

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 İkili verileri bir dosya akışı sütununa depolama ve getirme başlıklı konuya bakın.

SQL Server doküman 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.