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"

No comments:

Post a Comment