none
SqlCommand ve CommandType Özelliği RRS feed

  • Soru

  • Merhaba Arkadaşlar

    SqlCommand sınıfının CommandType özelliği ile ilgilli bir sorum olacak. Bilindiği üzere 3 değişik değer alabiliyor. (Text, StoredProcedure ve TableDirect) fakat aşağıdaki örnekte bir stored procedure çalışırılan bir kod var ve CommandType özelliği belirtilmeden çalışıyor.

    SqlConnection cnn = new SqlConnection(connectionString);

    cnn.Open();

    SqlCommand cmd = new SqlCommand("TabloGetir"cnn);

    SqlDataReader dr = cmd.ExecuteReader();

    .......

    Sormak istediğim SqlCommand CommandType özelliğinini belirtmemizdeki olay nedir?

    Neden belirtilir ? Bize ne sağlar? Sonuçta yazmadan da çalıştırılabiliniyor.?

    Konu hakkında bilgilerinizi paylaşırsanız çok sevinirim.

    11 Haziran 2013 Salı 12:26

Yanıtlar

  • Ya aslında fazla bir espirisi yok; CommandType varsayılan olarak Text dir. SP yi adıyla çağırmak için StoredProcedure direk tablo adı ile tablo açmak için TableDirect kullanılır yani;

    //Text
    command = "exec my_sp";
    
    //StoredProcedure
    command = "my_sp";
    
    //Text
    command = "select * from Tablo1";
    
    //TableDirect
    command = "Tablo1";
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen V_Sunuk 11 Haziran 2013 Salı 17:47
    11 Haziran 2013 Salı 16:54
    Moderatör

Tüm Yanıtlar

  • Bazı StoredProcedure'lerin Output parametreleri vardır, yani bazı parametrelerini geri değer döndürmede kullanabilirsiniz. Eğer output parametreli bir sp kullanmak istiyorsanız CommandType'ı StoredProcedure yapmazsanız dönen değeri alamazsınız

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    11 Haziran 2013 Salı 13:25
    Moderatör
  • Önay hocam da yazmış ama bende şöyle bir şey söyleyeyim (Önay hocam yanlışım var ise düzeltirseniz sevinirim).

    SqlCommand nesnesi ile bir katı sql sorgusu çalıştırılacak ise (insert into, update, delete, select sorgularından bir tanesi çalıştırılacak ise), SqlCommand'ın CommandType özelliği Text olarak verilmelidir. Çoğu yerde bu şekilde bir atama olmadığını görürsünüz. Bunun sebebi, SqlCommand nesnesinin varsayılan CommandType değeri Text'tir. O yüzden tekrar cmd.CommandType=CommandType.Text; yazmamıza gerek yoktur. Burada Stored Procedure seçimi yapılırsa eğer,  command nesnesinin CommandText özelliğine girilen değer bir stored procedure ismi olmalıdır. Aksi taktirde bu procedure bulunamadı hatası verir. Daha sonra command nesnesinin CommandType özelliği stored procedure olarak seçilmelidir. Yani işin özeti, sen command nesnesin commandtext'ine girdiğin değer bir stored procedure ismi ise yani bir procedure çalıştaracaksan CommandType özelliğini StoredProcedure olarak ayarlaman gerekir. Ama yok ben direkt katı sql sorgusu çalıştıracağım diyorsan CommandType özelliğine değer atamana gerek yoktur çünkü zaten varsayılan teğeri Text'tir.


    Oğuz KURTCUOĞLU | Professional Software Developer http://www.oguzkurtcuoglu.com oguz[at]oguzkurtcuoglu[dot]com

    11 Haziran 2013 Salı 14:18
  • Aynı zamanda şu görevi de vardır. Diyelim bir stored procedure yazdın. CommandText ine "SP_EKLE" yazdın Parametre olarak da Stored Procedure paramatrelerinin değerini vereceksin diyelim CommandType = CommandType.StoredProcedure; yazman gerekir. Eğer yazmazsan Stored Procedure olarak algılamıcak ve Stored Procedure ün ilk istediği parametre hatası alacak. Peki neden parametre göndererek stored procedure ümü çalıştırayım ki? gibi sorusunun cevabı da şudur. Genellikle ASP Parametres kullanmadan yapılan giriş bölümlerinde hatalar meydana gelir ve SQL Cümlesini devam ettirecek komutlar yazar (Örnek : Sitenin giriş bölümü olduğunu düşün ve adam giriş cümlesine şöyle bir devam ettirecek işlem yazıyor 'WHERE ID=1' şeklinde birşey yazdığında id si 1 olan genellikle admin hesabıdır ve otomatik olarak admin paneline giriş yapabilir) bu yüzden parametres ile girilecek parametre değerleri kullanılır. Böylelikle açık önlenmiş olur. Aynı zamanda sizin C# da verdiğiniz veri tipini Parametres Otomatik olarak SQL e uygun Veri Tipine convert ederek gönderir.

    http://barisceviz.blogspot.com/
    Barış Ceviz - Executing Life

    facebooktwitteryoutube

    11 Haziran 2013 Salı 14:43
    Moderatör
  • Sayın Hocam

    Aşağıdaki gibi bir stored procedure var diyelim

    create proc KDVHesapla

    (@Fiyat money)

    as

    select @Fiyat * 1.18

    Oluşturduğumuz bu stored procedure SqlCommand'ın Constructor'ına Text olarak yazıyoruz parametresi ile;

    SqlCommand cmd = new SqlCommand("KDVHesapla 250",baglanti);

    cmd.ExecuteNonQuery();

    Kural gereği CommandType belirtmez isek TEXT olarak algılanıyor ve biz yukarıda Stored Procedure yazdık parametresi ile ve CommandType = CommandType.StoredProcedure; şeklinde belirtmediğimiz halde yukarıdaki kod çalışıyor.

    Durum böle iken ben CommandType.StoredProcedure desem ne faydası oluyor, demesem ne faydası oluyor .

    Aklım karıştı. CommandType belirtmemizde bir yarar olduğunu fakat ne olduğunu bilemedim.

    Sorumu daha detaylı anlatabilmişimdir inşallah!!!

    11 Haziran 2013 Salı 15:00
  • Bu durumda Önay hocamın dediği gibi dönüş değerini almak istersen yazman gerekir.

    Oğuz KURTCUOĞLU | Professional Software Developer http://www.oguzkurtcuoglu.com oguz[at]oguzkurtcuoglu[dot]com

    11 Haziran 2013 Salı 15:06
  • Ya aslında fazla bir espirisi yok; CommandType varsayılan olarak Text dir. SP yi adıyla çağırmak için StoredProcedure direk tablo adı ile tablo açmak için TableDirect kullanılır yani;

    //Text
    command = "exec my_sp";
    
    //StoredProcedure
    command = "my_sp";
    
    //Text
    command = "select * from Tablo1";
    
    //TableDirect
    command = "Tablo1";
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak İşaretleyen V_Sunuk 11 Haziran 2013 Salı 17:47
    11 Haziran 2013 Salı 16:54
    Moderatör