.Net Platformunda Data Access Layer Nasıl Yazılır

in #utopian-io7 years ago (edited)

What Will I Learn?

.Net platformunda veriye erişim belli bir mimariye sahiptir. Bu yazımda Data Access Layer yazımı adımlarını bir veri erişim katmanı içinde ele alarak basit ve modüler bir hale getirmeye çalıştım.

Requirements

.Net Framework
Visual Studio Core

Difficulty

Intermediate

Tutorial Contents

  • DataAccessLayer Bilgileri
  • Veri Erişim Katmanı Nasıl Geliştirilir
  • Veri Erişim Katmanını Bir Uygulamada Test Edelim

.Net Platformunda Data Access Layer Nasıl Yazılır

.Net Platformunda veri erişim katmanı aşağıdaki resimdeki gibi uygulama ve veritabanı arasında yer almaktadır.

image.png

Bu mantıktan yola çıkarak önce kendimize bir model oluşturmamız gerekiyor. Bu modeli aşağıda ki grafikte inceleyebilirsiniz.

image.png

Modelimizden kısaca bahsetmek gerekirse;

DataAccessLayer adında bir ClassLibrary' miz var. Bunun içinde DataBase adında temel bir sınıfımız bulunuyor ve DataBase sınıfı içinde de veri tabanı üzerinde işlem yapabilmemizi sağlayan tüm özellik ve methodlar yer alıyor. Ayrıca DataBase içinde yazacağımız bağlantı cümlesine göre bir Connection nesnesi oluşturan 2 farklı metod yer alıyor. Bu metodlarCreateDataBase adındadır ve bunlardan biri parametre alırken diğeri almaz. Son olarak bir de default constructor' ın connection string' i direk parametre alacak şekilde yazılmış bir hali vardır.

Objects bölümünde ise veritabanı işlemleri sırasında kullanacağımız Ado.net' in temel sınıfları yer alır.

Properties bölümünde ise connection string' i dinamik bir yapı halinde sunabilmek için yazılmış özellikler yer alır.

StaticSQL bölümünde ise veritabanı işlemlerini yapabilmek için özelleştirdiğimiz 3 farklı metod yer alır.

  • RunSqlTable() : string tipte bir sql sorgusu alır ve geriye bir DataTable döndürür.
  • RunSqlQuery() : string tipte bir sql sorgusu alır ve geriye bir değer döndürmez. (ExecuteNonQuery() gibi çalışır)
  • RunSqlScaler() : string tipte bir sql sorgusu alır ve geriye object tipinde tekil bir sonuç döndürür. (ExecuteScalar() gibi çalışır)

Stored Procedure bölümünde ise Static Sql bölümündeki metodların Stored Procedure 'ler ile işlem yapan halleri mevcuttur. Çalışma şekilleri aynı olmakla birlikte bunlar parametre olarak çalışacak olan stored procedure' ün adını alır.

  • RunSPTable()
  • RunSPQuery()
  • RunSPScalar()

Parameters bölümü ise sorguları parametrik kullanabilmek için geliştirilmiştir.

AddParameter() : yeni bir parametre ekler
ClearParameters() : eklenmiş tüm parametreleri temizler

Modelimiz hakkında bu temel bilgileri verdikten sonra uygulamamızı geliştirmeye başlayabiliriz.

Veri Erişim Katmanı Nasıl Geliştirilir?

Öncelikle VS Core ile DAL adında bir ClassLibrary projesi oluşturuyoruz.

image.png

Daha sonra projemize DataBase adında bir sınıf ekleyelim ve aşağıdaki kodları yazalım.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace DAL
{
public class DataBase
{
#region Default Constructor
public DataBase()
{
}
#endregion
#region Properties
private string host;
public string Host
{
get { return host; }
set { host = value; }
}
private string dbName;
public string DbName
{
get { return dbName; }
set { dbName = value; }
}
private bool integratedSecurity;
public bool IntegratedSecurity
{
get { return integratedSecurity; }
set { integratedSecurity = value; }
}
private string userName;
public string UserName
{
get { return userName; }
set { userName = value; }
}
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
private string others;
public string Others
{
get { return others; }
set { others = value; }
}
#endregion
#region Objects
private SqlConnection conn;
private SqlCommand cmd;
private SqlDataAdapter dap;
private DataTable dt;
#endregion
}
}

Buraya kadar yazdığımız kodlar DataBase sınıfının sahip olduğu özelliklerin tanımlanması ve bu sınıf içinde kullanacağımız Ado.net nesnelerinin tanımlanmasıdır. Şimdi her biri farklı bir şekilde SqlConnection nesnesi oluşturacak olan aşağıdaki 3 metodu da DataBase sınıfı içine yazıyoruz.

public DataBase(string con_str)
{
conn = new SqlConnection(con_str);
}
public bool CreateDatabase()
{
try
{
string conStr = "Server = " + host + "; DataBase = " + dbName + "; UID = + " + userName + "; Password = " + password + "; Integrated Security = " + integratedSecurity + "; " + others;
conn = new SqlConnection(conStr);
return true;
}
catch
{
return false;
}
}
public bool CreateDatabase(string con_str)
{
try
{
conn = new SqlConnection(con_str);
return true;
}
catch
{
return false;
}
}

Şimdi StaticSql bölümünde bahsettiğimiz ve string tipte sql sorguları ile veritabanı üzerinde işlem yapacak olan metodlarımızı yazalım

public DataTable RunSqlTable(string sql)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
dap = new SqlDataAdapter(cmd);
dt = new DataTable();
dap.Fill(dt);
cmd.Dispose();
dap.Dispose();
return dt;
}
public void RunSqlQuery(string sql)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
cmd.Dispose();
}
public object RunSqlScalar(string sql)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
conn.Open();
object result = cmd.ExecuteScalar();
conn.Close();
cmd.Dispose();
return result;
}

Şimdi aynı işlemleri StoredProcedure yardımıyla yapacak olan metodlarımızı yazalım.

public DataTable RunSPTable(string sp_name)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp_name;
dap = new SqlDataAdapter(cmd);
dt = new DataTable();
dap.Fill(dt);
cmd.Dispose();
dap.Dispose();
return dt;
}
public void RunSPQuery(string sp_name)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp_name;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
cmd.Dispose();
}
public object RunSPScalar(string sp_name)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp_name;
conn.Open();
object result = cmd.ExecuteScalar();
conn.Close();
cmd.Dispose();
return result;
}

Son olarak parametrik çalışabilmek adına gerekli olan işlemleri sağlamak için aşağıdaki parametre ekleme ve temizlekten sorumlu olan metodlarıda DataBase sınıfına ekleyelim.

public void AddParameter(string name, object value)
{
if (cmd == null)
{
cmd = new SqlCommand();
}
cmd.Parameters.AddWithValue(name, value);
}
public void ClearParameters()
{
cmd.Parameters.Clear();
}

Bu işlemleri gerçekleştirdikten sonra artık uygulamamız derlenip farklı projelerde kullanıma hazır hale gelmiştir.

Veri Erişim Katmanını Bir Uygulamada Test Etme

Artık veriye erişim katmanı projemizi tamamladığımıza göre bunu farklı bir uygulamada test edebiliriz. Bunun için yeni bir windows projesi açalım ve form üzerine ;

  • 1 tane DataGrid
  • 4 tane TextBox
  • 1 tane Button yerleştirelim

image.png

Örneğimizde bağlanacağımız veritabanının adı dbTest tablo adı ise tbl_Personel olsun ve id, ad, soyad, maas adında 4 tane alan olsun.

Öncelikle ilk yapmamız gereken şey DataAcceessLayer projesinin bulunduğu dizinden DAL.dll isimli dosyayı örnek projemize referans olarak eklemektir.

image.png

Referansı ekledikten sonra artık DAL projesini örnek uygulama üzerinde kullanabiliriz. Bunun için önce kayıtları DataGrid' de görebilmek amacıyla Form_Load olayına aşağıdaki kodları yazalım.

private void Form1_Load(object sender, EventArgs e)
{
//DataBase db = new DataBase("Server=Localhost; DataBase = dbTest; Integrated Security = SSPI");
DataBase db = new DataBase();
db.Host = "Localhost";
db.DbName = "dbTest";
db.IntegratedSecurity = true;
db.CreateDatabase();
//db.CreateDatabase("Server=Localhost; DataBase = dbTest; Integrated Security = SSPI");
DataTable dt = db.RunSqlTable("SELECT * FROM tbl_Personel");
dataGridView1.DataSource = dt;
textBox4.Text = db.RunSqlScalar("SELECT COUNT(*) FROM tbl_Personel").ToString();
}

Gördüğünüz gibi veritabanına DAL üzerinden bağlanmanın 3 farklı yolu var. Son satırda ayrıca textBox4 içine tablodaki toplam kayıt sayısı da yazdırılıyor.

Bu işlemlerden sonra butona basınca diğer textbox 'lara girilen değerlerin parametre olarak bir stored procedure verilip , bu sp' nin de DAL üzerinden tabloya bir kayıt eklemesini sağlayalım.

O zaman önce aşağıdaki stored procedure' ü sql server'a ekleyelim.

CREATE PROCEDURE spPersonelEkle
@par_ad nvarchar(50), @par_soyad nvarchar(50), @par_maas int
AS
BEGIN
INSERT INTO tbl_Personel (ad, soyad, maas) VALUES (@par_ad, @par_soyad, @par_maas)
END
GO

Stored Procedure artık hazır olduğuna göre butona basılınca çalışacak kodları yazabiliriz.

private void button1_Click(object sender, EventArgs e)
{
DataBase db = new DataBase("Server=Localhost; DataBase = dbTest; Integrated Security = SSPI");
db.AddParameter("@par_ad", textBox1.Text);
db.AddParameter("@par_soyad", textBox2.Text);
db.AddParameter("@par_maas", Convert.ToInt32(textBox3.Text));
db.RunSPQuery("spPersonelEkle");
DataTable dt = db.RunSqlTable("SELECT * FROM tbl_Personel");
dataGridView1.DataSource = dt;
db.ClearParameters();
}

Uygulamayı derleyip çalıştırırsanız önce tablodaki kayıtları DataGrid üzerinde görebilirsiniz. Daha sonra kayıt ekleyip sonucu görebilirsiniz.



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @forkonti, I just gave you a tip for your hard work on moderation. Upvote this comment to support the utopian moderators and increase your future rewards!

Hey @bej I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • This is your first accepted contribution here in Utopian. Welcome!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x

Coin Marketplace

STEEM 0.16
TRX 0.15
JST 0.029
BTC 55157.38
ETH 2317.75
USDT 1.00
SBD 2.33