C# ile Generic Stored Procedure Runner

Batuhan Düzgün tarafından yayınlanmıştır 6. May 2012 02:26

 
Merhaba arkadaşlar bu yazıda sizlere veritabanı işlemleriyle ilgili olan bir konudan bahsedeceğim. Çoğu zaman Web projelerinde ve Masa Üstü uygulamalarında veritabanı ile ilgili işlemler hep önemli ve projelerin temeli olmuştur. Özellikle bir projeye başlanırken gereksinim analizinden sonra ilk atılacak en önemli adım Veri Modelinin (yani veritabanı tasarımının) yapılmasıdır. Ardından Veri Modeline uygun ekranların ve görsel arayüzlerin hazırlanması gelir. Bütün bunlardan sonra İş Katmanı, Log Katmanı ve Veri Katmanı gibi katmanlar yazılır. 
 
Bu yazıda örneğini vereceğim uygulama, geliştirmiş olduğum Web projelerinden birinde kullandığım çok katmanlı bir proje mimarisinden alınmış küçük bir örneklemedir. Yazılım projeleri geliştirilirken en önemli unsur modüler olmasıdır. Böylece proje için gerekli olan güncellemeler ve değişiklikler hızlı ve tutarlı bir şekilde gerçekleştirilebilir. 
 
Hazırlanacak olan Veri Katmanı kodlarının işlevi verilen Stored Procedure ismini ve parametrelerini çalıştırmak ve fiziksel VeriTabanı tabloları üzerinde işlem yapmaktır. Bunun için öncelikle Veritabanı bağlantısı ve Veritabanı işlemleri için gerekli olan sınıflar aşağıdaki gibi tasarlanmıştır.
 

// Sınıfın işlevleri veritabanı bağlantısı açmak ve kapamaktır.

    public class SQLConnection

    {

        private SqlConnection baglanti = null;

        // Web config'ten veritabanı bağlantı cümlesi okunur.

        private string baglantiCumlesi = ConfigurationManager.ConnectionStrings["baglantiCumlesi"].ConnectionString;

        // Bağlantı durumunu tutacak olan değişkendir.

        private bool isOpen = false;

        public SQLConnection()

        {

            // Singleton tasarım deseniyle bir nesnenin bir kere yaratılmasını sağlanır.

            if (baglanti == null)

            {

                baglanti = new SqlConnection(baglantiCumlesi);

            }

        }

        // Veritabanı bağlantısı açılır.

        public bool openDatabase()

        {

            try

            {

                baglanti.Open();

                isOpen = true;

            }

            catch (Exception e)

            {

                isOpen = false;

            }

            return isOpen;

        }

        // Veritabanı bağlantısı kapatılır.

        public void closeDatabase()

        {

            try

            {

                baglanti.Close();

            }

            catch (Exception e)

            {

            }

        }

        public bool isOpened()

        {

            return isOpen;

        }

        // Bağlantı döndürülür.

        public SqlConnection getConnection()

        {

            return baglanti;

        }

    }

  
Ardından veritabanı işlemlerini Sql sorgularını çalıştıracak olan sınıf yapısı aşağıdaki gibi tasarlanmıştır.
 

// Veritabanı işlemlerini yapmak ile sorumlu sınıftır.

    public class SQLCommand

    {

        // Veritabanı işlemleri için SqlCommand tipinde bir nesne create edilir.

        private SqlCommand komut = null;

        // Veriseti çekmek için SqlDataAdapter tipinde nesne create edilir.

        private SqlDataAdapter adapter = null;

        // Tablodan kayıt okumak için SqlDataReader tipinde bir referans tanımlanır.

        private SqlDataReader okuyucu = null;

        private SQLConnection baglanti = null;

        public SQLCommand()

        {

            if (komut == null)

            {

                komut = new SqlCommand();

            }

            if (adapter == null)

            {

                adapter = new SqlDataAdapter(komut);

            }

        }

        // Veritabanı işlemleri için bir bağlantı gerektiği için bağlantı nesnesi set edilir.

        public void setConnection(SQLConnection connection)

        {

            baglanti = connection;

        }

        // Bağlantı durumu açık olup olmadığı her duruma karşı kontrol edilir.

        private bool isOpened()

        {

            bool flag = true;

            if (baglanti.getConnection().State == ConnectionState.Closed)

            {

                flag = baglanti.openDatabase();

            }

            return flag;

        }

        // Sonuç kümesi alınmadığı durumlarda INSERT, DELETE, UPDATE gibi bu metod çağrılır.

        public void executeNonQuery(string storedProcedure, List<SQLParameter> parameters)

        {

            try

            {

                if (isOpened())

                {

                    komut.CommandText = storedProcedure;

                    komut.Connection = baglanti.getConnection();

                    // Komuta eklenmiş olan Sql cümlesinin Stored procedure tipinde olduğu belirtilir.

                    komut.CommandType = CommandType.StoredProcedure;

                    for (int i = 0; i < parameters.Count; i++)

                    {

komut.Parameters.Add(parameters[i].getParameterAlias(), parameters[i].getParameterDbType()).Value = parameters[i].getParameterValue();

                    }

                    komut.ExecuteNonQuery();

                }

            }

            catch (Exception e)

            {

            }

            finally

            {

                baglanti.closeDatabase();

            }

        }

        // Dataset döndüren SELECT gibi sorgularda bu metod çağrılır.

        public DataSet executeResultQuery(string storedProcedure, List<SQLParameter> parameters)

        {

            DataSet dataTablosu = new DataSet();

            try

            {

                if (isOpened())

                {

                    komut.CommandText = storedProcedure;

                    komut.Connection = baglanti.getConnection();

                    komut.CommandType = CommandType.StoredProcedure;

                    for (int i = 0; i < parameters.Count; i++)

                    {

 komut.Parameters.Add(parameters[i].getParameterAlias(), parameters[i].getParameterDbType()).Value = parameters[i].getParameterValue();

                    }

                    adapter.Fill(dataTablosu);

                }

            }

            catch (Exception e)

            {

            }

            return dataTablosu;

        }

        public void closeReader()

        {

            if (okuyucu != null)

            {

                okuyucu.Close();

            }

        }

        // Herhangi bir kaydın bulunup bulunmadığını kontrol eden metoddur.

        public bool isContainsAnyRecord(string storedProcedure, List<SQLParameter> parameters)

        {

            bool flag = false;

            try

            {

                if (isOpened())

                {

                    komut.CommandText = storedProcedure;

                    komut.Connection = baglanti.getConnection();

                    komut.CommandType = CommandType.StoredProcedure;

                    for (int i = 0; i < parameters.Count; i++)

                    {

komut.Parameters.Add(parameters[i].getParameterAlias(), parameters[i].getParameterDbType()).Value = parameters[i].getParameterValue();

                    }

                    okuyucu = komut.ExecuteReader();

                    if (okuyucu.Read())

                    {

                        flag = true;

                    }

                }

            }

            catch (Exception e)

            {

            }

            finally

            {

                closeReader();

                baglanti.closeDatabase();

            }

            return flag;

        }

    } 

 

Veritabanı ile işlemleri yapacak olan sınıflar hazırlandı. Bu sınıfların temel amaı veritabanı işlemlerini kotarmaktır. Bunun üzerine yeni bir katman ekleyip Stored Procedure'leri dinamik parametre yapısına göre şekillendiren bir sınıf hazırlanacaktır. Bu sınıf yapısında Stored Procedure ismi, parametreleri ve parametre tipleri yer alacaktır.

// Stored Procedure çeşitleri için base sınıf yapısıdır.

    // Parametreli Stored Procedure gibi parametresizde Stored Procedure olabilir.

    public class StoredProcedure

    {

        // Stored Procedure ismi

        protected string procedureName;

        public StoredProcedure()

        {

        }

        public void setProcedureName(string procedurename)

        {

            procedureName = procedurename;

        }

        public string getStoredProcedureName()

        {

            return procedureName;

        }

    }

Parametreli Stored Procedure sınıfı aşağıdaki gibidir.

// Parametreli Stored Procedure sınıf yapısıdır. Base sınıftan kalıtım almıştır.

    public class StoredProcedureWithParams : StoredProcedure

    {

        // Parametre listesi tutar

        // Parametre içinde parametre alias, type ve value vardır.

        private List<SQLParameter> parameters;

        public StoredProcedureWithParams(int paramsCount)

            : base()

        {

            // Ne kadar parametre varsa o kadarlık bir liste oluşturulur.

            parameters = new List<SQLParameter>(paramsCount);

            // Boş olan parametre listesi oluşturulur.

            createParametersList(paramsCount);

        }

        private void createParametersList(int paramsCount)

        {

            for (int i = 0; i < paramsCount; i++)

            {

                parameters.Add(new SQLParameter());

            }

        }

        // params anahtar sözcüğü ile parametre sayısı belirsiz olan bir metod tanımlamış olunur.

        // 5 parametre geçilirse dizi içinde 5 adet bilgi olacaktır.

        // 3 parametre geçilirse dizi içinde 3 adet bilgi olacaktır.

        public void setParametersAlias(params string[] parametersalias)

        {

            for (int i = 0; i < parametersalias.Length; i++)

            {

                parameters[i].setParameterAlias(parametersalias[i]);

            }

        }

        // SqlDbType'larda parametre sayısı belirsiz bir biçimde tanımlanmıştır.

        public void setParametersDbTypes(params SqlDbType[] parametersdbtype)

        {

            for (int i = 0; i < parametersdbtype.Length; i++)

            {

                parameters[i].setParameterDbType(parametersdbtype[i]);

            }

        }

        // Value'larda parametre sayısı belirsiz bir biçimde tanımlanmıştır.

        public void setParametersValues(params string[] parametersvalues)

        {

            for (int i = 0; i < parametersvalues.Length; i++)

            {

                parameters[i].setParameterValue(parametersvalues[i]);

            }

        }

        // Tüm parametre listesi döndürülür.

        public List<SQLParameter> getParameters()

        {

            return parameters;

        }

    } 

Bütün herşey hazırlandı. Son olarak gerekli kodların ardı sıra yazılması ve projenin çalıştırılması kısmına gelindi. Aşağıdaki kodlar bir Butonun Click(Tıklama) olayına bağlanır. 

SQLConnection connection = new SQLConnection();

SQLDbTypes dbTypes = new SQLDbTypes();

SQLCommand command = new SQLCommand();

command.setConnection(connection);

StoredProcedureWithParams sp = new StoredProcedureWithParams(2);

sp.setProcedureName("checkUserAccount");

sp.setParametersAlias("@name", "@password");

sp.setParametersDbTypes(dbTypes.nvarChar, dbTypes.nvarChar);

sp.setParametersValues(TextBox1.Text.Trim(), TextBox2.Text.Trim());

if (command.isContainsAnyRecord(sp.getStoredProcedureName(), sp.getParameters()))

{

    Response.Write("KAYIT VAR BULUNMAKTADIR");

}

else

{

    Response.Write("KAYIT YOKTUR");

}

Proje çalıştırıldığında aşağıdaki gibi bir sonuç ortaya çıkacaktır. 

 
 
 
Umarım yararlı bir makale olmuştur. Bir sonraki makalemde görüşmek dileğiyle ...
 
Batuhan Düzgün
Bilgisayar Mühendisi
Endüstri Mühendisi 

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

C#

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  September 2018  >>
MoTuWeThFrSaSu
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

Yazıları geniş takvimde göster