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.....