SQL Server Management Objects (SMO)

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.

SQL Server Management Objects (SMO)” hakkında 37 yorum

  1. reber beritan

    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.

    Cevapla
  2. Ahmet Kaymaz Yazar

    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,

    Cevapla
  3. reber beritan

    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++;
    } }

    Cevapla
  4. reber beritan

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

    Cevapla
  5. Ahmet Kaymaz Yazar

    Ş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.

    Cevapla
  6. reber beritan

    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

    Cevapla
  7. yener

    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.

    Cevapla
  8. Ahmet Kaymaz Yazar

    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.

    Cevapla
  9. yener

    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 .

    Cevapla
  10. yener

    MerhabalarAn 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

    Cevapla
  11. Ahmet Kaymaz Yazar

    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


    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.

    Cevapla
  12. fatih

    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

    Cevapla
  13. Ahmet Kaymaz Yazar

    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,

    Cevapla
  14. fatih

    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.

    Cevapla
  15. arzu

    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

    Cevapla
  16. Ahmet Kaymaz Yazar

    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];
    SqlCommandBuilder oCb = new SqlCommandBuilder(oDa);
    oDa.InsertCommand = oCb.GetInsertCommand();
    oDa.UpdateCommand = oCb.GetUpdateCommand();
    oDa.DeleteCommand = oCb.GetDeleteCommand();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.

    Cevapla
  17. esra

    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?

    Cevapla
  18. Ahmet Kaymaz Yazar

    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

    Cevapla
  19. yusuf

    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.

    Cevapla
  20. Samet

    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.

    Cevapla
  21. Ahmet Kaymaz Yazar

    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.

    Cevapla
  22. Gürkan

    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.

    Cevapla
  23. Ahmet Kaymaz Yazar

    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.

    Cevapla
  24. Mustafa

    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

    Cevapla
  25. hakan

    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ımcaVisual 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 veriyorgerçek server; Windows server 2008 ve üzerinde iis 7 kuruluinternet ü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 ederimsaygılarımla

    Cevapla
  26. Ahmet Kaymaz Yazar

    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.

    Cevapla
  27. Salih YÜCEL

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

    Cevapla
  28. Oğuz

    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ü

    Cevapla
  29. Ahmet Kaymaz Yazar

    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.

    Cevapla
  30. Hasan

    peki ahmet bey smo da çalıştırdığımız bir metin belgesi var içerisinde sql sorguları bulunuyor bu kodları
    List a = new List();
    a.Add(server.ConnectionContext.ExecuteNonQuery(okunan.ToString(), ExecutionTypes.ContinueOnError));
    bu şekilde çalıştırıyorum ama execute sırasında kodlarda hata olduğu zaman bu hatada ne yazdığını nasıl öğrenirim

    Cevapla

yusuf için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir