Konuyu görüntüle
IUCODERS FORUM > Programlama > .NET > TEKRARSIZ RANDOM
Yazar
safter


avatar

Kayıt: 18.04.2006
25.02.2008-21:52 #38805
OleDbCommand db_komut1 = new OleDbCommand("SELECT min(id) FROM eleman", db_baglanti);
db_komut.ExecuteNonQuery();
OleDbCommand db_komut2 = new OleDbCommand("SELECT max(id) FROM eleman", db_baglanti);
db_komut.ExecuteNonQuery();

Random rasgele = new Random();
id = rasgele.Next(db_komut1, db_komut2);


veritabanından en büyük ve en kücük idleri cekiyorum ve bu degerler arasında TEKRARSIZ bir sayi elde etmek istiyorum yukarıdaki kod dogru mu ? bide tekrarsız olması için ne eklemem lazım ? yardımcı olurmusunuz?





q
Yazar
omergok


avatar
kenderuntanbul
Kayıt: 21.02.2007
26.02.2008-00:48 #38824
safter işin kod kısmına girmeyim ama mantık olarak yapman gerekeni söyleyeyim.

ilk olarak sadece o iki sayı arasından rastgele sayı üretmen yanlış çünkü aradaki id nolarından birisi ilerde silinmiş/silinecek olabilir. O yüzden tüm id numaralarını alıp bir diziye atman lazım. Bu işlemden sonra rastgele seçimi bu dizinin içinden yapacaksın. çekilen sonucu da yapmak istediğin işlemi yaptıktan sonra diziden çıkartacaksın. döngü dizinin oluştuğu yerden sonra olacak. sql işlemini döngü içine alma sakın dizi sürekli başa sarar. diziden çektiğin elemanları tek tek çıkardıktan sonra mesela do-while kullanıyorsan döngü için (ki muhtemelen öyle olacak) şart kısmında da dizinin eleman sayısını kontrol edersin. 0 olduğu zaman döngüyü kırarsın.







Yazar
aliozkn


avatar
Manisa
Kayıt: 13.04.2006
26.02.2008-01:36 #38825
random sayı işini sql le de yapabilirsin

http://www.petefreitag.com/item/466.cfm








Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
26.02.2008-01:48 #38826
Öncelikle Ömer'in anlattığı yola katılıyorum. Başka bir yol aklıma geldi bunu da düşünebilirsin:

Anladığım kadarıyla Access veritabanı kullanak yapıyorsun. Değilse ona göre cevap yazayım.
OleDBCommand kullanmandan dolayı Access üzerinden anlatıyorum.

Ömer'in de dediği gibi ID baz alarak kayıt istemek yanlış olur.

Aslında tek bir sql cümlesiyle ölümcül darbeyi indirebilirsin:
OleDbCommand db_komut = new OleDbCommand("SELECT TOP 10 id FROM eleman ORDER BY Rnd(id)", db_baglanti);


db_komut'u çalıştırıp okuttuğun zaman her seferinde farklı 10 kayıt seçecektir sana.
(id sütunundan random sayı türeterek ona göre sıralama yapmasını ve ilk 10 kaydı getirmesini istiyoruz sql kodunda.)

SQL Server ya da diğer veri tabanı sistemlerinde benzer şekilde çözüm mevcut...





Yazar
omergok


avatar
kenderuntanbul
Kayıt: 21.02.2007
26.02.2008-09:58 #38832
SQL içinde böyle bir güzellik olduğunu bilmiyordum açıkçası (: Bunu öğrendiğim iyi oldu, hatta baya baya iyi oldu çünkü bir konuyu kara kara düşünüyordum artık sorunumun büyük bir kısmı halloldu (: teşekkürler hepinize (:







Yazar
safter


avatar

Kayıt: 18.04.2006
28.02.2008-14:30 #38932
aliprinter yazdi
 
Öncelikle Ömer'in anlattığı yola katılıyorum. Başka bir yol aklıma geldi bunu da düşünebilirsin:

Anladığım kadarıyla Access veritabanı kullanak yapıyorsun. Değilse ona göre cevap yazayım.
OleDBCommand kullanmandan dolayı Access üzerinden anlatıyorum.

Ömer'in de dediği gibi ID baz alarak kayıt istemek yanlış olur.

Aslında tek bir sql cümlesiyle ölümcül darbeyi indirebilirsin:
OleDbCommand db_komut = new OleDbCommand("SELECT TOP 10 id FROM eleman ORDER BY Rnd(id)", db_baglanti);


db_komut'u çalıştırıp okuttuğun zaman her seferinde farklı 10 kayıt seçecektir sana.
(id sütunundan random sayı türeterek ona göre sıralama yapmasını ve ilk 10 kaydı getirmesini istiyoruz sql kodunda.)

SQL Server ya da diğer veri tabanı sistemlerinde benzer şekilde çözüm mevcut...


anladım peki 10 kayıt degilde bir değişkendeki değer kadar kayıtı almak istiyorsam hatta bu seçilen kayıtlar üzerinde UPDATE yapmak istiyorsam nasıl kullanacagım bu nu .. çok karıştı kafam kusura bakma printer :D yardımcı olursan cok sevinirim





q
Yazar
safter


avatar

Kayıt: 18.04.2006
28.02.2008-14:43 #38933
ben kodu böyle kullana bilirmiyim? onu demek istedim :)

OleDbCommand db_komut = new OleDbCommand("UPDATE TOP "'+pazartesi+'" id FROM eleman ORDER BY Rnd(id) SET gun_1 = 'OFF', gun_8 = 'OFF' ", db_baglanti);


:):) cok mu ütopik oldum ne :D





q
Yazar
safter


avatar

Kayıt: 18.04.2006
28.02.2008-14:47 #38934
bu arada pazartesi orada bir rakam :) değişken isimlerini biraz uzun tutuyorumda :)





q
Yazar
aliprinter


avatar
İstanbul
Kayıt: 12.02.2006
28.02.2008-16:44 #38941
Kullanabilirsin...

Düzeltme: Demin hızlı bir bakış ataracak cevap yazdım. Kullanabilirsin derken TOP 10 yerine
TOP " + pazartesi + "
şeklinde kullanabilirsin demek istedim. (Tek tırnağa gerek yok ayrıyetten)

UPDATE yapmak istiyorsan şöyle bir sql olmalı:
OleDbCommand db_komut = new OleDbCommand("UPDATE elemean SET guncelleneceksutunadi='yenideger' WHERE id IN (SELECT TOP " + pazartesi + " id FROM eleman ORDER BY Rnd(id)", db_baglanti);





Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb