Makale Özeti

Bu makalemizde System.Data.SqlServerCe referansı altında uygulama geliştiricilere sunulan SqlCeEngine sınıfını mercek altına alacağız.

Makale

Sql Server 2005 Compact Edition uygulama geliştiricilerin beğenisine sunulduğunda birçok yenilikle sahneye çıkmıştı. Bunlardan en önemlisi Sql Server 2005 Compact Edition artık Mobil Cihaz’ lardan sonra Masaüstü uygulamalarında da kullanılabilecekti.

Performans, optimizasyon, birlikte çalışılabilirlik gibi özelliklerini incelediğimizde Basit ve Lokal Veri Depolama senaryolarında Sql Server 2005 Compact Edition çok doğru bir seçenek olacaktır. Bu noktada geliştirilen uygulamaların Sql Server 2005 Compact Edition (bu noktadan sonra Sql CE olarak anılacaktır)veri depolama altyapısı üzerinden programlanabilmesi için managed kod uygulama geliştiriciler sistemlerine Sql CE yükleme paketini kurmaları gerekmektedir. Bu kurulum ile birlikte sistemimize managed Windows Masaüstü ve Mobil Cihaz uygulamalarında kullanabileceğimiz System.Data.SqlServerCe ismi ile kullanabileceğimiz bir referans yüklenmektedir.

Bu referans üzerinden uygulama geliştiriciler tam Sql Server 2005 Compact Edition entegre çalışan uygulama geliştirebilir ; üzerinde aktif olarak çalışıyor oldukları veritabanı üzerinde veri bazlı ve yönetimsel seviyede işlemler gerçekleştirilebilirler. Bu makalemizde bu referans üzerinden uygulama geliştiricilerin kullanımına sunulan ; Sql Server 2005 Compact Edition uygulama geliştirme senaryolarında en temel sınıf olarak kabul edilen bir sınıfı ; SqlCeEngine sınıfını mercek altına alacağız.

SqlCeEngine sınıfı temel anlamda adından da anlaşılabileceği üzere bir Sql Server 2005 Compact Edition motorunu ifade etmektedir. Buradaki motor kelimesinden çıkarmamız gereken anlam temel yönetimsel işlemler gerçekleştirebilecek bir sınıf olarak ifade edilebilir. Genel hatlarıyla sınıfın elemanlarına bakacak olursak ;

listenin çokta karmaşık olmadığını rahatlıkla farkedebiliriz. Metotların ne işe yaradığını teorik olarak anlatmaktansa mobil bir cihaz üzerinde geliştireceğimiz küçük bir örnek bu noktada daha yararlı olacaktır. Örnek .NET Compact Framework 2.0 yüklü Windows Mobile 5.0 işletim sistemine sahip bir Pocket PC cihazı hedef alınarak geliştirilecektir. Bunun için sisteminizde Windows Mobile 5.0 SDK’ nın kurulu olması gerekmektedir.

İlk olarak işe yeni bir Mobil Windows Projesi açarak başlıyoruz.

Bir sonraki adımda makalemizin temel konusu olan sınıfımızın bulunduğu referansı ; System.Data.SqlServerCe referansınızı projemize referans olarak ekliyoruz.

Referansı projemize ekledikten bir sonraki adımda uygulamamızı geliştirmeye hızlı bir şekilde devam edelim. Bu noktadaki amacımız yukarıda ifade ettiğimiz üzere bu referans içerisinde bulunan SqlCeEngine sınıfının metotlarını ve temel amacını mercek altına almak olacaktır.

Hızlı bir şekilde örneğimize devam edelim. Genel hatlarıyla sınıfımızı incelediğimizde yapının nasıl çalıştığını Constructer’ ı üzerinden rahatlıkla anlayabiliriz. Sınıfın Instance’ ını almak istediğimiz zaman karşımıza 2 farklı overloaded constructer çıkmaktadır.

Bunlardan ilki kullanıcıdan herhangi bir parametre istemez iken ikincisi kullanıcıdan mobil cihazınız üzerinde fiziksel olarak bulunan ya da bulunacak olan veritabanına bağlantı kurulacağı noktada kullanılacak olan bir bağlantı cümleciği istemektedir. Bağlantı cümleciği içerisinde kullanabileceğimiz tüm parametrelerin listesini http://msdn2.microsoft.com/en-us/library/system.data.sqlserverce.sqlceconnection.connectionstring.aspx adresinden ayrıntılı bir şekilde inceleyebilirsiniz. Örneğimiz üzerinde Mobil Cihazımızın kök klasörü içerisinde bulunan Yazilim.sdf isimli veritabanına bağlantı kuracağız. Bu noktada bu veritabanının fiziksel olarak olmadığını ; sınıfımız içerisinde belirttiğimiz bağlantı cümleciği yardımı ile oluşturulacağını birlikte uygulayacağız. Yapıcı metot içerisine Bağlantı Cümlesi parametresini şekildeki gibi göndererek bir SqlCeEngine objesi oluşturuyoruz.

Şekilde görüldüğü üzere herhangi bir Kullanıcı Adı / Şifre kombinasyonu belirtilmemiştir ki bu noktada veritabanımızın güvenliği çokta yüksek değildir.

Mantık çerçevesinde baktığımızda bu sınıfı kullanarak gerçekleştireceğimiz yönetimsel işlemleri gerçekleştirebilmemiz için ilk aşamada veritabanımızın fiziksel olarak oluşturulmuş olması gerekmektedir. Bu noktada ilk olarak SqlCeEngine sınıfı içerisinde karşımıza çıkan CreateDatabase() metodu üzerinde örneğimizi uygulamaya devam edelim.

Metot adından da anlaşılabileceği üzere SqlCeEngine objesi içerisinde belirtilmiş olan bağlantı cümleciği içerisindeki patikadaki veritabanını fiziksel olarak oluşturmaya yaramaktadır. Uygulamamızı hiç vakit kaybetmeden çalıştırıyoruz :

Uygulama ekranı açıldığında boş bir form görüyor olmamız gerekmektedir. Fakat uygulamamızı kapatıp mobil cihaz üzerinde belirtilen patika içerisine baktığımızda :

veritabanı dosyamızın başarılı bir şekilde oluşturulduğunu rahatlıkla görebiliriz. Veritabanımıza mobil cihazımız üzerine yüklenen Query Analyzer uygulaması üzerinden bağlantı kurup basit bir tablo ve birkaç satır bilgi ekliyoruz.

Yeni bir tablo ve birkaç satır bilgi ekliyoruz.

Ve bilgiler ;

Run butonuna tıkladığımıza ekran 1 satırın eklendiğine dair mesaj görüntülenecektir. Bu noktadaki amacımız minimal düzeyde bile olsa veritabanımızın içerisinde bilgilerin bulunuyor olmasıdır.

Hızlı bir şekilde sınıfımızın içerisinde bulunan metotları incelemeye devam edelim. SqlCeEngine sınıfı içerisinde herhangi bir t zamanında veritabanının fiziksel dosyasının tutarlılığını inceleyebilmek amacı üzerine kullanabileceğimiz faydalı bir metot bulunmaktadır. Bu metot üzerinden veritabanı içerisindeki “sayfa” ların tutarlılığını belirleyebilir, bir sonraki başlık içerisinde inceleyeceğimiz Repair metodunun gereksinimini belirleyebilirsiniz. Şekildeki kod bloğu üzerinden makalemize devam ediyoruz.

Verify metodunu çalıştırarak fiziksel veritabanı dosyası içerisindeki tutarlığı denetliyoruz. Tutarsız bir durum ile karşı karşıya kalındığında ise Verify metodu uygulama geliştiriciye false değerini döndürmekte ve Repair metodunu kullanmasını gerektiğini söylemektedir. Uygulamayı çalıştırıyoruz :

Veritabanımızın fiziksel anlamda herhangi bir tutarsızlık sorununun olmadığını rahatlıkla anlayabiliriz. Peki ya bu metot sonucunda false boolean değerini elde etmiş olsaydık problemin önüne nasıl geçebilecektik ? Problemin çözümüne geçmeden önce değerin false gelmesinin sebepleri üzerinde kısaca değinmek daha faydalı olacaktır.

Konuyu kısaca ifade etmek gerekirse Verify metodunun false değerini kullanıcıya döndürmesi veritabanının fiziksel dosyası içerisinde hesaplanan Checksum değerlerinin tutarsız olduğunu ; haliyle veritabanı içerisindeki Datapage’ lerin herhangi bir tanesinde bir problem olabileceği anlamına gelmektedir. Sistemin bu şekilde çalışması riskini göze almayacak isek çözüme ulaşmamız için tek bir yöntem bulunmaktadır ; Repair() .

Repair metodu SqlCeEngine sınıfı içerisinde uygulama geliştiricilerin kullanımına gelen ; bu tip tutarsızlık senaryolarında fiziksel veritabanı dosyasını eski haline dönüştürmeye yarayan hayat kurtarıcı bir metot olarak kullanılmaktadır. Senaryomuzda hata olmamasına rağmen Repair metodunun kullanımını kısa bir örnekle açıklamak bu noktada daha doğru olacaktır.

Şekilden anlaşılacağı üzere Repair metodu kullanıcıdan iki adet parametre istemektedir. Bunlardan ilki ConnectionString. ConnectionString parametresinin istenmesinin sebebi “tamir edilmiş” veritabanının bozuk veritabanı dosyasından farklı bir lokasyonda olmasını isteyen uygulama geliştiriciler için metoda parametre olarak eklenmiştir. Eğer “tamir edilmiş” veritabanının aynı lokasyonda ; yani varolan veritabanının üzerine yazılmasını istiyorsak bu parametreye null değer vermek yeterli olacaktır. Bu noktada bir sonraki parametre değerine bakacak olursak RepairOption adını verdiğimiz bir enum değeri kullanıcıdan istenmektedir. Bu enum değerinin istenmesinin amacı ise “tamir edilme” işlemi esnasında bulunan bozuk bölgelere nasıl bir işlem gerçekleştirileceğidir.

Bu enum listesindeki değerler şekildeki gibi oluşturulmuştur ;

Enum listesi içerisinde bulunan değerleri bu noktada kısaca açıklamak faydalı olacaktır.

DeleteCorruptedRows enum değerini belirleyerek Repair() metodu çalıştırıldığında SqlCeEngine objesi “bozuk” veritabanı dosyası içerisinde bulduğu “sorunlu” DataPage’ leri düzeltmeye çalışmadan silecektir. Bir diğer seçenek olan RecoverCorruptedRows seçeneği ise ilk seçeneğin aksine bozuk bulduğu DataPage’ leri düzeltmeye çalışarak eski haline getirecektir. Biz ikinci seçeği seçecek şekilde metodumuzu çalıştırıyoruz.

Bu metot çalıştırıldığında dosyanın fiziksel olarak bulunduğu noktada aynı isimle “tamir edilmiş” versiyonu otomatik olarak oluşturulacaktır.

Makalemize ; SqlCeEngine sınıfının diğer metotlarını inceleyerek devam edelim. Şu ana kadar üzerinde çalıştığımız metotların neredeyse hepsi standart olarak “olmazsa olmaz” metotlar olarak ifade edilebilir. Sırada yine olmazsa olmaz olarak ifade edebileceğimiz ; masaüstü uygulamalarında Sql Server’ ın normal sürümlerini kullanan uygulama geliştiricilerin yakından tanıdığı bir kavramı yerine getiren bir metot ile devam edelim ; Shrink(). Shrink kavramı standart Sql Server sürümleri üzerinde “veritabanının kullanılmayan alanlarını makaslayarak yerden tasarruf” olarak ifade edilebilecek sık gerçekleştirilen bir eylemdir. Bellek miktarı açısından yetersiz olan Mobil Cihazlar üzerinde kullanılmasının ise bu noktada çok doğru olduğu açıktır. SqlCeEngine sınıfı içerisinde bulunan Shrink metodu üzerinden uygulama geliştiriciler veritabanının kullanılmayan alanlarını makaslatarak yerden tasarruf sağlayabilirler. Şekildeki kod satırını ekleyerek uygulamamıza devam ediyoruz :

Sırada SqlCeEngine sınıfı içerisinde “önemli” olarak incelenebilecek son bir metot daha var ; Compact(). Compact metodu yapısı gereği fiziksel veritabanı dosyamızın “adresi “ verilen noktada verilen “yeni” özellikleriyle “gereksiz boşlukları temizledikten sonra” tekrar oluşturulmasını sağlamaktadır. Bu noktada cümle içerisinde geçen “yeni özellikler” kavramını biraz açmak daha doğru olacaktır.

Birçok zaman fiziksel veritabanı dosyamızı (*.sdf) Şifre gibi bazı özellikleri belirlemeyerek oluşturmuş olabiliriz. Bu durum, bundan sonraki kullanımlarımızda veritabanımızın bu şekilde kullanılacağı anlamına gelmemektedir.

Konu ile nasıl bir ilişki var diye araştırdığımızda Compact metodu içerisine aldığı ConnectionString parametresi ile aslında bir nevi “veritabanımızın tüm özellikleriyle” yeni halini oluşturmaktadır. Daha ayrıntılı açıklamak gerekirse Compact metodunun ilk parametresinde verdiğimiz ConnectionString değeri içerisinde Şifre bilgisi bulunıyor ise, veritabanımızın yeni hali bu özelliğe sahip bir şekilde oluşturulacaktır.

Kodu şekildeki gibi çalıştırdığımızda Kök Klasör içerisinde YazilimYeni.sdf ismiyle, sadece“eknozcckcLr” şifresi kullanılarak bağlantı kurulabilecek bir veritabanı oluşturulmuş olacaktır.

Şifre bilgisini belirtmeden bu veritabanına bağlantı kurmaya çalıştığımızda ise :

Çağırılan ilk metot üzerinden şekildeki hatayı alacağız.

Bu makalemizde SqlCeEngine sınıfına ayrıntılı bir şekilde değindik. Bir sonraki makalede görüşmek üzere.


Ekin ÖZÇİÇEKÇİLER
Microsoft Certified Trainer
ekin.ozcicekciler@bilgeadam.com
MCP, MCAD.NET, MCSD.NET, MCSD.NET, MCTS, MCPD Ent.