SQL Server’da BCP Kullanarak Veritabanındaki Fotoğrafı Klasöre Çıkartmak

Herkese merhaba,

Bu yazıda SQL Server’da BCP yani Bulk Copy Program kullanarak veritabanındaki fotoğrafı klasöre çıkartmak hakkında bilgi vereceğim.

BCP (Bulk Copy Program),  kısaca yığın kopyalama programıdır. Veri alma ya da veri aktarma işlemleri için bu programı kullanabilirsiniz.

Aslına bakarsanız BCP kullanarak veritabanındaki fotoğrafı klasöre çıkartmakla ilgili doğru düzgün bir örnek ya da Türkçe bilgi yok. Hatta bu konu hakkındaki Türkçe makaleyi ilk ben yazdım.

Bu makale aşağı yukarı iki ya da üç saatlik bir çalışmanın ürünüdür. Kodların kısa olduğuna bakmayın. Cidden anlaması ve uygulaması o kadar da kolay olmayan bir çalışmadır.

Not 1 : Bu işlemler Windows’un yüklü olduğu sürücüde maalsef çalışmadı. Güvenlik engellerine takıldığı için D sürücüsü üzerinde işlemlerimi yaptım.

Not 2 : Aşağıdaki ayarları kendi sunucunuz üzerinde muhakkak çalıştırın aksi durumda bu işlem çalışmaz.

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
GO
RECONFIGURE
GO

Ayarları yaptıktan sonra ilk olarak aşağıdaki tabloyu oluşturun ve içerisine eklemiş olduğum veriyi ekleyin.

--Tablo oluşturma

CREATE TABLE dbo.Fotograf
(
    FotografID INT IDENTITY(1, 1) PRIMARY KEY,
    FotografAdi VARCHAR(100),
    Fotograf VARBINARY(MAX)
);

GO

--Tabloya Fotoğraf adı ekleme

INSERT INTO dbo.Fotograf
(
    FotografAdi
)
VALUES
('18mart.jpg');

Yukarıda bir tablo oluşturdum ve bu tabloya 18mart.jpg adında bir fotoğraf adı ekledim. Siz dilediğinizi ekleyebilirsiniz. Uzantı adıyla beraber kaydettim yani 18mart.jpg şeklinde. Siz de konuyu anlamak adına fotoğraf adını değiştirmeden ekleyin.

Şimdi bu tabloya aşağıdaki kod ile fotoğrafımı ekliyorum.

--Tabloya Fotoğraf Ekleme (Güncelleme)

UPDATE dbo.Fotograf
SET Fotograf =
    (
        SELECT *
        FROM
            OPENROWSET(BULK 'D:mart.jpg', SINGLE_BLOB)
            AS x
    )
WHERE FotografAdi = '18mart.jpg';
GO

Benim fotoğrafım D sürücüsündeydi. Yukarıdaki kodda bir where şartı da bulunmakta. Daha sonra başka yerde de kullanmanız için böyle bir şartı da koda ekledim.

Zaten fotoğraf adım 18mart.jpg olduğu için sıkıntı çıkmadan çalışacaktır. Siz bu kısma muhakkak dikkat edin.

Yukarıdaki sorguyu çalıştırdıktan sonra aşağıdaki sorguyla tablomuzu kontrol edelim.

--Tablonun kontrol edilmesi

SELECT *
FROM dbo.Fotograf;
GO

Sorguyu çalıştırdığınızda aşağıdaki sonucu göreceksiniz.

Görüldüğü üzere fotoğrafımız şu anda sunucu içinde tabloda ve VARBINARY tipinde

Şimdi gelelim bu fotoğrafı klasörümüze çıkarmaya.

İlk olarak D sürücüsü içine deneme adında bir klasör oluşturalım. Fotoğrafımızı bu klasöre çıkaracağız. Klasörü oluşturduktan sonra aşağıdaki işlemlere devam edelim.

BCP kullanarak veritabanındaki fotoğrafı klasöre çıkartma işleminde karşılaştığım en büyük sıkıntı format sıkıntısıydı.

Bu sıkıntı şu şekilde gitti.

bcp [YoutubeEgitimleri].[dbo].[Fotograf] format nul -f D:\deneme\formatdosyasi.fmt -c -t, -T -S YSK\YAVUZSELIM

Yukarıdaki kodu cmd komut dosyası ekranında çalıştırdığınız anda formatdosyasi.fmt adlı dosyayı deneme klasöründe oluşturacaktır. Eğer bu dosyayı oluşturmazsanız BCP ile fotoğrafı klasöre düzgün şekilde çıkartmada sıkıntı yaşarsınız.

Bu kodun anlamına gelince.

[YoutubeEgitimleri].[dbo].[Fotograf] Burası veritabanındaki tablomuzdur. Siz kendi tablonuza göre ilerde düzenleyebilirsiniz.

D:\deneme\formatdosyasi.fmt Burası da görüldüğü üzere formatdosyasi.fmt ‘yi çıkaracağımız dosya yoludur.

Gelecekte başka işlemler için sadece bu ikisinde kendinize göre değişiklik yaparsınız.

Kodu çalıştırdığınız anda aşağıdaki sonucu göreceksiniz.

Görüldüğü üzere başarı ile çalıştı ve deneme klasöründe formatdosyasi.fmt adlı dosya başarı ile oluştu.

Şimdi bu dosyayı not defteri ile açalım. Açınca aşağıdaki ekranı göreceksiniz.

Şimdi bizim kullanacağımız satır Fotoğraf satırı. Çünkü Varbinary dosya o satır. Satırı aşağıdaki gibi düzenleyip kaydedelim.

Bu işlemi başarı ile tamamladıysanız sıra geldi aşağıdaki kodu çalıştırmaya.

--Tablonun export edilmesi

DECLARE @Command NVARCHAR(4000);
DECLARE @Fotografadi NVARCHAR(100);
--Fotoğraf adının dinamik çekilmesi
SELECT @Fotografadi = FotografAdi
FROM dbo.Fotograf;


SET @Command
    = N'bcp "SELECT Fotograf FROM [YoutubeEgitimleri].[dbo].[Fotograf] WHERE FotografID = 1 " queryout  "D:\deneme\'
      + @Fotografadi + N'" -S YSK\YAVUZSELIM -T -n -f D:\deneme\formatdosyasi.fmt';
PRINT @Command

EXEC master..xp_cmdshell @Command;

GO

Gördüğünüz üzere formatdosyasi.fmt yapısını sorgumuzda kullanmaktayız. Dosyayı çıkardığımız yer ise deneme klasörüdür.

Kodu SQL Server üzerinde çalıştırdığınız anda aşağıdaki sonucu göreceksiniz.

Görüldüğü üzere başarı ile çalıştı. Şimdi deneme klasörüne gidip bakalım.

Görüldüğü üzere fotoğraf başarılı bir şekilde veritabanından çıkarılmış oldu.

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

SQL Server Eğitimleri Kanalına Abone Olun

Şunlar makaleler de hoşunuza gidebilir

Ads Blocker Image Powered by Code Help Pro
Reklam Eklentisi Kullanıyorsunuz

Lütfen bizlere destek için reklam eklentisi olmadan sitemizi ziyaret edin.

Şimdiden teşekkür ederiz.