jag har gjort en grej som slumpar fram en användare
sub slumpa_click(obj as object, e as eventargs)
Dim cn as new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=E:\Inetpub\databaser\tihi.mdb;")
Dim cmd as new OleDbCommand("SELECT TOP 1 userid FROM users order by RND(userid)",cn)
cn.open()
dim userid as string = cmd.ExecuteScalar()
cn.close()
huvudframe.attributes("src") = "userprofile.aspx?userid=" & userid
end sub
den fungerar och slumpar upp olika personer... men det konstigaste är att den slumpar efter ett mönster. den slumpar upp ca 10 olika användare sen börjar den om och slumpar upp användare igen i samma ordning.
Har jag gjort något dumt i koden? Kan jag göra det på något bättre sätt kanske?
redigerat: Jag kan tillägga att om jag kör frågan i access och skriver ut sqlen där så får jag massa olika och inget mönster följs.
Nu har jag aldrig kört RND i en sql sats i Access men när man använder RND i "vanlig" kod så måste man alltid köra Randomize först för att "blanda om", eller vad man ska kalla det. Annars blir det alltid samma resultat.
jag testade sätta dit randomize precis efter sub slumpa_click
men det blev ingen skillnad...
men det skumma är ju att om jag skriver ut sqlen i access så slumpar den upp olika hela tiden utan att det blir samma i rad osv...
det måste vara något fel på sidan på nåt sätt... om jag klickar snabbt på slumpaknappen så hinner jag se 20 olika användare innan den går tillbaks igen.. och sen är det alltid samma ordning men beroende på hur snabbt man klickar så får man se olika många innan den börjar om...
Inte alls konstigt.
Eftersom du har din RND funktion i SQL-satsen så spelar det inte så stor roll om du sätter Randomize i koden. Så detta har inget med koden att göra utan RND med Access.
Se om du kan googla fram något om hur man använder RND i Access.
okej, jag testar det.. har suttit och letat i databasen efter mönster mellan dom användare som slumpas upp... men det finns inga likheter.... det här är verkligen skumt... men jag googlar lite. tack sålänge =)
Om du vill så kan du göra så som du gör, du kan om du har problem med RND() använda dig av NewID() istället detta fungerar utmärkt.
Du har dock ett FET problem med att göra Order by RND()|NewID() och det är prestanda, så fort din tabell börjar innehålla lite fler rader, typ 1000 och fler så börjar du märka riktiga prestandaproblem.
Mitt tips blir istället att hämta alla användare till en dataTabel och sedan där slumpa fram ett "radsnummer" och plocka ut den raden med det "radsnummret".
jag har hittat massa nu men jag förstår inte riktigt. varför skriver man typ något i den här stilen:
randomize()
intRandomNumber = Int (1000*Rnd)+1
och sedan skriver man något liknande detta i sqlen
ORDER BY RND(" & intRandomNumber & "*ID)"
kommer man inte få fram något nummer då som den kommer köra order på? förstår inte riktigt. någon som har lust att förklara den koden? vad är 1000 som man tar gånger? vad händer om man har fler än 1000 poster i databasen? :q
redigerat: vad händer om jag inte har ett id för varje siffra? vissa idnummer kan ju saknas pga borttagna användare...
1. hämta allt i databasen och lägg i en DataTable
2. Kör en Randomize och sedan en RND för siffror mellan 1 och antalet records i din DataTable
3. Den slumpade siffran minus 1 är det index i din DataTable du ska hämta. Du ska alltså inte anropa databasen med det slumpade numret och du ska inte köra RND i din sql-sats längre.
Siffrorna i RND funktionen bestämmer vilket intervall du ska ha siffrorna i.
okej, jag var fortfarande lite inne på att köra order by rnd()
men jag testar gärna dethär med datatable istället eftersom att jag inte får det andra att funka.
jag tror jag förstår processen över hur man gör detta, det enda jag inte vet är hur gör jag sedan, när jag slumpat fram ett nummer, för att läsa av det indexet från min datatable?
jag tror jag förstår processen över hur man gör detta, det enda jag inte vet är hur gör jag sedan, när jag slumpat fram ett nummer, för att läsa av det indexet från min datatable?
Läs PDahlen's sista inlägg och sista raden i det! :)
Men 1000 skall i ditt fall bytas ut mot antalet rader i din DataTable.
jo det förstår jag.. men det jag undrar över är hur jag läser av en rad från datatable... jag har bara använt datatable för att presentera information på en sida... hur gör jag för att läsa av en rad sen?