none
Aynı Verilerin Birden Fazla Eklenmesi Sorunu c#-sql RRS feed

  • Soru

  • Merhaba arkadaşlar birleştirmiş olduğum tablolardan ana bir tablo oluşturdum. Programda bir hata vermeden veri eklendi diyor. Fakat eklenmiyor. İlk veriyi sql'den ekleyip diğer verileri c#'tan ekleyince problem başlıyor. 2. veri normal bir şekilde ekleniyor ama 3. veriden 2 adet, 4. veriden 4 adet, 5.den veri 8 adet aynı veriyi ekliyor.   Ben bu problemi çözemedim.

    Buton 2'ye tıklanınca olan olay

    DateTime bugun = DateTime.Today;
                baglanti.Open();
                SqlCommand ekle = new SqlCommand("INSERT INTO malzemeler(m.malzeme_kod,c.malzeme_cesit,m.malzeme_ad,m.malzeme_adet,f.malzeme_ureten_firma,m.malzeme_kayit_tarihi,c.id_cesit,f.id_firma) SELECT @malzemekod, @malzemecesit, @malzemead, @malzemeadet, @malzemeuretenfirma, @malzemetarih, @cesitid, @firmaid FROM [dbo].[malzemeler] AS m INNER JOIN [dbo].[malzeme_cesitleri] AS c ON m.id_cesit=c.id_cesit INNER JOIN [dbo].[malzeme_firma] AS f ON m.id_firma=f.id_firma", baglanti);   
                ekle.Parameters.AddWithValue("@malzemekod", malzeme_kodu.Text);
                ekle.Parameters.AddWithValue("@malzemecesit", comboBox1.Text);
                ekle.Parameters.AddWithValue("@malzemead", malzeme_adi.Text);
                ekle.Parameters.AddWithValue("@malzemeadet", malzeme_adedi.Text);
                ekle.Parameters.AddWithValue("@malzemeuretenfirma", comboBox2.Text);
                ekle.Parameters.AddWithValue("@malzemetarih", bugun);
                ekle.Parameters.AddWithValue("@cesitid", cesit_id);
                ekle.Parameters.AddWithValue("@firmaid", firma_id);            
                ekle.ExecuteNonQuery();
                baglanti.Close();
                ds.Tables["malzemeler"].Clear();
                listele();
                MessageBox.Show("Malzeme eklendi.");

    Malzemeler Tablosundaki "id" kolonum primary key ve +1 şeklinde artıyor.

    SELECT TOP 1000 [id_cesit]
          ,[malzeme_cesit]
          ,[malzeme_id]
      FROM [stok].[dbo].[malzeme_cesitleri]

    SELECT TOP 1000 [id_firma]
          ,[malzeme_ureten_firma]
          ,[malzeme_id]
      FROM [stok].[dbo].[malzeme_firma]

    SELECT TOP 1000 [id]
          ,[malzeme_kod]
          ,[malzeme_cesit]
          ,[malzeme_ad]
          ,[malzeme_adet]
          ,[malzeme_ureten_firma]
          ,[malzeme_kayit_tarihi]
          ,[id_cesit]
          ,[id_firma]
      FROM [stok].[dbo].[malzemeler]

    malzemeler tablosundaki "id_firma" malzeme_firma tablosundaki  "id_firma" ile ilişkili

    malzemeler tablosundaki "id_cesit" malzeme_cesitleri tablosundaki  "id_cesit" ile ilişkili

    19 Şubat 2020 Çarşamba 12:10

Yanıtlar

  • Arayuz kodlamaya baslamadan once SQL tasarimini iyice gözden geçirmelisin.

    Bu arayüzde ne yapmak istediğini dusun, bu haliyle ayni sabit degerleri N kere insert etmeye calisan bir kod var. Muhtemelen asil yapmak istediğin:

    -Malzeme_cesitleri tablosundan sectirilip textboxlara yazilmis sabit degerler var (combo1 ile muhtemelen o seciliyor)

    -Yanina (combo2?) ile o malzemenin hangi firmadan olduğu secilip,

    -Tarih (bugun) ve adet eklenip kabaca:

    combo1'den (cesit_Id), combo2'den (Firma_id), tarih, adet elde edilmiş olup Malzemeler tablosuna (muhtemelen cesit_id, firma_id, tarih, adet kolonlari) eklenmek isteniyor. O zaman kod yaklaşık suna benzerdi:

    string sql = @"INSERT INTO malzemeler
      (id_cesit,id_firma,malzeme_kayit_tarihi,malzeme_adet) 
      values 
      (@cesitid, @firmaid, @tarih, @adet);";
    
    DateTime bugun = DateTime.Today;
    SqlCommand ekle = new SqlCommand(sql, baglanti);
    ekle.Parameters.Add("@cesitid", SqlDbType.Int).Value = cesit_id;
    ekle.Parameters.Add("@firmaid", SqlDbType.Int).Value = firma_id;
    ekle.Parameters.Add("@tarih", SqlDbType.Date).Value = bugun;
    int.TryParse(malzeme_adedi.Text, out int adet);
    ekle.Parameters.Add("@adet", SqlDbType.Int).Value = adet;
    baglanti.Open();
    ekle.ExecuteNonQuery();
    baglanti.Close();
    ds.Tables["malzemeler"].Clear();
    listele();
    MessageBox.Show("Malzeme eklendi.");
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    19 Şubat 2020 Çarşamba 14:53

Tüm Yanıtlar

  • Merhaba,

    Muhtemelen inner joinlerden kaynaklı. Inner join sorgularınızı gözden geçirin. Eğer inner joinlerde tek kayıt gelmiyorsa SQL gelen kayıt sayısı kadar ilave kayıt yapıyordur.


    Bu cevabın size yardımcı olduğunu düşünüyorsanız lütfen resmin altındaki Yardımcı Olarak Oyla butonuna tıklayınız.

    19 Şubat 2020 Çarşamba 13:29
  • Çok kez baktım ama bir hata göremedim. 
    19 Şubat 2020 Çarşamba 13:51
  • Bu soruyu daha once sordunuz ve o soruyu, size sorulanları cevaplamadan açık biriktiniz. Burada insert komutunuz syntaxda teorik olarak yanlış ama MS SQL Server bunu tolere ederek hata vermiyor (bug herhalde ama kimse bug olarak algilamiyor).

    Syntax kismini geçerseniz, pratikte formdan bazı sabit degerler alıyorsunuz, ve aldiginiz bu degerleri, 

    SELECT count(*) 
    FROM [dbo].[malzemeler] AS m 
    INNER JOIN [dbo].[malzeme_cesitleri] AS c 
       ON m.id_cesit=c.id_cesit 
    INNER JOIN [dbo].[malzeme_firma] AS f ON m.id_firma=f.id_firma;

    sorgusunda gelecek sayı kadar tekrar malzemeler tablosuna ekliyorsunuz, yani ayni komutu üst üste M kere cagirsanisaniz, 1.de N, 2.de 2N, 3.de 4N ... 10.da 1024N kayıt eklersiniz. Yani 3 kayıtla başlasanız, 10 kerede elinizde 3072 kayıt olur. Olayın vehametini anlayabilmeniz icin bu kadar uzun yazıyorum. Sanırım önceki sorunuzdaki gibi, sorulara cevap verme zahmetine katlanmayı, bırakıp pas gececeksiniz. Neyse ben uyarımı yapayım. Tasariminiz bastan sakat duruyor, özür dilerim. 

     


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    19 Şubat 2020 Çarşamba 13:53
  • Çetin abi zahmetlik bir durum yok ben verilmesi gereken bilgileri verdiğimi düşünüyorum. Olayın anlaşılması için daha hangi bilgileri vermem gerekiyor? Benim bunun dışında bir sürü işim var. Fırsat buldukça bu foruma bakmaya çalışıyorum. Ve abi ilgin için teşekkür ederim. Gerçekten. Senin verdiğin her şeyi anlayamayabilirim. Lütfen anlayışla karşıla.
    19 Şubat 2020 Çarşamba 14:16
  • Benim de bir çok isim gücüm var ama yine de kendi isim olmasa da yardim etmeye calisiyorum. Bu soz garip olmuş.

    Uyarmaya calisiyorum, bastan beri tasarımında bir gariplik var, simdi tablo yapıların daha düzgün ama neden bu sekilde bir insert yapmaya kalkistigini anlamak zor geliyor.

    Baslangicta tabii ki hiç veri eklenmeyecek, cunku, veritabanınızda henüz o sarta uyan bir kayıt yoktur. Kayıtlar eklenmeye basladiginda ise, bu SQL ile, dediğim gibi bir kartopuyla baslayıp kısa surede bir cig gibi büyüyen  bir veri ekleme olacak.

    Malzeme_cesitleri tablosu her malzemeden 1 adet, o malzemenin ne oldugunu aciklayan bir tablo,

    Malzeme_firma o malzeme_cesitlerinden üreten firmalar Cesit 1 -< N Firma, degil mi?

    Malzemeler ise arada alinan malzemeler ile ilgili bir tablo gibi. 

    Durum boyle ise, neden her seferinde, kullanicidan alinan sabit degerleri o 3 tablonun joinlerle baglantili sonucu kadar yeni kaydı malzemelere ekliyorsunuz?

    Ne demek istediğimi anlamak icin, dogrudan SSMS'de o sabit degerlerin yerine elle deger koyup birkaç kere insert etmeyi deneyin, ne oldugunu goreceksiniz.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    19 Şubat 2020 Çarşamba 14:30
  • Peki abi dediğini yapacağım. Bu hatayı çözmek için ne yapmam gerekir? Yada neye dikkat etmeliyim?
    19 Şubat 2020 Çarşamba 14:38
  • Arayuz kodlamaya baslamadan once SQL tasarimini iyice gözden geçirmelisin.

    Bu arayüzde ne yapmak istediğini dusun, bu haliyle ayni sabit degerleri N kere insert etmeye calisan bir kod var. Muhtemelen asil yapmak istediğin:

    -Malzeme_cesitleri tablosundan sectirilip textboxlara yazilmis sabit degerler var (combo1 ile muhtemelen o seciliyor)

    -Yanina (combo2?) ile o malzemenin hangi firmadan olduğu secilip,

    -Tarih (bugun) ve adet eklenip kabaca:

    combo1'den (cesit_Id), combo2'den (Firma_id), tarih, adet elde edilmiş olup Malzemeler tablosuna (muhtemelen cesit_id, firma_id, tarih, adet kolonlari) eklenmek isteniyor. O zaman kod yaklaşık suna benzerdi:

    string sql = @"INSERT INTO malzemeler
      (id_cesit,id_firma,malzeme_kayit_tarihi,malzeme_adet) 
      values 
      (@cesitid, @firmaid, @tarih, @adet);";
    
    DateTime bugun = DateTime.Today;
    SqlCommand ekle = new SqlCommand(sql, baglanti);
    ekle.Parameters.Add("@cesitid", SqlDbType.Int).Value = cesit_id;
    ekle.Parameters.Add("@firmaid", SqlDbType.Int).Value = firma_id;
    ekle.Parameters.Add("@tarih", SqlDbType.Date).Value = bugun;
    int.TryParse(malzeme_adedi.Text, out int adet);
    ekle.Parameters.Add("@adet", SqlDbType.Int).Value = adet;
    baglanti.Open();
    ekle.ExecuteNonQuery();
    baglanti.Close();
    ds.Tables["malzemeler"].Clear();
    listele();
    MessageBox.Show("Malzeme eklendi.");
    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    19 Şubat 2020 Çarşamba 14:53
  • Teşekkürler abi bu işe yaradı. 
    20 Şubat 2020 Perşembe 07:23