C#'ta Bağlantısız Veritabanı İşlemleri

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla

Bu makale size ne kadar yardımcı oldu?

Çok faydalı, bilmediğim pek çok şeyi öğrendim.
12
86%
Eh, idare eder. Genel bir tekrar olmuş oldu.
1
7%
Gereksiz yere zaman kaybı, faydalı olmadı.
1
7%
 
Toplam oy: 14

Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

C#'ta Bağlantısız Veritabanı İşlemleri

Mesaj gönderen mucar »

C#’ta Bağlantısız Veritabanı İşlemleri
(Disconnected Database Operations with C#)


ADO.NET’e Genel Bir Bakış

Microsoft VS.NET’te veritabanı işlemleri ADO.NET ile gerçekleştirilmektedir. ADO.NET yazılımcının çeşitli veritabanlarıyla ilgili akla gelebilecek bütün işlemlere müdahale edebilmesi için geliştirilmiş .NET dillerinin hepsiyle birlikte kullanılabilen ortak bir yapıdır. Bu yapı içerisinde çeşitli veritabanı işlemlerini gerçekleştirmeye yönelik pek çok nesne, yöntem ve sınıf mevcuttur. (Bu işlemlere örnek vermek gerekirse; Kayıt ekleme, silme, değiştirme, arama, her türlü SQL işlemleri, transaction yönetimi, Stored Procedure kullanımı, ilişki yönetimi vb. gibi.)

ADO.NET ile veritabanı işlemleri temel olarak 2 kısımda incelenebilir;

• Bağlantılı Veritabanı İşlemleri (Connected Database Operations): Uygulamanın veritabanına sürekli bağlı olduğu yöntemdir. Değişiklikler veritabanına direk olarak yansımaktadır. Gerçek zamanlı erişim sağlar. Temel nesneleri Command ve DataReader nesneleridir.
• Bağlantısız Veritabanı İşlemleri (Disconnected Database Operations): Uygulama veritabanına sürekli bağlı değildir. İşlemler veritabanının gerekli tablolarını içeren sanal bir kopyası üzerinde yapılır. Gerektiği zaman bu veriler veritabanına aktarılır. Bu aktarımlar haricinde işlemler bağlantısız bir ortamda gerçekleşmektedir.

Resim

Bu yöntemin temel nesneleri DataSet ve DataAdapter nesneleridir. Yapı şekilde görüldüğü gibidir.

Resim

Dataset: Sanal veritabanı da diyebiliriz. Fiziksel veritabanındaki tabloları, satırları, ilişkileri yapısında barındırabilir. Bellekte geçiçi olarak tutulur.

DataAdapter: Datasetle, veritabanının haberleşmesini sağlayan nesne.

Connection: Veritabanına bağlanmak için kullanılan nesne

Veritabanı: Verilerin fiziksel olarak tutulduğu asıl veri kaynağı.

DataAdapter veri kaynağı ve DataSet arasındaki iletişimi sağlar. Tamamen çevrimdışı olarak ve veri sağlayıcı türünden bağımsız olarak çalışan DataSet içerisinde tabloları, bu tablolara ilişkin satır ve sütunları, tabloların birbirleriyle ilişkilerini hafızada saklayan bir araçtır. DataAdapter ise gerektiğinde DataSet’e veritabanında bulunan tabloları aktarır aynı zamanda DataSet’ten aldığı verileri veritabanına işleyebilmektedir. Connection ve DataAdapter sınıfları ise DataSet’ten farklı olarak veri sağlayıcı türüne bağımlı olarak çalışırlar (Örn; Access veritabanı bağlantısı için OleDbConnection ve OleDbDataAdapter nesneleri, SQL Server veritabanı bağlantısı için ise SqlConnection ve SqlDataAdapter nesneleri kullanılır). Veritabanı ile olan fiziksel bağlantı Connection sınıfı ile gerçekleştirilebilmektedir. Aşağıdaki şekle bakarak bağlantı yapısını daha somut bir şekilde kafanızda canlandırabilirsiniz;

Resim

DataSet’i daha iyi anlayabilmeniz açısından özelliklerine değinecek olursak;

 Her zaman çevrimdışı olarak çalışır. Veritabanı ile direk bağlantısı yoktur. Tamamen bağımsız olarak çalışır.
 İçerisinde tabloları, bu tablolara ait satır ve sütunları, tablo görüntülerini ve ilişkilerini barındırır.
 Hızlıdır, hafızada tutulduğu için veritabanı ve ağ ortamındaki yavaşlıklar onu direk etkilemez.
 Veritabanı sağlayıcılarından bağımsızdır. Uyumlu DataAdapter olduğu sürece DataSet’ler bütün veritabanı sağlayıcılarıyla çalışabilir.
 Direk olarak veritabanı üzerinde işlem yapılmadığı için yapılan değişikliklerin geri dönüşü kolaydır. Yapılan değişikliklerin kaydını tutar. (Anahtar Kelime: RowState)

DataAdapter nesnesi ise veri sağlayıcı türlerine göre değişiklik göstermektedir. Fakat kullanım şekli ve yapısı hepsinde aynıdır. DataAdapter’ın 2 temel işlevi vardır

1. Veritabanındaki istenen verileri DataSet’e aktarmak
2. DataSet’teki istenen verileri veritabanına aktarmak

Veritabanındaki istenen verileri DataSet’e aktarmak için DataAdapter’ın Fill() metodu kullanılır.

DataSet’teki istenen verileri veritabanına aktarmak için ise DataAdapter’ın Update() metodu çağrılır.

Connection nesnesi de DataAdapter’ın veritabana bağlanarak verilere ulaşabilmesi ve veritabanında değişiklik yapabilmesi için gerekli fiziksel bağlantının açılmasını ve kapanmasını sağlar. Veri sağlayıcısına göre çeşitlilik göstermekle beraber kullanım ve yapı itibarıyle farklılık göstermez.

Dilerseniz verilen bu ön bilgilerin ışığında, temel veritabanı işlemlerinin nasıl yapıldığını uygulamalı olarak görelim.

Bunun için ilk önce basit bir access veritabanı oluşturalım, içerisinde “kisi” isimli bir tablo olsun. Alanlar ise id (AutoNumber), ad (Text), soyad (Text), meslek (Text) olsun.

Yeni bir proje açın ve aşağıdakine benzer bir form oluşturun.

Resim

Şimdi de tasarladığımız bu formun kodlarını oluşturmaya başlayın. Aşağıda bu forma ilişkin örnek kodlar bulunmaktadır.

Kod: Tümünü seç

...

//access bağlantı nesnelerini içeren sınıf
using System.Data.OleDb;

namespace Project1
{        
	
	public class WinForm1 : System.Windows.Forms.Form
	{
...
		//Veritabanı baglantı araçlarını formun her yerinde 
		// kullanabilmek için  öntanımlama yapılıyor
		OleDbConnection baglanti;
		OleDbDataAdapter adaptor;
		OleDbCommandBuilder komutolusturucu;
		DataSet dsKisi;
		DataRow yenikayit;

		//Kaydet butonuna basmadan önce işlem tipi olarak
		//”Yeni Kayıt” veya “Düzenle” butonlarından hangisine
		// basıldığını anlamak için bir değişken oluşturuluyor
		string islemtipi;

		//Kayıtlar arasında dolasma işlemini gerçekleştirmek
		//amacıyla seçili satırı gösteren değişken oluşturuluyor
		int secilisatir=0;

...		

private void WinForm1_Load(object sender, System.EventArgs e)
{

//Bağlantıyı sağlayacak olan ConnectionString yazılıyor.
baglanti=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Application.StartupPath+"\\..\\..\\defter.mdb");
baglanti.Open(); //Bağlantı açıldı.

// Adaptör nesnesi tanımlanıyor. SelectCommand’ı belirtiliyor.
adaptor=new OleDbDataAdapter("select * from kisi",baglanti); 

//Yeni bir DataSet oluşturduk.
dsKisi=new DataSet();

//Adaptörümüz SelectCommand’ı ile seçtiği tabloyu,
//dsKisi DataSet’inin içerisine “kisi” tablo ismiyle kopyalıyor 
adaptor.Fill(dsKisi,"kisi");
//Seçili satırdaki ilgili alanları textboxlara
// dolduran fonksiyon çağrılıyor
alanlaridoldur();
//Yeni Kayıt ve Düzenle butonlarına basmadan 
// Textboxlar’a veri girişini engelleyen fonksiyon çağrılıyor
alanlarikilitle();
//Yeni Kayıt ve Düzenle butonlarına basmadan 
// Güncelle ve İptal butonlarının kilidini açan fonksiyon çağrılıyor
butonkilidiniac();

//DefaultView bizim “kisi” tablomuzun bir kopyası gibi
//düşünülebilir. Aradaki fark ise silinen satırları içermemesi
//Biliyoruz ki Delete() metoduyla silinen satırlar adaptörün
//Update() komutu gelene kadar hala tabloda tutuluyor
//Bu yüzden view kullanıyoruz.Varsayılan görüntünün 
//Silinen satırlar hariç  bütün satırları içermesini belirtiyoruz.
//Bu sayede kayıtları gösterirken bu görüntüyü kullanacağız.		  dsKisi.Tables["kisi"].DefaultView.RowStateFilter=DataViewRowState.CurrentRows;

}

private void alanlaridoldur()
{		  
  int i=secilisatir;
  try
  {
   //TextBoxlar’a DataSet’in DefaultView’ında
   //bulunan seçili kaydın verileri dolduruluyor
   textBox1.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[i]["ad"].ToString();
   textBox2.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[i]["soyad"].ToString();
   textBox3.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[i]["meslek"].ToString();
   //Seçili kaydın numarası gösteriliyor
   textBox4.Text=(i+1).ToString(); 
   //Toplam kayıt sayısı gösteriliyor
   textBox5.Text=dsKisi.Tables["kisi"].DefaultView.Count.ToString();
  }
  catch(Exception e)
  {
   MessageBox.Show(e.Message);
  }
}

private void alanlarikilitle()
{
//alanlara veri girişini engelledik
textBox1.Enabled=false;
textBox2.Enabled=false;
textBox3.Enabled=false;
}

private void alanlarinkilidiniac()
{
//alanlara veri girişini açtık
textBox1.Enabled=true;
textBox2.Enabled=true;
textBox3.Enabled=true;
}

private void alanlaritemizle()
{
//alanlar temizleniyor
textBox1.Text="";
textBox2.Text="";
textBox3.Text="";
textBox4.Text="";
textBox5.Text="";
}

private void butonkilitle()
{
//Yeni Kayıt veya Düzenle butonlarına basıldığında
//butonların olması gereken durumlar ayarlanıyor
btnSon.Enabled=false;
btnSonraki.Enabled=false;
btnOnceki.Enabled=false;
btnIlk.Enabled=false;
btnYeniKayit.Enabled=false;
btnDuzenle.Enabled=false;
btnSil.Enabled=false;
textBox4.Enabled=false;
btnGuncelle.Enabled=true;
btnIptal.Enabled=true;
}

private void butonkilidiniac()
{
//Güncelle veya İptal butonlarına basıldığında
//butonların olması gereken durumlar ayarlanıyor
btnSon.Enabled=true;
btnSonraki.Enabled=true;
btnOnceki.Enabled=true;
btnIlk.Enabled=true;
btnYeniKayit.Enabled=true;
btnDuzenle.Enabled=true;
btnSil.Enabled=true;
textBox4.Enabled=true;
btnGuncelle.Enabled=false;
btnIptal.Enabled=false;
}

private void btnYeniKayit_Click(object sender, System.EventArgs e)
{
//Güncelle butonunda işlem tipini bilebilmek için
//değişkene yeni değeri veriliyor
islemtipi="yeni";
butonkilitle();
alanlarinkilidiniac();
alanlaritemizle();
}
		
private void btnDuzenle_Click(object sender, System.EventArgs e)
{
//Güncelle butonunda işlem tipini bilebilmek için
//değişkene duzenle değeri veriliyor
islemtipi="duzenle";
butonkilitle();
alanlarinkilidiniac();
}

private void btnSil_Click(object sender, System.EventArgs e)
{

if(MessageBox.Show("Kaydı kalıcı olarak silmek istediğinize emin misiniz?","Bilgi",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2)==DialogResult.Yes)
{
	try
	{
	   //Veritabanında daha önceden kayıtlı olan satırlar silindiğinde
	   //kayıtlar arasında gezerken
             //”Deleted row information cannot be accessed through row”
	   //hatasını aşmak için böyle bir yöntem izledik. Buradaki ilk if bloğu
	   //seçili satırın daha önce veritabanında kayıtlı olup olmadığını anlıyor
	   string s="";
	   if (dsKisi.Tables["kisi"].Rows[secilisatir].RowState==DataRowState.Unchanged)
	   s="Unchanged";   
	   
	   dsKisi.Tables["kisi"].Rows[secilisatir].Delete();

	   //Bu if bloğu ise eğer satır daha önceden kayıtlı ise adaptorün
	   //Update() metodunu çalıştırıyor. Delete komutunun veritabanına
	   //yansıtılmasını sağlıyor.
	   if(s=="Unchanged")
	   {
	   //Adaptorün SelectCommand’ından hareketler InsertCommand,
	   //DeleteCommand ve UpdateCommand ifadelerini otomatik olarak
	   //oluşturuyor. Aksi takdirde Update Exception döndürecektir.
	   komutolusturucu=new OleDbCommandBuilder(adaptor);
	   adaptor.Update(dsKisi,"kisi");
	   }
	   	
	   MessageBox.Show("Kayıt silindi", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
	   if (secilisatir>0)
	   secilisatir--;
         	   alanlaridoldur();
	}
	catch(Exception hata)
	{
	   MessageBox.Show(hata.ToString(), "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
	}

}
}

private void btnGuncelle_Click(object sender, System.EventArgs e)
{
//Eğer yeni kayıt butonuna basıldıktan sonra Güncelle’ye basıldıysa
if (islemtipi=="yeni")
{  
    try
    {    
	//DataSet’te boş yeni bir satır oluşturuluyor.
	yenikayit=dsKisi.Tables["kisi"].NewRow();
	//Satırdaki alanlara değerler atanıyor
	yenikayit["ad"]=textBox1.Text;
	yenikayit["soyad"]=textBox2.Text;
	yenikayit["meslek"]=textBox3.Text;
	//Satır datasete ekleniyor. 
	dsKisi.Tables["kisi"].Rows.Add(yenikayit);
	MessageBox.Show("Kayıt başarılı bir şekilde eklendi.","Bilgi");
	alanlaridoldur();
	alanlarikilitle();
	butonkilidiniac();
    }    
    catch(Exception hata)
    {
	MessageBox.Show(hata.ToString(),"Hata",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);
    }
}
else if (islemtipi=="duzenle")
{
  try
  {      
        //Veritabanında daha önceden kayıtlı olan satırlar düzenlendikten 
        //sonra silindiğinde, kayıtlar arasında gezerken
        //”Deleted row information cannot be accessed through row”
        //hatasını aşmak için böyle bir yöntem izledik. Buradaki ilk if bloğu
        //seçili satırın daha önce veritabanında kayıtlı olup olmadığını anlıyor
        string s="";
        if (dsKisi.Tables["kisi"].Rows[secilisatir].RowState==DataRowState.Unchanged)
        s="Unchanged";

        yenikayit=dsKisi.Tables["kisi"].Rows[secilisatir];
        yenikayit["ad"]=textBox1.Text;
        yenikayit["soyad"]=textBox2.Text;
        yenikayit["meslek"]=textBox3.Text;

        //Bu if bloğu ise eğer satır daha önceden kayıtlı ise adaptorün
        //Update() metodunu çalıştırıyor. Değiştirilen bu satırın
        //silinmeye çalışılması sonucu çıkacak olan hatayı
        //önlemek için Delete komutunun veritabanına
        //yansıtılmasını sağlıyor.
        if(s=="Unchanged")
        {
        komutolusturucu=new OleDbCommandBuilder(adaptor);
        adaptor.Update(dsKisi,"kisi");
        }

        MessageBox.Show("Kayıt başarılı bir şekilde güncellendi.","Bilgi");
        alanlaridoldur();
        alanlarikilitle();
        butonkilidiniac();
  }
  catch(Exception hata)
  {    
        MessageBox.Show(hata.ToString(), "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
  }
}
}
		
private void btnIptal_Click(object sender, System.EventArgs e)
{
alanlaridoldur();
butonkilidiniac();
alanlarikilitle();
}

private void btnIlk_Click(object sender, System.EventArgs e)
{
//İlk kayda git
secilisatir=0;
alanlaridoldur();
btnOnceki.Enabled=false;
btnIlk.Enabled=false;
btnSon.Enabled=true;
btnSonraki.Enabled=true;
}

private void btnOnceki_Click(object sender, System.EventArgs e)
{

if (secilisatir>0)
{
//Bir önceki kayda git
secilisatir--;
alanlaridoldur();
btnSon.Enabled=true;
btnSonraki.Enabled=true;
}
else
{
btnOnceki.Enabled=false;
btnIlk.Enabled=false;
}

}

private void btnSonraki_Click(object sender, System.EventArgs e)
{

if (secilisatir+1<dsKisi.Tables["kisi"].DefaultView.Count)
{
//Bir sonraki kayda git
secilisatir++;
alanlaridoldur();
btnOnceki.Enabled=true;
btnIlk.Enabled=true;
}
else
{
btnSon.Enabled=false;
btnSonraki.Enabled=false;
}

}
		
private void btnSon_Click(object sender, System.EventArgs e)
{
//Son kayda git
secilisatir=dsKisi.Tables["kisi"].DefaultView.Count-1;
alanlaridoldur();
btnOnceki.Enabled=true;
btnIlk.Enabled=true;
btnSon.Enabled=false;
btnSonraki.Enabled=false;
}

private void textBox4_TextChanged(object sender, System.EventArgs e)
{
// TextBox’ta yazılan pozisyondaki kayda gitmek için
if (textBox4.Text!="")
{
 int i=dsKisi.Tables["kisi"].DefaultView.Count; //Toplam kayıt sayısı
 int t=Convert.ToInt32(textBox4.Text); //Gidilecek olan kaydın pozisyonu

  if (i>=t)
  {
  secilisatir=t-1;
  //alanları doldur
  int a=secilisatir;
  textBox1.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["ad"].ToString();
  textBox2.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["soyad"].ToString();
 textBox3.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["meslek"].ToString();
 }
 else
 {
 secilisatir=i;
 //alanları doldur
 int a=secilisatir;
 textBox1.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["ad"].ToString();
 textBox2.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["soyad"].ToString();
 textBox3.Text=dsKisi.Tables["kisi"].DefaultView.Table.Rows[a]["meslek"].ToString();
 }
}

}

private void textBox4_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{   
//yalnız karakter girilmesi için
if (!Char.IsDigit(e.KeyChar))
e.Handled = true;
}

private void WinForm1_Closed(object sender, System.EventArgs e)
{
//DataSet’te yapılmış olan bütün değişiklikler
//veritabanına gönderiliyor ve bağlantı kesiliyor.
komutolusturucu=new OleDbCommandBuilder(adaptor);
adaptor.Update(dsKisi,"kisi");
baglanti.Close();
}




         }
} 
Proje kodlarını indirmek için tıklayın.
Eleştiri ve önerilerinizi bekliyorum.
En son mucar tarafından 12 Oca 2007 02:25 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Eline emeğine sağlık, güzel olmuş.. Bu çalışma ile bir kere kaybettiğin zamanı bir çok kişi daha olaya başlarken kazanmış olacaktir :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Eline sağlık, harika bir makale.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Eline sağlık, temel mantığın (offline dataset) kavranması açısından güzel bir makale, ancak pratikte olaylar biraz daha farklı-gelişmiş işliyor. DataAcessLayer lar (http://www.llblgen.com) sayesinde işler biraz daha kolaylaşıyor. Bunu söylememin nedeni kodlara bakanları C# tan soğutmamak :lol:
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

s.a.

C# nedir. merak ettim. okunu?u S ?arp m?d?r. ve net IDE midir.
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

rsimsek, fduman ve lazio değerli yorumlarınız için teşekkürler.

lazio bizi aydınlattın. Verdiğiniz linkten bir kaç tanıtım videosu izledim, gerçekten de hiç bir kod yazmadan programı hazırlıyor. Siz bu aracı kullanıyor musunuz. Ne derece faydalı oluyor, verilen ücrete değer mi?

İleride artık bu sektörde bitecek böyle giderse. Bu araçlar yakında mutlaka IDE'lerle beraber de gelecektir ve bu sayede 6 yaşında bir çocuk bile çok rahat programlar hazırlayabilecek, programcılığın gidişatı böyle görünüyor şimdilik. Ne yapmalı, değerli DelphiTürkiye Forum üyeleri bu konuda neler düşünüyor, başka kulvarlara yönelmek gerekiyor sanırım. Herkesin yapabildiği birşeyin ne esprisi olabilir ki? Kazanç bir yana, kişisel tatmin açısından da aynı şekilde.
kadirkurtoglu yazdı:s.a.

C# nedir. merak ettim. okunu?u S ?arp m?d?r. ve net IDE midir.
a.s. c#, "si şarp" şeklinde okunuyor. Visual Studio .NET ile gelen .NET'in ana dili. Java'nın piyasadaki tekelini kırmak amacıyla oluşturulmuş bir dil. Yapısı Java'ya o kadar benzer ki bir Java programına bakarak C#'a çevirmek hiç de zor değil. Pek çok IDE bu dili derleyebiliyor ama en popüleri Visual Studio .NET 2005. Benim kullandığım IDE ise Borland Developer Studio 2006. Sharp Develop diye bir IDE daha var, onu denemedim. Daha başkaları da vardır mutlaka.
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Yazı için tebrikler. Güzel bir yazı olmuş.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

mucar yazdı: lazio bizi aydınlattın. Verdiğiniz linkten bir kaç tanıtım videosu izledim, gerçekten de hiç bir kod yazmadan programı hazırlıyor. Siz bu aracı kullanıyor musunuz. Ne derece faydalı oluyor, verilen ücrete değer mi?
Aslında tam olarak hiç kod yazmadan program yazıyor diyemeyiz, çünkü kod yazıyoruz :)
llbl basit bir arayüzü olan, birden çok database (mssql, IB/FB, Postgre, Oracle) e bağlanıp bağlandığınız database in table, view, SP, vs gibi nesnelerini bir Library projesi olarak yaratıyor. Bu library yi sizin business projenize Data Access Layer olarak ekliyorsunuz.
CSharp ve VB.Net için CF 1-2, .Net 1-2 olarak Adapter ve SelfServicing olarak yaratabiliyor projeleri.
Yaratılan DAL da Sadece tablo, field, view, sp vs ler için class lar, property ler, enum lar vs var. Bu yapılar sadece bizim delphi de kullandığımız örneğin IBX bileşen setini simule ediyor. Ama güzel tarafı tek satır sql kodu yazmıyorsunuz, haliyle Veritabanı bağımlılığını bitiriyor, çalışanların tek standartta kod yazmasını sağlıyor, trigger mantığını source tarafına alabiliyorsunuz (Veritabanı bağımlılığını tekrar bitiriyor :)) gibi temel faydaları var.. standart .net in connection, adapter vs gibi class larıyla uğraşmadığınız için çok hızlı kod yazabiliyorsunuz ama kesinlikle kod yazmayı bitirmiyor bu araç..
Fiyat konusunda yukarıda bahsettiklerim 200 Euro dan daha değerlidir diye düşünüyorum :)
DeveloperToolKit

..::|YeşilMavi|::..
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Bence kodu biraz uzatmışsınız. Ben bir kaç öneri ekleyeyim.
Windows Forms sınıflarında databinding özelliği var. .Net'te, Delphi'de olduğu gibi veritabanı bağlantısı için başka(TDBEdit,vs..) veritabanı olmadığı durumlarda başka(TEdit, vs..) bileşenler kullanmanıza gerek kalmıyor.

DataBinding ile kod baya bir sadeleşecektir.

Kod: Tümünü seç

//Adaptörümüz SelectCommand’ı ile seçtiği tabloyu,
//dsKisi DataSet’inin içerisine “kisi” tablo ismiyle kopyalıyor
adaptor.Fill(dsKisi,"kisi"); 
textBox1.DataBindings.Add("text", dsKisi, "kisi.ad");
textBox2.DataBindings.Add("text", dsKisi, "kisi.soyad");
textBox3.DataBindings.Add("text", dsKisi, "kisi.meslek");
Artık o textBox bileşenlerinin "text" özelliğini datasette belirtilen alanlarla bağladık. Datasette ne varsa otomatik olarak onu gösterecek.

Tabloda kayıtlar arasında dolşamka içinde

Kod: Tümünü seç

    BindingContext[dsKisi,"kisi"].Position++; // bir kayıt ileri
    BindingContext[dsKisi,"kisi"].Position--; // bir kayıt geri
yöntemini kullanabilirsiniz.

Not : BindingContext nesnesi Form'a ait.

İyi çalışmalar
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Konu bağlamında;

Delphi bloggerlarından .NET için Data Acces Layer (DAL) tavsiyeleri. İçlerinde beleşware olanlarda var :

Steve Trefethen, CodeGear çalışanı
http://www.stevetrefethen.com/blog/Data ... ework.aspx

Brian Moelk, bilgili bir delphici, Borland mail listelerini takip edenler mutlak ismini duymuştur. Beleş olanlardan Subsonic'i tek geçerim diyor.

http://www.brainendeavor.com/tw/tiki-vi ... &postId=43
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

undefined yazdı:... beleşware olanlarda var :
..
Bu lafı çok tuttum :lol: :lol:

Bir de Gaffurun sen anladın onu :lol: :lol:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla