Blob ile Veri kaydı

Oracle veritabanında BLOB 4 GB’ta kadar Binary dataları saklamak için kullanabiliriz. MsSQL de 2 GB lık veri saklayabilen Varbinary(max), Image veri türlerine benzer, dosyalarımızı örneğin Resimleri database ortamında tutmamızı sağlayan çok güzel bir veri tipidir. Kullanım elverişliliği resimlerinizin veri tabanında tutularak güvenliğini ve saklanabilirliğini artırmanın yanısıra asıl değinmek istediğim nokta yüksek hız gerektiren sistemlerde, yüksek miktarda veri kayıt etmek istediğimizde verilerin parçalı olarak kayıt edildiğini düşünelim. Böyle bir durumda normal bir bilgisayar için 10 ms(mili saniye) lik bir kayıt işlemi parçalara bölünmüş her blok için 10 ms(mili saniye) zamanımızı alacaktır. Ama verilerinizi bölmeden tekbir seferde kayıt edildiğinde ortalama 20-30 ms (mili saniye) ye aldığını düşünürsek (veri boyutuna göre süre değişecektir) mükemmel bir zamandan tasarruf etmiş oluyoruz ki ben böyle bir işlem için bir kaç projemde kullanarak yüksek verimlilikler elde ettim ve tavsiye ederim.

Unutulmamalıdırki bu gibi bir işlemin projelerinizin içeriği ve durumuna göre değişir bir yarar ve kayıp sağlayacaktır. Bu yüzden projelerinizde bu durumu önceden gözden geçiriniz.

Örneğin :
100 Bytelık bir veri bloğumuz olsun ve 10KHz bir veri okuma ile database bu bloğu yazmak istiyoruz.

1KHz = 10000Hz
Her bir kayıt için 1/10000 Hz = 0,0001 sn(saniye) lik bir zaman aralığında kayıt etmemiz gerekir ki, bu da 100 µs(mikro saniye) dir.
Normal bir kayıt için bize 10 ms(mili saniye) gerekli idi. Görüldüğü gibi veriyi oku, veritabanına yaz işlemi bu aşamada yavaş kalacaktır.

Blob veri bloğu olarak kayıt ettiğimizde 100 Byte lik veriyi depolayalım ve tek seferde 3000 veri bloğunu kayıt ettiğimizde. (3000 x 100 Byte lık bir veri blokları)

3000 x 0,0001 sn = 300 ms(mili saniye) lik bir zamanda kayıt etmeniz gerekirken, Blob ile veritabanına kayıt işlemimiz ortalama 20-30 ms(mili saniye) sürdüğünde işimizi oldukça karşılayacaktır. Yine unutulmamlıdırki 20-30 ms(mili saniye) lik veritabanına kayıt esnasında veri bloklarınızı okuyarak depolamaya devam ederek veri kaybı yaşamamalısınız.

Şimdi C#.Net ile Oracle database’inde Blob Veri kaydına örnek verelim. Blob kayıt için bir fonksiyon oluşturalım ve OracleParameter oluşturarak Insert querymizin içine tanımladığımız parametreyi gömelim.

public static bool exec_Blob(byte[] byte_test, string sql)
        {
            bool sonuc = false;
            try
            {

                string baglanti = "Data Source=BenimPC:1521/XE;user id=Deneme;Password=123456;";
                OracleConnection con = new OracleConnection(baglanti);
                con.Open();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = con;

                OracleParameter blobParameter = new OracleParameter();
                blobParameter.OracleDbType = OracleDbType.Blob;
                blobParameter.ParameterName = "BlobParameter";
                blobParameter.Value = byte_test;

                OracleCommand cmnd = new OracleCommand(sql, con);
                cmnd.Parameters.Add(blobParameter);
                cmnd.ExecuteNonQuery();
                con.Close();
                sonuc = true;
            }
            catch
            {
                sonuc = false;
            }


            return sonuc;
        }

blobParameter.ParameterName = “BlobParameter”; tanımında kullandığımız BlobParameter ismini Insert Query mizin içindeki Values kısmındada aynı ismi vereceğimizi unutmayın. 

“VALUES ( 1,’DENEME_URUN’,:BlobParameter)”

Byte_Veri ile byte türünde veri kaydı gerçekleştirmek için bir Byte Array oluşturalım ve hızlı bir aktarım için Buffer.BlockCopy ile Kaynak Datamızın içindeki 400 Byte lik veriyi Byte_Veri‘mize kopyalayalım. Veri tabanımıza Insert Query’imizi ve BlobParameter‘a yüklenecek veri bloğunu fonksiyonumuza gönderelim.

public void VeriTabanına_Yaz()
        {
            byte[] Byte_Veri = new byte[400];
            Buffer.BlockCopy(KaynakData, 0, Byte_Veri, 0, 400);

            string sql = "INSERT INTO URUN(URUN_ID,URUN_ADI,URUN_VERI) VALUES ( 1,'DENEME_URUN',:BlobParameter)";

            if (exec_Blob(Byte_Veri, sql))
            {
                MessageBox.Show("Kayıt başarılı!");
            }
            else
            {
                MessageBox.Show("Kayıt başarısız!");
            }
        }

Veri tabanında URUN tablonuzu doğru oluşturup, connectionları doğru gerçekleştirdiğinizde kayıt işlemi başarılı gerçekleşecektir.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir