16 Aralık 2013 Pazartesi

Kullanışlı bir Ado.Net Data Access Layer.


 Merhaba,
Eğer projenizde Ado.Net kullanacaksanız, yada Ado.Net kullanmanız gereken yerler olacaksa yazmış olduğum bu sınıfı çok seveceksiniz.



public class DAL {
 

       public static DataTable executeProc(string spName, params SqlParameter[] prm) {
           SqlConnection cnn = new SqlConnection(getCnn);
           SqlCommand cmd = new SqlCommand();
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.CommandText = spName;
           cmd.Connection = cnn;
           if (prm != null) {
               foreach (SqlParameter pr in prm) {
                   if (pr.Value == null) {
                       pr.Value = DBNull.Value;
                   }
                   cmd.Parameters.Add(pr);
               }
           }
           DataTable dt = new DataTable();
           SqlDataAdapter da = new SqlDataAdapter(cmd);
           da.Fill(dt);
           return dt;
       }
      

       public static  List<T> executeProc<T> ( string spName, bool? isException=false,params SqlParameter[] prm) {
           DataTable dt = executeProc(spName, prm);
           List<T> returnList = new List<T> ();
           T obj;
           foreach (DataRow dr in dt.Rows) {
               obj = (T)Activator.CreateInstance(typeof(T));
               foreach (DataColumn dc in dt.Columns) {
                   if (dr[dc].Equals(DBNull.Value))  dr[dc] = null;
                   try {
                       obj.GetType().GetProperty(dc.ColumnName).SetValue(obj, dr[dc], null);
                   } catch  {
                       if (isException==true) {
                           throw;
                       } else {
                           HttpContext.Current.Server.ClearError();
                           break;
                       }
                   }
               }
               returnList.Add(obj);
           }
           return returnList;
 
       }
 
       public static void executeNonQuery(string spName, params SqlParameter[] prm) {
           SqlConnection cnn = new SqlConnection(getCnn);
           SqlCommand cmd = new SqlCommand();
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.CommandText = spName;
           cmd.Connection = cnn;
           if (prm != null) {
               foreach (SqlParameter pr in prm) {
                   if (pr.Value == null) {
                       pr.Value = DBNull.Value;
                   }
                   cmd.Parameters.Add(pr);
               }
           }
           cnn.Open(); cmd.ExecuteNonQuery(); cnn.Close();
       }
       public static object executeScalarValue(string spName, params SqlParameter[] prm) {
           SqlConnection cnn = new SqlConnection(getCnn);
           SqlCommand cmd = new SqlCommand();
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.CommandText = spName;
           cmd.Connection = cnn;
           if (prm != null) {
               for (int i = 0; i < prm.Length; i++) {
                   if (prm[i].Value != null) {
                       cmd.Parameters.Add(prm[i]);
                   }
               }
           }
           cnn.Open();
           object obj = cmd.ExecuteScalar();
           cnn.Close();
           return obj;
       }
       public static bool executeSql(string sqlString, params SqlParameter[] prm) {
           SqlConnection cnn = new SqlConnection(getCnn);
           SqlCommand cmd = new SqlCommand();
           try {
               cmd.CommandType = CommandType.Text;
               cmd.Connection = cnn;
               if (prm != null) {
                   for (int i = 0; i < prm.Length; i++) {
                       if (prm[i].Value != null) {
                           cmd.Parameters.Add(prm[i]);
                       }
                   }
               }
               cnn.Open();
               cmd.ExecuteNonQuery();
               cnn.Close();
               return true;
           } catch {
               if (cnn.State == ConnectionState.Open) {
                   cnn.Close();
               }
               return false;
           }
       }
       public static string getCnn = ConfigurationManager.AppSettings["Cnn"].ToString();
    }

15 Aralık 2013 Pazar

Tenis'e yeni başlayanlar için. Forehand aslında nasıl olmalı? - Spor

 Merhaba,
  Eğer Tenis sporuna yeni başlayan biriyseniz eğitmeninizden mutlaka raketi sıkı sıkı tut, raketi düz bir şekilde ileri götür, gibi kendinizi kasım kasım kasmanızı sağlayacak telkinler alabilirsiniz. Aslında başlangıç için bunlar gereklidir. Eğitmen sadece rakete alışmanız için bunları yaptırır.
 Ama aslında olması gereken bu değildir. Kendinizi istediğiniz kadar kasın, raketi istediğiniz kadar sıkın top ile doğru enerji aktarım noktalarında buluşmaz iseniz sıkı sıkıya sıktığınız raket çarpan topa yenilir. İşin püf noktası top ile doğru yerde doğru momentum u kullanarak buluşmanız ve vuruşunuzu yapmanız gerekir. Tabi bunları uygulamanız başlarda çok zor, ancak oynadığınız maç sayısı arttıkça enerjinizi doğru yönetmeyi de öğreniyor olacaksınız. Bir süre sonra tıpkı oturmak yada yürümek gibi beyin bu işlevler için özel bir process yürütmüyor olacak.

 Aşağıdaki videoların Tenis öğrenirken bana çok yardımı oldu. Eminim size de yardımı olacaktır.
Sporla ve sağlıkla kalın.

14 Aralık 2013 Cumartesi

Neden Code First?


 Code First uygulamalarda kodları veritabanına daha az bağımlı hale getiren bir metodolojidir. Eğer projemizde bir ORM kullanıyorsak uygulamamızı istediğimiz kadar katmanlara ayıralım, projemizde ORM katmanının yarattığı sınıfları kullanmak zorunda kalırız(Db First).
Bu da aslında aşağıdaki gibi bir ilişki hiyerarşişi oluşturur.


 Görüldüğü gibi projemizi ne kadar katmana ayırırsak ayıralım db sınıflarını kullanabilmemiz için her katmana ayrı ayrı ORM modelini referans etmek zorunda kalıyoruz. Bu da yapılan her değişikliğin ardından tüm katmanlardaki db contexlerinin ayrı ayrı update edilmesi anlamına geliyor. Bu işlemler de bizim projeyi katmanlara ayırarak elde etmek istediğimiz katmanlar arası bağımsızlığa tam anlamıyla baltayla vuruyor.

 Peki Code First kullanırsak bu ilişki hiyerarşisi nasıl olacak? İşte böyle.


Evet görüldüğü gibi veritabanımızın sadece 1 katman ile ilişkisi var ve artık code generation sınıflarını kullanmak zorunda değiliz.
 Şimdi aklınıza şu sorular gelebilir. Peki sistem tabloları, sutunları foregin keyleri primary keyleri nasıl tanıyor? Dbml yada edmx gibi data modellerinin yaptığı işleri nasıl hallediyoruz? Bu soruların cevapları için de bu makaleyi okuyabilirsiniz.
Herkese iyi çalışmalar.