SQL Procedure ile Dinamik TOPN Sorgusu

Arkadaşlar merhaba;

Bir süredir makale yazmıyordum. Tekrardan bir SQL makale ile giriş yapmak istedim.
Bu yazımızda TOPN komutunun Procudureler aracılığıyla ile parametrik olarak uyğulanmasını işleyeceğiz.

Öncelikle kısaca bir sorgu üzerinde TopN komutu nedir ondan bahsedelim.

SELECT TOP 10 * FROM MUSTERILER
Kullanım şekli böyle olan TOP komutu bize ilk 10 kaydı getirir. TOP 100 yazsaydık ilk 100 kaydı getirirdi.
Peki nerede işimize yarar; ilk aklıma gelen sitemize üye olan ilk 10 kişi kimdir? gibi sorulara cevap verir. Sadece 10 kayıt için bütün kayıtları çekmek çok mantıklı olmayacaktır.

İlk 10 (100) kayıt dedik ama bu herhangi bir ordery by komutu kullanılmazsa ASC yani artan sıralama ile çalışır. Bu durumda ilk N kaydı, order by DESC kullanılırsa son N kaydı getirir.

Bu kadar bilgiden sonra asıl konumuz olan TOPN komutunu parametrik olarak nasıl alınır sorusunu cevaplayalım.

Önce Proceduremizi yazalım:

CREATE PROC TOPN
@ROWCOUNT VARCHAR(10),
@SORTING VARCHAR(3)
AS
DECLARE @KOMUT VARCHAR(MAX)
SET @KOMUT='SELECT TOP '+ @ROWCOUNT +' * FROM MUSTERI ORDER BY ID '+ @SORTING

EXEC (@KOMUT)

Bu kadar olan Procuderemiz iki tane parametre alır.
Birincisi TOP için getirmek istediğiniz kayıt sayısı diğeri ise sıralama yönüdür (ASC veya DESC)

Önceden de bahsettiğim gibi asc kullanırsanız ilk girilen kayıtları desc kullanırsanız son girilen kayıtları getirir.
Query Analyzer da test etmek için
EXEC TOPN 5,'ASC'

Faydalı olması umuduyla... hatıram olsun...

SQL CharIndex Kullanımı

Merhaba arkadaşlar;

SQL üzerinde çalışmalarımız devam ediyor. İlerde komplex procudereler yazarken bizlere lazım olabilecek elemanları yavaş yavaş oluşturmaya başladık.

Şimdi sıra CharIndex() kullanımında. Kullanımı çok basit olan CharIndex() adında anladıgımız gibi bir string ifade içinde başka bi string ifade aramak için ve index no yakalamak için kullanılır.

Hemen bir örnek verecek olursak

SELECT CharIndex('a','fatih')
Eğer aranan karakter( yada karakterler) bulunursa index no, bulunamazsa da 0 dönecektir.
Bu örneğe göre dönecek olan değerimiz dönecek olan değerimiz 2 dir.
(Eğer birden fazla yerde bulunursa ilk bulunan index dönecektir...)
C# VB.NET vs. diller tarafında butür indexlemeler 0 dan başlar ama SQL de direk 1 den başladıgını farketmişsinizdir. Yani bu işlemi .net tarafında karşılıgını yapmış olsaydık dönecek değer 1 oludu.
Biraz daha detaylı bir örnek verecek olursak

DECLARE @returnValue int

SELECT @returnValue=CHARINDEX('a','ADANA')
IF(@returnValue=0)
print 'Aranılan Karakteri içermiyor...'
ELSE
print 'Karakter Index='+ Convert(varchar(10),@returnValue)


SELECT PATINDEX('%T%','FATİH') <-- amaca="" ayn="" eder...="" hizmet="" span="">

Artık lazım olması durumunda nasıl kullanılacagını biliyoruz. Bir süre daha T-SQL üzerine gitmeyi planlanlıyorum.

Şimdilik hoşcakalın...

SQL Trigger (Tetikleyici) Kullanımı

Merhabalar;

T-SQL üzerine gitmeye devam ediyoruz.
Bugün ki konumuz TRIGGER kullanımı.

Sql de veri tutarlıgını sağlamak ve işlemleri otomatikleştirmek amacıyla kullanılan bir yapıdır Trigger.
Kelime anlamı Tetikleyici olan Trigger adına yakışır aynı güzellikde hareket etmektedir ataması yapılan tablodaki hareketleri takip ederek otomatik olarak çalışır.

Triggerler aslında Procudurelerin daha da fonksiyonelleştirilmiş halidir.
Ataması yapılan tabloda INSERT,DELETE,UPDATE olmak
üzere 3 farklı trigger kullanılabilir. SELECT işleminde kayıtlarda değişiklik olmadıgı için çalışmaz. Ayrıca Create, Alter, Drop işlemlerinde de çalışmaz.Bunların dışında View,Temp_table ler de de Trigger kullanılamaz.
Önemli husus daha var Triggerlere dışardan Parametre yollanamaz.


Tabloların maruz kaldıkları işlemlere göre trigerler geçici tablolar oluştururlar bunlar DELETE işlemi için DELETED, INSERT işlemi için INSERTED dir. Bunlar çalışma anında oluşturulur ve işlem biter bitmez silinir. Daha sonra oluşmanız münkün değildir. Burda UPDATE değinilmedigini biliyorum UPDATED diye bi tablomuz yok. Updateleri yakalamak için hem DELETED hemde INSERTED tablosundan faydalanacagız onun için ayrıca ögner yazacagım.

Aşagıda ki Trigerimizde STOK ve STOK2 adında 2 tablomuz var. Şuan için pek mantıklı bir işlemiş gibi görünsede STOK tablosundan sildigimiz kayıtları bir yerde saklama geregi duyabiliriz ve örnekler çogaltılabilir. İşde Trigerimizde bu amaca hizmet etmekte.



ALTER TRIGGER DENEME_TRIGGER --Trigerimiz tanımladık
ON STOK --hangi tabloda çalışacak

FOR DELETE
--hangi işlem için (FOR INSERT,DELETE,UPDATE aynı anda olabilir)AS

INSERT INTO STOK2 (KODU,ADI,BIRIMREF) SELECT KODU,ADI,BIRIMREF FROM DELETED

Giriş seviyesi için sanırım bu örnek yeterli daha sonra farklı örneklerle detaya inecegiz.

Şimdilik hoşcakalın...

C# Condition Kullanımı (?:)

Merhabalar;

Blogun tarzı geregi lafı çok uzatmak istemiyorum ama
bi kaç uyarı yapmadan da geçemeyecegim.

Geliştirdigimiz kodlarda asıl amaç çalışması olsada, zaman içinde gelişen ve kalabalıklaşan kod yıgınları için önceden önlemini alıp ona göre bir mimari oluşturmak gerekiyor. Bunun için mümkün oldugu kadar OOP tarafına kaymanızı tavsiye ederim.
OOP a gitmeden önce çok farkına varmadıgımız ve işi kolaylaştıran Condition kullanımından bahsedicem.

Önce kodlarımızı bir inceleyin sonra açıklamasını yapalım



Dönen sonuç 5, den büyük oldugu için dönen sonuç false olacaktır
Hemen açıklamasını yapalım
Burda yapılan işlem şu 5, 3 den büyük ise true, değilse false sonuç dönderecektir.

Condition kullanmadan bunu yapmış olsak kodlarımız aşagıda ki gibi olacaktı.

if (5<3 sonuc=" false;">sonuc =false;


Genel kullanım şekli şöyledir:

(deger) ? dorgu ise : Değilse

deger doğru ise ? den sonra ki kısım, değilse : den sonra ki kısım çalışacaktır.

Farklı bir örnek daha verelim sanırım böylece daha net anlaşılacak

string deger=null;
string str = String.IsNullOrEmpty(deger) ? "Boş" : "Dolu";
MessageBox.Show(str);

Evet işin detaylarına gittikce ufkumuzun genişledigini ve daha az satırlarla çalıştıgımızı farketmişsinizdir.
(blogspot un yapısı yüzünden if else bloklarını vs. veremedim herşeye html hatası veriyor buna ragmen)

Umarım keyfli olmuşdur.


C# Klasör İçini Temizleme

Merhablar zaman zaman klasörlerimizin içini temizleme ya da bazı dosyaları silme geregi duya biliriz.
İşde size çözüm yolu

İşe başlamadan önce

using System.IO; eklemeniz gerektigini biliyorsunuz.

FileInfo fileInfo;
string uzanti = ".txt";

foreach (string dosya in Directory.GetFiles(@"C:\TEST"))
{
fileInfo = new FileInfo(dosya);
if (fileInfo.Extension == uzanti)
// Dosya Uzantısı ve sizin uzantınız aynımı ??
{
fileInfo.Delete();
}
}

Peki ya klasörün kendini silmek istersek

Directory.Delete("klasör konumu");
bu komutun 2 overload ı vardır

1. Klasör boşsa siler
Directory.Delete(@"C:\TEST");

Silmeden önce içinde bişiler varmı kontrolünü yapabilirsiniz.

2. Klasör dolumu boşmu bakmadan siler
Directory.Delete(@"C:\TEST",true);
Tabi olaylar bu kadar değil sanırım bu konuda makelemiz yok en kısa sürede telafi edelim
Şimdilik hoşcakalın...

CURSOR KULLANIMI

Merhabalar Sql başlıca kullanılan işlemlerden biride Cursor ler dir.
Cursor ler kayıt kümesi üzerinde satır satır hareket etmemizi sağlar.
Nisbeten performans gerektiren bir işlem oldugundan dikkatli kullanılmasında fayda var.

Bu cursor blogunu herhangi procedure içinde rahatca kullanabiliriz.
Yaptıgı işlem ise bi tablodan çektigi verileri diger bi taboya insert yapıyor.

"ee zaten bunu cursor kullanmadan da yapabilirim hemde daha kısa ve kolay..." diyen arkadaşlarım olabilir, biliyoruz bunun çok çok faklı yollarıda var burda asıl amaç Cursor yazımını kavramak.

declare @code varchar(11)
declare @unvani nvarchar(50)

DECLARE DENEME_CURSOR CURSOR FOR -- cursor umuzu tanımlıyoruz
SELECT CODE, DEFINITION_ FROM CL

OPEN DENEME_CURSOR
--kullanıma açtık
FETCH NEXT FROM DENEME_CURSOR INTO @code, @unvani

WHILE @@FETCH_STATUS<>-1
--kayıtlar üzerinde hareket etmeye başladıkBEGIN
insert into CLC Values(@code,@unvani)
--insert yapıyoruz...
FETCH NEXT FROM DENEME_CURSOR INTO @code, @unvani
END

CLOSE DENEME_CURSOR
-- işi biten cursor kapatılmalıDEALLOCATE DENEME_CURSOR --Bellekde haliyle yer kaplayacagı için cursor le ilgili herşeyi temizledik...
CURSOR kullanımı oldukca kolay ve keyflidir. Artık cursor mantıgını ve yazımını kavradıgımız için gerekli hallerde hemen devreye sokarak işlerimi halledebiliriz.

Bir süre daha T-SQL üzerine gidecegim. Adım adım ilerleyerek en sonlarında senaryolarla ögrendigimiz konuları pekiştirmeyi hedefliyorum.
Bir sonra ki yazmızda görüşmek üzere hoşçakalın...

richTextBox 'a Resim Ekleme

Merhabalar;

Yeteneklerine hayran kaldıgım iki companentten biri richTextBox diğeri ise DataGridView dir. DataGridView için ilerde çok detaylı yazılar yazıcam ama önce richTextBox nasıl resim eklenir onu görelim.


private bool pasteMyBitmap(string fileName)
{

// Open an bitmap from file and copy it to the clipboard.
Bitmap myBitmap = new Bitmap(fileName);

// Copy the bitmap to the clipboard.
Clipboard.SetDataObject(myBitmap);

// Get the format for the object type.
DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);

// After verifying that the data can be pasted, paste it.
if (richTextBox1.CanPaste(myFormat))
{
richTextBox1.Paste(myFormat);
return true;
}
else
{
MessageBox.Show("The data format that you attempted to paste is not supported by this control.");
return false;
}
}


Kaynak:http://http//msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.canpaste.aspx

Umarım faydalı olur.

DataTable Sınıfı

Merhaba arkadaşlar;

Bugün DataTable sınıfını ve en sık kullanılan metodlarını inceleyecegiz.

DataTable tek tablo şeklinde verileri tutmak için kullanılır. En sık kullanılan şekli database den gelen verileri tablo şeklinde tutmak üzerinde işlemler yapmak için dir. DataSet ile arasındaki fark DataTable bir tek tablo tutarken DataSet tüm database şeklinde tüm tabloları tutar.

Burda anlatacagımız metodların bir kısmı DataSet içinde geçerlidir.

Kısa bilgiden sonra metadlarımızı sırayla geçelim.
Aslına bakarsanız bu metodların her biri ayrı makale konusudur.

DataTable ye kolon ekleme: dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("UrunAdi",typeof(string)),
new DataColumn("Birimi",typeof(string)),
new DataColumn("Adet",typeof(int))
});

yada
dt.Columns.Add("UrunAdi", typeof(string));
dt.Columns.Add("Birimi", typeof(string));
dt.Columns.Add("Adet", typeof(int));

Satır ekle:
dt.Rows.Add("Elma", "Kg", 10);

dt.Select(); Datatable içinde arama bu metod için DataTable içinde arama makalemize göz atabilirsiniz.

Xml yazma :
DataTable içinde ki verilerimizi xml formatında dosya yazmak için kullandıgımız metodumuzdur. DataSet ten farklı olarak, tekrar DataTable içine okuma yapabilmek için Xml Şeması ile birlikte oluşturmak zorundayız sadece.
dt.WriteXml("C:\\Urunler.xml");
dt.WriteXmlSchema("C:\\Urunler.xsd");

Xml okuma :
dtCopy.ReadXmlSchema("C:\\sdf.xsd");
dtCopy.ReadXml("C:\\sdf.xml");

DataTable kopyalama:
dt mizi satırlarıyla beraber başka bi dt ye kopyalamamızı sağlar.
dtCopy = dt.Copy();

Kolonları Kopyalama:
Tablonun iskelet yapısını kopyalar kolon baslıkları tipleri aynen kopyalanır fakat satırlar alınmaz dtCopy = dt.Clone();

Tablo Temizlemek:
dt mizin tüm satırlarını temizler
dt.Clear();

Tablo Birleştirmek:
dt isimli tabloyu dtCopy isimli tablo içinde birleştirir.
dtCopy.Merge(dt);

Kolon Hesaplama:
dt.Compute(); Satır hesaplama Toplama ortalama alma vs. Ayrıca işlenecek

Satır Silme:
indexi verilen satırı siler
dt.Rows.RemoveAt(satirIndex);

Satırlar Arasında Dolaşmak:
foreach(DataRow row in dt.Rows)
{
işlemler
}
aynı şekilde kolonlar arasında Columns dizisini kullanarak dolaşabilirsiniz.

Datable sınıfı ile ilgili anlatabilecek çok detay konular var ama hepsini burda anlatmaya gücümüz yetemeyeceginden belli başlı metodlarını inceledik.
Umarım bişiler katmışdır size.
Umarım umut ettikleriniz gerçekleşir...


Datatable GetChanges() Metodu

Merhaba arkadaşlar;

Bugün GetChanges() metodunu ile datatable içinde ki değişiklerimizi yakalayacagız.

Kısaca anlatacak olursak;

Database den çektigimiz veriler datatable ye doldurulur ve dataGridview controlüne basılır.
Burdan bilinmesi gereken bir şey vardır.

dataGridView1.DataSource=dt; komutu ile Datatable ve dataGridView kontrolü artık bütünleşmiştir. dataGridView de yaplan bütün değişikler aynen dt de de işlenir. İşte bu hareketleri yaklamak için yapmamız gerekenler kodlar...

Yapılabilecek hareketler ve anlamları

DataRowState.Added Eklenenler kayıtlarDataRowState.Deleted Silinenler kayıtlar
DataRowState.Detached Araştırınız
DataRowState.Unchanged Enson AcceptChanges çalıştırılmasından sonra yapılan değişiklikler

Buyrun kodlara...

DataTable dt;

private void btnDegisiklikler_Click(object sender, EventArgs e)
{

dataGridView2.DataSource = dt.GetChanges(DataRowState.Modified);
//Değişikleri gösterir
dt.GetChanges() metodu parametresiz olarak kullanıldıgında dt içinde ki değişikleri değiştirilen kayıtları getirir.

private void btnDb_Click(object sender, EventArgs e)
{
dt = new DataTable();
SqlConnection conn = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");
SqlCommand mCommand = new SqlCommand("Select * From DEPO1", conn);
SqlDataAdapter adp = new SqlDataAdapter(mCommand);
adp.Fill(dt);
dataGridView1.DataSource = dt;
}

SqlCommandBuilder DeriveParameters

Arkadaşlar merhaba;

Bu yazımızda Sql Procedure lerimizin bizden istediği parametreleri ögrenmek için yapılması gerekenleri ögrenecegiz.

Evet bu konuda bizi yardımdı olacak olan SqlCommandBeuilder sınıfı ve sevgili DeriveParameters metodumuz dur.
Peki bu yardım sever metodu nasıl kullanacaz hemen bir örnek yazarak konuyu somutlaştıralım.

Buyrun kodlara..

Bir buton yardımıyla kodları tetikleyebilirisiniz..

using (SqlConnection conn = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123"))
{
SqlCommand mCommand = new SqlCommand("DepoToplam", conn);
mCommand.CommandType = CommandType.StoredProcedure;
conn.Open();
//buraya kadar ne yaptık artık biliyorsunuz.

SqlCommandBuilder.DeriveParameters(mCommand); //Parametleri alabilmemizi sağlayan metoda sqlCommand nesnemizi atadık.
string parametreler = "";

for (int i = 0; i < mCommand.Parameters.Count; i++)
{
parametreler += "Procudere: "+mCommand.CommandText+" \n Adı: " + mCommand.Parameters[i].ParameterName + " Tipi: " + mCommand.Parameters[i].SqlDbType;
}
MessageBox.Show(parametreler);
}

Artık Sql Procedurelerimizin bizden istediği parametleri ve türlerini biliyoruz.
Sizde kendi ihtiyaçlarınıza göre diger özellikleri kullanarak işlerinizi hızlandırabilirsiniz.
"Büyük yangınlar küçük kıvılcımla başlarmış" Umarım küçük bir kıvılcım olur...
Dilerim herşey gönlünüzce olur...

SqlTransaction Kavramı

Merhabalar;

Uzun zamandan bu yana makale yazamıyordum kafamı dagıtmak için çokdandır yazmak istediğim SqlTransaction konusunda makale yazmak istedim.

Kodlara başlamadan önce çok yüzeysel bir anlatımla bu sınıfın ne işe yaradıgını anlatmak istiyorum.

SqlTransaction sınıfı hatalı veya tutarsız veri yazılmasını önlemek için kullanılır. Bu konunun anlatımında en çok kullanılan örnek hesaplar arası para transferi örneğidir.

A hesabında B hesabını para havalesi yapılırken önce A hesabından havale miktarı düşülür B hesabına yazılır. Peki ama A hesabından havale miktarı düşüldü, ya tam B hesabına yazılacakken server kapandı yada durdu v.s herhangi bir sorun oldu ???? eee nolacak şimdi A hesabında para düşüldü B hesabına işlenemedi A hesabı sahibi mağdur durumda. Ya da tam tersini düşünürsek B hesabına para işlendi ama A hesabından düşülemediği için Banka hesaplarda havale miktarınca açık verecek.

Aynı işlem depolar arası transfer gibi bir çok örnekle anlatılabilir.

SqlTransaction sınıfı; işte bu tür transfer işlemlerinde senaryoda anlatılan problemlerin önüne geçmek için kullanılır. 1. tablodan silinen kayıt 2. tabloya başarılı bir şekilde işlenmemişse 1. tabloda ki değişiklikleri hemen geri alır, işlem başlamadan ki haline getirir. Bu kadar anlatımdan sonra kodları yazalım..

Tablomuz DEPO1 ve DEPO2 adında 2 tane biribirinin aynısı olacak...
CREATE TABLE [dbo].[DEPO1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[URUNADI] [nchar](10) NULL,
[MIKTARI] [nchar](10) NULL
)


SqlConnection conn = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");

private void button1_Click(object sender, EventArgs e)
{
conn.Open(); //hepsinden önce bağlantı açılmış olmalı...SqlTransaction _transation; //SqlTransaction nesnemizi tanımlıyoruz
_transation = conn.BeginTransaction(); // Transaction ımızı başlattıkSqlCommand cmdDepo1 = new SqlCommand();
cmdDepo1.Parameters.AddWithValue("@MIKTAR", 1);

cmdDepo1.CommandText = "UPDATE DEPO1 SET MIKTARI=MIKTARI-@MIKTAR WHERE ID=1";
cmdDepo1.Connection = conn;
cmdDepo1.Transaction = _transation; //komut nesmeizin Transaction özelligine SqlTransaction ımızı atıyoruz.
SqlCommand cmdDepo2 = new SqlCommand();
cmdDepo2.Connection = conn;
cmdDepo2.Parameters.AddWithValue("@MIKTAR", 1);
cmdDepo2.CommandText="INSERT INTO DEPO2 VALUES('ELMA',@MIKTAR)";
cmdDepo2.Transaction = _transation;
try
{
cmdDepo1.ExecuteNonQuery(); //komutları çalıştırdık
cmdDepo2.ExecuteNonQuery();
_transation.Commit(); //hata yoksa verileri yolladık
}
catch
{
_transation.Rollback(); //hata varsa tüm değişikliker geri alıyor
}
finally
{
conn.Close(); //durum ne olursa olsun bağalantımızı kapadık.}

Bu örnekte aynı Database içinde SqlTransation uyguladık farklı Databaseler arasıda uygulamak mümkün.

Faydalı olmuş omasını diliyorum. Umarım herşey gönlünüze göre olur...

Tam gaz yola devam... Bol şannsssss.....

Params Anahtar Kelimesi ile Sınırsız Sayıda Parametre Tanımlama


Merhabalar;

Birbirinin devamı niteliğinde olan metod tanımları şekillerini gördük. Sıra params anahtar kelimesi ile sınırsız sayıda parametre kullanma yöntemine.

Bildiginiz gibi daha önce anlatılan metodlarda önceden belirlenen sayıda parametre verilirken bu yöntemde istenilen kadar parametre girilebilir.



Bu işleme göre sonuç olarak çıkar.

Out Parametre Metod Kullanımı

Merhabalar;

Out parametresinde gönderilen değerler üzerinde işlemler yapılır ve aynı degerler uot parametresi ile geri aynı değişken üzerinden dışarı taşınır.

Daha detaylı örnekler için araştırma yapmanızda faydalar vardır.


Konuyu daha iyi kavramanız için out ve ref anahtar sözcüklerini araştırmanız daha faydalı olacaktır.
Konunun SQL karşılıgı için buraya bakabilirsiniz.
Bir sonra ki yazımızda görüşmek üzer mutlu kalın....

Overloaded (Aşırı Yüklenmiş) Metotlar

Merhabalar ;
Bu yazımızda Overloaded yani Aşırı yüklenmiş metodlar üzerinde duracağım.
Overloaded Metodlar nedir ne işe yararlar kabaca anlatalım, daha sonrada bir örnek yapalım.
Aşırı yüklenmiş metodlar adında anlaşıldıgı gibi aynı isimde farklı işleri yerine getiren metodlardır. Resimde DataTable nesnesinin 3 tane Overloaded metodu oldugunu görüyoruz.






Bir metod aşırı yüklenmesi için kesinlikle aynı isime sahip olmalıdır ve farklı tipde değer döndermeli yada farklı sayıda (yada tipde) parametre almalıdır. Yani bir birinin aynı olan metod hata verecektir.

Bu bilgiler ışığında kendi örnegimizi yapıyoruz.

Topla adında bir metod tanımlayalım ve bunu 3 aşırı yükleme yapalım.

// 2 para metreli 1. toplama metodumuz
private int topla(int sayi1, int sayi2)
{
return sayi1 + sayi2; // 2 sayıyı toplar tam sayı olarak geri dönderir
}
// 3 parametreli 2. toplama metodumuz
private int topla(int sayi1, int sayi2, int sayi3)
{
return sayi1 + sayi2 + sayi3; // 3 sayıyı toplar tam sayı olarak geriye dönderir
}
// 3 parametreli 3. metodumuz (dikkat ederseniz bu strin türünden parametre alır)
private string topla(string sayi1, string sayi2, string sayi3)
{
return sayi1 + sayi2 + sayi3; // 3 string paramereti alır string olarak geriye dönderir}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(topla(1,1).ToString());
MessageBox.Show(topla(1,1,1).ToString());
}
Geriye dönen degerler 2 ve 3 olacaktır.


Pekiii hemen akla şu soru gelecektir.

---string dönderen metodda 3 parametreli program nasıl anlayacak toplayacakmı yoksa bu stringleri birleştirecekmi??????

cevabı tabi gayet basit girilen bi ifadenin string olarak algılanması için " " (çift tırnak) içine alınması gerekir.

Hatırlayacagınız gibi 1 kendi başına int degeri taşırken "1" string olarak tanınacaktır.
Buna göre şöyle kullanılmalı;

MessageBox.Show(topla("1","1","1").ToString());

Dönen sonuç tabikide 111 olacaktır.

Konularımız biraz daha detaya doğru gidecek. Umarım buraya kadar anlatılanlar faydalı olmuştur.

Bir sonraki yazımda görünşüceye kadar mutlu kalın....

MARS(Multiple Active Result Sets)

MARS nedir??


MARS(Multiple Active Result Sets) ADO.NET 2.0 ile gelen tek bağlantı ile birden çok stored proc select vs. işlem yapmamıza olanak veren bit teknikdir.


Normal ADO.NET teknigi ile bu işi halletmeye kalksak ya iki ayrı bağlantı tanımlanacak yada bir işlem bittikden sonra diğerine geçmeden önce bağlantıyı kapatıp açmak gerekir.


Herşeyi doğru yazdınız ama yinede bir hata varsa dikkat etmeniz gereken bi yer var.

ConnectionString imizde MultipleActiveResultSets = true gözden kaçırmamanız gerekir.


Arasında ki farkı görmek için kendiniz önce normal bildigimiz yöntemle yazın daha sonra MARS tekniğini uygulayın böylece arasındaki farkı daha bariz farkedeceksiniz.


SqlConnection sqlCon = new SqlConnection("data source=localhost;initial catalog=TEST;integrated security=SSPI;MultipleActiveResultSets = true");
SqlCommand cmd1 = new SqlCommand("Select * From Musteri", sqlCon); //Müşteri listem
SqlCommand cmd2 = new SqlCommand("Select * From Siparis where M_ID=@MID", sqlCon); //Müşteri siparişleri listem

cmd2.Parameters.Add("@MID", System.Data.SqlDbType.Int);
SqlDataReader dr1;
SqlDataReader dr2;
sqlCon.Open();
dr1 = cmd1.ExecuteReader();
while (dr1.Read()) //müşteri listemden okumaya başladım 1. Müşterim
{
Console.WriteLine(dr1[1].ToString());
Console.WriteLine("-----------------------------");
Console.WriteLine("");
cmd2.Parameters["@MID"].Value = dr1[0]; //ID sini siparişe yolluyorum.
dr2 = cmd2.ExecuteReader(); // buraya dikkattt... Siparisler okunmaya başladı..
while (dr2.Read())
{
Console.WriteLine(dr2[2].ToString()); // siparişler listeleniyor.
}
dr2.Close(); // tüm siparişleri listeledik işimiz bitti kapattık dataReader ımızı.
}
sqlCon.Close();
Console.ReadLine();


Özet olarak anlatacak olursak :

1. db ye bağlandık

2. sorgu çekmek için komutlarımızı hazırladık

3. SqlDataReader larımızı tanımladık (Biri müşteri listesi, Diğeri Siparişler için)

4. Müşteri listesini almaya başladık. (1. müşteri adı ve ID aldık sonraki satırlarda siparişler için kullanacagız.)

5. Bu kezde müşterinin ID sini komut satırına yolladık ve müşteri ye ait siparişleri listelemeye başladık.

6. siparişleri okudugumuz SqlDataReader i kapattık.

7. Takip eden satırlar....


Ekran çıktısı şöle oluyor...






SqlCommandBuilder Sınıfı ve DataGridView üzerinden update işlemi

Merhabalar;

Bu yazımızda dataGridView nesnesi üzerinden güncelleme silme ve ekleme işlemlerini ögrenecez.

Hepimiz programlarımız da dataGridView kullanıyoruz vede tanıdıkca daha da çok seviyoruz.

Bazen kullanıcılar müşterilerin siparişlerini verirken bazı kayıtları düzenleme geregi duyarlar. Örnegin Teslimat günü 3 gün sonra olan bi ürün depoda kalmamış ve 4. gün gelecektir. Hemen formlar arasında gidip gelmekdense hemen orada aynı anda değiştirmek isterler ki bence haklarıdırda. Peki bu durumda neler yapalabiliriz.

Not: Muhtemelen aşagıda ki hatayı alırsınız.
" Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information."
Bu hatanın nedeni database de tablonuzda primery key yoktur. Yani genelde ID kolonu olur Birincil anahtar atarsanız çözüme ulaşırsınız.

string cnStr = "Server=.;DataBase=TEST;uid=sa; pwd=123";
SqlConnection Conn;
SqlCommand cmd = new SqlCommand();
SqlDataAdapter adp;
DataTable dt;
private void btnYukle_Click(object sender, EventArgs e)
{
// Bu kısım zaten biliyorsunuz...
// Database bağlanı sorgu çektik, dönen sonuçları dataGridView nesnesine doldurduk.
Conn = new SqlConnection(cnStr);
cmd = new SqlCommand("Select * From CustomerInfo", Conn);
adp = new SqlDataAdapter(cmd);
dt = new DataTable();
adp.Fill(dt);
dataGridView1.DataSource = dt;
}
private void btnGuncelle_Click(object sender, EventArgs e)
{
//Evet asıl olayın gerçekleştigi yer burasu buraya biraz dikkat ediyoruz.
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adp);
// SqlCommandBuilder burda bizim için update delete vs. komutlar hazırlar ve dataAdapter ile ilişkendirilir.cmdBuilder.GetUpdateCommand(); //ben sadece update yapacagım için GetUpdateCommand() kullandım siz isterseniz ihtiyacınız için insert ve delete uygulayabilirsiniz.adp.Update(dt); // vee mutlu son dataTabledeki değişikliklerDatabase işleniyor.}

Umarım faydalı olur. Bence çok tatlı bişey bu mükkem pratiklik getiriyor.
Bu arada canım hala çok sıkılıyor....
Bir sonraki yazımızda görüşünceye kadar mutlu kalın....