Showing posts with label Database. Show all posts
Showing posts with label Database. Show all posts

Saturday, May 14, 2022

Generating GUID in excel using macro

For some reason, you may need to generate GUID in an excel document. For me, because of using GUID as primary keys in database, I have needed to generate insert scripts and GUIDs as primary keys. First of all you need to activate developer options of excel. After that, you are able to write macros. Finally, create a module and create function given below:

Function createguid()
Dim guid As String
guid = CreateObject("WScript.Shell").Exec("powershell -command [guid]::newGuid().ToString()").StdOut.ReadAll
createguid = Application.WorksheetFunction.Clean(guid)
End Function
In this approach, powershell is used for GUID generation. You can use this function in formulas after creation. Only drawback of this method is powershell console is opened and closed as many as generated GUIDs. 

Thursday, December 13, 2018

ProjectBase ile Transaction Üzerinden Dış Veri Erişim Yapıları ile Entegrasyon (Entity Framework 6 Örneği)

ProjectBase (PB) kütüphanesi veri erişim mantalitesi olarak ORM (Object Relational Mapping) ile provider seviyesi arasında bir konumda bulunmaktadır. PB dış bir veri erişim yapısı ile beraber kullanılmak istendiğinde ortak transaction kullanım gerekliliği doğabilmektedir. Örneğin ORM olarak Entity Framework 6 (EF) kullanıyoruz ve bazı işlemleri EF ile bazılarını PB ile yapacağız fakat bu işlemlerin aynı transaction üzerinde yapılması gerekmekte. Bu durumda EF üzerinde aşağıdaki kod ile bir transaction başlatabiliriz:

DataBaseContext context = new DataBaseContext();
DbTransaction transaction =  context.Database.BeginTransaction().UnderlyingTransaction

Burada elde ettiğimiz transaction nesnesi veri tabanı bağlantısı açık ve işlem yapmaya hazır olan bir nesnedir. Bu işlemden sonra bu transaction nesnesini PB de kullanabiliriz:

IDatabase2 db = DatabaseFactory.GetDbObject(DbSettings.TransactionMode);
db.UseExternalTransaction(transaction);

Buradan sonra PB ile yaptığımız işlemler EF ile oluşturduğumuz transaction üzerinden yapılacaktır. Normal EF kullanımından farklı olarak EF 6'da transaction bu yazıda bahsettiğimiz yöntemle başlatıldığında Commit edilmesi gerekmektedir:

context.Save();
context.Database.CurrentTransaction.Commit();

Bu işlem sırasında aşağıdaki hususlara dikkat edilmesi gerekir:

1. Dışarıda oluşturulan transaction geçerli bir durumda olmalı ve veri tabanı bağlantısı açık olmalıdır.
2. PB ile Commit veya RollBack yapıldığında PB sıralı yeni işlemleri yeni transaction kullanarak yapacaktır. Yani mevcut transaction geçerliliğini yitirecektir.
3. Bu işlem yapılırken PB transaction modda çalışır durumda olmalıdır.

Sunday, March 18, 2018

ProjectBase (PB) ile Asenkron Programlama - Asynchronous Programming with ProjectBase (PB)

PB v4.0.0-beta ile veri tabanı işlemlerinin asenkron olarak yapılabilmesi amacıyla PB içine asenkron mimari eklendi. Asenkron programlama (AP) .NET 4.5 ile ortaya çıktığı için PB'nin kullanılması için minumum .NET 4.5 kullanılması gerekmektedir. AP'de yapılacak yan işler ana işten ayrılarak asenkron bir şekilde halledilmekte ve ana işin bu yan işler sebebiyle meşgul edilmesi engellenebilmektedir. AP bir çok amaçla kullanılabilmekle beraber Forms uygulamalarında UI (User Interface) thread, yani arayüz elemanlarını oluşturan thread, genellikle ana thread olmakla beraber tamamlanması uzun işlerde bu thread uzun süre meşgul edilirse arayüzün cevap vermemesine neden olmaktadır. Ayrıca form yapısında bir arayüz elemanını oluşturan thread'den başka bir thread bu elemana ulaşmaya kalkıştığında ön tanımlı (default) olarak uygulama hata verecektir. AP form uygulamalarında kullanıldığında UI thread sürekli meşgul edilmediği için arayüz sürekli aktif kalacaktır.

AP ayrıca işi birden fazla Thread olarak yaptığı için bu işlerin işlemcilere dağıtımı kolay olmakta ve işlemci sayısına göre hız kazanımı elde edilebilmektedir.

Bu amaçla bu yazıda PB v4.0.0-beta kullanan bir örnek form uygulaması hazırlandı. Burada PB'nin kodlarını Github üzerinde indirip ilgili fonksiyonları Thread.Sleep() fonksiyonu kullanıp geciktirerek AP'nin etkisini daha rahat gözlemleyebilirsiniz. Oluşturulan forms arayüzü aşağıda verilmiştir:



Arayüzde 2 tane GridView, bir button ve bir label kullanılmıştır. DOLDUR tuşuna basıldığında label üzerine yazı yazılmadan önce veri çekme işlemleri başlatılmakta, yazı yazdırılmakta ve veriler GridView'lar içine yüklenmektedir. GridView'lar içine veriler kendi aralarında da eş zamansız yüklendiği için aynı anda yüklenmemektedir. Bu işlemler esnasında arayüz sürekli cevap verir durumda olacaktır.

PB v4.0.0-beta bağlantı yönetimini (Connection Management) eş zamansız (asenkron) yapmamaktadır. Yani bağlantı işlemleri gerçekleştirmek için işlemleri yürüten ana thread kullanılmaktadır. Bu yüzden bağlantı sırasında kısa süreli bir meşguliyet meydana gelebilmektedir. Aşağıda forms uygulamasının kodları verilmiştir:


public class EMPLOYEE
{
    public string FIRST_NAME { get; set; }
    public string LAST_NAME { get; set; }
    public decimal SALARY { get; set; }
    public DateTime? HIRE_DATE { get; set; }

}

private async void BtIslem_Click(object sender, EventArgs e)
{
    string sql = "select * from employees";
    string sql2 = "update employees set first_name = 'VELI YIGIT' where employee_id = 101";

    var db = DatabaseFactory.GetDbObjectAsync(DbSettings.ManuelConnectionManagement);

    var task = db.GetObjectListAsync(sql);
    var task2 = db.ExecuteQueryAsync(sql2);
    var task3 = db.GetObjectListAsync(sql);

    LbBilgi.Text = "Verilerin gelmesini beklememe gerek yok!";

    GwData.DataSource = await task;
    await task2;
    GwData2.DataSource = await task3;

    db.CloseConnection();
}

Tuşun basılma (click) olayında (event) "async" anahtar kelimesi ile asenkron kod içerdiği belirtilmektedir. Asenkron işlemlerin sonuçları "await" anahtar kelimesi kullanılarak beklenmektedir. Bir noktada await kullanıldı ise ana thread beklenen işlem sonuçlanana kadar alt satırları işlememektedir. Yukarıdaki kod bloğunda görüldüğü üzere 2 veri çekme işlemi ve bir güncelleme (update) işlemi asenkron olarak başlatılmaktadır. Label üzerine yazı yazdırıldıktan sonra (bu arada veritabanı işlemleri asenkron olarak devam etmekte), daha sonra sonuçlar beklenerek ilgili arayüz elemanları güncellenmektedir. Bu bekleme işlemi sırasında ana thread bloklanmadığı için arayüz sürekli cevap verir durumda olacaktır.

Burada bir diğer önemli nokta "Manuel Connection Management" modunun kullanılmasıdır. Otomatik yönetimde yan thread bağlantıyı diğerleri işlemler sonuçlanmadan kesebilmekte ve bu durum işlemlerin hatalı sonuçlanmasına neden olabilmektedir. Bu sebeple AP kullanılacak ise Manuel mod veya Transaction mod kullanılması gerekmektedir.

Bütün veritabanı işlemleri sonuçlandıktan sonra bağlandı kesilmektedir.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

 "https://github.com/vyigity/ProjectBase"


Saturday, December 16, 2017

ProjectBase kütüphanesi ile evrensel (global) parametre kullanımı

ProjectBase (PB) v2.5.0 ile birçok QueryGenerator (QG) sıkıntısı çözüldü ve global parametre özelliği kütüphaneye eklendi. Eski usülde parametre kullanımları eğer veri tabanı bağımsız tanımlanmak isteniyorsa FilterText özelliği içinde verilmeliydi. Bu yöntemde eğer parametre karakteri veri tabanı ile uyumsuz ise değiştiriliyordu. Bu yöntem lokal parametre kullanımı olarak tanımlanmaktadır. Global parametre kullanımında parametre SelectText, FilterText veya SelectTail içinde kullanılabilmektedir. Bu özellik ayrıca karmaşık sql komutlarının parametrik olarak QG tarafından işlenebilmesine de olanak sağlamaktadır. Aşağıdaki örneği inceleyelim:

var db = DatabaseFactory.GetDbObject();
var gen = QueryGeneratorFactory.GetDbObject(ParameterMode.Global);

string sql = @"
               select * from employees e
                            
               where e.employee_id =
 
               (select max(employee_id) from employees 
                where salary > .p.SALARY and commission_pct > .p.COMMISSION)
              ";

gen.SelectText = sql;
gen.AddFilterParameter("SALARY", 8000);
gen.AddFilterParameter("COMMISSION", 0.1d);

var dt = db.ExecuteQueryDataTable(gen.GetSelectCommandBasic());

Burada karmaşıklığı artırmak için iç içe select cümlecikleri kullandık ve iç cümleciğe parametrik olarak bir değer gönderdik. Global parametre tanımında parametre tanımlaması ".p." prefiksi kullanılarak yapılmaktadır. Örnekte gösterildiği gibi "SALARY" isimli parametre ".p.SALARY" olarak tanımlanmıştır. Neden ".p." gibi bir şey prefiks olarak tercih edildi diye soracak arkadaşlar için burada karmaşık bir derleyiciye sahip olmadığımız için örüntü (pattern) olarak yazılabilecek sql cümlecikleri içinde en az denk gelebilecek bir yapıyı tercih etmemiz gerekiyordu diye soruyu cevaplayabilirim. Yukarıdaki kod çalıştırıldığında sonuç DataTable olarak elde edilecektir.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

 "https://github.com/vyigity/ProjectBase"

Monday, October 16, 2017

ProjectBase ile DataTable Yerine Önceden Tanımlı Nesne Kullanarak Veri Çekme (Tip Belirtimli - Typed)

Daha önceki yazılarda DataTable üzerinde veri çekme örneği yapmıştık. DataTable ile yapılan işlemler "Typed" yani belirli türlü olmadığı için kodlamayı zorlaştırmaktadır. Şimdi kendi oluşturduğumuz bir sınıfa ait nesneyi verileri tutmak için kullanacağız. Yine "EMPLOYEES" tablosunu kullanalım ve önce sınıfı aşağıdaki gibi oluşturalım:

public class EMPLOYEE
{
    public string FIRST_NAME { get; set; }
    public string LAST_NAME { get; set; }
    public decimal SALARY { get; set; }
    public DateTime? HIRE_DATE { get; set; }

}

Burada dikkat edilmesi gereken husus yazacağımız sorgudan gelecek olan sütun isimlerinin "Property" isimleri ile eşleşmesidir. Eşleme büyük-küçük harfe duyarlı değildir. Şimdi bu sınıfı kullanacak veri çekme kodlarını yazalım:

var db = DatabaseFactory.GetDbObject();
var gen = QueryGeneratorFactory.GetDbObject();

gen.SelectText = "select * from employees where employee_id < 112";

List<EMPLOYEE> employees = db.GetObjectList<EMPLOYEE>(gen.GetSelectCommandBasic());

Yukarıdaki kod çalıştırıldığında id numarası 112'den küçük kayıtları yazdığımız sınıfın bir listesi olarak elde edeceğiz.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

"https://github.com/vyigity/ProjectBase"

Sunday, October 15, 2017

ProjectBase Data Access and Utility Library - ProjectBase Veri Erişim ve Yazılım Destek Kütüphanesi

ProjectBase (PB) is a Utility and Data Access library. PB designed with a database independent interface oriented approach to ensure extentibility and reliablity. PB's codes can be changed or manipulated easily. PB can be installed with nuget package manager console:
PM> Install-Package vyigity.ProjectBase -Version 4.0.0

PB has 3 type of data access:
  • Automatic Connection Management: Using single connection object and while executing a command, connection is opened and closed automatically.
  • Manuel Connection Management: Using single connection object and connection is opened and closed by developer manually.
  • Transaction Mode: PB supports PL/SQL type code writing of transactional processes. PB creates transactions and manages them automatically.
PB currently supports Oracle (Managed-Unmanaged Provider), SQL Server databases and OleDb. PB supports MySql provider with v2.0.0 and PostgreSQL provider with v3.0.0.
Also PB supports low level object mapping features.

Project Adress:
For introduction:
For connection management examples:
For transactions examples:
For DML examples:
For parametric database procedures and functions examples:

ProjectBase ve QueryGenerator ile Veri Tabanı Prosedür İşlemleri

QueryGenerator ile veri tabanı prosedür veya fonksiyonlarına erişmek için öncelikle örnek veri tabanı fonksiyonlarını oluşturalım:

FUNCTION "GETUSERNAME" (
  "PARAM1" IN NUMBER) RETURN varchar2 IS

  RETURN_VAL varchar2(150);

BEGIN 

  select FIRST_NAME ||' ' || LAST_NAME into RETURN_VAL from employees where employee_id = PARAM1;
  
  RETURN RETURN_VAL;

END;


FUNCTION "GETSALARY" (
  "PARAM1" IN NUMBER) RETURN number IS

  RETURN_VAL NUMBER;

BEGIN 
  
  select SALARY into RETURN_VAL from employees where employee_id = PARAM1;

  RETURN RETURN_VAL;

END;

Yukarıda string değer döndüren "GETUSERNAME" ve decimal değer döndüren "GETSALARY" fonksiyonlarını oluşturduk. Aşağıda gibi bu fonksiyonları .NET projemiz içinde kullanabiliriz:

var db = DatabaseFactory.GetDbObject();
var gen = QueryGeneratorFactory.GetDbObject();

gen.ProcedureName = "GETSALARY";
gen.AddDataParameter("RETURN_VAL", DbType.Decimal, null, 150, System.Data.ParameterDirection.ReturnValue);
gen.AddDataParameter("PARAM1", 100);

db.ExecuteQuery(gen.GetProcedure());

var return_val = gen.GetParameterValue("RETURN_VAL");

string gen2 = QueryGeneratorFactory.GetDbObject();

gen2.ProcedureName = "GETUSERNAME";
gen2.AddDataParameter("RETURN_VAL", DbType.String, null, 150, System.Data.ParameterDirection.ReturnValue);
gen2.AddDataParameter("PARAM1", 100);

db.ExecuteQuery(gen2.GetProcedure());

decimal return_val2 = gen2.GetParameterValue("RETURN_VAL");

Yukarıda görüldüğü üzere QueryGenerator ile standart bir kod arayüzü ile fonksiyon ve prosedür erişimleri yapılabilmektedir.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

"https://github.com/vyigity/ProjectBase"

Saturday, October 14, 2017

ProjectBase ile QueryGenerator kullanarak parametrik DML işlemleri

"QueryGenerator" (QG) standart olarak parametrik veri tabanı işlemlerini gerçekleştirilmesi sağlayan sınıftır. Parametrik işlemler SQL injection gibi güvenlik açıklarına karşı kesinlikle tercih edilmesi gereken bir yöntemdir. Parametrik işlemlerde kullanılan ve sql texti içinde yer alan bir sözün parametre olup olmadığının anlaşılmasını sağlayan ve verita banına göre değişebilen bazı karakterler vardır. Bunlar SQL Server veri tabanı için "@", Oracle veri tabanı için ":" karakterleridir. Örneğin SQL Server içi parametre yazılacaksa "@Param" şeklinde, Oracle için yazılacaksa ":Param" şeklinde yazılır. QG sınıfı standart olarak ":Param" şeklinde yazılacak şekilde hazırlanmıştır.

Aşağıdaki kod bloku ile QG ile nasıl veri çekilebileceği gösterilmiştir:

var gen = QueryGeneratorFactory.GetDbObject();
var db = DatabaseFactory.GetDbObject();
string sql = "select * from employees where employee_id = :ID";

gen.SelectText = sql;
gen.AddFilterParameter("ID", 100);

var dt = db.ExecuteQueryDataTable(gen.GetSelectCommandBasic());

Yukarıdaki örnekte görüldüğü üzere ":ID" parametresi ile bir filterparameter oluşrulmuş ve 100 id numaralı kişinin bilgileri çekilmiştir.

QG ile Update ve Insert işlemleri de kolaylıkla yapılabilmektedir. Aşağıdaki kod bloğunda 101 id numaralı kişinin bilgileri güncellenmiştir:

var db = DatabaseFactory.GetDbObject();
var gen = QueryGeneratorFactory.GetDbObject();
gen.TableName = "EMPLOYEES";
gen.AddDataParameter("FIRST_NAME", "VELI YIGIT");
gen.AddDataParameter("LAST_NAME", "YOLCU");
gen.AddFilterParameter("Param1", 101);
gen.FilterText = "WHERE employee_id = :Param1";

db.ExecuteQuery(gen.GetUpdateCommand());

Yukarıdaki kod bloğundan anlaşıldığı üzere sadece değiştirilecek alanların parametre olarak eklenmesi yeterlidir. Gerekli update komutu QG tarafından oluşturulmaktadır. Burada dikkat edilmesi  gereken nokta filtre içinde yer alan parametreler "FilterParameter" olarak eklenmelidir.

QG ile Insert işlemi aşağıdaki gibi yapılabilmektedir:

var db = DatabaseFactory.GetDbObject();
var gen = QueryGeneratorFactory.GetDbObject();
gen.TableName = "EMPLOYEES";
gen.AddDataParameter("EMPLOYEE_ID", "300");
gen.AddDataParameter("FIRST_NAME", "VELI YIGIT");
gen.AddDataParameter("LAST_NAME", "YOLCU");
gen.AddDataParameter("EMAIL", "vyigity@deneme.com");
gen.AddDataParameter("HIRE_DATE", new DateTime(2017,10,14));
gen.AddDataParameter("JOB_ID", "SH_CLERK");

db.ExecuteQuery(gen.GetInsertCommand());

Update komutuna benzer olarak Insert komutunda da eklenecek alanların DataParameter olarak eklenmesi yeterlidir.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

"https://github.com/vyigity/ProjectBase"

Sunday, October 8, 2017

ProjectBase ile Veri Tabanı Bağlantı Türlerine Göre İşlemler

ProjectBase "TransactionMode" dışında bağlantı kontrolüne göre 2 yöntem içermektedir. "ManuelConnectionManagement" ile veri tabanı işlemleri şöyle yapılabilmektedir:

IDatabase2 db = DatabaseFactory.GetDbObject();
db.ExecuteQuery("update employees set salary = 3000 where employee_id = 100");

//Yeni veri tabanı bağlantısı kuruldu
//salary = 3000 oldu
//Bağlantı kesildi

db.ExecuteQuery("update employees set salary = 24000 where employee_id = 100");

//Yeni veri tabanı bağlantısı kuruldu
//salary = 24000 oldu
//Bağlantı kesildi

Yukarıdaki kod örneğinde gösterildiği üzere her işlemde bağlantı kurulup kapatılmaktadır. Art arda işlemlerde bu durum performans sorunu çıkaracağından bu durumda "ManuelConnectionManagement" tercih edilmelidir. Bu durumda aynı işlem iki farklı kod biçiminde yazılabilir.

IDatabase2 db2 = DatabaseFactory.GetDbObject(DbSettings.ManuelConnectionManagement);
db2.ExecuteQuery("update employees set salary = 3000 where employee_id = 100");

//Veritabanı bağlantısı kuruldu
//salary = 3000 oldu
//Bağlantı açık bırakıldı

db2.ExecuteQuery("update employees set salary = 24000 where employee_id = 100");

//Eski bağlantısı kullanıldı
//salary = 24000 oldu
//Bağlantı açık bırakıldı

db2.CloseConnection();

//Bağlantı kesildi.

Yukarıdaki örnekte görüldüğü üzere "CloseConnection" çağrılmadan bağlantı sonlandırılmamaktadır. Aynı kod aşağıdaki biçimde de yazılabilir:

using (IDatabase2 db = DatabaseFactory.GetDbObject(DbSettings.ManuelConnectionManagement))
{
    db.ExecuteQuery("update employees set salary = 3000 where employee_id = 100");

    //Veritabanı bağlantısı kuruldu
    //salary = 3000 oldu
    //Bağlantı açık bırakıldı

    db.ExecuteQuery("update employees set salary = 24000 where employee_id = 100");

    //Eski bağlantısı kullanıldı
    //salary = 24000 oldu
    //Bağlantı açık bırakıldı           
}

//Bağlantı kesildi.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

"https://github.com/vyigity/ProjectBase"

Saturday, October 7, 2017

ProjectBase ile Veri Tabanı İşlemleri (Transaction Örneği)

"ProjectBase" kütüphanesi otomatik transaction yönetimi ve connection yönetimi yapmaktadır. Veritabanı erişim sınıfları 3 modda çalışmaktadır. Bunlar:

* AutoConnectionManagement
* ManuelConnectionManagement
* TransactionMode

Veri tabanı erişim sınıfları ön tanımlı olarak "AutoConnectionManagement" modda çalışmaktadır. Bu modda klasik olarak her işlemde bağlantı açılıp işlem sonlandığında bağlantı kapatılmaktadır. Bu yöntem sıralı işlemlerde yavaş çalıştığından "ManuelConnectionManagement" modunda bağlantının ne zaman açılıp kapanacağı yazılımcı tarafından yönetilerek performans kazanımı yapılabilmektedir. TransactionMode ise PL/SQL tipinde kod yazımı için geliştirilmiştir.

Aşağıdaki örnekte TransactionMode kullanılarak nasıl işlem yapılacağı gösterilmiştir:

using (IDatabase2 db = DatabaseFactory.GetDbObject(DbSettings.TransactionMode))
{
    //salary = 24000

    db.ExecuteQuery("update employees set salary = 3000 where employee_id = 100 ");
    db.Commit();

    //salary = 3000 oldu

    db.ExecuteQuery("update employees set salary = 5000 where employee_id = 100 ");
    db.Commit();

    //salary = 5000 oldu

    db.ExecuteQuery("update employees set salary = 6000 where employee_id = 100 ");
    db.ExecuteQuery("update employees set manager_id = 101 where employee_id = 100 ");
    db.Commit();

    //salary = 6000 ve manager 101 oldu

    db.ExecuteQuery("update employees set salary = 10000 where employee_id = 100 ");
    db.ExecuteQuery("update employees set manager_id = null where employee_id = 100 ");
    db.RollBack();

    //salary = 6000 ve manager 101 kaldı

    db.ExecuteQuery("update employees set salary = 24000 where employee_id = 100 ");
    db.ExecuteQuery("update employees set manager_id = null where employee_id = 100 ");
    db.Commit();

    //salary = 24000 ve manager null oldu

    db.ExecuteQuery("update employees set salary = 50000 where employee_id = 100 ");

    throw new Exception("Fatal Error!");

    //Son işlem geri alındı.
}

Yukarıda görüldüğü gibi veri tabanı erişim sınıfı  transaction yönetimini otomatik olarak gerçekleştirdi. Yani yukarıdaki kod incelendiğinde 6 tane transaction otomatik olarak oluşturulmuş ve işlenmiştir. Veri tabanı erişim sınıfı ön tanımlı olarak hata olması durumunda rollback yapmaktadır. Bu yüzden son işlem geri alınmıştır.

"Bu yazıda "Oracle Managed Provider", Oracle 11g Express Edition ve HR şeması test verileri kullanılmıştır."

"https://github.com/vyigity/ProjectBase"

Veri Erişim Katmanına Giriş - Introduction to DAL (Data Access Layer)

Günümüzde yazılım projelerinde katmanlı mimari en önemli özelliklerden biridir. Katmanlı mimaride bir katman istenildiğinde başka bir projede aynen kullanılabilmekte böylece kod tekrarı azaltılmakta ve güvenilirlik büyük ölçüde artırılmaktadır.

Bir çok yazılım projesinin en önemli parçalarından biri veri erişim katmanıdır çünkü bu katman aracılığı ile veri tabanı işlemleri yürütülür. Bu yazıda kendi yazdığım "ProjectBase" (PB) isimli DAL katmanına giriş yapacağım. Proje kodlarına buradan ulaşabilirsiniz.

DAL katmanı için en önemli noktalar  tutarlılık, güvenilirlik, çok biçimlilik (Polimorfizm) ve genişletilebilirliktir. PB kütüphanesi çok biçimlilik ve genişletilebilirlik için "Interface" tabanlı bir yapıda oluşturulmuştur. PB kütüphanesi ile iş katmanında yazılan kodlarda değişiklik yapılmadan veri tabanı değişikliği kolaylıkla yapılabilmektedir. Ayrıca PB içinde tanımlı interface kullanılması ile istenildiği kadar "provider" sınıf yazılabilir ve bu sınıflar özelleştirilebilir.

Şimdi PB ile veri okuma işlemi yapalım:

* Veri tabanı olarak Oracle 11g Express Edition kullanacağım.  Veri tabanını Oracle'ın resmi sitesinden ücretsiz olarak indirebilirsiniz.

* Provider olarak Oracle "ManagedDataAccess" kullanacağım.

Veri tabanı kurulumunu yaptıktan sonra web.config içerisinde bağlantı stringi aşağıdaki gibi tanımlanmalıdır.

<connectionStrings>
      
    <add name="Context" connectionString="DATA SOURCE=XE;PASSWORD=hr;USER ID=hr" providerName="Oracle.ManagedDataAccess.Client" />
    
</connectionStrings>

Burada providerName önemlidir. Erişim sınıfları burada yazan provider bilgisine göre ilgili sınıfları seçecektir.

DAL katmanının kurulumu için "ProjectBase" kütüphanesini indirip projeye eklemek kurulum için yeterlidir.

using (IDatabase2 db = DatabaseFactory.GetDbObject())
{
    var dt = db.ExecuteQueryDataTable("select * from employees");
}

Yukarıdaki kod bloğu ile "Employees" tablosunda yer alan bütün veriler çekilip "DataTable" nesnesi olarak döndürülmektedir. Oracle veri tabanı içinde "HR" şemasında test için küçük bir veri tabanı servis edilmektedir. "Employees" tablosu bu veri tabanının içindedir.

ProjectBase kütüphanesi Oracle ve SQL veri tabanlarını ve OleDb erişimini desteklemektedir.