Avatar billede axkris Nybegynder
24. januar 2004 - 23:01 Der er 17 kommentarer og
2 løsninger

Problemer med rs.RecordCount

Hej

Det er aldrig lykkedes mig at få rs.RecordCount til virke i mysql, selvom der er masse af records i et recordset. Den retunrer altid -1. Måske kan den slet ikke bruges i mysql, eller også skal den bruges på en bestemt måde. Jeg ved det ikke.

strQuery = "SELECT ID, URL, GRAFIK, VISNINGER FROM PLUSPROFIL_BANNER WHERE Type = 'maxi' AND VISNINGER < MAXVISNINGER ORDER BY VISNINGER / (to_days(now()) - to_days(Oprettelse)) LIMIT 0,3"
set rs = dataConn.execute(strQuery)
response.write "<br>antal: " & rs.RecordCount
Avatar billede trer Nybegynder
24. januar 2004 - 23:23 #1
Om Recordcount funktionen virker afhænger af den valgte cursor-type (client/server side / forward etc) og af om driveren understøtter recordcount.

Check MSDN for låsetyper og check på hjemmesiden hos det softwarehus har leveret den driver du benytter til MySQL - der må være noget whitepaper der fortæller hvad de har implementeret og hvad de ikke har.

Recordcount er, underligt nok, noget der ofte er udeladt...
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 01:38 #2
Du har ret i det hele, trer, undtagen lige "Recordcount er, underligt nok, noget der ofte er udeladt..."

Det er ikke underligt, for det er en kostbar oplysning at give fra sig. Man
er fx nødt til at vente på at sql-serveren bliver helt færdig med sin forespørgsel,
før man overhovedet kan behandle den første række. Derfor udelades den tit.
Avatar billede trer Nybegynder
25. januar 2004 - 09:30 #3
erikjacobsen> På fx Ms SQL Server er den ikke specielt kostbar da statistikkerne ret præcist fortæller antal rækker - og ellers gør index det. I udarbejdelsen af Query planen skal optimizeren alligevel benytte oplysninger.

Men selvfølgelig - andre database motorer, andre forhold...
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 09:35 #4
Du har kun antal rækker i tabellerne,  ikke antallet af rækker, der kommer ud af
en tilfældig forspørgsel. En

  SELECT * FROM t

vil være nem at finde antallet for i alle DB-systemer, inden man begynder
at kigge på rækkerne. Mens

  SELECT * FROM t WHERE fornavn LIKE '%bentebent%'

til gengæld i alle DB-systemer kræver man løber alt igennem først.
Avatar billede axkris Nybegynder
25. januar 2004 - 12:44 #5
Spændende debat, men er der en, som har et konkret bud på, hvordan jeg får min kode til at virke :-D

strQuery = "SELECT ID, URL, GRAFIK, VISNINGER FROM PLUSPROFIL_BANNER WHERE Type = 'maxi' AND VISNINGER < MAXVISNINGER ORDER BY VISNINGER / (to_days(now()) - to_days(Oprettelse)) LIMIT 0,15"
set rs = dataConn.execute(strQuery)
randomize
rs.Move(int(rs.RecordCount * rnd))
           
if not rs.eof then and not rs.eof then
  response.write "<a target=""_blank"" href=""" & rs("URL") & """><img border=""0"" width=""468"" height=""60"" src=""" & rs("Grafik") & """ onmouseover=""filters.alpha.opacity=100"" style=""FILTER: alpha(opacity:90)"" onmouseout=""filters.alpha.opacity=90""></a>"               
else
  response.write "<br>fejl"
end if

PS. Husk at det er rs.RecordCount som giver -1, hvorfor det ikke virker.
Avatar billede axkris Nybegynder
25. januar 2004 - 12:50 #6
rettelse til min kode: "(to_days(now()) - to_days(Oprettelse)) + 1" i stedet for "(to_days(now()) - to_days(Oprettelse))"
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 13:23 #7
Måske kan du ikke, og skal lave flere sql-sætninger med COUNT(*) i.

Måske kan du ved at åbne recordsæt rigtigt. Jeg har hørt et sted, at der
skulle være "mere held" med:

  rs.open sql,conn,adopenkeyset,adlockOptimistic

hvor du selv laver dit recordset (jeg har ikke selv prøvet)
Avatar billede axkris Nybegynder
25. januar 2004 - 13:34 #8
Ok, forsøger men...

>Måske kan du ved at åbne recordsæt rigtigt
Er det da en forkert måde? ;) Og hvad er den grundlæggende forskel på at lave et recordset med "execute" og med "open"? (Og hvorfor dog have to måder at gøre det samme på.... ;))
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 13:46 #9
Du kan sætte flere parametre på med rs.open. En conn.execute giver kun een af
mulighederne, så vidt jeg husker blot almindelig fremadskridende læsning af dit rs.
Avatar billede axkris Nybegynder
25. januar 2004 - 13:53 #10
Kan I hjælpe lidt? SKAL jeg have 2 select-sætninger?

Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

strQuery = "SELECT ID, URL, GRAFIK, VISNINGER, COUNT(ID) as Banner_count FROM PLUSPROFIL_BANNER WHERE Type = 'maxi' AND VISNINGER < MAXVISNINGER ORDER BY VISNINGER / (to_days(now()) - to_days(Oprettelse) + 1)  LIMIT 0,10"
set rs = dataConn.execute(strQuery)
randomize
rs.Move(int(rs("Banner_count") * rnd))
           
if not rs.eof then
.
.
.
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 13:57 #11
Ja, du skal have 2 sql-sætninger, den ene med count(*), den anden som du har nu.
Eller prøve den rs.open jeg anførte, utestet.

Men det er kun hvis du skal bruge antallet *før* du er løbet igennem dit rs.
Skal du først bruge det bagefter, så tæller du bare selv rækkerne.
Avatar billede axkris Nybegynder
25. januar 2004 - 14:13 #12
Æv, den går stadig i minus 1.

strQuery = "SELECT ID, URL, GRAFIK, VISNINGER FROM PLUSPROFIL_BANNER WHERE Type = 'maxi' AND VISNINGER < MAXVISNINGER ORDER BY VISNINGER / (to_days(now()) - to_days(Oprettelse) + 1)  LIMIT 0,10"
set rs = Server.CreateObject("ADODB.Recordset")
rs.Open strQuery, dataConn
' virker ikke: adopenkeyset, adlockOptimistic
randomize
rs.Move(int(rs.recordCount * rnd))
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 14:32 #13
Kender den ikke navnene adopenkeyset osv skal du selv inkludere adovbs.inc
Avatar billede axkris Nybegynder
25. januar 2004 - 14:34 #14
Ok, men hvordan gør jeg det?
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 14:54 #15
<!-- #include file=adovbs.inc -->

Men kun hvis du har den. Du kan også bare prøve med

  rs.Open strQuery,dataConn,1,3

Eller lege med alle muligheder:
  i stedet for 1-tallet prøv: 0,1,2,3
  i stedet for 3-tallet prøv: 1,2,3,4

Det er vist de muligheder der er. Men jeg har lige testet på er webhotel, der
tilbyder ASP og MySql, og kan *ikke* få andet end -1 tilbage.
Avatar billede erikjacobsen Ekspert
25. januar 2004 - 16:39 #16
Avatar billede axkris Nybegynder
30. januar 2004 - 14:12 #17
Ok Erikjacobsen, styk svar :-D
Avatar billede erikjacobsen Ekspert
30. januar 2004 - 14:20 #18
Tak, jeg samler ikke på point.

Fik du getrows til at virke?
Avatar billede axkris Nybegynder
30. januar 2004 - 14:25 #19
Jeg kastede mig ikke over getrows, men fik i stedet count til at virke... koden er dog ikke så flot med count, fordi jeg nu har to select-sætninger.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester