Makale Özeti

CodeSmith ile çalışırken en çok kullanıldığını söylediğimiz veritabanı şemasına erişebilme durumunda bahsedeceğiz.

Makale

CodeSmith - Veritabanı Şeması ile Çalışmak - 4

Insert işlevini gerçekleştiren bir stored procedure oluşturmak

Aşağıdaki CodeSmith template kodu tek alandan oluşan primarykey'e sahip olan tablolar için insert işlevini yerine getirmektedir.

<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>

<%@ Property Name="Veritabani" Type="DatabaseSchema" Optional="False" %>

<%@ Assembly Name="SchemaExplorer" %>

<%@ Import Namespace="SchemaExplorer" %>

 

<%@ Import Namespace="System.Text" %>

 

<script runat="template">

      public string GetNativeType(ColumnSchema column)

      {

                  string param = string.Empty;

                  param=column.NativeType;

                 

                  switch (column.DataType)

                  {

                        case DbType.Decimal:

                        {

                             param = column.NativeType + "(" + column.Precision + ", " + column.Scale + ")";

                             break;

                        }

                        case DbType.AnsiString:

                        case DbType.AnsiStringFixedLength:

                        case DbType.String:

                        case DbType.StringFixedLength:

                        {

                             if (column.NativeType != "text" && column.NativeType != "ntext")

                             {

                                   if (column.Size > 0)

                                   {

                                         param = column.NativeType + "(" + column.Size + ")";

                                   }

                             }

                             break;

                        }

                  }    

            return param;

      }

      public string GetSqlParam(ColumnSchema column)

      {

            string param = string.Empty;

            param=GetNativeType(column);

            param="@" + column.Name + " " + param;

            return param;

      }

      void CreateInsertSP()

      {

            StringBuilder sb=new StringBuilder();

            foreach(TableSchema ts in Veritabani.Tables)

            {

                  CreateInsertSP(ts,sb);

            }

            Response.WriteLine(sb.ToString());

      }

      void CreateInsertSP(TableSchema ts,StringBuilder eklenecekSB)

      {

           

            eklenecekSB.Append("CREATE PROC [" + ts.Name + "_INSERT]\n");

            eklenecekSB.Append(GetSqlParam(ts.PrimaryKey.MemberColumns[0]) + " OUTPUT,\n");

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

            {

                  ColumnSchema c=ts.NonPrimaryKeyColumns[i];

                  eklenecekSB.Append(GetSqlParam(c));

                  if(i!=ts.NonPrimaryKeyColumns.Count-1)

                  {

                        eklenecekSB.Append(",\n");

                  }

            }

            eklenecekSB.Append("\nAS\n");

            eklenecekSB.Append("INSERT INTO [" + ts.Name + "] (");

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

            {

                  ColumnSchema c=ts.NonPrimaryKeyColumns[i];

                  eklenecekSB.Append(c.Name);

                  if(i!=ts.NonPrimaryKeyColumns.Count-1)

                  {

                        eklenecekSB.Append(",\n");

                  }

            }

            eklenecekSB.Append(") VALUES (");

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

            {

                  ColumnSchema c=ts.NonPrimaryKeyColumns[i];

                  eklenecekSB.Append("@" + c.Name);

                  if(i!=ts.NonPrimaryKeyColumns.Count-1)

                  {

                        eklenecekSB.Append(",\n");

                  }

            }

            eklenecekSB.Append(")");

            eklenecekSB.Append("\nSET @" + ts.PrimaryKey.MemberColumns[0].Name + "=SCOPE_IDENTITY()");

            eklenecekSB.Append("\nGO\n\n");

           

      }

</script>

<%

CreateInsertSP();

%>

 



Yukarıdaki kod bloğunda tablonun primarykey alanı tespit edilip o alan output parametre olacak ve en son scope_identity ile otomatik artan sayı olduğu varsayılan alanın değerini tespit edip output parametreye atayacak şekilde düzenlenmiştir. Çıktısı olan stored procedure yukarıdaki ekran görüntüsünde gözükmektektedir.

Insert işlevini gerçekleştiren bir stored procedure oluşturmak

<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>

<%@ Property Name="Veritabani" Type="DatabaseSchema" Optional="False" %>

<%@ Assembly Name="SchemaExplorer" %>

<%@ Import Namespace="SchemaExplorer" %>

 

<%@ Import Namespace="System.Text" %>

 

<script runat="template">

      public string GetNativeType(ColumnSchema column)

      {

                  string param = string.Empty;

                  param=column.NativeType;

                 

                  switch (column.DataType)

                  {

                        case DbType.Decimal:

                        {

                             param = column.NativeType + "(" + column.Precision + ", " + column.Scale + ")";

                             break;

                        }

                        case DbType.AnsiString:

                        case DbType.AnsiStringFixedLength:

                        case DbType.String:

                        case DbType.StringFixedLength:

                        {

                             if (column.NativeType != "text" && column.NativeType != "ntext")

                             {

                                   if (column.Size > 0)

                                   {

                                         param = column.NativeType + "(" + column.Size + ")";

                                   }

                             }

                             break;

                        }

                  }    

            return param;

      }

      public string GetSqlParam(ColumnSchema column)

      {

            string param = string.Empty;

            param=GetNativeType(column);

            param="@" + column.Name + " " + param;

            return param;

      }

      void CreateInsertSP()

      {

            StringBuilder sb=new StringBuilder();

            foreach(TableSchema ts in Veritabani.Tables)

            {

                  CreateInsertSP(ts,sb);

            }

            Response.WriteLine(sb.ToString());

      }

      void CreateInsertSP(TableSchema ts,StringBuilder eklenecekSB)

      {

           

            eklenecekSB.Append("CREATE PROC [" + ts.Name + "_UPDATE]\n");

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

            {

                  ColumnSchema c=ts.Columns[i];

                  eklenecekSB.Append(GetSqlParam(c));

                  if(i!=ts.Columns.Count-1)

                  {

                        eklenecekSB.Append(",\n");

                  }

            }

            eklenecekSB.Append("\nAS");

            eklenecekSB.Append("\nUPDATE [" + ts.Name + "] SET\n");

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

            {

                  ColumnSchema c=ts.NonPrimaryKeyColumns[i];

                  eklenecekSB.Append(c.Name + "=@" + c.Name);

                  if(i!=ts.NonPrimaryKeyColumns.Count-1)

                  {

                        eklenecekSB.Append(",\n");

                  }

            }

            eklenecekSB.Append("\nWHERE ");

            for (int i=0;i<ts.PrimaryKey.MemberColumns.Count;i++)

            {

                  ColumnSchema c=ts.Columns[i];

                  eklenecekSB.Append(c.Name + "=@" + c.Name);

                  if(i!=ts.PrimaryKey.MemberColumns.Count-1)

                  {

                        eklenecekSB.Append(" AND ");

                  }

            }

           

            eklenecekSB.Append("\nGO\n\n");

      }

</script>

<%

CreateInsertSP();

%>



Bu makalemizin amacı önceki makalelerde edinilen bilgilerin pekiştirilmesi adına örnek kod sağlamaktı. Yukarıdaki iki template örneğini inceleyerek ihtiyacınız olacak ve sık kullandığınız stored procedure ler için templateler oluşturabilirsiniz.

Bu makaleye kadar makaleleri okuyan ve artık kendisi bir template oluşturup egzersiz yapmak isteyenler için bir tavsiye : Üzerinde Index olan alanları bulup onlar için Select ve Delete sorgularını çalıştıracak stored procedureler oluşturun. CodeSmith API Reference ı inceleyerek işe başlayabilirsiniz.

Cengiz HAN
cengiz@cengizhan.com
Microsoft ASP.NET Most Valuable Professional
MCSD.NET, MCT