SQL Server’da Veritabanına Fotoğraf Ekleyip Çıkaran Prosedür

Herkese merhaba,

Bu yazıda SQL Server’da veritabanına fotoğraf ekleyip çıkaran prosedür hakkında bilgi vereceğim.

SQL Server’da bazı durumlarda veritabanına fotoğraf ekleyip, sonrasında bu fotoğrafları başka bir klasöre ya da dosyaya T-SQL komutları ile çıkarmak isteyebiliriz.

İlk olarak aşağıdaki kodları çalıştırıp gerekli ayarlamaları yapmalısınız.

EXEC sp_configure 'show advanced options', 1; 
RECONFIGURE; 
EXEC sp_configure 'Ole Automation Procedures', 1; 
RECONFIGURE;

Şimdi tablomuzu oluşturalım.

--Fotoğraf tutacağımız tabloyu oluşturuyoruz.

CREATE TABLE Fotograflar
(
    FotoAd NVARCHAR(40) PRIMARY KEY NOT NULL,
    FotoDosyaAd NVARCHAR(100),
    FotoData VARBINARY(MAX)
);

Şu anda tablomuzun içi boş. Tablomuzun içine fotoğraf eklemek için bir prosedür oluşturuyoruz. Kodları aşağıda görmektesiniz.

--Veritabanına Fotoğraf Ekleyen Prosedür 
CREATE PROCEDURE VeritabaninaFotoEkle
(
    @FotoAd NVARCHAR(100),
    @FotoDosyaYolu NVARCHAR(1000),
    @DosyaAd NVARCHAR(1000)
)
AS
BEGIN
    DECLARE @DisDosyaYolu NVARCHAR(2000);
    DECLARE @Sql NVARCHAR(2000);
    SET NOCOUNT ON;
    SET @DisDosyaYolu = CONCAT(@FotoDosyaYolu, '\', @DosyaAd);
    SET @Sql
        = N'INSERT INTO Fotograflar (FotoAd, FotoDosyaAd, FotoData) ' + N' SELECT ' + N'''' + @FotoAd + N'''' + N','
          + N'''' + @DosyaAd + N'''' + N', * ' + N'FROM Openrowset( BULK ' + N'''' + @DisDosyaYolu + N''''
          + N', Single_Blob) as Fotograf';
    EXEC (@Sql);
    SET NOCOUNT OFF;
END;

Prosedürümüzü çalıştırıyoruz ve prosedür başarılı şekilde oluşturuldu. Şimdi fotoğrafı çıkaran prosedürün kodlarını çalıştıralım. Aşağıda kodları görmektesiniz.

--Veritabanından Fotoğraf Çıkaran Prosedür 

CREATE PROCEDURE VeritabanindanFotografCikar
(
    @FotoAd NVARCHAR(100),
    @FotoDosyaYolu NVARCHAR(1000),
    @DosyaAd NVARCHAR(1000)
)
AS
BEGIN
    DECLARE @FotoData VARBINARY(MAX);
    DECLARE @DisDosyaYolu NVARCHAR(2000);
    DECLARE @Nesne INT;
    SET NOCOUNT ON;
    SELECT @FotoData =
    (
        SELECT CONVERT(VARBINARY(MAX), FotoData, 1)
        FROM dbo.Fotograflar
        WHERE FotoAd = @FotoAd
    );
    SET @DisDosyaYolu = CONCAT(@FotoDosyaYolu, '\', @DosyaAd);
    BEGIN TRY
        EXEC sp_OACreate 'ADODB.Stream', @Nesne OUTPUT;
        EXEC sp_OASetProperty @Nesne, 'Type', 1;
        EXEC sp_OAMethod @Nesne, 'Open';
        EXEC sp_OAMethod @Nesne, 'Write', NULL, @FotoData;
        EXEC sp_OAMethod @Nesne, 'SaveToFile', NULL, @DisDosyaYolu, 2;
        EXEC sp_OAMethod @Nesne, 'Close';
        EXEC sp_OADestroy @Nesne;
    END TRY
    BEGIN CATCH
        EXEC sp_OADestroy @Nesne;
    END CATCH;
    SET NOCOUNT OFF;
END;

İkinci prosedür de başarılı şekilde oluştu ise şimdi tablomuzun içine bilgisayarımızdaki bir fotoğrafı ekleyelim. Bu işlem için biraz önce oluşturduğumuz prosedürü kullanıyoruz.

Ben D klasörü içine herhangi bir fotoğraf ekledim. Siz istediğiniz fotoğrafı kullanabilirsiniz.

Not : Windows’un yüklü olduğu sürücüde bu işlemi yaptığınız zaman hata alabilirsiniz.

Fotoğraf ekleme prosedürü aşağıdadır.

--Fotoğrafın prosedür ile veritabanına eklenmesi (Windows'un yüklü olduğu sürücüde hata vermekte. Bu yüzden farklı bir sürücü üzerinde işlemi yapın.) 

EXEC dbo.VeritabaninaFotoEkle 'Dragon', 'D:\', 'Foto.png';

İşlem başarılı bir şekilde çalıştı ise aşağıdaki sonucu göreceksiniz.

SQL Server’da Veritabanına Fotoğraf Ekleyip Çıkaran Prosedür

Şimdi fotoğrafı D sürücüsü içerisinden siliyorum ve oluşturmuş olduğum prosedür ile veritabanından geri getirmek istiyorum. Fotoğraf çıkarma prosedürü aşağıdadır.

--Fotoğrafın prosedür ile veritabanından çıkarılması (Windows'un yüklü olduğu sürücüde hata vermekte. Bu yüzden farklı bir sürücü üzerinde işlemi yapın.) 

EXEC dbo.VeritabanindanFotografCikar 'Dragon', 'D:\', 'Dragon.png';

Kodu çalıştırdığınız zaman D sürücüsüne fotoğrafın geri geldiğini göreceksiniz.

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

442 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!