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
SequentialScan
olarak ayarlayan FileAccess
Write
öğesini oluştururSqlFileStream
. dosyasına tek bir bayt yazılır SqlFileStream
ve 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
SequentialScan
olarak 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. |