none
Aynı kayıdı engelleme olmuyor.Acil yardım lütfen!!! RRS feed

  • Soru

  • Aynı isimle kayıt olmamasını istiyorum internetten araştırıp bu kodu yazdım.Çalışıyor fakat kaydet dedikten sonra "Bu kayıt veritabanında zaten var" diyor ondan sonra kaydete birdaha basınca kaydediyor yani kaydedicekken ilk önce sebebsiz yere hatayı veriyor ondan sonra tekrardan kaydete basınca hiç bir hata vermeden kaydediyor.

    Kodlama ;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.SqlClient;

    namespace proje1
    {
        public partial class SınıfTanımları : Form
        {
            public SınıfTanımları()
            {
                InitializeComponent();
                verilerigöster("Select * From SinifListesi");
                SqlConnection con = new SqlConnection("Data Source=LAPTOP-DLVRA0GP\\SQLEXPRESS;Initial Catalog=proje1;Integrated Security=True");
                SqlDataAdapter da = new SqlDataAdapter("Select * From SinifListesi", con);
                DataSet ds = new DataSet();
                da.Fill(ds);

                dataGridView1.DataSource = ds.Tables[0];

            }
            SqlConnection con = new SqlConnection("Data Source=LAPTOP-DLVRA0GP\\SQLEXPRESS;Initial Catalog=proje1;Integrated Security=True");

            public void verilerigöster(string veriler)
            {
                SqlDataAdapter da = new SqlDataAdapter(veriler, con);
                DataSet ds = new DataSet();
                da.Fill(ds);

                dataGridView1.DataSource = ds.Tables[0];
            }

            private void button2_Click(object sender, EventArgs e)
            {
                verilerigöster("Select * From SinifListesi");
            }

            private void SınıfTanımları_Load(object sender, EventArgs e)
            {

            }
            bool durum;
            string sınıf;

            void Kontrolsql()
            {
                con.Open();
                SqlCommand komut = new SqlCommand("select * from SinifListesi where Sınıflar=@Sınıflar", con);
                komut.Parameters.AddWithValue("@Sınıflar", textBox2.Text);
                if (Convert.ToInt32(komut.ExecuteScalar()) > 0)
                {
                    MessageBox.Show("Bu kayıt veritabanında zaten var.");
                }
                else
                {
                    _kaydedilsinmi = true;
                }
                con.Close();
            }
            private bool _kaydedilsinmi;

            void Sqlkaydet()
            {
                {

                    if (durum == true)
                    {
                        SqlCommand com = new SqlCommand("INSERT INTO SinifListesi (Sınıflar) values (@Sınıflar)", con);
                        {
                            com.Parameters.AddWithValue("@Sınıflar", textBox2.Text);
                            MessageBox.Show("Kayıt Yapılmıştır.");
                            con.Open();
                            com.ExecuteNonQuery();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Bu Kayıt Zaten Var", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                    con.Close();
                }
            }


            private void button1_Click(object sender, EventArgs e)
            {
                con.Open();
                string srg = textBox1.Text;
                string sorgu = "Select * from SinifListesi where Sınıflar Like '" + srg + "'";
                SqlDataAdapter adap = new SqlDataAdapter(sorgu, con);
                DataSet ds = new DataSet();
                adap.Fill(ds, "con");
                this.dataGridView1.DataSource = ds.Tables[0];
                con.Close();
            }

            private void button3_Click(object sender, EventArgs e)
            {
                Sqlkaydet();
                Ekle();
                Kontrolsql();
                if (!_kaydedilsinmi)
                {
                    MessageBox.Show("Bu kayıt veritabanında zaten var.");
                    return;
                }

                con.Open();
                SqlCommand komut = new SqlCommand("insert into SinifListesi (@Sınıflar)", con);

                komut.Parameters.AddWithValue("@Sınıflar", textBox2.Text);
                komut.ExecuteNonQuery();
                verilerigöster("Select * from SinifListesi");
                con.Close();
                textBox2.Clear();
            }
        

            private void button4_Click(object sender, EventArgs e)
            {
                    Temizle();
            }

            void Ekle()
            {
                sınıf = textBox2.Text;
            }

            void Temizle()
            {
                textBox2.Clear();
                textBox2.Focus();
            }

            private void textBox1_TextChanged(object sender, EventArgs e)
            {

            }

            private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                
            }

            private void label2_Click(object sender, EventArgs e)
            {

            }
        }
    }


    • Düzenleyen Nurettinn 20 Temmuz 2018 Cuma 14:02
    20 Temmuz 2018 Cuma 13:37

Yanıtlar

  • Merhaba Nurettin Bey

    Öncelikle SQL cümlelerinizi asla metin birleştirme yoluyla oluşturmayın. Parametreleri kullanın. Sorunuza dönecek olursak, mükerrer kayıtları da yazılım ile engellemeye çalışmayın. Bu görüldüğü kadar kolay engellenebilecek bir durum değil çünkü. Mükerrer kayıtları engellemenin en iyi yolu bunu veritabanı seviyesinde imkansız hale getirmektir. Bunun içinde "unique index" özelliğinden faydalanmalısınız.

    Tablo adınız  SinifListesi ve tekrar etmemesi gereken kolonunuz Sınıflar ise aşağıdaki gibi bir sorguyu bir kere çalıştırmanız yeterli olacaktır:

    ALTER TABLE SinifListesi  
    ADD UNIQUE (Sınıflar);

    Bu işlemi yaptığınızda INSERT sorgunuz mükerrer kayıtlarda hata verecektir. Bunu yakalayıp kullanıcıya bilgi verebilirsiniz.

    İlgili dokümanlar :

    https://www.w3schools.com/sqL/sql_unique.asp

    https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-2017



    www.cihanyakar.com

    • Yanıt Olarak Öneren Altan Özdemir 20 Temmuz 2018 Cuma 14:40
    • Yanıt Olarak İşaretleyen Nurettinn 26 Temmuz 2018 Perşembe 06:07
    20 Temmuz 2018 Cuma 14:12