MSSQL ile Veritabanına Dosya Eklemek

  • 21.09.2015
  • M.Tayyip Yetiş
  • MSSQL

mssqlMerhaba bu makalede mssql veritabanına dosya kaydetmek işleminden bahsedeceğiz. genellikle projelerde dosyalar sunucu dosya sistemi üzerinde tutulur ve dosyanın yolu veritabanına kaydedilir normalde doğru olan da budur çünkü ürün fotoğrafları, makale resimleri vs. gibi resimleri veritabanına kaydetmek çok mantıklı değildir çünkü bu tür resimlere çok fazla ihtiyaç duyulur ve her seferinde veritabanı amacı dışında kullanılarak tuttuğu byte yani binary cinsinden resim ya da video içeriğini uygulamaya iletir bu ise çok fazla bir veri olduğundan bu kadar sık tekrarlanması büyük ölçüde performans kaybına sebep olur normal kullanımda sadece resmin varchar türünden yolu istendiğinden çok daha az veri transferi olur. Buna rağmen bazen resim, vide gibi medya dosyalarını ya da gizli dosyalarınızı veritabanınıza kaydetmek isteyebilirsiniz bu sebeple kullanımını öğrenmekte fayda var. nitekim ben veritabanı üzerinde çalışan bir file manager yapmak istediğim için zamanında üzerinde çokça durmuştum elde ettiğim kadarını ise sizlerle paylaşıyorum. aşağıdaki örneği inceleyin.

Aşağıdaki namespace'leri import etmelisiniz

using System.IO;
using System.Data.SqlClient;

Aşağıdaki kod parçası ile veritabanına dosyamızı ekliyoruz

SqlClient.SqlParameter[] vParams = new SqlClient.SqlParameter[2];
vParams(0) = new SqlClient.SqlParameter();
vParams(0).SqlDbType = SqlDbType.VarChar;
vParams(0).ParameterName = "dosyaadı";
vParams(0).Value = files.FileName;
vParams(1) = new SqlClient.SqlParameter();
vParams(1).SqlDbType = SqlDbType.VarBinary;
vParams(1).ParameterName = "dosya";
vParams(1).Value = GetDosya("dosya yolu");
veritabanı.çalıştır("INSERT INTO TABLOM (DOSYAADI, DOSYA) VALUES(@dosyaadı,@dosya)", vParams);

yukarıdaki kod parçasında parametre yöntemini kullanarak veri ekleme işlemi gerçekleştiriliyor bunun sebebi göndermek istediğimiz verinin türü binary bunu ise standart kullanımda belirtemeyiz. öncelikle SqlParameter türünden bir dizi türetiyoruz. parametre ismini ve veri türünü belirtiyoruz. dosya işlemleri için VarBinary türünü seçmelisiniz. value değeri olarak atanan GetDosya benim kendi fonksiyonum geriye byte cinsinden değer döndürüyor. veritabanı.çalıştır() fonksiyonu da kendi yazdığım ve veritananı işlemlerimi kısaltmak için kullandığım dll'in içindeki ExecuteNonQuery() görevi gören bir fonksiyon. sizler kendi veritabanı mimarinize göre farklı şekillerde kullanabilirsiniz önemli olan komutunuza SqlParameter değişkeninizi parametre olarak vermek.

GetDosya Fonksiyonu :

private object GetDosya(dosyayolu)
{
	FileInfo fInfo = new FileInfo(dosyayolu);
	long sayac = fInfo.Length;
	FileStream fStream = new FileStream(dosyayolu, FileMode.Open, FileAccess.Read);
	BinaryReader bReader = new BinaryReader(fStream);
	byte[] byteDosya = null;
	byteDosya = bReader.ReadBytes(Convert.ToInt32(sayac));
	return byteDosya;
}

Dosyayı daha sonra veritabanında okumak ve gerçek bir dosyaya dönüştürmek için ise bir çok yöntem var. biz aşağıdaki gibi bir şey yapabiliriz.

byte[] dosya = veritabanı.ExecuteScalar("SELECT DOSYA FROM TABLOM WHERE ID=1");
string yol = "D:\\ornekdosya.jpg";
File.WriteAllBytes(yol, dosya);

yukarıda ExecuteScalar() fonksiyonunu kullanarak veritabanından dosyanın byte cinsinden verisini çektik ve dosya değişkenine atatık. File sınıfının WriteAllBytes fonksiyonunu da kullanarak belirtilen yola belirtilen byte'ları yazdık ve dosyamızı oluşturduk. Dosyayı okumak için daha çeşitli varyasyonlar kullanabilirsiniz. System.IO namespace'ini kullanarak Stream'ler ile daha detaylı dosya işlemleri yapabilirsiniz. Umarım faydalı olmuştur.

Mustafa Tayyip YETİŞ
Yazılım Geliştirme Uzmanı

Yorum Yap

Diğer Makaleler

Etiketler