<code> Om .recordCount returnerar -1 står du på antingen BOF eller EOF. rs.Open SQL, conn, adOpenStatic, adLockReadOnly <code> Hej. Om det sakas poster retunerar recordCount 0. Om det är så att cursorn inte stödjer recordCount så retunerars -1 om det finns poster. Eftorsom antalet är okänt. Det mest effektiva sättet att lösa ditt problem är att helt enkelt räkna antalet poster. Efter som detta tar betydligt mindre tid än vad något av det andra förslagen gör. Denna principen är ju egentligen bara tillämpbar om du loopa genom hela recordsettet. Men det förmodar jag du gör. Jag har bara provat JohanD's förslag med rs.open-varianten, eftersom den var enklast. Det jag snabbt erfor var att den krävde en rs.close emellanåt, men det gick bra. Då han använder servercursors borde mitt förslag att lägga in en count i frågan vara den snabbaste varianten då denna count cachas och räknas enbart om när cykelbessättningen förändrats. Ur prestanda synpunkt skalla man undvika underfråger. Har jag fått lära mig i alla fall. <code> Eftersom du skriver set rst = con.execute ... blir det automatiskt ett serversided recordset och då fungerar inte rst.recordcount utan returnerar -1. För att det skall fungera måste du skriva: Som sagt att bara plocka ut antal är det då givetvis snabbare att köra en separat fråga. Men om man ändå skall loopa recordsetet. Så kan man samtidigt räkna posterna och på så sätt kunna utnytja den snabbaste cursorn. För att fråga databasen om antalet tar betydligt mer tid än att räkna upp en variabel i loopen. Jag håller med att många ser sällan helheten, men när man gör en sökning av det här slaget är det sällan man väljer att loopa hela innehållet då enbart posten som väljs utifrån sökresultatet är den intressanta. Det finns lägen då den lösning du föreslog är den mest "rätta" lösningen, men jag tolkade frågeställaren som att han ville ha reda på antalet på snabbaste möjliga sätt. He, he. Jag kan forsätta på den här diskussinen i evigheter. ;O)Visa antalet träffar med SQL
SQL = "SELECT Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rs = conn.Execute(SQL)
</code>
Med raderna ovan väljer jag ut ett antal rader ur en tabell. Hur många rader fick jag? rs.RecordCount fungerar inte, ger -1.
Jag har provat olika Cursortyper, men det hjälpte inte. Kan inte använda Open istället för Execute, då saknar den nån variabel.
Mvh DickSv: Visa antalet träffar med SQL
Varför vill du veta antalet poster?
Vill du bara skriva ut eller extrahera all data från ditt rs behöver du
egentligen bara skriva en loop
do until EOF
loop
om det är för att du vill skriva ut antalet poster - kolla in Pelles kurs om
hur man skriver till ett excelark - där visar han även hur man får fram
antalet poster.
/EmmaSv: Visa antalet träffar med SQL
antal=rs.RecordCount
/JohanSv: Visa antalet träffar med SQL
SQL = "SELECT Antal = (select count(Fragor.ID) from Fragor WHERE Fragetyp = 1), Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rs = conn.Execute(SQL)
</code>
Är en lösningSv: Visa antalet träffar med SQL
Testa detta
Dim antal
rs.MoveLast
antal = rs.RecordCount
rs.MoveFirstSv: Visa antalet träffar med SQL
Sv: Visa antalet träffar med SQL
<code>
Dim RecordCount as Long
SQL = "SELECT Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rs = conn.Execute(SQL)
Do Until rs.Eof
'.....
RecordCount = RecordCount + 1
rs.MoveNext
Loop
Text1.Text = CStr(RecordCount)
</code>Tack Allihopa!
Jag ska försöka sätta mig in i hur 'det hänger ihop' lite bättre senare. Men jag är imponerad över antalet sätt det går att lösa mitt problem på.
Mvh DickSv: Visa antalet träffar med SQL
Sv: Visa antalet träffar med SQL
Sv: Visa antalet träffar med SQL
SQL = SELECT Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rs = conn.Execute("select count(Fragor.ID) as ANTAL from Fragor WHERE Fragetyp = 1")
Antal = rs.Fields("ANTAL").Value
rs.Close
Set rs = conn.Execute(SQL)
</code>
Då borde det här vara en snabbare lösning då?
Bara i rent experimentiellt syfte testade jag de förslag som har kommit in här och den varianten som jag föreslog samt den ovan var i särklass snabbast. Den lösning där du föreslog att loopa igenom allt var långsammare (dock mera resursvänlig) än att till exempel lyfta ut allt i en Array och kolla UBound. Sv: Visa antalet träffar med SQL
rst.open sql, con, 3, 3
Men när det gäller ditt exempel, kan du använda:
SQL = "SELECT Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rs = conn.Execute(SQL)
antalposter = UBound(rs.GetRows()) + 1
Detta blir ett dubbelt anrop mot databasen eftersom getrows hämtar alla posterna igen, men detta går fort eftersom det är cachat..
/PelleSv: Visa antalet träffar med SQL
Detta är som jag ser det ett vanligt "fel" hos programmerare. Det gäller att se helheten.
Ni får gärna testa era alterntiv. Gärna intresserad av att höra era resultat och tankar.
<code>
Dim fldID As ADODB.Field
Dim fldFraga As ADODB.Field
Dim fldSvar As ADODB.Field
Dim fldOrdklass As ADODB.Field
Dim rsTemp As ADODB.Recordset
Dim Item As MSComctlLib.ListItem
Dim Items As MSComctlLib.ListItems
Dim strSQL As String
Dim RecordCount As Long
Set Items = ListView1.ListItems
strSQL = "SELECT Fragor.ID, Fragor.Fraga, Fragor.Svar, Fragor.Ordklass FROM Fragor WHERE Fragetyp = 1"
Set rsTemp = conn.Execute(strSQL)
Set fldID = rsTemp("ID")
Set fldFraga = rsTemp("Fraga")
Set fldSvar = rsTemp("Svar")
Set fldOrdklass = rsTemp("Ordklass")
Do Until rsTemp.EOF
Set Item = Items.Add(, "#" & fldID.Value, "" & fldFraga.Value)
Item.SubItems(1) = "" & fldSvar.Value
Item.SubItems(2) = "" & fldOrdklass.Value
RecordCount = RecordCount + 1
rsTemp.MoveNext
Loop
rsTemp.Close
StatusBar1.Panels(1).Text = CStr(RecordCount)
</code>Sv: Visa antalet träffar med SQL
Sedan beror det ju också på vilken databas man kör i, till exempel är två separata frågor (en med count och en med resultat) snabbare att köra i SQL-Server medan läget är lite annorlunda i Oracle där en fråga med tillhörande underfråga är snabbast. Sv: Visa antalet träffar med SQL
Som jag ser det är det ju inte bra att belasta databasen. Ovset om det går snabt eller inte. Om det är så att kolumnen i whersatsen är indexerad. Så behöer ju den bara kolla poster mot indexet. Nackdelen som jag ser det med en underfråga är att servern måste skicka minst 4 byte data extra per post. Vilket påverkar hastigheten vid överföringen av poster. Det bästa är om man håller sqlfrågerna så rena som möjligt. Under utvecklingsfasen så kan man bilda sig en falsk uppfattning. När du sedan kör ut applikationen skarpt så är det andra faktorer som påverkar. Frågan är vilket som skulle påverka belastni på låt oss säga en web applikationen. Att räkna poster kräver ju mer proccessor kradt på serven. Men det är nog inte av samma betydelse som skillnaden i poststorlek gör. Dataacces brukar vara flaskhalsen. Därför bör man tillämpa minimall mängd data och access. Likaså bör man undvika at belasta databas motorn. Eftersom om dataaccessen dras ut kommer det påverka IIS. Varje sida kommer ta mer tid att behandla. Och att lägga till en underfråga belastar databas server.
Detta är ju sant om man visar hela resultatet. Men om man vill visa resultatet på sidor. Så är det ju inte bra att loppa igenom hela recordsetet. Men efter som man då använder en statisk cursor är det inget problem att använda recordcount.