SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Ocak 2011 Cuma

SQL CE

SQL CE kolay veritabanı depolaması sağlayan ücretsiz, gömülü, veritabanı motorudur. SQL CE kullanmak için her hangi bir veri tabanı kurulumu gerektirmez. Sadece gerekli dll’ler bin dizinine kopyalanır ve uygulamanız veri tabanını motorunu kullanır. SQL CE çalışma döngüsü uygulamanın veri tabanına ilk erişim ile başlar ve uygulama kapatılınca uygulama ile birlikte kapatılır. Uygulama ile birlikte kapanan SQL CE veri tabanı otomatik olarak bellekten temizlenir.

SQL CE veri tabanı verileri dosya içinde saklamaktadır. SQL CE veri tabanını sadece dosyayı kopyala-yapıştır yaparak taşıyabilirsiniz. Dosyada verileri saklaması rağmen ASP.NET gibi çok kanallı kullanıma da uygundur. Her hangi bir çökme veya kilitlenme riski yoktur. Tüm uygulamalarda rahatlıkla kullanılabilinir.

Nasıl Kullanılır?

SQL CE kullanmak için geliştiriciler ekstra hiçbir bilgiye ihtiyaçları yoktur. Mevcut tüm .NET veri erişim metotları ile SQL CE erişimi sağlanabilmektedir. Kod geliştiriciler için en uygun veri tabanıdır. SQL CE veri tabanını kullanmak için önce Visual Studio SP 1 (beta)yı yüklemeniz gerekmektedir. Daha sonra SQL CE Tools For Visual Studio yüklemeniz gerekmektedir.

Örnek Uygulama

Örnek bir Asp.Net adres defteri uygulaması yapalım. Öncelikle boş bir Asp.Net uygulaması açalım.

Uygulamaya SQL CE Veri Tabanı Ekleme

Açtığımız boş uygulamanın App_Data dizinine SQL CE veri tabanını aşağıda ki gibi ekleyelim.

Veri tabanını ekledikten sonra projenin görüntüsü aşağıdaki gibi olacaktır.

Proje referanslarına System.Data.SqlServerCe kütüphanesi ve App_Data dizinine Sql Ce veri dosyasının eklendiğini görüyoruz. Veri tabanı ile çalışmak için gereken kütüphaneyi ve verilerin saklanacağı veri dosyasını projemize eklemiş olduk.

Eklediğimiz Sql Ce dosyasına çift tık ile içini açalım. Şimdi yeni bir tablo ekleyebiliriz.

Eklediğimiz tablolarımızın veri modelini oluşturalım ve daha sonra bu tablolara veri girelim. Örnek adres defteri uygulamamız için People tablosu oluşturdum ve tabloya deneme kayıtlarını girdim.

SQL CE Veri Yapısını Alma

Tüm SQL CE işlemlerimizi tamamladık. Artık uygulama tarafında kullanabiliriz. SQL CE veri tabanına Entity Framework ile bağlanmak için Entity Data Model ekleyelim.

Açılan ekranda “Generate from Database” seçeneğini seçip ilerleyelim. Sonra ki ekranda eklediğimiz AdressBook.sdf dosyasının seçili geldiğini göreceksiniz.

Sırada ki ekranda ekran da SQL CE veri tabanımızda ki tabloların geldiğini görüyoruz. Burada iki tabloyu da seçip sihirbazı tamamlayalım. Oluşan Entity Modeli aşağıda ki gibi olacaktır.

SQL CE ile Çalışmak

Veri tabanında oluşturduğumuz modeli uygulamamıza taşımış olduk. Şimdi veriyi ekranda göstermek gerekiyor. Uygulamanın ana sayfasına bir tane grid kontrolü ekleyelim. Grid kontrolünün DataSourceId özelliğinden “<New Data Source>” seçeneğini seçelim. Karşınıza aşağıda ki veri kaynağı ayarlama ekranı gelecektir.

Ben örnek olarak Entity Framework alt yapısını kullanmak istediğim için Entity seçeneğini işaretledim. Sonra ki sayfada projede ki veri kaynaklarının listesi gelmektedir. Oluşturduğumuz entity data modeli listeden seçelim.

Sonra ki sayfada gride hangi tabloyu bağlamak istediğimizi sormaktadır. People tablosunu seçelim.

Artık uygulamayı çalıştırıp önyüzden kayıtları değiştirebiliriz.

Sonuç

SQL CE kolayca veritabanı depolamasını etkinleştirmek için kullanabileceğiniz ücretsiz, gömülü, veritabanı motoru sağlar.

SQL CE ile yapılan çalışmaları isterseniz kolayca uygulamanın herhangi bir kodu değiştirmek zorunda kalmadan SQL Server veya SQL Azure üzerine taşıyabilirsiniz. Yapmanız gereken sadece uygulama yapılandırma dosyasında <connectionString> değerini değiştirmektir. Böylece uygulama geliştirmek için gerekli küçük gömülü veritabanı çözümü esnekliği sağlanmış olmaktadır.

31 Mart 2007 Cumartesi

Generic Oracle DataAccess Layer + Typed DataSet

Data Access Layer için manüel kodlama yapar mısınız? Yapıyorsanız hep aynı kodları yazmaktan sıkılmadınız  mı ? :) (Bulduğunuz çözüm Code Generator yazmak mıdır? Dilin nimetlerinden yararlanın derim.) SQL Server ortamında Data Access Layer için en rahat çözüm tabii ki Typed DataSet yani XSD dosyalarıdır. Typed DataSet'ler üzerinde TypedDataSetGenerator ile çok kolay bir şekilde veri tabanı üzerindeki Store Procedure, Table, View gibi nesnelere ulaşıp gerekli olan kod bloğunu üretebilirsiniz. Nasıl yapılacağını buradan öğrenebilirsiniz. 
SQL Server platformunda Typed DataSet kullanmaya alışmış ve tüm alt yapısını SQL Server üzerine kuran bir yazılımcı Oracle Platformuna geçince ne olur? Bir süre sudan cıkmış balık durumda kalır. :) En büyük veri tabanı üreticilerinden biri olan Oracle'ın .Net platformu için SQL Server kadar hızlı ve kolay bütünleşik bir kod geliştirme aracı ne yazık ki yok. VS içinde ki Server Explorer penceresinden Oracle Packet içeriklerini bile göremiyorsunuz. Odp.Net ile gelen Oracle Explorer penceresi ile ancak Oracle veri tabanınızın detaylarını görebilmektesiniz. Fakat el alışkanlığı ile burada ki nesleri sürükleyip Xsd dosyanıza bırakmak istediğinizde nesnelerin taşınamaz olduğunu görürsünüz. Google'da Oracle Typed DataSet üzerine derin araştırmalar yapıp en sonunda Oracle XSD dosyalarını bir sonra ki VS sürümünde destekleyeceğini açıklayan duyurusu ile tüm hayalleriniz yıkılır. Ama iş beklemez çözüm bulunmalı. Peki, Oracle üzerinde Typed DataSet için 'minimum kodlama ile' Data Access Layer nasıl olacak ki?
Önce DataAccesss Layer nasıl olacak? Typed DataSet kullanan programlarda çalışma mantığı: Veriyi çek, kullanıcıya işlettir ve veri tabanını System.Data.DataAdapter sınıfı ile güncelle şeklindedir. Typed Data Set kullanıyorsanız DataAccess Layer System.Data.DataAdapter nesnesinin bir uygulamasını içermek zorundadır. SQL platformunda bunu TypedDataSetGenerator yaptığı için problem yok. Oracle platformu için çözüm üretelim:

İş ihtiyacımız nedir? Oracle Packetler içinde olan Store Procedure'leri kendi projemiz içinde çağırabilmek ve Typed DataSet üzerinde kullanmak. (Zaten diğer Oracle nesnelerine VS içinden erişilmekte.) Tüm bunları sürekli aynı kodları tekrar etmeden yapmalıyız.

Çözüm: Kod tekrarı yapmamak için Generic Data Access Layer oluşturmak.  İhtiyacımız olan tüm Store Procedure'leri Typed DataTable sınıflarına attribute olarak atamak ve Generic Data Access Layer üzerinde bu attributeleri kullanarak gerekli işlemleri yerine getirmek.(Bir önceki konuda olduğu gibi bu konuda da Attribute sınıflar yardıma koşuyor.) Her zaman ki gibi kodu en üst seviyede yazmalıyız. Sürekli kendisini tekrar eden kodlama yerine en üst seviyede bir defa kod yazmak. Böylece DataAdapter nesnesine olan bağımlılı tek yerden ve kesin bir şekilde ortadan kaldırabiliriz.

Önce Store Procedure'leri tanımlayacağımız Attributeleri yazalım:

 Store Procedure Attribute sınıflarımızı Typed DataTable sınıflarımıza ekleyelim.
[cs]
[SelectProcedure("ACME.PCK_TEST.PRC_GET_ALL_TEST", "refcursor P_TEST:", DefaultSelect = true ) ] 
[SelectProcedure("ACME.PCK_TEST.PRC_GET_TEST_BY_ID","ID1",DefaultSelect=false)] 
[InsertProcedure("ACME.PCK_TEST.PRC_INSERT_TEST", "NAME1", "VALUE1", "out P_ID1 : Int32 id1")] 
[UpdateProcedure("ACME.PCK_TEST.PRC_UPDATE_TEST", "NAME1","VALUE1","ID1")] 
[DeleteProcedure("ACME.PCK_TEST.PRC_DELETE_TEST","ID1")] 
partial class TEST1DataTable 
{ 

}
Neden birden çok Select Procedure var?  DataAdapter nesnesi her bir kayıtın RowState özelliğine göre kendisine ait InsertCommand, UpdateCommand, DeleteCommand fonksiyonlarında biri kullanılarak veriyi güncelleyecektir. Bu sebebten dolayı sadece birer tane Insert, Update ve Delete Store Procedure eklenmesine izin verilmiştir. Birden cok SelectCommand gerekecektir.
Böylece artık Typed DataTable nesneleri Oracle Packet üzerinde ilişkili oldukları Store Procedure'leri bilmektedir. DataTable nesneleri için artık bir Generic DataAdapter nesnesileri oluşturabiliriz. Veri şemasını biliyoruz, veriyi veri tabanında işleyecek Store Procedure'leri biliyoruz o halde Data Access Layer üzerinde sürekli aynı kodları yazmanın gereği var mıdır? En tepeye Generic bir Data Access Layer yazar ve tüm Logic içerisinde bu sınıfı kullanırız. (İp ucu: Yerinizde olsam Base Logic sınıflarınıda Generic yapardım. Bu sayede bütünleşik ve tamamen Generic bir çatınız olur. Projelerinizi minumum kodlama ile bitebilirsiniz.
IDataService ile genel veri tabanı etkileşim ihtiyaçları ortaya konmuştur.

Bu işlemleri gerçekleştiren OracleDataService sınıfıdır ki kendisi projede tek başına Data Access Layer olmaktadır. OracleDataService sınıfı kendisine tip parametresi olarak verilen Typed DataTable nesnesinin StoreProcedure Attribute'lerini almakta ve Odp.Net ile gelen OracleDataAdapter nesnesini bu Attribute'lere göre oluşturmaktadır.
[cs]
StoreProcedureAttribute[] sps = (StoreProcedureAttribute[])table.GetType()
 .GetCustomAttributes(typeof(StoreProcedureAttribute), false); 
foreach (StoreProcedureAttribute att in sps) 
{ 
 if (att is InsertProcedure) 
  InitInsertProcedure(att.ProcedureName, att.Paramters); 
 else if (att is UpdateProcedure) 
  InitUpdateProcedure(att.ProcedureName, att.Paramters); 
 else if (att is DeleteProcedure) 
  InitDeleteProcedure(att.ProcedureName, att.Paramters); 
 else if (att is SelectProcedure) 
  InitSelectProcedure(att.ProcedureName, att.Paramters,
   (att as SelectProcedure).DefaultSelect ); 
 else 
  InitCustomProcedure(att.ProcedureName, att.Paramters); 
}
Odp.Net OracleDataAdapter nesnesine ait Commandları oluştur:
[cs]
private Oracle.DataAccess.Client.OracleCommand 
  InitStoreProcedure(string procedureName, string[] parameters) 
{ 
 Oracle.DataAccess.Client.OracleCommand command = 
  new Oracle.DataAccess.Client.OracleCommand(); 
 command.Connection = _connection; 
 command.CommandType = System.Data.CommandType.StoredProcedure; 
 command.CommandText = procedureName; 
 foreach (string parameter in parameters) 
 {
  command.Parameters.Add(InitParameter(parameter)); 
 } 
 return command; 
}
Kullanımı gayet basittir:
[cs]
Demo.Framework.Generic.Data
 .OracleDataService 
_dataAccessLayer = new Demo.Framework.Generic.Data
 .OracleDataService(); 
public Form1() 
{ 
 InitializeComponent(); 
 _dataAccessLayer.FillAll(dataSet1.TEST1); 
} 

private void tEST1BindingNavigatorSaveItem_Click(object sender, EventArgs e) 
{ 
 _dataAccessLayer.UpdateTable(dataSet1.TEST1); 
}

Değişken parametrele Store Procedure çağrılarını gene OracleDataService sınıfını kullanarak yapabilirsiniz.

Sonuç

Tüm Data Access çağrıları sürekli aynı kodların tekrarı olmaktadır. Genelde manüel kodlama ile veya Code Genetor yazmak ile  bu sıkıcı kod bloğu oluşturulmaktadır. Yukarıda ki yaklaşım ile tekrar edilen kodlardan kurtulmuş olduk. Oracle ve Typed Dataset kullanan uygulamalar için genel (ve tecrübe ile sabit yeterli) bir Data Access Layer yazmış olduk. Aynı yaklaşımı SQL üzerinde de kullanabilirsiniz hatta sadece isim uzayını ve bir iki satır kodu değiştirerek aynı sınıfı kullanabilirsiniz. Fakat ben bunun yerine SQL ortamında size doğrudan XSD dosyalarını kullanmanızı öneririm.