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 - 1

CodeSmith ile çalışırken en çok kullanıldığını söylediğimiz veritabanı şemasına erişebilme durumunda bahsedeceğiz.
CodeSmith API Reference ile tüm referansına erişebileceğiniz SchemaExplorer assembly si ile veritabanı ile ilgili şema bilgisine erişebilir ve bu doğrultuda stored procedureler, entity classlar, data access classları oluşturabilirsiniz.
SchemaExplorer assemblysi global assembly cache de bulunan CodeSmith kurulduğunda sisteme yüklenen bir assemblydir.

Template'e Referans Eklemek

Template'e referans eklemek için kullanacağımız yazım kuralı asp ile uygulamam geliştirenler için yine yabancı gelmeyecektir.

Veritabanı şemasına erişebilmek için aşağıdaki şekilde gözüktüğü gibi yeni bir template oluşturalım.
SchemaExplorer assemblysine referans ekleyebilmek için; <@Assembly Name="SchemaExplorer" %> ifadesini yazıyoruz.

Referans eklendikten sonra bu assembly içindeki rootnamespace olan SchemaExplorer namespaceini import etmeliyiz. Tür isimlerini uzun uzun yazmak yerine import ediyoruz tabiki.

Veritabanının şemasına erişmekten bahsediyoruz. Bu durumda templatein ilk öğrenmesi gereken şey "Hangi veritabanı?" sorusunun cevabı olmalıdır. Bunun için template'imize bir property eklememiz gerekiyor.

Veritabanını Seçmek

Veritabanını seçmek için template ekleyeceğimiz propertynin veri türü SchemaExplorer namespace i içerisinde yer alan DatabaseSchema sınıfıdır.

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

Yukarıdaki property tanımlanırken Optional özelliği false olarak belirlenmiştir zira templatein veritabanı seçilmeden çalışmaması istenmektedir.

Veritabanı seçilmeden templatei çalıştırmak istediğimizde hata mesajı ile bizi uyaracaktır.

<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>
<%@ Property Name="Veritabani" Type="DatabaseSchema" Optional="False" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

Yukarıdaki resimde de gözüktüğü gibi Veritabanı propertysi properties ekranında gözükmektedir. Bu özelliğin yanındaki "..." butonuna tıklandığında, DatabaseSchema türü için belirlenen editör olan DatabasePicker formu açılmaktadır. Bu listede örnek kayıt olarak Northwind veritabanı tanımlı geliyor. Form üzerindeki "..." butonuna tıklayarak yeni bir veritabanı bağlantısı tanımlayabilirsiniz.

Data Source Manager formu üzerinde Add butonu ile ile yeni bağlantı tanımlamak için Data Source formu açılır.
 

Yukarıda gözüktüğü gibi örnek olarak pubs veritabanını için gerekli tanımlamayı yapıyor ve OK butonu ile yeni bağlantıyı tanımlıyoruz.

Örnek için pubs bağlantısını seçip devam edelim.

Veritabanındaki Tabloların Listesini Almak

Template'leri tanımlarken <% %> blokları arasına yazdığımız kodlar template çalıştırıldığında yukarıdan aşağıya doğru çalıştırılırlar. Ancak yine asp de olduğu gibi <script></script> etiketleri arasında metodlar tanımalayabilirsiniz. Template için tanımlanan script etiketinin runat özelliğinin template olması gereklidir.

<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>
<%@ Property Name="Veritabani" Type="DatabaseSchema" Optional="False" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<script runat="template">
void ListTables()
{
TableSchemaCollection tablolar;
tablolar=Veritabani.Tables;
foreach(TableSchema ts in tablolar)
{
Response.WriteLine(ts.Name);
}
}
</script>

Yukarıda kalın harfler ile gösterilen bölümde gözüktüğü gibi bir metod tanımlaması yaptık ancak templatei bu şekilde çalıştırdığımızda hiç bir çıktısı olmayacaktır. Zira metoda herhangi bir çağrı yapılmamıştır. Bunun için template i aşağıdaki gibi düzenlememiz gerekmektedir.

<%@ CodeTemplate Language="C#" TargetLanguage="Text" %>
<%@ Property Name="Veritabani" Type="DatabaseSchema" Optional="False" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<script runat="template">
void ListTables()
{
TableSchemaCollection tablolar;
tablolar=Veritabani.Tables;
foreach(TableSchema ts in tablolar)
{
Response.WriteLine(ts.Name);
}
}
</script>
<%
ListTables();
%>

Kalın harflerde gösterilmiş <% %> etiketleri arasındaki bölüm template çalıştırıldığında yukarıdan aşağıya doğru çalışacaktır. Ve bu kod bloğunda ListTables adındaki metodumuza çağrı olduğuna göre o noktaya metod çalışacak ve template çıktısına tablo isimlerini yazacaktır.

Tablonun Sütunlarını Almak

CodeSmith nesne modeli bir süre sonra referansa bakmadan veya intellisense e başvurmadan metodları ve propertyleri tahmin edebileceğiniz kadar basit. Nasıl ki DatabaseSchema sınıfının Tables özelliği veritabanındaki tabloları veriyor ise, tabloları temsil eden TableSchema sınıfının Columns özelliği ise tablonun sütunlarının listesini vermektedir.

<script runat="template">

void ListTables()
{
            TableSchemaCollection tablolar;
            tablolar=Veritabani.Tables;
            foreach(TableSchema ts in tablolar)
            {
                        Response.WriteLine(ts.Name);
                        Response.Indent();
                        foreach(ColumnSchema cs in ts.Columns)
                        {
                                   Response.WriteLine(cs.Name);
                        }
                        Response.Unindent();

            }
}
</script>

Response sınıfının Indent ve Unindent metodları ise girinti ve çıkıntılı çıktı oluştumak istendiğinde kolaylık sağlamaktadır.

Template'i çalıştırdığımızda çıktısının aşağıdaki gibi olduğu gözükecektir.

Devam eden makalelerimizde elde ettiğimiz bu verileri işe yarar şekilde çıktı üretmek için kullanacağız. Örneğin stored procedure oluşturmak gibi. Aslında bu noktadan sonra bir çok işlevi yerine getirebiliriz.

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