SQL Server Management Objects (SMO)

SQL Server, Oracle Add comments

SQL Server 2000, SQL sunucularını uzaktan programatik olarak yönetebilmek için COM tabanlı SQL-DMO(Distributed Management Objects) bileşenini(sqldmo.dll) sunmaktaydı. SQL Server yönetimi için kullandığımız Enterprise Manager uygulaması da temelde bu API’yi kullanıyor. SQL Server 2005, doğrudan DMO bileşenine destek vermekle birlikte bunu biraz daha geliştirip, iki tane .NET tabanlı bileşen haline getirmiştir;SQL Server Management Objects (SMO) ve Replication Management Objects (RMO). Bu kütüphaneler, nesnelerin script yapısı yönetim, database backup yönetimi, job oluşturulması ve güncellenmesi, nesne güncellemeleri gibi işlemleri, programlarımız içerisinden yapmamızı sağlar. Bu yazıda özellikle database yöneticileri için her derde deva olarak görülen SMO kütüphanesi detaylandıracağız.
Bilindiği gibi bir veya daha fazla SQL sunucunu yönetmek için Management Studio IDE’si kullanılır. Bu arabirimin olmadığı ortamlarda third party araçlar tercih edilir. Bazı durumlarda bu araçlardan birini tercih etmeyip kendimize özgü bir arabirim geliştirmek isteriz. Örneğin web tabanlı bir SQL sunucu yönetimine hepimizin ihtiyacı vardır. Bu tür durumlarda SMO kütüphanesi kullanılarak bir SQL sunucu üzerinde Management Studio aracılığıyla yaptığımız birçok işlemi programatik olarak gerçekleştirilebiliriz. SMO, SQL Server 2005′e özgü property ve metodlar taşısa da sadece SQL Server 2005 değil önceki sürümler için de kullanabiliriz.
SMO, DMO gibi bir .dll dosyası olup SQL Server 2005 ile birlikte gelen .NET tabanlı Microsoft.SqlServer.Smo.dll kütüphanesidir. SMO ve konuyla ilgili diğer kütüphaneler (Microsoft.SqlServer.ConnectionInfo.dll veya Microsoft.SqlServer.SmoEnum.dll), C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies klasöründe bulunmaktadır. Bu kütüphaneleri kullanmak için .NET uygulamamıza referans olarak eklememiz yeterlidir. SMO uygulamaları, çalıştığı makinede SQL Server 2005′in Client Tools ayarlarına göre MDAC 9.0 ve Microsoft System.Data.SqlClient kütüphanesine bağımlı olarak çalışır.
SMO Assembly, SQL sunucu yönetimiyle ilgili olarak aşağıdaki namespace’leri içerir.

Namespace Açıklama
Microsoft.SqlServer.Management.Smo SQL Server’i yönetmek için kullanılan sınıfları içerir.
Microsoft.SqlServer.Management.Smo.Agent SQL Server Agent ile ilgili sınıflar
Microsoft.SqlServer.Management.Smo.Broker Service Broker yönetimi için gerekli sınıflar
Microsoft.SqlServer.Management.Smo.Mail SQLiMail servisiyle ilgili sınıflar
Microsoft.SqlServer.Management.Smo.RegisteredServers Sunucu üzerindeki Registered Server’ların yönetimiyle ilgili sınıflar
Microsoft.SqlServer.Management.Smo.Wmi WMI(Windows Management Instrumentation-Windows Yönetim Alt Yapısı) ile ilgili sınıflar

SMO ile ilgili işlemler yapılırken öncelikle aşağıdaki .dll dosyalarını projeye referans olarak eklemeliyiz;

  • “C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll”,
  • “C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.Smo.dll”,
  • “C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.SmoEnum.dll”,
  • “C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.SqlEnum.dll”
    Ardından hangi sunucu üzerinden çalışacaksak onu temsil eden bir Microsoft.SqlServer.Management.Smo.Server nesnesi yaratılır. Bu server default olarak lokaldeki sunucuya işaret eder. Eğer lokaldaki sunucudan farklı bir sunucuyu yönetmek istersek o sunucunun adını verebildiğimiz gibi Microsoft.SqlServer.Management.Common.ServerConnection türünde bir nesne oluşturup bu nesneyi Server nesnesine parametre olarak geçebiliriz. Yani Server sınıfı, overload edilmiş constructor’e sahiptir. Basit bir örnek yapalım; aşağıdaki kod parçacığı, AHMETA\AKAYMAZ sunucusunun adını ve versiyon bilgisini ekrana yazdırmaktadır.
    using System;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    
    class Program
    {
        static void Main()
        {
            //Lokaldeki sunucuya işaret eder
            //Server Svr = new Server();
    
            //Lokaldeki sunucu üzerindeki AKAYMAZ isimli instance
            //Server Svr = new Server(@"(local)\AKAYMAZ");
    
            Server Svr = new Server(@"AHMETA\AKAYMAZ");
            Console.WriteLine(Svr.Name +" "+ Svr.Information.VersionString);
            Console.ReadLine();
        }//Main
    }//Program

    AHMETA\AKAYMAZ 8.00.760Eğer bu sunucuya farklı güvenlik bilgileriyle erişilecekse ya Server.ConnectionContext sınıfı kullanılır veya ServerConnection türünde bir nesne tanımlanır.

    Server Svr = new Server(@"AHMETA\AKAYMAZ");
    
    //Windows Authentication değil SQL Authentication kullanacağız
    Svr.ConnectionContext.LoginSecure = false;
    Svr.ConnectionContext.Login = "sa";
    Svr.ConnectionContext.Password = "123";
    
    Console.WriteLine(Svr.Name +" "+ Svr.Information.VersionString);

    Güvenlik bilgilerini ServerConnection nesnesi aracılığıyla da verebiliriz.

    ServerConnection Cnn = new ServerConnection(@"AHMETA\AKAYMAZ");
    Cnn.LoginSecure = false;
    Cnn.Login = "sa";
    Cnn.Password = "sa";
    
    Server Svr = new Server(Cnn);
    Console.WriteLine(Svr.Name +" "+ Svr.Information.VersionString);
    Yeri gelmişken söyleyelim; SMO, default olarak connection pooling özelliğine sahiptir. Yani ilk açılan bağlantı establish olur ve gerektiğinde yeniden kullanılır. SMO’nun bu davranışı, ServerConnection sınıfının ServerConnection AutoDisconnectMode property’si “AutoDisconnectMode.NoAutoDisconnect” olarak set edilerek veya ConnectionContext sınıfının NonPooledConnection property’si “true” yapılarak değiştirilebilir.
    Server Svr = new Server(Cnn);
    Svr.ConnectionContext.NonPooledConnection = true;
    Svr.ConnectionContext.Connect();
    Console.WriteLine(Svr.Name +" "+ Svr.Information.VersionString);
    Svr.ConnectionContext.Disconnect();

    Burada SMO ile ilgili tüm sınıfları incelemek yerine günlük hayatta en çok ihtiyaç duyulan birkaç tanesinden bahsedeceğiz. İçinde bulunduğumuz networkte canlı olan SQL Server sunucularını öğrenmek için Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers() metodu kullanılır.

    using System.Data;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    
    class Program
    {
        static void Main()
        {
            //Network üzerinde bulunan SQL Server'lerin listesi
            DataTable dtSqlServers = SmoApplication.EnumAvailableSqlServers();
            foreach (DataRow dtSrv in dtSqlServers.Rows)
            {
                String ServerName;
                ServerName = dtSrv["Server"].ToString();
                if (dtSrv["Instance"] != null
                    && dtSrv["Instance"].ToString().Length > 0)
                    ServerName += @"\" + dtSrv["Instance"].ToString();
    
                Console.WriteLine(ServerName);
            }
    
            Console.ReadLine();
        }//Main
    }//Program

    Aynı şekilde Server nesnesinin Databases property’si kullanılarak o sunucudaki veritabanlarına oradan da Tables property’si kullanılarak tablolarına erişilebilir. Aynı şekilde sunucu üzerinde database, table, view gibi nesneler de aynı bileşen ile oluşturulabilir. Ayrıca SMO içindeki ConnectionContext sınıfı aracılığıyla Transaction desteği de sağlanabilir.BeginTransaction(), CommitTransaction() ve RollBackTransaction() metodları, sunucu üzerinde yazma, silme, güncelleme işlemleri yapılırken kullanılabilir.Böylece veri bütünlüğü de sağlanmış olur.
    Aynı şekilde sunucu üzerindeki Login, User, Schema, Roll yönetimini de SMO içerisindeki sınıf ve metodlarla gerçekleştirebiliriz.

    Database ve Object Script Oluşturma
    Bu bölümde en çok ihtiyaç duyulan konulardan biri de database veya database üzerindeki nesnelerin scriptini üretmektedir. Management Studio’da bir database veya database içerisindeki nesneyi sağ tıklayarak o nesnenin SQL Script’ine çok rahat ulaşılabilmekteydi. Bunu SMO ile gerçekleştirmek için Microsoft.SqlServer.Management.Smo.Scripter classı veya database objesinin Script() metodu kullanılır. Script() metodu, geriye System.Collections.Specialized.StringCollection türünde değer döndürür. Aşağıdaki örnekte msdb database’in içindeki storedprocedure’ler listelenmiş ve bunlardan bir tanesi için object script oluşturulmuştur.

    using System;
    using System.Data;
    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Common;
    using System.Collections.Specialized;
    
    class Program
    {
        static void Main()
        {
            //Network üzerinde bulunan SQL Server'lerin listesi
            Server Svr = new Server(@"AHMETA\AKAYMAZ");
            //msdb veritabanı için referans oluşturalım.
            Database Db = Svr.Databases["msdb"];
    
            //msdb içindeki StoredProcedure listeleyelim
            foreach (StoredProcedure MySp in Db.StoredProcedures) {
                //Console.WriteLine(MySp.Name);
            }
    
            //msdb içindeki dt_adduserobject isimli procedure'in object scriptini oluşturalım.
            StoredProcedure Sp = Db.StoredProcedures["dt_adduserobject", "dbo"];
            StringCollection Sc = Sp.Script();
    
            foreach (string S in Sc)
                Console.WriteLine(S);
    
            Console.ReadLine();
        }//Main
    }//Program

    Script() metoduna alternatif olarak Scripter nesnesi de kullanılabilir. Bu nesnenin avantajı birden fazla nesnin script’ini aynı anda oluşturabiliyor olmamızdır. Bu nesnenin Script() metodu, SqlSmoObject türünde parametre almaktadır. SqlSmoObject, SQL Server üzerinde bulunan nesneleri tutabilen bir veri türüdür.

    static void Main()
    {
        //Network üzerinde bulunan SQL Server'lerin listesi
        Server Svr = new Server(@"AHMETA\AKAYMAZ");
        //msdb veritabanı için referans oluşturalım.
        Database Db = Svr.Databases["msdb"];
    
        //msdb içindeki dt_adduserobject isimli procedure'in object scriptini oluşturalım.
        Scripter Scr = new Scripter();
        Scr.Server = Svr;
    
        StoredProcedure Sp = Db.StoredProcedures["dt_adduserobject", "dbo"];
        SqlSmoObject[] Objs = new SqlSmoObject[1];
        Objs[0] = Sp;
    
        StringCollection Sc = Scr.Script(Objs);
    
        foreach (string S in Sc)
            Console.WriteLine(S);
    }//Main

    SMO ile database backup alma
    SMO ile yapabildiğimiz işlem sadece sunucu ve o sunucu üzerinde duran veritabanlara, veritabanların nesnelerine erişmek değildir. Aynı zamanda o sunucunun bakımını SMO ile yapabiliriz. Örneğin en çok ihtiyaç duyduğumuz konulardan biri sunucu üzerinde backup işlemlerinin yapılmasıdır.

    class Program
    {
        static void Main()
        {
            //Network üzerinde bulunan SQL Server'lerin listesi
            Server Svr = new Server(@"AHMETA\AKAYMAZ");
            Backup Bkp = new Backup();
            Bkp.Devices.AddDevice(@"C:\Pubs.bak", DeviceType.File);
            Bkp.Database = "Pubs";
            Bkp.Action = BackupActionType.Database;
            Bkp.Initialize = true;
            Bkp.PercentCompleteNotification = 10;
            Bkp.PercentComplete += new PercentCompleteEventHandler(Bkp_YuzdeGoster);
            Bkp.SqlBackup(Svr);
    
            Console.ReadLine();
        }//Main
    
        static void Bkp_YuzdeGoster(object sender, PercentCompleteEventArgs e)
        {
            Console.WriteLine("% " + e.Percent.ToString() +" backup alındı");
        }//Bkp_YuzdeGoster
    
    }//Program

    Bu şekilde devam ederek SMO aracılığıyla SQL Server sunucuları üzerinde backup, restore, data import/export gibi birçok işlemi gerçekleştirebiliriz.

  • 36 Responses to “SQL Server Management Objects (SMO)”

    1. reber beritan Says:

      Hocam makale çok güzel olmuş. Hocam ben üniv. 4. sınıf öğrencisiyim. Bitirme ödevim web tabanlı sql server yönetimi. Makalenizdeki ağ üzerinde canlı server’ları öğrenme bölümünü denedim bi türlü olmadı. Bu konuda çok acil yardımcı olursanız çok sevinirim. Yani ağ üzerinde canlı olan Sql sunucularını nasıl öğrenecem. Şimdiden teşekkürler…

    2. Ahmet Kaymaz Says:

      Sayın Beritan, ilginiz için teşekkür ederim.
      Network üzerinde canlı olan SQL Server sunufularını listelemek için makaledeki kodu kullanmanız yeterlidir. “Bir türlü olmadı” dediğiniz hata nedir. Ayrıca kullandığınız kodları paylaşırsanız daha doğru yönlendirme yapabiliriz. Kolay gelsin,

    3. reber beritan Says:

      Hocam yazdığım kodlar aşağıda görülmektedir. Benim problemim şu: Benim bilgisayarımda hem sql 2000 hemde sql 2005 kurulu. Benim yazdığm bu kodlarla Sql 2005 görünüyor. Ama Sql 2000′e bir türlü ulaşamadım. Hem sql2000 hem de 2005 ikiside aktif ve çalışyorlar. Ama her nedense Dropdownlist’te sadece Sql 2005 gözüküyor.

      protected void Page_Load(object sender, EventArgs e)
      {
      int sayac=1;
      //Network üzerinde bulunan SQL Server’lerin listesi
      DataTable dtSqlServers = SmoApplication.EnumAvailableSqlServers();
      DropDownList1.Items.Insert(0, “Server’ı seçin”);
      foreach (DataRow dtSrv in dtSqlServers.Rows)
      {
      String ServerName;
      ServerName = dtSrv["Server"].ToString() + dtSrv["Instance"].ToString();
      DropDownList1.Items.Insert(sayac, ServerName);
      DropDownList1.DataBind();
      sayac++;
      }

      }

    4. reber beritan Says:

      Lütfen Hocam çok acil cevabınızı bekliyorum.
      Not: hem sql 2000 hem de sql 2005 ikisini de local olarak kuruşum.

    5. Ahmet Kaymaz Says:

      Şu anda makinemde 2 SQL server bulunmadığı için bir deneme yapamıyorum. Fakat SQL browser servisinden kaynaklanıyor diye tahmin ediyorum. “Microsoft SQL Server 2005 »
      Configuration Tools »
      SQL Server Configuration Manager » SQL Server 2005 Services” altındaki “SQL Server Browser” servisini turn on ederek deneyebilir misiniz. Bu servis, makine üzerinde bulunan instance’leri yöneten bir windows servisidir.

      Aynı zamanda registry’de her iki instance görünüyor mu gerçekten. “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server » InstalledInstances”

      Eğer hala görünmüyorsa “SmoApplication.SqlServerRegistrations.RegisteredServers” koleksiyonunu deneyebilirsiniz.

      Umarım bu yönlendirmeler size yardımcı olur.

    6. reber beritan Says:

      Hocam, “SQL Server Browser” servisi çalışıyor zaten. Yeniden başlattım. Değişen bişey olmadı. sadece 2005′i görüyor. Ayrıca registery’de her iki instance da görünüyor. Aslında hocam 2 3 gün öncesine kadar ağ üzerindeki tüm SQL serverları (hem 2000′i hem de 2005′i) görüyordu. Ama ne olduysa 2 3 gündür SQL 2000′i görmüyor. Yardımınız için teşekkürler

    7. yener Says:

      merhaba sql server 2005 kullanarak web sayfasına admin yapabildim ve localhost olarak çalıştırdım ancak bunu sunucuya export ve import edemiyorum bir bilginiz var mı Teşekkürler.

    8. Ahmet Kaymaz Says:

      Merhaba,

      ne yapmak istediğimiz anlayamadım. Local’de oluşturduğunuz veritabanını mı sunucuya yükleyemiyorsunuz ? Bunu sizin de denediğiniz tahmin ettiğim Import/Export bölümünden kolaylıkla yapabilirsiniz. Bu işlemi yaparken aldığınız hatanın ne olduğunu yazarsanız belki bir yönlendirme yapabiliriz.

    9. yener Says:

      merhaba öncelikle import ve exportu nasıl yapabileceğime dair bir bilgi verici kaynak varmı ? local de veri tabanını oluşturdum ve sorunsuz çalışıyor ama import ve exportu tam olarak yapamıyorum bunun için sac ayarları varmış ancak içinden çıkamadım teşekkürler .

    10. Ahmet Kaymaz Says:

      Sac ayarları ??

      Önceki mesajımda yazdığım gibi hatanın ne olduğunu aktarmanız daha mantıklı olacaktır.

      SQL Server ile ilgili Türkçe kaynak olarak Yaşar Gözüdeli’nin kitabını tavsiye ederim.
      Ayrıca Import/Export işlemi için aşağıdaki linkleri kullanabilirsiniz.

      http://www.mssqltips.com/tip.asp?tip=1055
      http://www.databasejournal.com/features/mssql/article.php/3580216

      Kolay gelsin,

    11. yener Says:

      Merhabalar

      An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

      uzaktaki servere bağlanırken gelen hata mesajım şu şekilde şu anda uzak sunucuya data basei aktardım ancak web config dosyasına ceşitli connection stringlerle bağlantı yapmaya calıştığımda bu hata mesajı geliyor .serveri yöneten kişilerin verdiği cevapsa bizde her şey normal.

      sizce hata nerden kaynaklanabilir. bana örnek bir connection string ayarı gösterebilirmisiniz …teşekkürler

    12. Ahmet Kaymaz Says:

      Merhaba Yener,

      Bunun birkaç nedeni olabilir. Olmayan bir SQL Server sunucusuna erişmeye çalışıyor olabilirsin veya SQL Server sunucusu için Connection string tanımlaması yanlış olabilir veya SQL Browser servisi başlatılmamış veya en güçlü ihtimal olarak karşı sunucu uzaktan bağlanmaya (remote connections) ayarlanmamıştır.

      “SQL Server 2005 Network Configuration » Protocols for MSSQLSERVER” bölümünde TCP/IP ayarlarını gözden geçirmeni ve SQL Server 2005 Surface Area Configuration (SQL Server 2005 Yüzey Alanı Yapılandırması) bölümünden Surface Area Configuration for Services and Connections’ı (Hizmetler ve Bağlantılar için Yüzey Alanı Yapılandırması) tıklayıp Database Engine (Veritabanı Altyapısı) altındaki, Remote Connections’ı (Uzak Bağlantılar) » Local and remote connections’ı (Yerel ve uzak bağlantılar) tıklayıp sistemin uzaktan erişilebilir durumunu kontrol etmeni tavsiye ederim.

      Wb.Config veya App.Config dosyasınız için Connection string olarak aşağıdaki gibi bir tanımlama yapılabilir
      <connectionStrings>
      <add name="CnnStr" connectionString="server=<Sunucu IPsi>;database=<Veritabani Adi>;uid=<Kullanici Adi>;pwd=<Sifre>"/>
      </connectionStrings>

      Buradaki sunucu adını, “Server IP \ Instance Adı” olarak vermeniz daha doğrudur. Eğer default instance olarak kurulmuşsa istance adı olarak “MSSQLSERVER” ifadesini deneyebilirsin.

      Bu tanımlamaya da kodlarınız arasından şu şekilde erişebilirsiniz:
      SqlConnection mySqlCnn = new SqlConnection(ConfigurationManager.ConnectionStrings["CnnStr"].ToString());

      Sunucuya gerçekten uzaktan erişilip erişilmediğini öncelikle Query Analyzer’dan kontrol edebilirsen en azından sunucu ayarlarından mı yoksa connection string’den mi kaynaklanıyor öğrenmiş oluruz.

    13. fatih Says:

      Ahmet Bey iyi günler, ziden bir yardım isteyecem. ben SQLXPRESS te bir veritabanına erişen bir program yazdım ve bunu Local ağ üzerinden 3-4 makinaya da kullandıracam. bunun için yapmam gerekenleri araştırdım ve teorik olarak ne yapılacağını buldum ama pratikte biraz yardıma ihtiyacım var. sql olan makinaya programı kurdum, diğer bilgisayara programı kurup ilk çalıştırdığımda veritabanının yerini sordurup verileri oradan okuyup oraya yazmasını istiyorum. bu işlem için bana önerileriniz varmı, eğer böyle bişey yaptıysanız kod örneği gönderebilirmisiniz bi inceleyim.
      ilginize şimdiden teşekkür ederim

    14. Ahmet Kaymaz Says:

      Merhaba Fatih,

      anladığım kadarıyla program açıldığı zaman veya programın “Ayarlar” bölümünde programın kullanacağı veri tabanının adresini girmek istiyorsun. Böyle bir durumda programın kullanacağı veri tabanına ait connection string bilgisini kullanıcı bazlı konfigürasyon dosyasına yazarsın ve “Ayarlar” bölümünden System.Configuration.Configuration kütüphanesini kullanarak bu dosyadaki sectionları güncellersin. Konfigürasyon dosyaları nihayetinde XML tabanlı oldukları için rahatlıkla modify edilebilir. Bu dosya, uygulamaya ait olan App.Config dosyası olamaz çünkü .NET 2.0 ile birlikte runtime’da bu dosya readonly özelliğine sahiptir. Bu yüzden başka bir xml dosyası oluşturarak bu işlemi yapabilirsin.

      Veya asıl tavsiyem “Project » Properties Settings” bölümünden ayarlanan programa özgü ayarlarla bu işlemin yapman. Bununla ilgili aşağıdaki yazı ilgini çekebilir.

      http://www.ahmetkaymaz.com/2007/02/10/program-ayarlarinin-dinamik-kaydedilmesi/

      Kolay gelsin,

    15. fatih Says:

      Ahmet Bey merhaba,
      yazınızı okudum, projenin properties inde settings bölümünde connection tipinde veri tanımladım bunları program içinden nasıl kullanacam, biraz açarmısınız.

      iyi çalışmalar.

    16. Ahmet Kaymaz Says:

      Fatih bey,

      fikri vermesi açısından küçük bir örneğini vermiş olduğum linkteki yazının altına ekledim.

      http://www.ahmetkaymaz.com/2007/02/10/program-ayarlarinin-dinamik-kaydedilmesi/

      Kolay gelsin,

    17. kerem Says:

      Aşağıdaki likte Ahmet hocamızın anlatığı konunun devamını bulabilirsiniz. Backup ve Restore işlemleri mevcuttur.

      http://www.sqldbatips.com/showarticle.asp?ID=34

      İyi Çalışmalar.

    18. arzu Says:

      merhaba

      bu kodları referans alarak başladığım programda bi sorunum var, veritabanındaki tabloları bir listbox ta listelettim ve SelectedIndexChanged olayında table içerisindeki kayıtları bir gridview a bağladım.

      string cmd = “select * from ” +
      LbTables.SelectedItem.Text;
      SqlDataAdapter adpt = new SqlDataAdapter(cmd,
      conn);
      DataTable tbl = new DataTable();
      adpt.Fill(tbl);
      GridView1.DataSource = tbl;
      GridView1.DataBind();

      sorunum bu gridviewdaki kayıtları update edebilmek. update ifadesindeki where koşulunu nasıl verebilrim ??

      teşekkürler

    19. Ahmet Kaymaz Says:

      Arzu Hanım,

      bilindiği gibi DataAdapter sınıfının SelectCommand, InsertCommand, UpdateCommand, DeleteCommand olmak üzere üç temel komut nesnesi var. Size düşen adpt nesnesi için UpdateCommand property’sini düzenlemektir. Bunun için farklı update cümlesi yazılabilir ama en basiti bu işlemi tablodaki identity kolonunu referans alarak yapmaktır. Aşağıdaki ifadede ismi Ogrenci olan tablo için örnek bir güncelleme ifadesi yazılmıştır.
      adpt.UpdateCommand = conn.CreateCommand();
      adpt.UpdateCommand.CommandText = "UPDATE Ogrenci SET AdSoyad=@AdSoyad WHERE OgrenciId=@OgrenciId";
      adpt.UpdateCommand.Parameters.Add("@OgrenciId", SqlDbType.Int);
      adpt.UpdateCommand.Parameters.Add("@AdSoyad", SqlDbType.VarChar, 50);
      adpt.UpdateCommand.Parameters["@OgrenciId"].SourceColumn = "OgrenciId";
      adpt.UpdateCommand.Parameters["@AdSoyad"].SourceColumn = "AdSoyad";

      Fakat sizin örnekte tablo isimleri dinamik olarak seçildiği için update cümlenizi de dinamik olarak oluşturmanız gerekecektir. Bunu manual oluşturabileceğiniz gibi bu işlem için geliştirilmiş olan System.Data.Common.DbCommandBuilder sınıfını kullanabilirsiniz. Bu sınıf, DataAdapter nesnesinin SelectCommand özelliği için tanımlı olan SQL sorguya göre DataAdapter nesnesinin update, delete, insert ifadelerini oluşturur. Burada dikkat edilmesi gereken kodu SelectCommand için tanımlı olan select cümlesinde primary key’in de okunmasıdır. Aşağıdaki kodlarda bunun örneği verilmiştir. Ogrenci tablosu yerine ListBox’taki tablo adını ekleyeceksiniz.

      oDa = new SqlDataAdapter("SELECT * FROM Ogrenci", oCnn);
      oDs = new DataSet();
      oDa.Fill(oDs, "Tablo");

      SqlCommandBuilder oCb = new SqlCommandBuilder(oDa);
      oDa.InsertCommand = oCb.GetInsertCommand();
      oDa.UpdateCommand = oCb.GetUpdateCommand();
      oDa.DeleteCommand = oCb.GetDeleteCommand();

      dataGridView1.DataSource = oDs.Tables[0];

      DataGridView tarafında değişiklik yapıldıktan sonra güncelleme buttonuna şunları yazmamız yeterli olacaktır.
      oDa.Update(oDs.Tables[0]);
      oDs.AcceptChanges();
      MessageBox.Show("Kayıt başarıyla güncellendi.");

      Bununla birlikte büyük uygulamalarda bu sınıfın tercih edilmesi beraberinde performans sorunu da getirebilir.

    20. arzu Says:

      çok teşekkür ederim.

    21. esra Says:

      Makale için çok teşekkürler. Yukarıda “SMO, SQL Server 2005′e özgü property ve metodlar taşısa da sadece SQL Server 2005 değil önceki sürümler için de kullanabiliriz. ” böyle bir açıklama yapmışsınız fakat, ben yazdığım projede SMO kullandım ve SQL Server 2000′de kulanıldığında
      ************** Exception Text **************
      System.IO.FileNotFoundException: Could not load file or assembly ‘Microsoft.SqlServer.Smo, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91′ or one of its dependencies. The system cannot find the file specified.
      ****
      Hatası ile karşılaşıyorum. Microsoft.SqlServer.Smo dll’i de proje dosyaları ile gönderilmelimidir?

    22. Ahmet Kaymaz Says:

      Esra Hanım,

      Haklısınız, SMO bileşeni SQL Server 2005 ile birlikte makineye kurulduğu için bu makalede listesi verilmiş olan .dll dosyalarını da taşımalısınız. SMO bileşenini projenize referans olarak eklediğinizde bu dosyalar otomatik olarak BIN klasörünün içerisine düşer. Oradan da kopyalayabilirsiniz.

      Bununla birlikte uygulamanızın çalıştırılacağı makineye SQL Server 2005 kurmadan sadece SMO componentini de kurabilirsiniz. Bunun için Feature Pack for Microsoft SQL Server 2005 paketinin bulunduğu aşağıdaki adresi kullanabilirsiniz.

      http://www.microsoft.com/Downloads/details.aspx?familyid=50B97994-8453-4998-8226-FA42EC403D17&displaylang=en

    23. esra Says:

      açıklamalar için çok teşekkür ederim.

    24. yusuf Says:

      merhaba
      SQL Server 2005′te veritabanın olustururken server name: mesala yusuf ken veritabanı olusturabiliyorum. ama server name yusuf\SQLEXPRESS seçtigim zaman hata veriyo. Visual studio 2008 de olusturdugum veri tabanına baglanamıyo.
      hata da :
      An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)
      SQL Server 2005 Surface Area Configuration kısmından ayarlamaları da yaptım ama hata yine veriyo anlayamadım. Yardınız için şimdiden teşekkürler.

    25. Ahmet Kaymaz Says:

      Bu hata net olarak yönlendirici olmadığı için birkaç şey deneyerek sonuca varabilirsin. Remote Connection’a izin verilmesi ve instance adının doğru yazılması bağlanman için yeterli olacaktır. Yapılacakların listesini aşağıdaki sitede bulabilirsiniz.

      http://blogs.msdn.com/sqlexpress/archive/2005/05/05/415084.aspx

    26. yusuf Says:

      yardımınız için teşekkür ederim.

    27. Samet Says:

      Merhaba anlatım için teşekkürler…
      benim yapmak istediğim bir proje var ve bu projede banka hesapları var ve vadeli hesaplar için vade tarihi geldiğinde otomatik olarak faizi ana paraya ekleyip tekrar databaseki hesap bakiyesine yazdırmak istiyorum bunun bir yolu varmı acaba…

    28. Ahmet Kaymaz Says:

      Bu işlemi SQL Server veya Oracle gibi bir sistem üzerinde yapmak için Job mekanizmasını kullanabilirsiniz. Her gün sonunda ilgili tabloları sorgular bahsettiğiniz kriterlere uygun hesapları tespit eder ve onlara faiz uygulayıp kayıtları update/insert eder. Yani bu işlemi yapan SQL Scriptleri JOb içerisinde kullanarak ihtiyacınızı karşılayabilirsiniz.

    29. Gürkan Says:

      Merhaba Ahmet Bey,
      SMO ile alakasız ama SQL Express ile alakalı bir sorum var. Yardımcı olursanız sevinirim.
      Bir program hazırlamaktayım. Programım sql express ile bir veritabanı kullanıyor. Ancak bu veritabanını bir setup içerisine koyuyorum. Kullanıcı programımı koyarken bu veritabanını da (mdf dosyası) kurulum dizinine koymuş oluyor. Daha sonra bu veritabanı ile programımı çalıştırıyorum. (connection string: Source=.\SQLEXPRESS;AttachDbFilename=D:\test\teston.mdf;Integrated Security=true;User Instance=True;)
      Bu mdf dosyasını kullanıcının hiç bir şekilde bir yerlere attach ederek kullanamamasını istiyorum. Çünkü bu veritabanının içerisindeki bir sayaç ile programın en fazla 10 kez çalıştırılmasını sağlıyorum. Kullanıcı veritabanına müdahale edip bu değeri değiştirememeli. Bu gereksinimler ile nasıl bir veritabanı oluşturmalıyım? Bir kullanıcı adı ve şifre verebilir miyim setup içerisine koyduğum veritabanına? Evet ise nasıl?
      Şİmdiden çok teşekkür ederim.

    30. Ahmet Kaymaz Says:

      MDF dosyası işletim sistemi için diğer dosyalardan farklı olmadığı için o sunucuya erişmiş biri o dosyayı rahatlıkla başka bir veritabanına attach edebilir. Bunu engellemenin bir yolu bulunmamaktadır.

    31. Mustafa Says:

      Ahmet Kaymaz Bey
      ellerinize emeklerinize sağlık,
      bu bilgileri bizlerle paylaştığınız için.
      yanınıza çırak lazım olursa ben seve seve çırağınız olmaya razıyım.

      iyi çalışmalar

    32. hakan Says:

      Hocam. İyi çalışmalar. Site için teşekkürler. Benim bir problemim var.yardımcı olursanız sevinirim.
      Son zamanlarda bayağı popüler olan michael schwarz in yazdığı ajax ile bir proje geliştirdim.bunu biliyosunuz zannımca

      Visual studio üzerinde proje sorunsuz bir şeklide çalışıyor yani javascript gerekli code behind methodu bulup işletiyor ve soncu getiriyor fakat bunu gerçek server a attığım zaman javascript hata uyarısı veriyor ve bunu karşılayacak class methodunu bulamdığını söylüyor örnek: “ornek”(classın adı) is undefined gibi bir hata veriyor

      gerçek server; Windows server 2008 ve üzerinde iis 7 kurulu

      internet üzerinden yaptığım aramalar sonucunda dll in glabal assembly cache e yüklenemediği gibi bir takım sonuclara rastladım çünkü VS oratamında bu dll in otomatik olarak Vs tarafından GAC yüklediği gibi birşeyler okudum.Aynı zamnada config dosyası içinde httphandler a bu ajax.dll kayıtlı durumda. bu sorunu aşamadım bana yardımcı olursanız sevirim. şimdiden her şey çok teşekkür ederim

      saygılarımla

    33. Ahmet Kaymaz Says:

      Hakan,

      Eğer dll dosyasını GAC’a veya projenin BIN klasörüne yüklemişsen ve Web.Config’de ilgili HttpHandler satırlarını düzenlemişsen çalışması gerekir diye düşünüyorum. Şöyle bir sıkıntı olabilir. Client tarafındaki sunucu fonksiyon çağrımlarına doğrudan sınıf yazmak yerine NamespaceAdi.SinifAdi olarak yazabilirsen belki çözüm olabilir. Yani classın adının önüne namespace ekleyerek deneme yapabilirsin veya class’ın code behind tarafına [AjaxPro.AjaxNamespace("NamespaceAdi")] şeklinde isim-alanını ekleyebilirsin.

    34. Salih YÜCEL Says:

      Ahmet hocam merhaba
      Bu uygulamanın vb olanı sitenizde varmıdır acaba
      Acil olarak lazım teşekkür ederim şimdiden

    35. Oğuz Says:

      Ahmet hocam elinize sağlık anlatmış olduğunuz sınıfları kullanarak kullanıcı kendi isim verdiği databesi otomatik oluşturacak fakat bizim önceden hazırladığımız şablon scriptle oluşacak yani bir nevi BlogEngine.net blog projesi gibi setup oluşturmak mümkünmü

    36. Ahmet Kaymaz Says:

      Oğuz,

      bunu kolayca yapabilirsin. Kullanıcının isim verdiği DB’yi oluşturursun ardından şablon script dosyasından SQL komutlarını okuyup onları SQL üzerindeki yeni oluşturduğun DB üzerinde çalıştırırsın.

    Leave a Reply


    3 × = 6

    WP Theme & Icons by N.Design Studio
    Entries RSS Comments RSS Giriş