Försöker skriva en kod som hämtar en slumpvis vald post i en access-databas. När jag nu har testat min kod ett tag verkar det som om de två översta posterna visas extremt mycket färre gånger än de övriga. Vad är det för fel? Hur kan man lösa detta? Du kör rnd flera gånger, borde inte påverka, men testa om detta blir bättre: Det där fungerade tyvär inte alls. Ingen slumpvisning alls, alla posterna visades på sidan likadant hela tiden. Du kanske skulle läsa den här: Tack. Tror just det fungerar nu. Eller vad sägs guffa? Men nu har jag kommit till ett nytt problem Jag skulle vilja att värdet i fältet AdsDisplayed i databasen skall öka med +1 varje gång just den posten vistats. Har försökt men får det inte att fungera. Får inga felmeddelanden men värdet i AdsDisplayed ökar inte. hittade felet på problemet jag skrev om Går det inte att använda Randomize i VB.NET? Sorry, såhär skulle jag ju skrivit... Men det verkar du redan ha listat ut... Har valt Görans kod, tack.Hämta random post ifrån access-databas. (får fram de översta posterna mer sällan
Har skrivit min kod efter att ha kollat in http://lists.evolt.org/archive/Week-of-Mon-20040315/156878.html och http://www.aspfaq.com/show.asp?id=2132, båda sidorna handlar om randomize-funktioner för vanlig ASP.
Min kod:
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load()
Dim i as integer
i = CInt(CInt(1000 * Rnd)+1)*-1
Dim objConn As OleDbConnection
Dim objCmd As OleDbCommand
Dim objRdr As OleDbDataReader
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("SELECT TOP 1 AdID, Headline, Rnd(" & (i) &"*AdID) " & _
"FROM Ad " & _
"ORDER BY 3", objConn)
objConn.Open()
objRdr = objCmd.ExecuteReader()
While objRdr.Read()
Response.Write(objRdr.Item("Headline") & "<br/>")
End While
objRdr.Close()
objConn.Close()
End Sub
</script>
Sv: Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load()
Dim objConn As OleDbConnection
Dim objCmd As OleDbCommand
Dim objRdr As OleDbDataReader
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("SELECT TOP 1 AdID, Headline FROM Ad ORDER BY RND()", objConn)
objConn.Open()
objRdr = objCmd.ExecuteReader()
While objRdr.Read()
Response.Write(objRdr.Item("Headline") & "<br/>")
End While
objRdr.Close()
objConn.Close()
End Sub
</script>
/Johan
Sv:Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
Sv: Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
http://guffa.com.loopiadns.com/Programming_article.asp?id=37Sv:Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load(s As Object, e As EventArgs)
Dim objConn As OleDbConnection
Dim objCmd As OleDbCommand
Dim objRdr As OleDbDataReader
Dim i As Integer
i = (CInt(1000 * Rnd)+1) * -1
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("select top 1 AdID, AdsDisplayed, Headline " & _
"from Ad order by Rnd(-AdID-" & Replace(Rnd(),",",".") & ")", objConn)
objConn.Open()
objRdr = objCmd.ExecuteReader()
Dim ChosenAd As String
Dim Displayed As Integer
While objRdr.Read()
Response.Write(objRdr.Item("Headline") & "<br/>")
ChosenAd = objRdr.Item("AdID")
Displayed = objRdr.Item("AdsDisplayed")
End While
objRdr.Close()
objConn.Close()
Dim UpdateDisplayed As Integer = (Displayed + 1)
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("UPDATE Ad SET AdsDisplayed = " & UpdateDisplayed & " WHERE AdID = " & Displayed & ";", objConn)
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
End Sub
</script>
Sv: Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
Hade skrivit:
objCmd = New OleDbCommand("UPDATE Ad SET AdsDisplayed = " & UpdateDisplayed & " WHERE AdID = " & Displayed & ";", objConn)
men det skulle ju vara:
objCmd = New OleDbCommand("UPDATE Ad SET AdsDisplayed = " & UpdateDisplayed & " WHERE AdID = " & ChosenAd & ";", objConn)
Men jag har fortfarande en fråga:
Göran, på din sida så har du skrivit att man skall använda följande kod:
<code>
Randomize
strSQL = "select top 5 Id, Info from Tabellen order by Rnd(-Id-" & Replace(Rnd(),",",".") & ")"
</code>
men jag använde ju bara:
<code>
strSQL = "select top 5 Id, Info from Tabellen order by Rnd(-Id-" & Replace(Rnd(),",",".") & ")"
</code>
och har alltså inte med:
<code>
Randomize
</code>
Detta eftersom jag inte vet hur man skriver detta i ASP.NET. Vet du hur man gör det?
Sv:Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
Annars kan du med fördel använda klassen Random från .NET Framework:
Dim rand as Random = New Random()
objCmd = New OleDbCommand("select top 1 AdID, AdsDisplayed, Headline " & _
"from Ad order by Rnd(-AdID-" & rand.NextDouble().ToString().Replace(",",".") & ")", objConn)
Jag ser att du öppnar en ny databaskoppling bara för att göra update. Använd samma databaskoppling .
Sv: Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load()
Dim objConn As OleDbConnection
Dim objCmd As OleDbCommand
Dim objRdr As OleDbDataReader
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("SELECT TOP 1 AdID, Headline FROM Ad ORDER BY RND(AdID)", objConn)
objConn.Open()
objRdr = objCmd.ExecuteReader()
While objRdr.Read()
Response.Write(objRdr.Item("Headline") & "<br/>")
End While
objRdr.Close()
objConn.Close()
End Sub
</script>
För att uppdatera borde detta fungera, du har tagit fel variabel i WHERE-satsen:
<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load()
Dim objConn As OleDbConnection
Dim objCmd As OleDbCommand
Dim objRdr As OleDbDataReader
objConn = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=E:\webbsidor\textad\db\textad.mdb")
objCmd = New OleDbCommand("SELECT TOP 1 AdID, Headline FROM Ad ORDER BY RND(AdID)", objConn)
objConn.Open()
objRdr = objCmd.ExecuteReader()
While objRdr.Read()
Response.Write(objRdr.Item("Headline") & "<br/>")
objCmd = New OleDbCommand("UPDATE Ad SET AdsDisplayed = AdsDisplayed + 1 WHERE AdID = " & objRdr.Item("AdID"), objConn)
objCmd.ExecuteNonQuery()
End While
objRdr.Close()
objConn.Close()
End Sub
</script>
Sv: Hämta random post ifrån access-databas. (får fram de översta posterna mer sä
Verkar dock inte som det är riktigt slump vilken som visas. Testade nämligen att köra sidan 100 gånger för att därefter skriva ner värderna i AdsDisplayed för att där på göra om samma prosedur några gånger. Det visade sig då att det var större sanolikhet att en viss post dök upp än en annan.
Så här blev resultatet i AdsDisplayed de 4 gånger jag testade:
AdID 1: 18, 19, 16, 11
AdID 2: 10, 3, 5, 4
AdID 4: 6, 15, 14, 15
AdID 5: 25, 31, 28, 35
AdID 6: 12, 13, 8, 13
AdID 7: 25, 14, 21, 17
AdID 8: 4, 5, 8, 5
(Att AdID 3 inte finns är för att jag råkat ta bort den posten)
...som ni ser så är det något som är knas.