none
Aynı Kullanıcı Adını Engelleme RRS feed

  • Soru

  • arkadaşlar sisteme üye olan kullanıcının kullanıcı adı veri tabanında kayıtlıysa label e hata msjnı hazdırsın değilse kayda devam etsin onu nasıl yapıyorduk bilgi verirseniz sevinirim
    • Düzenleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 11:08
    17 Aralık 2014 Çarşamba 09:07

Yanıtlar

  • aspnet hiç kullanmadım. arka planda datareader ile veritabanından olup olmadığını bulabilirsin.
    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:22
  • Kayıt olurken veritabanından sorgu çekersin select * from kullanici where kullaniciadi ='kullaniciaditextbox.Text' sqldatareader ile okutursun

    if(reader.Read())  // Yani kayıt varsa

    {

    bu isimde kayıt var hata mesajı

    }

    else

    Kayıt yapabilirsin 

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:38
  • Merhaba  ,

    Eğer aynı kullanıcı adını engellemek istiyorsanız bunu veritabanından yapmanız en doğru seçimdir. Bunun için ilgili alanı UNIQUE olmasını sağlamalısınız.

    ALTER TABLE TabloAdı
    ADD UNIQUE (KolonAdı)
    Bu şekilde ilgili tablonun alanının benzersiz olmasını sağlamış olursunuz eğer aynı değeri insert etmek isterseniz sql server hata çevirir.

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:42
  • Lütfen, rica ediyorum bu işe kullaktan dolma bilgilerle ya da 2008 yılında yazılmış bir makaleyi örnek alarak başlamayın. Oturun düzgünce bir kitap edinin öle başlayın.(C# 5.0 Nutshell)

    Yazdığınız kodlarda neyi niye yaptığınızı bilmediğiniz ortaya çıkıyor. Siz bir kullanıcı adını kontrol etmek istiyorsanız.

    "Select * From Kullanicilar Where KullaniciAdi = @kullaniciAdi"

    derseniz size gönderdiğiniz kullanıcı adının olup olmadığı gelir. Burada * yerine Count(*) diyebilirsiniz gibi gibi bir sürü yöntem kullanılabilir. Eğer ki dönen değer 0 dan büyükse kayıt vardır anlamına gelir. Burada niye ExecuteReader niye ExecuteScalar ya da niye ExecuteNonQuery kullanılıyor bir araştırın.

    Not: Yukarda verdiğim kitaba bitirirseniz zaten Ado.Net kullanmadan Entity Framework ile

    dbContext.Users.Count(x => x.KullaniciAdi == KullaniciAdi)

    daha basit yapabileceğinizi görürsünüz.

    Üşenmeden yazıyorum:

    ExecuteScalar: Geriye tek bir sonuç döndüreceğiniz zaman kullanırsınız yani yukarda yazdıklarımı düşündüğünüzde Count(*) dediğimiz zaman bu fonksiyonu kullanmak işimize yarar. Örnek:

    string sql = "Select Count(*) From Kullanicilar Where KullaniciAdi = @kullaniciAdi";
    SqlCommand cmd = new SqlCommand(sorgu, coon);
    if ((int)cmd.ExecuteScalar() > 0)
    {
    //hata
    }
    


    Burada (int) kullanımı Cast olarak geçiyor. Convert gibi düşünebilirsiniz ama değil. Eğer ki gelen datanın tipini biliyorsanız onu Convert etmek yerine cast ederseniz boşuna işlem yapmazsınız. Ben Count(*) işleminin sonucunda int bir tip geleceğini biliyorum. O yüzden int cast ettim.

    ExecuteNonQuery: Bir sorguyu çalıştırır ve geriye etkilenen satır sayısını döndürür. Yani bunun sonucunda dönen değere göre işlem yaptırmak çok doğru olmaz. 2 sebebi var:

    1. Update işlemi yaptığını düşünürsek senin hatandan dolayı 5 kayıt update edilir. Ve sen kullanıcıya update işlemi başarılı dersin ya da transactionı commit edersin.
    2. Veritabanın dönen satır sayısını kapatılabiliyor. Sebebi network trafiğini azda olsa azaltmak. Eğer böyle bir durum olursa update işlemini yapar ve sizin programınız patlar. Çünkü geriye null döner.

    ExecuteReader : Nerdeyse hiç kullanmadım. Genelde SqlDataAdapter ile çalışıyorum burada verileri bir DataTable nesnesine atıyorum kullanımı daha basit oluyor. Bunun bir kaç sebebi var:

    1. SqlDataAdapter kendi connection'ını kendi açıp kapatıyor. Yani ben ekstra bir işlem yapmıyorum.
    2. SqlDataAdapter sadece read işlemini değil Create-Read-Update-Delete işlemlerini yapıyor. Yani otomatik olarak bir grid üzerinde ki datayı hiç sorgu yazmadan CUD işlemini yaptırıyorum.

    Yapmaya çalıştığınız şeyin asp.net ya da datareader ile alakası yok. Çok uzattım eğer buraya kadar okumuşsanız şunuda okuyun. Oturun düzgünce çalışın, google da aratırken makale tarihlerine dikkat edin. Ado.Net kullanıcaksanız forumlarda o kadar çok çöp bilgi var ki. Kesinlikle Türkçe forumlara bakmayın. Eminim düzgün anlatanlar vardır bakıcaksanızda onları bulmaya çalışın.

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:34
    • Düzenleyen Berdann 17 Aralık 2014 Çarşamba 14:45
    17 Aralık 2014 Çarşamba 14:02
  • İlyas beyin dediği yöntemi kullanmanızı tavsiye ederim. Eğer illa böyle yapacağım diyorsanız aşağıdaki kodu kullanabilirsiniz.

    string sorgu = "insert into Users(TcNo,AdSoyad,AnneAdi,BabaAdi,DogumYeri,DogumTarihi) values (@TcNo,@AdSoyad,@AnneAdi,@BabaAdi,@DogumYeri,@DogumTarihi) WHERE  NOT EXISTS (SELECT 1 FROM Users WHERE AdSoyad = @AdSoyad)";
    SqlCommand cmd = new SqlCommand(sorgu, coon);  
    cmd.Parameters.AddWithValue("@TcNo", txtTCNo.Text);
    cmd.Parameters.AddWithValue("@AdSoyad", txtAdSoyad.Text);
    cmd.Parameters.AddWithValue("@AnneAdi", txtAnneAdi.Text);
    cmd.Parameters.AddWithValue("@BabaAdi", txtBabaAdi.Text);
    cmd.Parameters.AddWithValue("@DogumYeri", txtDogumYeri.Text);
    cmd.Parameters.AddWithValue("@DogumTarihi", txtDogumTarihi.Text);
    int result = cmd.ExecuteNonQuery();
    if (result < 1)
    {
    	lblMesaj.ForeColor = Color.Red;
    	lblMesaj.Text = "Tc Kimlik No Sistemde Kayıtlı";
    }
    else
    {
    	lblMesaj.ForeColor = Color.Green;
    	lblMesaj.Text = "Kaydedildi..";
    }
                    
    Not: @Berdann beye de katılıyorum sonuna kadar dediklerini dikkate alın lütfen..


    oguzkurtcuoglu.com



    • Düzenleyen Oğuz KURTCUOĞLU 17 Aralık 2014 Çarşamba 14:15
    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 14:06

Tüm Yanıtlar

  • aspnet hiç kullanmadım. arka planda datareader ile veritabanından olup olmadığını bulabilirsin.
    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:22
  • Kayıt olurken veritabanından sorgu çekersin select * from kullanici where kullaniciadi ='kullaniciaditextbox.Text' sqldatareader ile okutursun

    if(reader.Read())  // Yani kayıt varsa

    {

    bu isimde kayıt var hata mesajı

    }

    else

    Kayıt yapabilirsin 

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:38
  • Merhaba  ,

    Eğer aynı kullanıcı adını engellemek istiyorsanız bunu veritabanından yapmanız en doğru seçimdir. Bunun için ilgili alanı UNIQUE olmasını sağlamalısınız.

    ALTER TABLE TabloAdı
    ADD UNIQUE (KolonAdı)
    Bu şekilde ilgili tablonun alanının benzersiz olmasını sağlamış olursunuz eğer aynı değeri insert etmek isterseniz sql server hata çevirir.

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 12:42
  • bende öyle yaptım da hata alıyorum nedense veri ekleme sorgusunu yapıyorumda select sorgusunu nasıl yazacam anlamadım yazdığım kodlar bu şekilde 

    SqlConnection coon = new SqlConnection(); coon.ConnectionString = ""; coon.Open(); string sorgu = "insert into Users(TcNo,AdSoyad,AnneAdi,BabaAdi,DogumYeri,DogumTarihi) values (@TcNo,@AdSoyad,@AnneAdi,@BabaAdi,@DogumYeri,@DogumTarihi)"; SqlCommand cmd = new SqlCommand(sorgu, coon); SqlDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { lblMesaj.ForeColor = Color.Red; lblMesaj.Text = "Tc Kimlik No Sistemde Kayıtlı"; } else { cmd.Parameters.AddWithValue("@TcNo", txtTCNo.Text); cmd.Parameters.AddWithValue("@AdSoyad", txtAdSoyad.Text); cmd.Parameters.AddWithValue("@AnneAdi", txtAnneAdi.Text); cmd.Parameters.AddWithValue("@BabaAdi", txtBabaAdi.Text); cmd.Parameters.AddWithValue("@DogumYeri", txtDogumYeri.Text); cmd.Parameters.AddWithValue("@DogumTarihi", txtDogumTarihi.Text);

    cmd.ExecuteNonQuery();
                    coon.Close();
                    lblMesaj.Text = "Kayıt Başarıyla Tamamlandı.";




    • Düzenleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 13:31
    17 Aralık 2014 Çarşamba 12:59
  • Lütfen, rica ediyorum bu işe kullaktan dolma bilgilerle ya da 2008 yılında yazılmış bir makaleyi örnek alarak başlamayın. Oturun düzgünce bir kitap edinin öle başlayın.(C# 5.0 Nutshell)

    Yazdığınız kodlarda neyi niye yaptığınızı bilmediğiniz ortaya çıkıyor. Siz bir kullanıcı adını kontrol etmek istiyorsanız.

    "Select * From Kullanicilar Where KullaniciAdi = @kullaniciAdi"

    derseniz size gönderdiğiniz kullanıcı adının olup olmadığı gelir. Burada * yerine Count(*) diyebilirsiniz gibi gibi bir sürü yöntem kullanılabilir. Eğer ki dönen değer 0 dan büyükse kayıt vardır anlamına gelir. Burada niye ExecuteReader niye ExecuteScalar ya da niye ExecuteNonQuery kullanılıyor bir araştırın.

    Not: Yukarda verdiğim kitaba bitirirseniz zaten Ado.Net kullanmadan Entity Framework ile

    dbContext.Users.Count(x => x.KullaniciAdi == KullaniciAdi)

    daha basit yapabileceğinizi görürsünüz.

    Üşenmeden yazıyorum:

    ExecuteScalar: Geriye tek bir sonuç döndüreceğiniz zaman kullanırsınız yani yukarda yazdıklarımı düşündüğünüzde Count(*) dediğimiz zaman bu fonksiyonu kullanmak işimize yarar. Örnek:

    string sql = "Select Count(*) From Kullanicilar Where KullaniciAdi = @kullaniciAdi";
    SqlCommand cmd = new SqlCommand(sorgu, coon);
    if ((int)cmd.ExecuteScalar() > 0)
    {
    //hata
    }
    


    Burada (int) kullanımı Cast olarak geçiyor. Convert gibi düşünebilirsiniz ama değil. Eğer ki gelen datanın tipini biliyorsanız onu Convert etmek yerine cast ederseniz boşuna işlem yapmazsınız. Ben Count(*) işleminin sonucunda int bir tip geleceğini biliyorum. O yüzden int cast ettim.

    ExecuteNonQuery: Bir sorguyu çalıştırır ve geriye etkilenen satır sayısını döndürür. Yani bunun sonucunda dönen değere göre işlem yaptırmak çok doğru olmaz. 2 sebebi var:

    1. Update işlemi yaptığını düşünürsek senin hatandan dolayı 5 kayıt update edilir. Ve sen kullanıcıya update işlemi başarılı dersin ya da transactionı commit edersin.
    2. Veritabanın dönen satır sayısını kapatılabiliyor. Sebebi network trafiğini azda olsa azaltmak. Eğer böyle bir durum olursa update işlemini yapar ve sizin programınız patlar. Çünkü geriye null döner.

    ExecuteReader : Nerdeyse hiç kullanmadım. Genelde SqlDataAdapter ile çalışıyorum burada verileri bir DataTable nesnesine atıyorum kullanımı daha basit oluyor. Bunun bir kaç sebebi var:

    1. SqlDataAdapter kendi connection'ını kendi açıp kapatıyor. Yani ben ekstra bir işlem yapmıyorum.
    2. SqlDataAdapter sadece read işlemini değil Create-Read-Update-Delete işlemlerini yapıyor. Yani otomatik olarak bir grid üzerinde ki datayı hiç sorgu yazmadan CUD işlemini yaptırıyorum.

    Yapmaya çalıştığınız şeyin asp.net ya da datareader ile alakası yok. Çok uzattım eğer buraya kadar okumuşsanız şunuda okuyun. Oturun düzgünce çalışın, google da aratırken makale tarihlerine dikkat edin. Ado.Net kullanıcaksanız forumlarda o kadar çok çöp bilgi var ki. Kesinlikle Türkçe forumlara bakmayın. Eminim düzgün anlatanlar vardır bakıcaksanızda onları bulmaya çalışın.

    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:34
    • Düzenleyen Berdann 17 Aralık 2014 Çarşamba 14:45
    17 Aralık 2014 Çarşamba 14:02
  • İlyas beyin dediği yöntemi kullanmanızı tavsiye ederim. Eğer illa böyle yapacağım diyorsanız aşağıdaki kodu kullanabilirsiniz.

    string sorgu = "insert into Users(TcNo,AdSoyad,AnneAdi,BabaAdi,DogumYeri,DogumTarihi) values (@TcNo,@AdSoyad,@AnneAdi,@BabaAdi,@DogumYeri,@DogumTarihi) WHERE  NOT EXISTS (SELECT 1 FROM Users WHERE AdSoyad = @AdSoyad)";
    SqlCommand cmd = new SqlCommand(sorgu, coon);  
    cmd.Parameters.AddWithValue("@TcNo", txtTCNo.Text);
    cmd.Parameters.AddWithValue("@AdSoyad", txtAdSoyad.Text);
    cmd.Parameters.AddWithValue("@AnneAdi", txtAnneAdi.Text);
    cmd.Parameters.AddWithValue("@BabaAdi", txtBabaAdi.Text);
    cmd.Parameters.AddWithValue("@DogumYeri", txtDogumYeri.Text);
    cmd.Parameters.AddWithValue("@DogumTarihi", txtDogumTarihi.Text);
    int result = cmd.ExecuteNonQuery();
    if (result < 1)
    {
    	lblMesaj.ForeColor = Color.Red;
    	lblMesaj.Text = "Tc Kimlik No Sistemde Kayıtlı";
    }
    else
    {
    	lblMesaj.ForeColor = Color.Green;
    	lblMesaj.Text = "Kaydedildi..";
    }
                    
    Not: @Berdann beye de katılıyorum sonuna kadar dediklerini dikkate alın lütfen..


    oguzkurtcuoglu.com



    • Düzenleyen Oğuz KURTCUOĞLU 17 Aralık 2014 Çarşamba 14:15
    • Yanıt Olarak İşaretleyen Ali AKKAYA 17 Aralık 2014 Çarşamba 14:35
    17 Aralık 2014 Çarşamba 14:06
  • teşekkürler verdiğiniz bilgiler için 
    17 Aralık 2014 Çarşamba 14:35