SQL Management Objects (SMO) 2

SQL Management Objects (SMO) 2

Sistemdeki Database"leri listelemekle işe başlayabiliriz. Bu işlem için aspx sayfamıza bir tane ListBox sürükleyip bırakalım ve adını da LbDataBase olarak değiştirelim. Database"lei bu listbox"ın içinde listeleyeceğiz neden böyle bir şey yaptığımı makalenin devamında anlıyor olacaksınız. SQL Server"daki Database"leri ListBox"ın içine doldurmak için gereken kodları aşağıda görüyorsunuz.

Öncelikle sayfamıza gerekli namespace"leri dahil ediyoruz.

using Microsoft.SqlServer.Management.Smo;using Microsoft.SqlServer.Management.Common;

private void GetirDataBase(){    Server server = new Server(@"BBAS-MOBILESQL2005"); //Server nesnemizi tanımlıyoruz..    foreach (Database db in server.Databases)    {        LbDataBase.Items.Add(db.Name.ToString());    }}

Kodları makalemizin diğer bölümlerinde de kullanmak için bir metodun içine yazmayı uygun gördüm. Buradaki Server nesnesini bir önceki makalemde anlatmıştım. Burada yeni olan Database nesnesi. Adından da anlaşılacağı gibi bu nesne Database ile ilgili bilgileri tutuyor. Server nesnesinin Databases metodu bize SQL Server"daki tüm Database"leri döndürüyor biz de burada Database"lerin isimlerini teker teker ListBox"a ekliyoruz. PageLoad"da GetirDataBase() metodumuzu çağırdığımız zaman SQL Server"daki tüm Database"lerin listbox"ımızın içinde listelendiğini göreceksiniz. Şimdi de sistemimize yeni bir Database ekleyelim adı da Burak olsun. Bu işlem için öncelikle tüm Database"leri listelediğim sayfaya bir tane button koyup adını AddDb olarak, text özelliğini de Yeni Database ekle olarak değiştiriyorum. Bu buttona tıklanınca yeni bir sayfaya gidilsin ve işlem o sayfa üzerinden yapılsın.Yeni sayfamın adını da AddNewDb.aspx olarak belirledim ve içerisine bir tane textbox ile bir tane bir tane button koydum. Buttona tıklanınca textbox"ın içine girilen değer Database"in adı olacak şekilde bir tane Database oluşturulup tüm Database"lerin listelendiği sayfaya direk yönlendiriliyoruz. Buttona tıklanınca çalıştırılacak kodları aşağıda görüyorsunuz.

try{    Server server = new Server(@"BBAS-MOBILESQL2005");    Database db = new Database(server, TbDbAdi.Text);//Yeni Database"in adını ve hangi Server"da oluşturulacağı belirtiliyor.    db.Create();//Database oluşturuluyor.    Response.Redirect("SMO2.aspx");}catch (SmoException ex){    Response.Write(ex.Message);}

 

Şimdi sıra geldi tablolara. Listbox"ta seçilen Database"in özellikleri ve bu Database"de yer alan tabloları da başka bir listbox"da listelemek istiyorum. Bunun için sayfamıza bir tane label ve bir tane daha listbox sürükleyip bırakıyorum. Label"ın adını LabelDbOzellik ve listbox"ın adını da LbTables olarak değiştiriyorum. LbDataBase listbox"ımızın SelectedIndexChanged olayına yazacağımız kodları aşağıda görüyorsunuz. Bu kodlar seçilen Database"in özelliklerini label"a yazacak ve bu Database içinde yer alan tabloları da yeni listbox"a dolduracak.

protected void LbDataBase_SelectedIndexChanged(object sender, EventArgs e){    LabelDbOzellik.Text = "";//Label"daki yazıyı temizliyorum..    Server server = new Server(@"BBAS-MOBILESQL2005");    Database db = server.Databases[LbDataBase.SelectedItem.ToString()];

    //Seçilen Database"in özellikleri listeleniyor...    foreach (Property pr in db.Properties)//Property nesnesi tanımlayıp Database"in tüm özelliklerini teker teker bu nesne yardımı ile ekrana basıyoruz...    {        LabelDbOzellik.Text += "
"+pr.Name+": "+pr.Value;
//Name özelliği özellğini ismini, Value ise özellğin değerini döndürüyor.    }

    //Seçilen Database"deki tablolar listbox"a dolduruluyor...

    LbTables.Items.Clear();//Listbox"ın itemlarını temizliyorum...    foreach (Microsoft.SqlServer.Management.Smo.Table tb in db.Tables)    {        LbTables.Items.Add(tb.Name.ToString());    }

}

Yukarıdaki resimlerde kodların çalıştırıldıktan sonraki ekran görüntüsünün bir kısmını görüyorsunuz. Kodların üzerinde göz gezdirecek olursak; Server nesnemizden sonra bir Database nesnesi tanımlıyoruz ve hangi Database"i kullanacaksak sadece onu getiriyoruz. İşlemin diğer kısımlarını bu Database nesnesi üzerinden yapıyoruz. Database"in özelliklerini ekrana basarken Property adında bir tane daha nesneyle tanıştık bu nesne adından da anlaşılacağı gibi özellikleri barındıran bir nesne ve verileri Database nesnesinin Properties özelliğinden alıyor, hemen altta tabloları listbox"a doldururken değişik bir şey fark etmiş olmalısınız. Table nesnesini neden direkt Table şeklinde değil de Microsoft.SqlServer.Management.Smo.Table şeklinde tanımlamamın nedeni; bir tane Table nesnesi de System.Web.UI.WebControls namespace"inin içinde bulunmasından kaynaklanmaktadır, hangi Table"ı kullandığımı belirtmem gerektiği için böyle bir kullanım yolu seçtim.

Şimdi de herhangi bir tablo seçildiğinde bu tablonun sütunlarını listelemeye çalışalım. Bu işlem için de bir tane listbox kullanmayı uygun görüyorum. Hemen bir tane daha listbox sürükleyip bırakıyorum ve adını LbColumn olarak değiştiriyorum. LbTables listbox"ının SelectedIndexChanged olayına gerekli kodları yazıyorum:

protected void LbTables_SelectedIndexChanged(object sender, EventArgs e){

    LbColumn.Items.Clear();

    Server server = new Server(@"BBAS-MOBILESQL2005");    Microsoft.SqlServer.Management.Smo.Table tb = server.Databases[LbDataBase.SelectedItem.ToString()].Tables[LbTables.SelectedItem.ToString()];

    foreach (Column cl in tb.Columns)    {        LbColumn.Items.Add(""+cl.Name.ToString()+" "+cl.DataType+"("+cl.DataType.MaximumLength+")");    }}

Gördüğünüz gibi tablomuzda yer alan sütunları listeledik. Listeleme şekli tanıdık geliyor mu?

Kodda öncelikle bir tane Table nesnesi tanımlayıp seçili olan tabloyu bu nesneye eşitledik. Daha sonra Table nesnesinin içinde bulunan Columns özelliğini kullanarak sütunların özelliklerini döndürdük, ben burada sadece sütunun adını, veri tipini ve maximum uzunluğunu döndürdüm diğer özelliklere de tabii ki erişilebiliyor.

Şu ana kadar olan bölümde tablo ve sütunları döndürebildik dilerseniz bir de tablo ve bu tabloya da sütun ekleyelim. Öncelikle tablo ekleyerek işe başlayalım. Bunun için LbTables"ın altına bir tane textbox ve bir tane button koyalım. Textbox"ı kullanarak yeni oluşturulacak tablonun ismini girelim ve button yardımı ile de bu tabloyu oluşturalım. Buttona tıklanınca işletilecek kod bloğunu aşağıda görüyorsunuz.

protected void ButtonAddTable_Click(object sender, EventArgs e){

    Server server = new Server(@"BBAS-MOBILESQL2005");

    //Tabloyu oluşturuyoruz

    Microsoft.SqlServer.Management.Smo.Table NewTable = new Microsoft.SqlServer.Management.Smo.Table(server.Databases[LbDataBase.SelectedItem.ToString()], TbNewTable.Text);   

    Column c = new Column(NewTable, "ID", Microsoft.SqlServer.Management.Smo.DataType.Int);    c.Nullable = false;    c.Identity = true;    c.IdentityIncrement = 1;    c.IdentitySeed = 1;    

    NewTable.Columns.Add(c);    NewTable.Create();

    //ID sütünu primary key olarak tanımlanıyor.

    Index i = new Index(NewTable, "PK");    IndexedColumn ic = new IndexedColumn(i, "ID");    i.IndexedColumns.Add(ic);    i.IndexKeyType = IndexKeyType.DriPrimaryKey;    i.Create();

    //Tablolar yeniden listbox"a yükleniyor...

    LbTables.Items.Clear();    foreach (Microsoft.SqlServer.Management.Smo.Table tb in server.Databases[LbDataBase.SelectedItem.ToString()].Tables)    {        LbTables.Items.Add(tb.Name.ToString());    }}

Hatırlarsanız yazımın başında Burak adında bir tane Database oluşturmuştum bu Database"e Sehirler adında bir tane tablo ekledik. Bu tabloya bir tane de Sütun eklemek zorunda kaldım çünkü bir tablo en az bir tane Sütun içermek zorundadır. Bu sütunun adını ID olarak belirledim ve bir kaç özelliğini ayarladım. Sırasıyla bu özellikler; sütun null değer alamıyor, sütun bir identity, sayı artışı 1"den başlıyor ve 1"er 1"er artıyor. Tabloyu yarattıktan sonra bu tabloya bir de Primary Key tanımladım. Kodlardan da anlayacağınız gibi bu Primary Key ID sütunumuz oldu.

 Ufak bir düzenlemeyle tıpkı SQL Server Management Studio"da olduğu gibi önce sütunları sonra da tabloyu oluşturmak daha mantıklı olacaktır ama bu işlem konumuzun dışında olduğu için burada göstermiyorum.  

  SMO"da Transaction Bloğunun Kullanımı

Transaction veritabanının olmazsa olmaz bir parçasıdır. Transaction kullanılarak veri bütünlüğü sağlanıyor, SMO"da da üstlendiği görev veri bütünlüğü sağlamaktan çok farklı değil. Şöyle bir senaryo düşünelim bir tabloya sütun ekliyorsunuz ve sütun adlarının tamamını bir fonksiyona dizi halinde gönderdiniz yani tüm sütunlarınız tek bir buttona basılarak oluşturulacak. Ama bu sütun isimlerinden biri sisteme daha önce girilmiş ya da sizinle aynı anda başka bir kullanıcı da aynı sütun isminde bir sütun eklemeye çalışıyor bu durumda eğer Transaction kullanmazsanız hata oluşan yere kadarki kod bloğu işletilecek ve oluşturulan sütunlar da orada kalacaktı ama Transaction kullanmış olsaydınız hata oluşan yere kadar yapılan tüm değişiklikler roll back olacaktı ve oluşturduğunuz tüm sütunlar silincekti. Sözü fazla uzatmadan bir örnekle açıklayayım. Az önce Burak Database"ine Sehirler adında içinde ID sütunu bulunan bir tablo eklemiştik. Şimdi ise bu tabloya önce SehirAdi daha sonra terkrar ID sütununu ekleyecek şekilde bir kod yazalım. Bu kodu önce Transaction bloğu içine alalım sonra almadan tekrar deneyelim. Bunun için adı TransactionDeneme olan bir button ekleyip click eventine kodları yazıyorum.

protected void TransactionDeneme_Click(object sender, EventArgs e){

    Server server = new Server(@"BBAS-MOBILESQL2005");

    server.ConnectionContext.BeginTransaction();//Transaction"ı başlattık..

    try    {

        Microsoft.SqlServer.Management.Smo.Table tb = server.Databases["Burak"].Tables["Sehirler"];

        Column c = new Column(tb, "SehirAdi ", Microsoft.SqlServer.Management.Smo.DataType.VarChar(50));        c.Create();

        c = new Column(tb, "ID ", Microsoft.SqlServer.Management.Smo.DataType.Int);        c.Create();

        server.ConnectionContext.CommitTransaction();//İşlem sorunsuz bir şekilde sonlandıysa Transaction"ı onaylayıp değişiklikleri kaydediyoruz...   

    }    catch (SmoException ex)    {

        server.ConnectionContext.RollBackTransaction();//Hata oluştuysa işlemlerin tümünü geri alıyoruz...        Response.Write(""+ex.Message);

    }}

İlk Durum (Kodlar Transaction bloğu içinde):

İkinci Durum (Kodlar Transaction bloğu içinde değil):

Böylece bu makalemizin de sonuna geldik. Yeni bir makalede görüşmek dileğiyle.

Döküman Arama

Başlık :

Kapat