c#'ta veritabanı işlemleri ile ilgili bir soru

C# (C Sharp) veya Java ile ilgili konuları buraya yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

c#'ta veritabanı işlemleri ile ilgili bir soru

Mesaj gönderen mucar »

s.a.

BDS 2006'yla gelen C#'ı denemeye başladım şu sıralar. Basit bir veritabanı uygulaması yapmaya çalışıyorum Ado.Net'i öğrenmek açısından. Bir access tablosunu veritabanı olarak kullanıyorum. Ekleme,güncelleme,silme gibi standart işlemleri gerçekleştirmeye çalışıyorum. Fakat şöyle bir hatayla karşılaşıyorum;
deleted row information cannot be accessed through the row
Silme işlemindeki kodlarım şu şekilde;

Kod: Tümünü seç

if(MessageBox.Show("Kaydı kalıcı olarak silmek istediğinize emin misiniz?","Bilgi",MessageBoxButtons.YesNo,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2)==DialogResult.Yes)
  {
	dsKisi.Tables["kisi"].Rows[BindingContext[dsKisi,"kisi"].Position].Delete();
	OleDbCommandBuilder komutolusturucu=new OleDbCommandBuilder(adaptor);
	adaptor.ContinueUpdateOnError = true;
	adaptor.Update(dsKisi,"kisi");
	MessageBox.Show("Kayıt silindi","Bilgi",MessageBoxButtons.OK,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1);
  }

Araştırmalarıma göre ADO.NET'te DataTable'dan Delete() metoduyla silinen satırların aslında veritabanından silinmediği sadece bu satırın silineceğine dair bir bayrakla işaretlendiği, kalıcı olarak silmek için AcceptChanges metodunun işletilmesi gerektiği belirtiliyor. Eğer AcceptChanges metodu işletilmezse ve kayıtlar arasında dolaşılırken bu silinen kayda ait pozisyona gelindiğinde "deleted row information cannot be accessed through the row" hatasını vereceği söyleniyor. Aynen de bu şekilde oluyor. Fakat ben bu olayı çalıştırdığım halde bir sonuç alamadım.

Bu konuda bilgili arkadaşların yardımlarını bekliyorum.
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Kısaca anlatmaya çalışayım : ADO.NET'te xxxConnection nesnesi ile veritabanına bağlanır. xxxDataAdapter sayesinde ilgilenilen tablonun içeriği DataSet'e aktarılır. DataAdapter ilgili tablonun içeriğini okurken adı DataAdapter'in SelectCommand özelliğine aktarılan xxxCommand nesnesinden yararlanır. DataSet'te, dolayısıyla DataTable'larda yapılan değişiklikler yine xxxDataAdapter sayesinde Update metodu kullanılarak veritabanına yansıtılır. DataAdapter DataSet'in son halini veritabanına yazarken adları DataAdapter'in InsertCommand, DeleteCommand ve UpdateCommand özelliklerine aktarılmış Command nesnelerinden yararlanılır.

Bunun dışında DataAdapter'den yararlanmadan direk Comamnd nesneleri ile veritabanı üzerinde işlem yapmak mümkündür.
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

memiky cavabınız için teşekkürler. Güzel bir şekilde özetlemişsiniz olayı.

Birkaç gündür C# ve ADO.NET'i öğrenmeye çalışıyorum ve bu kısa zaman içerisinde gördüm ki gerçekten çok fazla yöntem, çok fazla nesne var, yapı çok farklı ve Delphi'den C#'a geçen birisi için bu bir karmaşa doğuruyor alışıncaya kadar. Delphi'deki sadeliği insan aramıyor değil bazen.

Dediğiniz gibi aslında SQL kullanmak da bir başka çözüm, fakat bir sorun çıktığında o sorunu çözmeden diğer yöntemlere yönelmek bana çok sağlıklı gelmiyor, insan kolaya kaçmış oluyor. Sorun küçük bir sorun olsa da onu çözmeden başka bir yöntemle işi halletmek beni tatmin etmiyor açıkçası.

Şu an sorunumu halen çözmüş değilim. Fakat araştırmalarım sırasında öğrendiğim bazı ince noktaları da sizlerle paylaşmak isterim;

1. Delete() metodunun satırı aslında veri kaynağından silmediği, fakat o satıra ait sanal bir alan olan RowState alanına "Deleted" şeklinde işaretleme yaptığını

2.Kalıcı olarak silmek için AcceptChanges() metodunun beklendiği, bu metodun çalıştırılması halinde ise Rowstate alanının "Unchanged" şeklinde işaretlendiğini

3. Kalıcı olarak veritabanından bir satırı silmek için Remove() veya RemoveAt() metodlarının kullanılabileceğini

(1. ve 2. yargı ile ilgili güzel bir makale: http://www.csharpnedir.com/makalegoster.asp?MId=141)

Fakat bunları yanlış mı uyguluyorum nerede hata varsa çözemedim. Şöyle ki;

Kod: Tümünü seç

dsKisi.Tables["kisi"].Rows[BindingContext[dsKisi,"kisi"].Position].Delete();
dsKisi.Tables["kisi"].Rows[BindingContext[dsKisi,"kisi"].Position].AcceptChanges();
komutolusturucu=new OleDbCommandBuilder(adaptor);
adaptor.Update(dsKisi,"kisi");
şeklinde kullandığımda kaydı siliyor. Fakat ileri, geri butonlarıyla tablodaki kayıtları dolaşırken silinen kaydın pozisyonuna gelindiğinde;
deleted row information cannot be accessed through the row
hatasını veriyor.

Kod: Tümünü seç

dsKisi.Tables["kisi"].Rows.RemoveAt(BindingContext[dsKisi,"kisi"].Position);
komutolusturucu=new OleDbCommandBuilder(adaptor);
adaptor.Update(dsKisi,"kisi");
şeklinde kullanırsam ise kaydı siliyor, hiç bir hata çıkmıyor. Fakat bu değişiklikler veritabanına işlenmiyor.

Sanırım bir yerde göremediğim, yanlış yaptığım birşeyler var.
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

Sorunları aşabildim nihayet. C# ve ADO.NET'e yeni başlayan biri olarak öğrendiğim bilgileri ve kullandığım yöntemleri anlattığım bir makale yazdım. Bu makaleyi Makale ve İpucu bölümünde bulabilirsiniz.

Bu sayede forumumuzda hem yeni başlayanlar için bir kaynak olmuş olur, hem de sizin görüşlerinizi ve eleştirilerinizi alarak daha optimize ve daha verimli kodlar oluşturabiliriz. Eleştirilerinizi bekliyorum.

Makaleyi okumak için: viewtopic.php?t=18540
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Cevapla