Makale Özeti

Bu yazımızda SqlServerCe Database Erişimi - 1 başlıklı makalemize, sqlcetransaction nesnesi kullanarak devam ediyoruz.

Makale

Merhabalar, bu yazımızda Smart Device' da  SqlCe Database Erişimi - 1 başlıklı makalemizin devamı olan, veri erişim katmanı (Ado.Net/Data Access) olarak oluşturduğumuz sınıfımızı transaction kullanımı ile detaylandıracağız. Önceki makelemizde SqlCeConnection isimli sınıfımıza ExecuteNonQuery, ExecuteScalerText, GetDataTable methodlarını eklemiştik. Bu makelemizde ise bu sınıfımız içerisine SqlCeTransaction nesnesini de ekleyerek örneklerle detaylandıracağız.

Öncelikle SqlCeTransaction nesnesini kullanacağımız public methodları (begin, commit, rollback) static sınıfımıza ekleyelim, sınıfımızın son durumunu class diagram üzerinde görelim.

Şimdi, Sırasıyla BeginTransaction, CommitTransaction ve RollBackTransaction methodlarımızı da sırasıyla ekleyelim. Static sınıfımızın dışından diğer public method'larımıza erişir gibi transaction'ımızı da yönetebilir olacağız. Static sınıfımıza 'trans' adında static SqlCeTransaction değişkenimizi ekleyerek düzenlemeye başlayalım.

 private static SqlCeTransaction trans;

 private static SqlCeConnection conn;

Begin Transaction

 public static void BeginTransaction() {

    try {

      if (conn != null) {

        trans = conn.BeginTransaction();

      }

    }

    catch (Exception) {

      throw;

    }

  }

Commit Transaction

 public static void CommitTransaction() {

    try {

      if (trans != null) {

        trans.Commit();

        trans.Dispose();

        trans = null;

      }

    }

    catch (Exception) {

      throw;

    }

  }

RollBack Transaction

 public static void RollBackTransaction() {

    try {

      if (trans != null) {

        trans.Rollback();

        trans.Dispose();

        trans = null;

      }

    }

    catch (Exception) {

      throw;

    }

  }

Dikkat edileceği üzere transaction yönetim methodlarımızı public olarak, dışarıdan erişilebilecek şekilde yazdık. Bir transaction nesnesi oluşturup, başlattıktan sonra ExecuteNonQuery gibi methodlarımızın SqlCeCommand nesnesinin bu transaction nesnesinden etkilenmesini sağlamamız gerekmektedir. Bunun için aşağıdaki gibi ExecuteNonQuery ve ExecuteScalerText isimli methodlarımızda da düzenleme yapıyoruz.

 public static int ExecuteNonQuery(string sql, params MyCeParameter[] parameters) {

      var rowsAffected = 0;

      try {

        using (var cmd = new SqlCeCommand()) {

          cmd.Connection = conn;

          cmd.CommandText = sql;

 

          if (parameters != null && parameters.Length != 0) {

            bindParametersToSqlCe(parameters, cmd);

          }

 

          //Transaction null değil ise (BeginTransaction methodu ile başlatılmış)

          //command nesnesinin Transaction property'si set edilir.

          if (trans != null) {

            cmd.Transaction = trans;

          }

 

          rowsAffected = cmd.ExecuteNonQuery();

        }

      }

      catch (SqlCeException ex) {

        ShowErrors(ex);

      }

      return rowsAffected;

  }

 

  public static object ExecuteScalerText(string sql, MyCeParameter[] parameters) {

      object result = null;

      try {

        using (SqlCeCommand cmd = new SqlCeCommand()) {

          cmd.Connection = conn;

          cmd.CommandText = sql;

 

          if (parameters != null && parameters.Length != 0) {

            bindParametersToSqlCe(parameters, cmd);

          }

 

          //Transaction null değil ise (BeginTransaction methodu ile başlatılmış)

          //command nesnesinin Transaction property'si set edilir.

          if (trans != null) {

            cmd.Transaction = trans;

          }

 

          result = cmd.ExecuteScalar();

        }

      }

      catch (SqlCeException ex) {

        ShowErrors(ex);

      }

      catch (Exception ex) {

        ShowPdaMessage.ShowException(ex);

      }

      return result;

  }

Sınıfımıza Transaction methodları da eklendiğine göre, bir örnek ile kullanabiliriz.

 private void urunKaydet() {

      try {

 

        // Transaction başlatılıyor..

        SqlCompactDatabase.BeginTransaction();

 

        const string sql = "insert into URUN(KODU,ADI) values(@p1,@p2) ";

        MyCeParameter kodu = new MyCeParameter("@p1", 1, ParameterDirection.Input);

        MyCeParameter adi = new MyCeParameter("@p2", "Vida", ParameterDirection.Input);

        SqlCompactDatabase.ExecuteNonQuery(sql, kodu,adi);

 

        const string sqlDetail = "insert into URUN_DETAY(URUN_KODU,DETAY,RENK) values(@p1,@p2,@p3) ";

        MyCeParameter urun_kodu = new MyCeParameter("@p1", 1, ParameterDirection.Input);

        MyCeParameter detay_bilgi = new MyCeParameter("@p2", "3 mm", ParameterDirection.Input);

        MyCeParameter renk = new MyCeParameter("@p3", "Siyah", ParameterDirection.Input);

        SqlCompactDatabase.ExecuteNonQuery(sqlDetail, urun_kodu, detay_bilgi, renk );

        //Transaction Commit ediliyor.

        SqlCompactDatabase.CommitTransaction();

 

      }

      catch (Exception) {

        //Eğer hata oluşur ve transaction başlatılmış ise geri alınır.

        SqlCompactDatabase.RollBackTransaction();

        throw;

      }

  }

Buradaki örnekte de görüldüğü gibi dilediğimiz zaman transaction başlatıp, sonlandırabilir, ya da iş mantığına göre dilediğimiz yerde eğer bir transaction başlatılmışsa rollback ile yapılan işlemleri geri alabiliriz.

Kolay gelsin.

Gökhan Manduz - gokhanmanduz@hotmail.com , gmanduz@gmail.com