none
Sql Server Resim dosyası saklamak RRS feed

  • Soru

  • Arkadaşlar herkese kolay gelsin.

    Sql Server 2008 sunucusu üzerindeki bir veri tabanına .tiff uzantılı resim dosyaları kaydedeceğim. Boyutu 10-25 MB arasında değişecek.

    1- Bu resim dosyasını byte dizisi şeklinde mi saklayayım. Yoksa Sql Server 2008 üzerinde harici dosya saklamama izin veren ekstra file yapısı var mı?

    2-Birde bu 20 MB lık dosya alıp verme işi client ile problem oluşturur mu?

    3-Eğer problem olursa local db mi kullanayım Sqlite gibi. Ana sunucuya kaydederim. Sonra clienttan sorgularım. Değişiklik olduysa gelen resim dosyasını bir klasöre kaydederim. Dosya ile ilgili bilgileri de local db ye kaydederim. Birde dışardan yeni bir veri eklendiğinde clientlara nasıl güncel bilgi gönderebilirim? SqlDependency bu işi yapar mı?

    Herşey için şimdiden teşekkürler...


    Mail Gönder


    • Düzenleyen Soner KOYLU 22 Kasım 2014 Cumartesi 23:06
    22 Kasım 2014 Cumartesi 23:05

Yanıtlar

  • Stackoverflow da dahil benim bildiğim tüm forumlarda, bir sorunun cevabı verilmişse cevap verilmiş olarak işaretleniyor. Bu gereklilikten öte, cevaplara daha çabuk ulaşılması, cevapsız kalmışların dikkat çekmesi için yapılıyor diye düşünüyorum. Şahsen benim umurumda olmadı hiç. Ben o işaretlere takılmıyorum.

    Senin sorunun cevabı başta da FILESTREAM idi şimdi de öyle (SQL server kullanmaya devam edeceksen).

     
    • Yanıt Olarak İşaretleyen Soner KOYLU 30 Kasım 2014 Pazar 11:58
    30 Kasım 2014 Pazar 11:06

Tüm Yanıtlar

  • Merhaba,

    1. Sql serverda image data tipi altında resim saklamak aslında mümkün, daha sonraları sql server 2008 r2 ile birlikte filestream denilen bir yenilik geldi, amaç .doc,.pdf vs. dosya türlerini -ki bunlara blob diyorlar- sql server üzerinde güvenli bir şekilde saklamaktı. şuradan inceleyebilirsin, http://technet.microsoft.com/tr-tr/library/bb933993(v=sql.105).aspx

    2. Eğer resimleri sqlserver üzerinde tutacaksan evet 20mblık dosyalar, server altyapına bağlı olarak client ile sıkıntılı bir süreç oluşmasında ilk adımın olabilir. 

    3. Yapmak istediğin işlem bir webprojesi mi? public bir websitesi mi? yada bir winform yazılımı mı? ya da yalnızca localde çalışacak bir yapı mı? aslında tüm bu sorular işi doğru yapman için nasıl izlemen gereken yöntemi değiştirebilir. 

    Benim önerim sql server üzerinde hiçbir zaman image dosyası tutmaman yönünde. Resimlerin urllerini sql server üzerinde tut ve bu resimleri iisuserin yetkisi altında bir klasöre uniqe isimler ile kaydet. daha sonra son kullanıcıya resimleri buradan okuyarak göster. 

    Yeni eklenen verilerden clientların bilgisi olması olayı aslında çok basit bir yöntem. Eğer bu bir masaüstü proje ise program açıldığında sql servera göndereceğin basit bir select cümlesi ile "o client" için yeni veri olup olmadığını kontrol edebilirsin. veri okundugunda ilgili kolondaki okunda değerini true yapar geçersin. Program açık kaldıgı süre içerisinde sürekli bu kontrolu yaptırman gerekliyse bu işlemi bir timer yardımıyla belirli aralıklar ile tekrar ettirebilirsin. 

    İyi Çalışmalar.


    i can change the world, just need the source code..

    23 Kasım 2014 Pazar 02:22
  • Yasin bey teşekkür ederim cevabınız için. WPF projesi ile çalışıyorum.

    Tam emin değilim. Büyük ihtimal çift veritabanı kullanacağım. Sadece 4-5 client olacak. Büyük ekranlarda resim gösterimi için yapıyorum projeyi.


    Mail Gönder


    23 Kasım 2014 Pazar 11:11
  • Soner WPF ;

    xaml;

           <GroupBox Grid.Column="1" 
    			Header="Arşiv Belge Ön izleme ..." 
    			Height="Auto"
    			Width="Auto" 
    			Grid.RowSpan="2"
    			Margin="4,4,4,5" BorderBrush="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}">
                <GroupBox.HeaderTemplate>
                    <DataTemplate>
                        <Grid Width="Auto" 
    						HorizontalAlignment="Right">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <Image Source="/Resim/Pin.png" 
    							Stretch="None" 
    							HorizontalAlignment="Left" 
    							VerticalAlignment="Top"/>
                            <Label Content="{Binding}"
    							HorizontalAlignment="Stretch" 
    							Background="#25A0DA" 
    							Height="20" 
    							Padding="5, 0, 0, 0"
    							Margin="37,8,0,8"
    							Foreground="White"/>
                        </Grid>
                    </DataTemplate>
                </GroupBox.HeaderTemplate>
                <Image x:Name="ResimShow" Stretch="Fill" Margin="2,5,2,2"/>
            </GroupBox>

    ve buda;

     var dlg = new OpenFileDialog();
                    dlg.Title = "Belgeyi Seç ..!";
                  
                    Nullable<bool> result = dlg.ShowDialog();
                    if (result == true)
                    {
                        string selectedFileName = dlg.FileName;
                        txtBelgeAdiWrite = System.IO.Path.GetFileNameWithoutExtension(selectedFileName);
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.BeginInit();
                        bitmap.UriSource = new Uri(selectedFileName, UriKind.RelativeOrAbsolute);
                        bitmap.EndInit();
                        ResimShow.Source = bitmap;
                        BalgeName.Text = txtBelgeAdiWrite;
                        FileInfo fInfo = new FileInfo(selectedFileName);
                        //long sayac = fInfo.Length;
                        //FileStream fStream = new FileStream(selectedFileName, FileMode.Open, FileAccess.Read);
                        //BinaryReader bReader = new BinaryReader(fStream);
                        //byteResim = bReader.ReadBytes((int)sayac);
                        byteResim = File.ReadAllBytes(selectedFileName);
                    }
                    else
                    {
                        byteResim = null;
                        ResimShow.Source = null;
                    }


    public byte[] byteResim = null;
    public string txtBelgeAdiWrite = null;

    kaydetme işlemi de;

    cmd.Parameters.AddWithValue("@DosyaBinary",SqlDbType.Binary).Value=byteResim;
    cmd.ExecuteNonQuery();

    en azından bir mantık verir diye düşünüyorum kolay gelsin ;

    birde çetin Beyin Bana Söylediği SQL FILESTREAM;

    Burada umarım faydalı olur;



    23 Kasım 2014 Pazar 11:43
  • Kenan abi çok teşekkür ederim. Ben bunları biliyorum. Ben şunu soruyorum. 20 mb resim dosyasını bir client tan çekmek bana ne gibi problemler yaşatır? Max 5 client olacak. Ve siz FILESTREAM kullandınız mı? Bu sadece sunucu üzerinde saklama prensibi. Sonuçta networke çıktığında yine bir data sirkülasyonu olacak. Ve programa data gelecek.

    Mail Gönder

    23 Kasım 2014 Pazar 12:14
  • Soner bende çetin beyle buna benzer konu da bana yardım istemişti ve saklanacak resimler 

    1 GB dan fazla ise FILESTREAM i önermiş di

    bende fazla araştırmadım saklanacak o kadar jpeg veya tiff vs. yoktu ama yukarıdaki link de bazı bilgiler mevcut umarım faydalı olur kolay gelsin;


    23 Kasım 2014 Pazar 12:25
  • Bugün deneyip size deneyimi anlatacağım.

    Mail Gönder

    24 Kasım 2014 Pazartesi 06:09
  • FILESTREAM

    SQL Server'da FILESTREAM attribute kullan.

    • Düzenleyen CetinBasoz 24 Kasım 2014 Pazartesi 08:55
    24 Kasım 2014 Pazartesi 08:52
  • Bana networkte veya diğer durumda faydası nedir çetin abi?

    Mail Gönder

    24 Kasım 2014 Pazartesi 11:02
  • "Yoksa Sql Server 2008 üzerinde harici dosya saklamama izin veren ekstra file yapısı var mı?"

    Dosyalari clientlarin ulasabilecegi bir yerde saklamak istemiyor musun? O zaman serverda olmalari gerekiyor. Server LAN'de degil ise, clientlara dosya erisimi vermek isteyecegini pek sanmam.

    SQL server FILESTREAM kullandiginda, dosyalar zaten harici dosyalar olarak saklaniyor. Aradaki temel fark, client acisindan o da database'in parcasi, bir field. Baska bir fieldi okumak ya da yazmak gibi.

    Senin server alt yapin N tane kullanicinin ayni anda 10-25 Mblik goruntuleri sorgulamasini kaldiramiyorsa, zaten once alt yapini gozden gecir. Hatta dil degistirmeyi (Go gibi), database degistirmeyi (MongoDb gibi) dusunebilirsin. Goruntuleri senin saklaman gerekmiyorsa, bu hizmeti verebilecek alt yapisi olan yerlerde ise dogrudan url saklarsin.

    • Yanıt Olarak İşaretleyen Burak ORDU 27 Kasım 2014 Perşembe 22:37
    • Yanıt İşaretini Geri Alan Soner KOYLU 30 Kasım 2014 Pazar 10:43
    24 Kasım 2014 Pazartesi 11:41
  • Teşekkürler,

    Enis,

    29 Kasım 2014 Cumartesi 21:55
  • Öncelikle forumdaki konular illa yanıtlanmış olarak işaretlenmeli mi? Mesela büyük forum sitelerinde(Stackoverflow) yanıtlanmamış sorular var bir çok. Konu güncelliğini yitirince hemen işaretlenmesi garip.

    WPF te yaptığım proje gayet iyi çalışıyor. 10 MB lık dosyalarda pek problem yaşamıyorum. Birkaç saniyede data aktarılıyor. Benim sakladığım byte dizileri bana ilerde problem yaşatır mı? Yoksa FILESTREAM de mi saklamam gerekiyor. Ya da ne kadar data boyutu için bu yapı önerilir?

    Teşekkürler...


    Mail Gönder

    29 Kasım 2014 Cumartesi 22:11
  • Stackoverflow da dahil benim bildiğim tüm forumlarda, bir sorunun cevabı verilmişse cevap verilmiş olarak işaretleniyor. Bu gereklilikten öte, cevaplara daha çabuk ulaşılması, cevapsız kalmışların dikkat çekmesi için yapılıyor diye düşünüyorum. Şahsen benim umurumda olmadı hiç. Ben o işaretlere takılmıyorum.

    Senin sorunun cevabı başta da FILESTREAM idi şimdi de öyle (SQL server kullanmaya devam edeceksen).

     
    • Yanıt Olarak İşaretleyen Soner KOYLU 30 Kasım 2014 Pazar 11:58
    30 Kasım 2014 Pazar 11:06
  • Stackoverflow da dahil benim bildiğim tüm forumlarda, bir sorunun cevabı verilmişse cevap verilmiş olarak işaretleniyor. Bu gereklilikten öte, cevaplara daha çabuk ulaşılması, cevapsız kalmışların dikkat çekmesi için yapılıyor diye düşünüyorum. Şahsen benim umurumda olmadı hiç. Ben o işaretlere takılmıyorum.

    Senin sorunun cevabı başta da FILESTREAM idi şimdi de öyle (SQL server kullanmaya devam edeceksen).

     
    Teşekkürler. Benim umrumda oluyor açıkçası. Çünkü bir konuda cevap olarak işaretlenen cevapları deniyorum. Bu şekilde rastgele işaretli bir cevap kimseye çözüm olmayacaktır.

    Mail Gönder

    30 Kasım 2014 Pazar 11:58