Bu makalede FILESTREAM kullanarak verileri gerçek Windows dosya sisteminden almaya çalışacağız. FileStream hakkında detaylı bilgi almak için sayfada filestream nedir makalesini okumalısınız.
Şimdi uygulamalı bir şekilde örneğimize geçelim.
1. FILESTREAM özelliği aktif edilir.
EXEC sp_configure N'filestream access level', 2;
RECONFIGURE WITH OVERRIDE;
İlk adım olarak filestream özelliğinin aktif edilmesi gerekmektedir.
Not: filestream access level’= 2 olursa hem SQL Server’dan (T-SQL) hem de Windows dosya sisteminden erişebilirsin.
Ayrıca, SQL Server Configuration Manager’dan da FILESTREAM özelliğini aktif etmeliyiz.

SQL Server hizmetini yeniden başlatılır.
2. FILESTREAM Kullanacak Bir Database Oluştur
Yeni bir veritabanı oluşturup FILESTREAM verilerini saklamak için FILEGROUP ile FILESTREAM alanı tanımlıyoruz.
CREATE DATABASE FileStreamDB
ON PRIMARY
( NAME = FileStreamDB_Data,
FILENAME = 'C:\FileStreamData\FileStreamDB.mdf' ),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM
( NAME = FileStreamDB_FS,
FILENAME = 'E:\FileStreamData\FileStreamFS' )
LOG ON
( NAME = FileStreamDB_Log,
FILENAME = 'C:\FileStreamData\FileStreamDB.ldf' );
Not: E:\FileStreamData\FileStreamFS klasörü fiziksel dosya sisteminde oluşturulacak ve SQL Server buraya dosya koyacak.
3. FILESTREAM Kullanan Bir Tablo Oluştur
Şimdi FILESTREAM desteği olan bir tablo oluşturalım:
USE FileStreamDB;
GO
CREATE TABLE FileTable
(
ID UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE DEFAULT NEWID(),
FileName NVARCHAR(255),
FileData VARBINARY(MAX) FILESTREAM
);
Not: VARBINARY(MAX) FILESTREAM alanı sayesinde dosyalar fiziksel olarak Windows dosya sisteminde saklanacak.
4. Windows Dosya Sistemine Dosya Kaydetme
Şimdi bir dosya ekleyelim. Bir resim, PDF veya herhangi bir dosyayı veritabanına ekleyebiliriz.
INSERT INTO FileTable (FileName, FileData)
VALUES ('AileYardımBildirimi.pdf',
(SELECT *FROM OPENROWSET(BULK 'C:\Users\Administrator\Documents\AileYardımBildirimi.pdf', SINGLE_BLOB) AS FileData));
Eğer aşağıdaki gibi hata mesajıyla karşılaşırsanız. Sql server servis hesabının ilgili klasör üzerinde yetkisinin olup olmadığına bakılmalıdır.
Msg 4861, Level 16, State 1, Line 25
Cannot bulk load because the file “C:\Documents\AileYardımBildirimi.pdf” could not be opened. Operating system error code 3(The system cannot find the path specified.).
Not: OPENROWSET(BULK …) komutu, dosyayı Windows’tan alıp FILESTREAM alanına ekler.
İlgili dosyamızı veritabanımıza eklemiş olduk.

5. FILESTREAM Verisini SQL Server’dan Okuma
Dosyayı SQL Server’dan almak için şu sorguyu çalıştırabilirsin veya select*from komutu ile çalıştırılabilir.
SELECT ID, FileName,
CAST(FileData AS VARBINARY(MAX)) AS FileData
FROM FileTable;

Bu sorgu dosya içeriğini binary formatında döndürür. Eğer dosyayı dışarı çıkarmak istiyorsan, uygulama tarafında bunu bir dosyaya yazabilirsin.
6. Windows Dosya Sisteminden Erişme
SQL Server dosyaları fiziksel olarak disk üzerinde sakladığı için, onları Windows dosya sisteminden de açabilirsin.
Dosyaların nerede saklandığını görmek için şu komutu çalıştır:
SELECT
FileName,
FileData.PathName() AS FileLocation
FROM FileTable;
Bu, dosyanın fiziksel konumunu döndürür. Örneğin, şu şekilde bir çıktı alabilirsin:

Bu dosya, Windows Explorer veya başka bir uygulama ile doğrudan açılabilir.
7. FILESTREAM Dosyasını Windows’a Kaydetme (SQL Server’dan Çıkarma)
SQL Server’daki FILESTREAM verisini bir dosya olarak dışa aktarmak için şu yöntemi kullanabilirsin:
Aşağıdaki komutun çalışabilmesi için OLE Automation Procedures’ın açık olması gerekir.
İlgili Procedure’ü açmak için şu komutu çalıştır:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE;
Aşağıdaki komut verileri aktaracağımız dosya yolunu ve hangi dosyaları aktaracağımızı seçiyoruz.
DECLARE @FileData VARBINARY(MAX);
DECLARE @FilePath NVARCHAR(255) = 'C:\DosyaCikti\AileYardımBildirimi_DB_CIKTIKTAN_SONRA.pdf';
DECLARE @objStream INT;
DECLARE @hr INT;
-- FileTable'dan ilgili dosya verisini al
SELECT @FileData = FileData FROM FileTable WHERE FileName = 'AileYardımBildirimi.pdf';
IF @FileData IS NOT NULL
BEGIN
-- ADODB.Stream nesnesini oluştur
EXEC @hr = sp_OACreate 'ADODB.Stream', @objStream OUTPUT;
IF @hr <> 0
BEGIN
PRINT 'ADODB.Stream oluşturulamadı!';
RETURN;
END;
-- Stream nesnesinin türünü belirle (1 = Binary)
EXEC @hr = sp_OASetProperty @objStream, 'Type', 1;
IF @hr <> 0
BEGIN
PRINT 'ADODB.Stream Type ayarlanamadı!';
RETURN;
END;
-- Stream aç
EXEC @hr = sp_OAMethod @objStream, 'Open';
IF @hr <> 0
BEGIN
PRINT 'ADODB.Stream açılamadı!';
RETURN;
END;
-- FileData içeriğini Stream'e yaz
EXEC @hr = sp_OAMethod @objStream, 'Write', NULL, @FileData;
IF @hr <> 0
BEGIN
PRINT 'Dosya verisi yazılamadı!';
RETURN;
END;
-- Stream içeriğini belirtilen dosya yoluna kaydet
EXEC @hr = sp_OAMethod @objStream, 'SaveToFile', NULL, @FilePath, 2;
IF @hr <> 0
BEGIN
PRINT 'Dosya kaydedilemedi!';
RETURN;
END;
-- Stream kapat
EXEC sp_OAMethod @objStream, 'Close';
EXEC sp_OADestroy @objStream;
PRINT 'Dosya başarıyla kaydedildi: ' + @FilePath;
END
ELSE
BEGIN
PRINT 'Belirtilen dosya bulunamadı!';
END;


Veritabanında bulunan pdf dosyasını tekrardan Windows arayüzüne çıkarmış olduk. Veritabanımıza docx ve jpg verilerini eklemek istersek aşağıdaki gibi yapabiliriz.
INSERT INTO FileTable (FileName, FileData)
VALUES ('Word Dosyası',
(SELECT *FROM OPENROWSET(BULK 'C:\Users\Administrator\Documents\wordbelge.docx', SINGLE_BLOB) AS FileData));
INSERT INTO FileTable (FileName, FileData)
VALUES ('resin_dosyası',
(SELECT *FROM OPENROWSET(BULK 'C:\Users\Administrator\Documents\resim.jpg', SINGLE_BLOB) AS FileData));
Aşağıdaki resimdeki gibi veritabanınan kaydedilen belgelerin çıktısını alabiliriz.

Bu makalede filestream veri veritabanına nasıl aktarılır. Veritabanından dosyalar nasıl çıkartılır görmüş olduk.
Başka bir makalede görüşmek dileğiyle.
“İnsanlardan öyleleri de vardır ki, inanmadıkları halde, Allah’a ve ahiret gününe inandık. derler.”
Bakara-8