SQL ISNULL() Kullanımı

SQL de degerlerin null olup olmama durumlarını kontrol etmemiz gerekebilir. Sorgudan dönen deger matematiksel bir işlem sokuluyorsa hata verecektir. Kullanım sebebleri çogaltalabiliriz

Kullanımı: isnull(alanadı,'null sa') --isnull(ADI,'ismiyok') ADI alanı null sa yerine ismiyok yazar

Konunun mantıgını anladık şimdi örneklere geçelim.

SELECT (ISNULL(MAAS,1)*1.10) AS ZAMLI FROM YMusteri

SELECT ISNULL(LAST_NAME,'--') AS CDG FROM CustomerInfo

Daha sorgular konusunda çok yolumuz var bir adım daha atmış olduk.

SQL Select Case When Kullanımı

Merhabalar;
Bir çogumuz sql sorgularında dönen kayıtlar üzerinde seçim işlemi
yapma gereği duymuşuzdur. Cinsiyet alanına kadın / erkek yazdırmak yerine litaratürde gösterilen şekliyle .T. / .F. yada 0/1 gibi kodlamalar kullanırız. 0 ise kadın 1 ise erkek olarak göster dememiz lazım. Bunun en pratik yolu yazdıgımız programlama dilini kullanmadan sql in kendine yaptırmaktır. Sorgumuzu görünce ne demek istedigimi daha iyi anlayacaksınız.
Hadi ozaman buyrun.

Genel yapısı :

SELECT KolonBaslıgı =
CASE SecilecekALAN
WHEN 'D' THEN 'DÜŞÜNCE'
WHEN 'E' THEN 'EGLENCE'
WHEN 'R' THEN 'RENK'
WHEN 'Y' THEN 'YAŞAM'
WHEN 'A' THEN 'AMAÇ'
ELSE 'Yoksa Neye Yarar Dünya '
END, DigerAlanlar
FROM TabloAdı

Genel kullanımını bu şekilde gösterdikten sonra isterseniz birkaç farklı örnek yapalım.

Müşteri tiplerini kodlara ayırdık. Hangi müşteri hangi statüde bilmek istiyoruz ve yazılım aşamasında verdiğimiz kodların hangisinin hangi manada oldugunu göstermek istiyoruz.

SELECT MUSTIPI=
CASE TIPI
WHEN '1' THEN 'ÜST DÜZEY' WHEN '2' THEN 'ORTA DÜZEY' WHEN '3' THEN 'ALT DÜZEY'
ELSE 'BELİRSİZ MÜŞTERİ TİPİ'
END,ADI As MUSTERI
FROM Musteri

Burda yaptıgımız işlemde sorgu çektik müşterilerin tamamı için müşteri kodlarına baktık 1 ise bunu yaz 2 ise bunu yaz.

SONUÇ:

MUSTIPI MUSTERI
---------- -----------
'ORTA DÜZEY' FATİH
'ORTA DÜZEY' MEHMET
'ÜST DÜZEY' SEDA
'ORTA DÜZEY' EDA

Diğer bir kullanım şekli;

SELECT CASE
WHEN BAKIYE=0 THEN 'RİSK YOK'
WHEN BAKIYE>1 AND BAKIYE <'2' THEN 'DÜŞÜK RİSK'
WHEN BAKIYE>=2 AND BAKIYE<'3' THEN 'ORTA SEVİYELİ RİSK' WHEN BAKIYE>3 OR BAKIYE=3 THEN 'YÜKSEK RİSK'
WHEN BAKIYE BETWEEN 4 AND 10 THEN 'ÇOK YÜKSEK RİSK'
END, m.SOYADI, ym.BAKIYE
FROM Musteri AS m INNER JOIN YMusteri AS ym ON m.ID = ym.M_ID

Başka bir örnek kullanabileceginiz bi çok komut var...

SELECT
CASE
WHEN TIPI IS NULL THEN 'HERHANGI MUSTERİ TIPI'
END AS TIP .........

SQL komutlarını ne kadar etkin biçimde kullanırsanız yazacagınız program o kadar hızlı ve zahmetsiz olur. SQL bize bir çok nimet sunmakta gerisi sizin ihtiyaçlarınıza ve yeteneklerinize kalmış.

Bir sonra ki yazıda görüşmek üzere...

SqlDataReader ve SqlDataAdapter Kardeşliği

Merhabalar bu yazımda da SqlDataReader ve SqlDataAdapter kardeşliği yani birlikde kullanımını inceleyecegiz.

Bilindigi gibi sorgu sonuçlarını döndermek için iki tane yöntem var SqlDataReader ve SqlDataAdapter . Kısaca bilgi verecek olursak SqlDataAdapter daha kullanışlı olsada SqlDataReader ileri yönlü okuma yaparak daha hızlı sonuç dönderir. Kullanım amacına uygun olarak iki yöntemden biri seçilebilir. Peki ya iki yöntemde aynı anda kullanılması gerekirse işde bu durum makalenin konusunu oluşturuyor.

Şimdi biraz kod yazalım.

Projenize birtane buton koyarak aşagıdaki kodları yazın.


Burda bütün satırları tanıyorsunuz.

SqlConnection sqlCon = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");
SqlCommand mCommand = new SqlCommand();
mCommand.Connection = sqlCon;
sqlCon.Open();
mCommand.CommandText = "Select * from YMusteri";

bu kısıma kadar her ikisi içinde ortak kodlar.

SqlDataReader dr = mCommand.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add(dr[0].ToString());
}

Şuana kadar ki kodlarımız SqlDataReader içindi.

dr.Close(); burda dikkat edilmesi gereken asıl nokta bu datareader nesnesi kapatmanız gerekir yoksa zaten veri okur durumda oldugunuz için dataadapter veri okuyamaz sıranın oan gelmesi için datareaderi kapatmanız gerekir.
dr.Dispose(); Madem ki dataReader ile işimiz bitti ozaman bellektende silelim.

SqlDataAdapter adp = new SqlDataAdapter(mCommand);
DataTable dt = new DataTable();
adp.Fill(dt);
dataGridView1.DataSource = dt;

veee mutlu son...

Bir sonra ki yazımızda görüşmek üzere...

Stored Procedure ve Output Parametre Kullanımı

Bu yazımızda da kısaca hem Stored Procedure kullanımını hemde procudereler içinde output parametresini nasıl kullanırız bunları ögrenicez.

Stored Procedureler konusunda detaylı araştırma yapmanız gerekiyor. Ama herşeyden önce konu ne olursa olsun bol örneklerle kendinizi problem çözer yeteneklere ulaştırmanız gerekiyor. Özelliklede Stored Procedure konusunda bol bol örnek yapmazsanız malesef çok ilerleyemezsiniz.

Peki Ama Neden Stored Procedure ?
Kısaca Stored Procedure kullanım amaçlarında bahsedecek olursak eğer ;

*** Stored Procedureler Server tarafında derlenip çalışıp sonuçları yolladıgından programınızın hızı konusunda önemli etkendir. Bu bile Stored Procedure kullanmak için yeterli bir sebeptir.
*** Aynı sebepten dolayı kaynakları daha az tükettiği için Network ağınızıda yormamış olur.
*** Projenizde kod kalabalıgınız azaltır. Modüler yazmaya yardımcı olur. Herhangi bir değişlik gündeme geldiğinde projenizi açıp kodları değiştirmekden yerine sadece ilgili procedure üzerinde değişiklik yaparak güncellemeyi halletmiş olursunuz. Diğer türlü kodları açıp gerekli değişiklikleri yaptıkdan sonra tüm kullanıcılarda tekrar aynı değişiklikleir dağıtmanız gerekir. Kullanıcıların tamamı aynı bina yada aynı şehirde olmaya bilir tüm şehirlere bağlanmak yada tek tek dolaşmanın maliyetini ve zaman kaybını siz düşünün. En sevdginiz arkadaşınız evlenirken siz o gece başka bir şehirde kös kös oturmuş güncellemeleri yapıyor olabilirsiniz (!! ihtimal tabi)

Bunlar belli başlı Stored Procedure kullanım amaçları daha birçok sebepten dolayı Stored Procedureler kullanılabilir. Ama dikkat edilemesi gereken bazı şeyler var nerde zaman Stored Procedure kullanılması gerektigini iyi kestirmek gerek olura olmaza S.P yazılmaz.


Bu kadar bilgiden sonra artık kod yazılımda keyfimiz yerine gelsin.

İşe önce bir tablo oluşturmakla başlıyoruz.

CREATE TABLE [dbo].[Musteri]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[ADI] [varchar](50) NULL,
[SOYADI] [varchar](50) NULL,
[BAKIYE] [float] NULL
)
ON [PRIMARY]


Sıra geldi Procuderimiz oluşturmaya;
Burdaki en önemli kısım @ADI ve @SOYADI parametrelerinin yönünün Output olması.

Output parametreler işlemler sonucu elde edilen sonucları geriye döndürmek için kullanılır.

SP ler bir deger döndürebilirler ama dönmesi gereken sonuç birden fazlasaysa Output kullanmanız işinizi kolaylaştırır.
C# da ki out anahtarıyla aynı amaç için kullanılır.

Not: Alter Proc Musteriler komutuyla değişiklikleri kaydedebilirsiniz.

Create Proc Musteriler
@ID int,
@ADI varchar (50) output, <--
@SOYADI varchar (50) output<--
As
Select @ID=ID, @ADI=ADI,@SOYADI=SOYADI From Musteri Where ID=@ID

--parametre olarak aldıgımız @ID ye göre arama yaptık dönen sonuçları @ADI,@SOYADI output parametreleriyle geri döndürdük.

Şimdi de sıra geldi C# kodlamaya;

Gerekenler; 1 buton 3 textBox
projemize using System.Data.SqlClient; ad uzayını eklemeyi unutmuyoruz

devammmmm....

private void button1_Click(object sender, EventArgs e)
{
string conSrt = String.Format("Server={0};Database={1};Uid={2};Pwd={3}", ".", "Test", "sa", "123456");
SqlConnection sqlCon = new SqlConnection(conSrt); //Bağlantımızı oluşturduk.
SqlCommand cmd = new SqlCommand("Musteriler", sqlCon); //Hangi Procedure yi kullanıcagımızı belirtiyoruz. Musteriler bizim S.P adımızdı
cmd.CommandType = CommandType.StoredProcedure; //Komut tipimizde StoredProcedure kullanacagımızı belirtiyoruz.
cmd.Parameters.Add("@ID", SqlDbType.Int); //Parametrelerimizi ekliyoruz
cmd.Parameters.Add("@ADI", SqlDbType.VarChar, 50);
cmd.Parameters.Add("@SOYADI", SqlDbType.VarChar, 50);
cmd.Parameters["@ID"].Value = Convert.ToInt32(textBox1.Text); // Arama yapacagımız ID noyu içeri yolluyoruz. Procedurede tipimiz int oldugu için int tipine Convert etmemiz gerekiyor.
cmd.Parameters["@ADI"].Direction = ParameterDirection.Output; //Parametremizin akış yönünü belirtir.Hatırlasınız bu iki parametreyi output parametre verdiğimişdik
cmd.Parameters["@SOYADI"].Direction = ParameterDirection.Output;
sqlCon.Open(); // Tüm hazırlıklar tamam olduguna göre artıkbağlantımızı açalım
cmd.ExecuteNonQuery(); // komutu çalıştırdık
textBox2.Text = cmd.Parameters["@ADI"].Value.ToString(); //Sonuçları textBoxlara atalımtextBox3.Text = cmd.Parameters["@SOYADI"].Value.ToString(); // Sonuçlar object tipinde geldiği için ToString() metodunu kullanarak string e çevirmeniz gerekir.

}

Her zaman ki gibi amacımız kabaca konuyu anlatmak detaylar sizin ihtiyaçlarınıza göre şekillenecektir.

İyi çalışmalar...

Wav Uzantılı Ses Dosyası Çalma

Bu yazımızda da wav uzantılı ses dosyalarını nasıl çalabilir soruna yanıt arıcaz. Lazım olursa eğer sistem kaynaklarında ki varsayılan durum seslerini nasıl kullanacaz sırayla inceleyelim.

Bu anlatamgımız sınıf sadece wav uzantılı dosylar çalar. mp3 v.s ses dosyalarını çalmak için uygulanması gereken yol başka onuda başka bir yazımızda ayrıca işleriz.
Kullanacagımız sınıfımız;
using System.Media; ad uzayı içinde yeralır. Ben kullanmadım ama bilginiz olsun.

Dışardan bir ses dosyası çalmak için;

System.Media.SoundPlayer calKemanci = new System.Media.SoundPlayer(@"C:\pegdisc.wav");

calKemanci.PlayLooping(); // siz durduruncaya kadar aynı sesi çalar.

calKemanci.Play(); //Bir kere çalar

calKemanci.Stop(); // durdurur

if (calKemanci.IsLoadCompleted) // Çalma işlemi bittimi ona bakar
MessageBox.Show("bitti");

Sistem Kaynagını kullanmak için;

Mesajkutusunda ki sesleri kulanabilirsiniz onun dışındaki sesler zaten wav uzantılı olarak sistem içinde buluyor.

System.Media.SystemSounds.Asterisk.Play();
System.Media.SystemSounds.Exclamation.Play();

Sesler tanıdık gelecektir zaten açıklamaya gerek yok...


Sistem kaynaklarını kullanmak ve dışardan ses dosyalarını çaldırmak için yapılmasu gerekenler bu kadar. Bunları nerelerde kullanabileceginiz size kalmış zaman içinde mutluka bi yerlerde yazılımınız için sesli uyarı yada hata mesajları verdirmek isteyeceksiniz;)

Şimdilik bu kadar bi sonra ki yazmın ne olacagını bende bilmiyorum. :D
O zamana kadar görüşmek üzere Hoşcakalın...

Resimi Pixel Pixel Renklere Ayırmak

Bu yazımda resim üzerinde gezinirken farenin bulundugu pixel deki rengi yakalamak için yapılması gerekenleri anlatacagım.
Öncelikle formumuzun üzerine resimi picturebox a yüklemek için 1 adet buton, resmi göstermek için 1 adet picturebox, yakalanan renk kodunu göstermek için 1 adet label eklemeniz gerekiyor.

Bahsettigim gibi resim üzerinde fare ile gezinirken üzerinde oldugumuz pixel rengini formun zemin rengine atayacaz.

GetPixel() metoduyla aktif pixel rengini alırken, SetPixel() metoduylada rengini değiştirebiliriz.

Sıra geldi kodlamaya;


Bitmap btm; // Öncelikle işe bir tane Bitmap deişken tanımlayarak başlıyoruz.
private void button1_Click(object sender, EventArgs e)
{
btm = new Bitmap(@"C:\CC.jpg");
pictureBox1.Image = btm; // Picturebox ımıza resmimizi yükledik
}

pictureBox nesnesinin üzerinde fare ile gezindikce aşagıda ki kodlar tetiklenecektir.

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (btm != null) //Resim yüklememişse hata verir.
{
try
{
Color color = btm.GetPixel(e.X, e.Y); // Olayın koptugu satır. Bize aktif pixselin rengisini veren kod satırı

this.BackColor = color; //Yaklanan renk formun zengine atandı.
label1.Text = color.Name;
}
catch {}
}
}

String.Format()

Bu yazımızda string ifadeleri formatlama olayına kısaca giriş yapacagım. Daha öncede belirttiğim gibi burda bu kodların en yalın en temel hallerini anlatıyorum. Araştırıp detaylandırmanız gerektigini biliyorsunuz. Amacımız beyinlerde küçükde olsa bir kıvılcım çakmak.

String ifadeler değişik şekillerde formatlanabilir olsada sadece bu amaçla oluşturulmuş bir fonksiyonumuz var String.Format()

Genel Kullanımı : { index[,alignment][:formatString]} şeklindedir.

Ençok kullandıgımız yöntemler için basit bi kaç örnek yapalım.
Kullanacagımız değişkenlerimizi tanımlıyoruz

string veri = "fatih";
double para = 12.52;
DateTime tarihSaat = DateTime.Now;
string sonuc = "";

sonuc = String.Format("Üretici Adı: {0} {1} {2}", "ahmet", "mehmet", "deneme");
MessageBox.Show(sonuc);

Burda "{0} {1} {2}" yerlerine " " (çift tırnaklar) dışındaki virgülden sonra gelecek
ifadeler yani "ahmet", "mehmet", "deneme" degerleri gelecek demektir.
Sonuç şu şekilde görünür "ahmet mehmet deneme"

En basit haliyle Metodumuzu kullandık. Burda bir formatlama işlemi yapmadık şu akla gelebilir neden Formatlama yapmadıysam bu fonksiyonu kullanayım ki? Evet ama bu şimdi formatlamadıysak hiç formatlamıcaz anlamına gelmiyor. Değişen şartlara göre bizden bu ifadenin formatlanması istenebilir butür olaylara hazırlıklı olmak adına kod blogunu değiştirmeden formatlayabilmek için kullandık. Amaç mimari yazılıma doğru kaymak.

sonuc = String.Format("{0:c}", para);
Para için Sonuc: 12.52 TL yerel parabirine göre birim atar.

sonuc = String.Format("{0:(##).(###)}", para);
Özel Format standart olmayan duruma özel format tasarımı için örnek

sonuc = string.Format("{0:M}", tarihSaat);
Tarih den Gün - Ay (14 Aralık) Şeklinde çok daha fazlası var sadece tarih işlemlerindede kullanılabilecegini göstermek için kullanadım.

Umarım faydalı olmuşdur.

Çok daha fazla detay için:
Kaynak: http://www.csharpnedir.com/articles/read/?id=486&title=String.Format%20Fonksiyonu