Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - Veritabanında Yolu Tutulan Bir Resmi Crystal Report'ta Göstermek
Kişisel Blog
 
 Tuesday, September 18, 2007

Herhalde Crystal Report hakkında forumlarda en faza sorulan sorulardan biri de veritabanında sadece yolu tutulan bir resmin raporda gösterilmesidir. Aslında sorun şurdan kaynaklanıyor; Crystal, database’de binary olarak saklanan resimleri direk gösterebiliyor ancak yolu verilen bir resmi binary formata çevirip gösteremiyor. Her ne kadar sorun olsa da çözüm imkansız da değil. Bu makalede kendi Typed Dataset’imizle bu sorunu nasıl aşacağımız anlatacağım.

Önce kendi veritabanımızı oluşturarak işe başlayalım. Ben örnekte “Oyuncular” diye bir tablo oluşturup , ünlü sinema oyunularımızla doldurdum. Bu sanatçıların resimlerini de C klasörünün altında Resimler adlı bir klasöre attım. Bu resimlerin adlarını da tabloya girdim.



Daha sonra CrystalResim adlı bir Windows Projesi oluşturdum. Form1’ime Crystal Report Viewer nesnesi ekledim.

Bir sonraki adımda bir “typed dataset” olarak oluşturup, bunu ilgili tablomuz gelecek şekilde dolduracağız ve daha sonra binary resimlerimizi ekleyeceğimiz bir sütun oluşturacağız. Bunu yapmaktaki amacımız bu dataset’i raporumuza kaynak olarak vermemiz. Adım adım bu işlemleri gerçekleştirelim:

1-      Typed Dataset’i oluşturmak için, projemizde sağ tık ve “Add New Item” seçeneğinden Dataset’i seçiyoruz. Ben ismine “MyDataSet” verdim. Bu isim önemli çünkü ileride NameSpace olarak karşımıza çıkacak.

2-      Bize boş bir ekran geliyor. İster Server Explorer’dan Oyuncular Tablosunu buraya sürükleyip bırakın, isterseniz sağ tık à “Add”  à Table Adapter seçeneğini seçip, buradaki sihirbazı takip edebilirsiniz. Otomatik olarak Visual Studio bu TableAdapter’e bir isim verecektir. (Tablo Adı + “TableAdapter” şeklinde). Bu isim önemli çünkü örneğimizin ilerleyen zamanlarında kullanacağız.  Sonuçta şu şekilde bir yapı elde etmeniz lazım:



3-      Sırada resmi binary olarak aktaracağımız sütunu eklemek var. Tablo üzerinde sağ tık à Add à Column seçeneği ile yeni bir sütun oluşturacağız. Yeni sütuna ben “BinaryResim” adını verdim. Bu işlemden sonra sütunu seçip “Properties” ekranından DataType seçeneğini System.Byte yapın. Ancak biz tek bir byte değil, byte dizisi tutacağımız için sonuna [] karakterlerini ekleyin. Yapının son hali şu şekilde olması lazım:

 

4-      Bu ekranla işimiz bitti. Projeyi bir kere derleyip bu ekranı kapatabiliriz. Derlemezseniz rapor ekranında sorun yaşayabilirsiniz.

Şimdi rapor oluşturma kısmına geldik. Projemiz üzerinde sağ tık à Add New Item à Crystal Report seçeneği ile bu işlemi gerçekleştirebiliriz. Ben rapor adına rprOyuncular dedim.  Bildiğiniz üzere bizi Crystal’ın sihirbazı karşılayacaktır. Raporu ister sihirbazla, isterseniz “As A Blank Report” seçeneğini seçip elle de yapabilirsiniz.

Sihirbazla yapacaksanız, ilk ekranda kaynak olarak  Project Data à Ado.Net Data Sets à Crystal Resim.MyDataSet (Dikkat ederseniz burasu Proje adı nokta dataset adı şekline gidiyor) à Oyuncular (Tablonun adı) seçmelisiniz.

Elle yapacaksanız Field Explorer’da Database Fields à sağ tık à Database Expert seçeneğini seçip bir sonraki adımda sihirbazdaki şablonu uygulamalısınız.

Sihirabazla devam edenler bilirler ki, bundan sonraki adım rapora dahil edilecek alanları seçmektir.  Bu ekranda BinaryResim olarak kendi oluşturduğunuz alanı göremeyeceksiniz. Sakin paniklemeyin, her şey yolunda. Sadece o sütunun tipi byte[] olduğu için listede çıkmadı. O alan yokmuş gibi rapor işlemlerinize devam edin.

Elle devam edenler ise bir problem yaşamayacaklar, çünkü tüm sütunlar karşılarında çıkacak ve sürükle bırak işlemi ile istenilen sütunları rapora atacaklardır.

Wizard ile işlemlerini tamamlayan arkadaşlar BinaryResim alanını rapora eklemek için Field Explorer’dan BinaryResim sütununu elle sürükleyip bırakacaklar, böylelikle iki üst paragrafta bahsettiğim sorunu çözeceklerdir.

DİKKAT: BinaryResim  sütununu rapora eklemezseniz resimler gözükmeyecektir. Resim adlı sütun sadece resim dosyasının adını tutuyor.

Artık raporumuz da bitti. Tek yapmamız birazcık kod yazmak. Formumuzda hatırlayacağınız gibi bir tek Crystal Report Viewer nesnesi vardı. Bu yüzden kodlarımı Form’un Load olayında yazacağız.

        private void Form1_Load(object sender, EventArgs e)

        {

            //Dataset'imizin bir instance'ını oluşturacağız (daha doğrusu sadece tablomuzu oluşturacağız)

            myDataset.OyuncularDataTable oyuncularTablo = new myDataset.OyuncularDataTable();

 

            //Datatable'ımızı dolduracak TableAdapter'i de oluşturuyoruz

            myDatasetTableAdapters.OyuncularTableAdapter oyuncularTableAdapter = new CrystalResim.myDatasetTableAdapters.OyuncularTableAdapter();

 

            //Verilerle dolduruyoruz

            oyuncularTableAdapter.Fill(oyuncularTablo);

 

            //!!!!İşin can alıcı noktası burada. DataTable'daki her satırı dolaşarak Resim alanındaki resmin binary

            //halini BinaryResim alanına aktarıyruz

            foreach (DataRow dr in oyuncularTablo.Rows)

            {

                byte[] resim= System.IO.File.ReadAllBytes(@"c:\Resimler\" + dr["Resim"].ToString());

                dr["BinaryResim"] = resim;

            }

 

            //Rarpoun bir instance'ını oluşturuyoruz

            rprOyuncular oyuncularRapor = new rprOyuncular();

 

            //Raporun kaynağını datatable'ımız olarak veriyoruz

            oyuncularRapor.SetDataSource(oyuncularTablo as DataTable);

 

            //ve en son formda görmek için Crystal Report Viewer nesnemizi rapora bağlıyoruz

            this.crystalReportViewer1.ReportSource = oyuncularRapor;

 

        }

Bu kadar!!! Artık tek yapmanız gereken projeyi çalıştırmak. Görünüm şu şekilde olacaktır:

 

Bir makalenin daha sonuna geldik. Umarım raporlarda resim göstermekte zorlanan arkadaşlar için yararlı olmuştur. Tüm görüş, düşünce ve sorularınız için çekinmeden yalcin.uzun@bilgeadam.com ‘a mail atabilirsiniz.

 

Projeyi, resimleri ve veritabanını indirmek için : CrystalResimMakale.rar (211,22 KB)
Tuesday, September 18, 2007 5:51:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
Name
E-mail
Home page

Comment (HTML not allowed)  

Enter the code shown (prevents robots):

Copyright © 2008 Yalçın Uzun