none
Fark RRS feed

  • Soru

  • CREATE PROCEDURE [dbo].[Musteri_Kaydet]
          @TC varchar(50),
          @UNVAN varchar(50),
          @AD varchar(50),
          @SOYAD varchar(50),
          @VEKIL varchar(50),
    	  @TELEFON varchar(50),
    	  @GSM varchar(50),
    	  @FAKS varchar(50),
    	  @MAIL varchar(50),
    	  @VERGINO varchar(50),
    	  @VERGIDAIRESI varchar(50),
    	  @ADRES Text,
    	  @RESIM varchar(50)
    AS
    BEGIN
          SET NOCOUNT ON; 
          INSERT INTO MusteriTablosu(TC,UNVAN,AD,SOYAD,VEKIL,TELEFON,GSM,FAKS,MAIL,VERGINO,VERGIDAIRESI,ADRES,RESIM)
          VALUES (@TC,@UNVAN,@AD,@SOYAD,@VEKIL,@TELEFON,@GSM,@FAKS,@MAIL,@VERGINO,@VERGIDAIRESI,@ADRES,@RESIM)
    END

    bu tetikleme c# kodlarım

     try
               {
              using (SqlConnection con = new SqlConnection(dboConnection.Baglanti))
                {
                    using (SqlCommand cmd = new SqlCommand("Musteri_Kaydet", con))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@TC", SqlDbType.VarChar).Value = tc.Text;
                        cmd.Parameters.Add("@UNVAN", SqlDbType.VarChar).Value = unvan.Text;
                        cmd.Parameters.Add("@AD", SqlDbType.VarChar).Value = ad.Text;
                        cmd.Parameters.Add("@SOYAD", SqlDbType.VarChar).Value = soyad.Text;
                        cmd.Parameters.Add("@VEKIL", SqlDbType.VarChar).Value = vekil.Text;
                        cmd.Parameters.Add("@TELEFON", SqlDbType.VarChar).Value = telefon.Text;
                        cmd.Parameters.Add("@GSM", SqlDbType.VarChar).Value = gsm.Text;
                        cmd.Parameters.Add("@FAKS", SqlDbType.VarChar).Value = faks.Text;
                        cmd.Parameters.Add("@MAIL", SqlDbType.VarChar).Value = mail.Text;
                        cmd.Parameters.Add("@VERGINO", SqlDbType.VarChar).Value = vergi.Text;
                        cmd.Parameters.Add("@VERGIDAIRESI", SqlDbType.VarChar).Value = vergidairesi.Text;
                        cmd.Parameters.Add("@ADRES", SqlDbType.VarChar).Value = adres.Text;
                        cmd.Parameters.Add("@RESIM", SqlDbType.VarChar).Value ="0";
                        con.Open();
                        cmd.ExecuteNonQuery();
                    }
                } 
               }

    değerli hocalarım şimdi SQL kısmını c# içinde yazsam veya yukarıdaki gibi kullanmanın farkı nedir açaba şimdiden teşekkürler;

    15 Haziran 2014 Pazar 11:43

Yanıtlar

  • MSSQL 2008 ve üzeri kullandığını düşünürsek; sadece o tabloda yapılacak değişiklerlerde kendine iş çıkartmış olursun o kadar, performansda kayda değer bir fark olmayacaktır.
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 12:29
  • Cihan Bey'in dediğine katılıyorum ve ekstra olarak sp kullanılmasında ki mantık biraz daha geniş. Yani sen tek bir insert işlemi yapıcaksan bunu sp de yapmanın çok anlamı yok(c# tarafında yazdığın sql sorgusunda parametreleri yine cmd.Parameters.Add şeklinde kullanarak!) ama birden fazla tabloya insert-update-delete tarzı işlemleri aynı anda yapıcaksan üstüne bunlardan herhangi bir hatada bütün işlemleri geri almak istediğinde sp içinde yazmak daha kolay ve daha hızlı oluyor.
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 12:59
  • Sql yapılan tüm sorguları bir sonra ki talebe daha hızlı cevap verebilmek için bellekte tutar ve bu zamanla memory şişmesine sebep olur. Bunu önlemek için veritabanı bakımları gerekir vesaire.

    Saklı yordam ( Procedure ) kullanılmadığı duruma örnek olarak.

    Aşağıda ki iki select işlemi için sys.dm_exec_cached_plans üzerinde iki kayıt oluşur. ID parametresinde ki değer değiştikçe bu kayıt sayısı artar, büyük ölçekli bir veritabanında performans kaybına ve bakım gereksinimine ihtiyaç duyulur.

    Select * from Tablo where ID=1
    Select * from Tablo where ID=2

    Saklı yordam (Procedure ) kullanıldığı duruma örnek

    Aşağıda ki gibi bir Prosedür kullanımı ile C# tarafından gönderilen ID değeri belleğe alınmış sorguna atanarak çalıştırılır, kaz kez talep edilirse edilsin bellekte tek satırlık yer kaplar. Memory ve IO işlemi gibi performasa etki eden unsurlarda cimrilik yapılmış olur.

    Create Proc get_Tablo
    @ID int
    as
    Select * from Tablo where ID=@ID

    Bunların haricinde C# tarafında Sql kodlarının varlığı bakımı zorlaştırır.




    • Düzenleyen Cengiz Gür 15 Haziran 2014 Pazar 18:52
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 18:50
  • Senin gosterdigin yollarin ikisi de SP (aslinda tek sey gostermissin). Ikincisi hic SP yazmaman.

    Senin kodun parametreli yani:

    Select * from Tablo where ID=@ID

    tarzinda oldugundan pratikte fark yok. SP olmasinin pek esprisi yok. Kayda deger avantaji yok, dezavantaji, seni SQL server bagimli hale getirir.

    Bunlarin disinda 3. alternatif Linq ve EF kullanmak. Onu dusunsen iyi olur bence. O zaman SQL server'a bagli kalmak zorunda degilsin. Ayni kodla (baglanti kodu degiserek) hem SQL server hem de MySQL, SQLite, PostgreSQL, MariaDb, Oracle ... gibi databaselere yazmis olursun.

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    16 Haziran 2014 Pazartesi 05:06
  • EF kullanımını aynı şekilde tavsiye ediyorum.

    Sp kullanımı ile SQL Server bağımlığını C# içerinde ki bağımlılığa ve karmaşıklığa tercih ederim. C# içerisinde parametre kullanımı ile evet pratikte  fark yok .


    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    16 Haziran 2014 Pazartesi 08:19
  • 1) Aşağıda ki iki select işlemi için sys.dm_exec_cached_plans üzerinde iki kayıt oluşur. ID parametresinde ki değer değiştikçe bu kayıt sayısı artar, büyük ölçekli bir veritabanında performans kaybına ve bakım gereksinimine ihtiyaç duyulur.

    2) Bunların haricinde C# tarafında Sql kodlarının varlığı bakımı zorlaştırır.

    1) Evet ama bu tamamen sistem bağımlı bir sorun. Bu planların boyutları genellikle çok küçüktür. Proje ciddi anlamda büyük ise gerçekten dert etmek gerekir, çünkü yarı yarıya kazanç söz konusu olabilir.

    2) Tabloda açılacak yeni bir field hem sql tarafında hem de c# tarafında kod değişikliğine neden olur. Bu nedenle eğer başka argüman yoksa bu maddeye hiç katılmıyorum.

    Herkesin dediği gibi bir O/RM aracı kullanın.

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    16 Haziran 2014 Pazartesi 10:53
  • Kenan hocam. Siz neden kendi yorumunuzu cevap olarak işaretliyorsunuz. Daha sonra buraya gelecek arkadaşları yanıltabilirsiniz. Hangi cevap uygunsa onu yanıt olarak işaretleyin. Kendinizinkini değil. :)
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    17 Haziran 2014 Salı 05:41
  • @Kenan , Burada insanların amacı puan kazanmak değil, birbirlerine yardımcı olmak. Dolayısı ile, hangi cevap doğruysa, lütfen o cevabı yanıt olarak işaretleyinki, aynı sorunla karşılaşan insanlar hangisinin doğru cevap olduğunun farkına varabilsin.

    Elimden geldiğince / gördüğüm kadarıyla hatanızı düzeltmeye çalışıyorum ancak, bazen benimde gözümden kaçabiliyor.

    Lütfen bu konuya biraz daha özen gösterelim.

    Teşekkürler.


    İletişim

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    17 Haziran 2014 Salı 05:58
    Moderatör

Tüm Yanıtlar

  • MSSQL 2008 ve üzeri kullandığını düşünürsek; sadece o tabloda yapılacak değişiklerlerde kendine iş çıkartmış olursun o kadar, performansda kayda değer bir fark olmayacaktır.
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 12:29
  • daha önce access kullanıyordum SQL'e yeni başladım şimdi demek istediğim şu c# içinde

    string sorgu = "SELECT * FROM kayit WHERE ad='ayse'";
    
    OleDbCommand uygula = new OleDbCommand(sorgu, yeni);

    bu şekilde kullanıyorduk

    SQL da 

    CREATE PROCEDURE [dbo].[Musteri_Kaydet]
          @TC varchar(50),
          @UNVAN varchar(50),
          @AD varchar(50),
          @SOYAD varchar(50),
          @VEKIL varchar(50),
    	  @TELEFON varchar(50),
    	  @GSM varchar(50),
    	  @FAKS varchar(50),
    	  @MAIL varchar(50),
    	  @VERGINO varchar(50),
    	  @VERGIDAIRESI varchar(50),
    	  @ADRES Text,
    	  @RESIM varchar(50)
    AS
    BEGIN
          SET NOCOUNT ON; 
          INSERT INTO MusteriTablosu(TC,UNVAN,AD,SOYAD,VEKIL,TELEFON,GSM,FAKS,MAIL,VERGINO,VERGIDAIRESI,ADRES,RESIM)
          VALUES (@TC,@UNVAN,@AD,@SOYAD,@VEKIL,@TELEFON,@GSM,@FAKS,@MAIL,@VERGINO,@VERGIDAIRESI,@ADRES,@RESIM)
    END

    bu şekilde yani bunun birbirine üstünlüğü ne her iki yolda yoksa aynımı ? demek istediğim o

     
    15 Haziran 2014 Pazar 12:45
  • Cihan Bey'in dediğine katılıyorum ve ekstra olarak sp kullanılmasında ki mantık biraz daha geniş. Yani sen tek bir insert işlemi yapıcaksan bunu sp de yapmanın çok anlamı yok(c# tarafında yazdığın sql sorgusunda parametreleri yine cmd.Parameters.Add şeklinde kullanarak!) ama birden fazla tabloya insert-update-delete tarzı işlemleri aynı anda yapıcaksan üstüne bunlardan herhangi bir hatada bütün işlemleri geri almak istediğinde sp içinde yazmak daha kolay ve daha hızlı oluyor.
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 12:59
  • Ben stored procedureleri genel olarak verileri raporlama/gösterim yaparken kullanıyorum.
    15 Haziran 2014 Pazar 15:31
  • Sql yapılan tüm sorguları bir sonra ki talebe daha hızlı cevap verebilmek için bellekte tutar ve bu zamanla memory şişmesine sebep olur. Bunu önlemek için veritabanı bakımları gerekir vesaire.

    Saklı yordam ( Procedure ) kullanılmadığı duruma örnek olarak.

    Aşağıda ki iki select işlemi için sys.dm_exec_cached_plans üzerinde iki kayıt oluşur. ID parametresinde ki değer değiştikçe bu kayıt sayısı artar, büyük ölçekli bir veritabanında performans kaybına ve bakım gereksinimine ihtiyaç duyulur.

    Select * from Tablo where ID=1
    Select * from Tablo where ID=2

    Saklı yordam (Procedure ) kullanıldığı duruma örnek

    Aşağıda ki gibi bir Prosedür kullanımı ile C# tarafından gönderilen ID değeri belleğe alınmış sorguna atanarak çalıştırılır, kaz kez talep edilirse edilsin bellekte tek satırlık yer kaplar. Memory ve IO işlemi gibi performasa etki eden unsurlarda cimrilik yapılmış olur.

    Create Proc get_Tablo
    @ID int
    as
    Select * from Tablo where ID=@ID

    Bunların haricinde C# tarafında Sql kodlarının varlığı bakımı zorlaştırır.




    • Düzenleyen Cengiz Gür 15 Haziran 2014 Pazar 18:52
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    15 Haziran 2014 Pazar 18:50
  • Senin gosterdigin yollarin ikisi de SP (aslinda tek sey gostermissin). Ikincisi hic SP yazmaman.

    Senin kodun parametreli yani:

    Select * from Tablo where ID=@ID

    tarzinda oldugundan pratikte fark yok. SP olmasinin pek esprisi yok. Kayda deger avantaji yok, dezavantaji, seni SQL server bagimli hale getirir.

    Bunlarin disinda 3. alternatif Linq ve EF kullanmak. Onu dusunsen iyi olur bence. O zaman SQL server'a bagli kalmak zorunda degilsin. Ayni kodla (baglanti kodu degiserek) hem SQL server hem de MySQL, SQLite, PostgreSQL, MariaDb, Oracle ... gibi databaselere yazmis olursun.

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    16 Haziran 2014 Pazartesi 05:06
  • EF kullanımını aynı şekilde tavsiye ediyorum.

    Sp kullanımı ile SQL Server bağımlığını C# içerinde ki bağımlılığa ve karmaşıklığa tercih ederim. C# içerisinde parametre kullanımı ile evet pratikte  fark yok .


    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    16 Haziran 2014 Pazartesi 08:19
  • 1) Aşağıda ki iki select işlemi için sys.dm_exec_cached_plans üzerinde iki kayıt oluşur. ID parametresinde ki değer değiştikçe bu kayıt sayısı artar, büyük ölçekli bir veritabanında performans kaybına ve bakım gereksinimine ihtiyaç duyulur.

    2) Bunların haricinde C# tarafında Sql kodlarının varlığı bakımı zorlaştırır.

    1) Evet ama bu tamamen sistem bağımlı bir sorun. Bu planların boyutları genellikle çok küçüktür. Proje ciddi anlamda büyük ise gerçekten dert etmek gerekir, çünkü yarı yarıya kazanç söz konusu olabilir.

    2) Tabloda açılacak yeni bir field hem sql tarafında hem de c# tarafında kod değişikliğine neden olur. Bu nedenle eğer başka argüman yoksa bu maddeye hiç katılmıyorum.

    Herkesin dediği gibi bir O/RM aracı kullanın.

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:30
    16 Haziran 2014 Pazartesi 10:53
  • Değerli yorumlarınız için çok teşekkür ediyorum biraz daha araştırıp bir karar vereceğim Saygılar ;
    16 Haziran 2014 Pazartesi 17:18
  • Kenan hocam. Siz neden kendi yorumunuzu cevap olarak işaretliyorsunuz. Daha sonra buraya gelecek arkadaşları yanıltabilirsiniz. Hangi cevap uygunsa onu yanıt olarak işaretleyin. Kendinizinkini değil. :)
    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    17 Haziran 2014 Salı 05:41
  • @Kenan , Burada insanların amacı puan kazanmak değil, birbirlerine yardımcı olmak. Dolayısı ile, hangi cevap doğruysa, lütfen o cevabı yanıt olarak işaretleyinki, aynı sorunla karşılaşan insanlar hangisinin doğru cevap olduğunun farkına varabilsin.

    Elimden geldiğince / gördüğüm kadarıyla hatanızı düzeltmeye çalışıyorum ancak, bazen benimde gözümden kaçabiliyor.

    Lütfen bu konuya biraz daha özen gösterelim.

    Teşekkürler.


    İletişim

    • Yanıt Olarak İşaretleyen Kenan YILMAZ 17 Haziran 2014 Salı 19:29
    17 Haziran 2014 Salı 05:58
    Moderatör
  • Arkadaşlar sanırım bir yanlış anlaşılma oldu ben değerli yorumlarınızı okuduktan sonra bir değerlendirme yapacağım ama şu an SQL server kullanmaya başladım cevaba gelince benim cevap doğru olduğu için değil sadece formda konuyu kapatmak için işaretledim hepinizin cevapları değerli saygılar diliyorum ;
    17 Haziran 2014 Salı 19:29