SQL Server’da Bulunan Stored Procedure ve View İçinde Arama Yapma

Stored procedure, view ve tabloların sayısı arttıkça hangi tablonun nerede kullanıldığını incelemek zorlaşabiliyor. Örneğin bir tablo üzerinde yapılan değişikliği kullanıldığı her noktayı bulmak ve değişikliği işlemek isteyebiliriz. MS SQL Server için konuşursak bunun aşağıdaki gibi bir yolu bulunmaktadır. Tablo adınızı yazdığınızda aşağıdaki sorgu hangi stored procedure’lerde yer aldığını listeler.

SELECT o.name,o.create_date,o.modify_date
FROM sys.sql_modules sm
INNER JOIN sys.objects o ON o.object_id = sm.object_id
WHERE o.type = 'P' AND sm.definition LIKE '%tablo_adi%'
ORDER BY o.name

Aşağıdaki sorgu da view’lerin içinde arama yapmamızı sağlar.

SELECT o.name, o.create_date, o.modify_date
FROM sys.objects o
WHERE o.type IN ('V') AND 
OBJECT_DEFINITION(object_id) LIKE '%tablo_adi%'
ORDER BY o.name

LINQ Sorgularında If Kontrolü

Bazı durumlarda LINQ sorgularını çalıştırırken if durumu ile kontrol gerekebilir. Örneğimizde DataModel adlı bir model sınıftan LINQ ile OrnekData tablosundan 3 adet bilgi çekelim.

IQueryable<DataModel> q = (from od in OrnekData
                        where od.FirmaId != null
						select new DataModel
                               {
                                CalisanAdi = od.CalisanAdi,
                                Id = od.Id,
                                KullaniciAdi = od.KullaniciAdi.HasValue ? od.KullaniciAdi : null,
                                Sifre = od.Sifre.HasValue ? od.Sifre : 0
                                });

public class DataModel
        {
            public string CalisanAdi { get; set; }
            public int? Sifre { get; set; }
            public string KullaniciAdi { get; set; }
        }

 

Kullanıcının kullanıcı adı ve şifresinin olup olmadığını HasValue özelliğiyle kontrol ettik eğer yoksa null ve 0 değerlerinin kullanılmasını sağladık.

SQL Sorgusunu Sayısal Değer Olarak Kullanma

Otomatik hesaplama yapan ya da sütunlar arasında aritmetik işlemler gerektiren bir uygulama üzerinde çalışıyorsanız bir SQL sorgusundan dönen değeri sayısal olarak ifade etmeniz gerekecektir.

Örnek olarak fiyatı belli olan bir ürünün alış miktarı kullanıcıdan alınsın, her ikisi de tablolarda sütun olarak yer alan alış miktarı ve fiyatı bilgisinin çarpımını elde etmek için ExecuteScalar() metotuna başvurmalıyız. Hatta kullanıcı üründen ne kadar aldığını textBox1’e girdiği anda toplam tutarı textBox2’ye yazdıralım.

  private void textBox1_TextChanged(object sender, EventArgs e)
        {
            SqlConnection baglanti = 
            new SqlConnection("server=.;database=StokTakip;Integrated Security=True");
            baglanti.Open();
            SqlCommand cmd = new SqlCommand("select Fiyati from Urunler 
            where UrunAdi = '" + textBox3.Text + "'",baglanti);
            int fiyat = Convert.ToInt32(cmd.ExecuteScalar());
            int tutar = fiyat * Convert.ToInt32(textBox1.Text);
            try
            {
                textBox2.Text = tutar.ToString();
            }
            catch
            {
                MessageBox.Show("Lutfen sayi giriniz.");
            }
            finally
            {
                textBox1.text = "";
            }
            baglanti.Close();
        }

Kodu kısaca açıklarsak; textBox3 ile aldığımız ürün adının fiyatını getirdik. Kullanıcının textBox2 ile girdiği alış miktarı ile çarpmadan önce fiyatın integer değer çevrilmesi gerekiyor. Bu durumun çözümünde ExecuteScalar() metotu oldukça yararlı.

ExecuteScalar() metotu, veritabanından toplam gibi tek bir değeri döndürmeyi sağlayan hızlı bir araçtır. Döndürdüğü değer, Resultset’in ilk elemanınıdır ve bu elemanın hangi tipte olduğu ilk etapta bilinemeyeceği için nesne(object) olarak kabul edilir. Eğer doğrudan int, string gibi farklı bir türe atamak isterseniz  ‘Cannot implicitly convert type ‘object’ to ‘int’. An explicit conversion exists (are you missing a cast?)’ hatası alırsınız. Bu yüzden gerekli çevirme işlemlerini yapmak gerekir.