Hej! Undrar om det går att "mäta" hur många poster ett recordset innehåller? (utan att behöva loopa igenom resultatet alltså). Hoppas ni förstår vad jag menar. Tack för hjälpen! Jo det går. Det beror på om du öppnar ditt recordset på ett av två sätt. Är det serversided så kan du inte räkna posterna. Är det clientsided kan du göra det. Jag tänker samtidigt förklara vad detta är och dess skillnader. För att komplettera Pelles svar: Ojoj... Tack snälla för svaret! Jag förstod det mesta men jag får nog läsa igenom ett par ggr till. Supertack!!!Antal poster i recordset?
clientsided eller serversided recordset
Skillnaden på serversided är att alla poster i ditt recordset ligger kvar på servern och hämtas i den takt du själv väljer det. Är det clientsided så hämtas alla posterna in lokalt i ditt recordset och du kan använda: poster = rst.recordcount.
Skillnaden på hur du öppnar är följande:
<info>
set rst = con.execute("select * from tabell)
</info>
Här är rst ett objekt innehållande data men ligger fortfarande kvar på servern. Du kan inte använda funktioner såsom rst.recordcount, rst.movenext osv. Först när du använder do while not rst.eof / rst.movenext / rst.loop så hämtas posterna in.
<info>
rst.open "select * from tabell", con, 3,1,1
</info>
Nu är rst ett objekt innehållade alla poster och kallas client-sided. Med detta sätt att öppna ditt recordset kan du använda rst.movefirst, rst.movelast, x = rst.recordcount mfl.
För att lösa räkningen på ditt serversided recordset kan du faktiskt hämta hem all data och lägga det i en array:
<info>
set rst = con.execute("select * from tabell)
minArray = Rst.GetRows
rst.close
</info>
Om du nu skriver antal = Ubound(MinArray,2) så kommer du att få antalet poster som returnerats, stängt recordsetet snabbt, och hämtat hem datat lokalt i minnet.
Som du förstår så finns fördelar och nackdelar med allting men kortfattat så bör du använda clientsided recordset om du kör paging eller skall addera eller uppdatera data via rst.addnew / rst.update och liknande.
För serversided recordset rekommenderas att du använder till insert, update, delete och även select i vissa lägen. För att köra insert, update och delete behöver man inte skapa något recordsetobjekt utan klarar sig med connection:
<info>
con.execute("delete from tabell where id = 12")
con.execute("update tabell set id = 13 where id=12)
con.execute("insert into tabell (id) values(21,22,23,24)
</info>
I asp är regeln, ligg inte och håll recordset öppna utan försök att stänga så fort det någonsin går. Hoppas detta hjälper dig lite i din tankeverksamhet. För att avsluta. Man behöver bara öppna en enda connection på asp-sidan för den kan återanvändas om och om igen. Se alltid till att stänga den när du är klar. Ett exempel på att skapa fler recordset med samma connection:
<info>
set rs1 = con.execute("select * from tabell1")
set rs2 = con.execute("select * from tabell2")
</info>
Att öppna en connection:
<info>
set con = server.createobject("adodb.connection")
con.open "mindsn" - eller en connectionsträng (se kurs http://www.pellesoft.se/login/articles/other/connectionstrings.asp
</info>
För att stänga sin connection och de eventuella recordset man skapat och använt på sin aspsida
<info>
set rs1 = nothing
set rs2 = nothing
con.close
set con = nothing
</info>Sv: Antal poster i recordset?
<code>
<%
Const ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mindatabas.mdb;Persist Security Info=False"
Function GetData(SQL) ' as RecordSet
Dim oConnection ' as Connection
Set oConnection = Server.CreateObject("ADODB.Connection")
oConnection.CursorLocation = 3 'adUseClient
oConnection.Open ConnectionString
Set GetData = oConnection.Execute(SQL)
Set GetData.ActiveConnection = Nothing
oConnection.Close
Set oConnection = Nothing
End Function
Function GetDataArray(SQL) ' as Array
Dim oConnection ' as Connection
Dim rs 'as Recordset
Set oConnection = Server.CreateObject("ADODB.Connection")
oConnection.CursorLocation = 3 'adUseClient
oConnection.Open ConnectionString
Set rs = oConnection.Execute(SQL)
GetDataArray = rs.GetRows
rs.Close
Set rs = Nothing
oConnection.Close
Set oConnection = Nothing
End Function
%>
</code>
Jag använder den här koden i en includefil för alla dataaccesser för att alltid veta när jag har en connection öppen. Problemet med Pelles anförande är att det inte är recordsetet man vill hålla stängt utan själva anslutningen. Så jag har löst det genom att antingen hämta en array eller hämta ett recordset som ligger på klientsidan.
<code>
'Exempel på hur man använder clientrecordsetet
Dim rs, i
Set rs = GetData("select * from tabell")
Response.Write "Antal poster:" & rs.RecordCount
For i = 1 To rs.RecordCount
Response.Write "Recordnumber: " & i & " contains """ & rs(0) & """"
rs.MoveNext
Next i
rs.Filter = "Fält=7"
Response.Write "Antal poster med fältet ""Fält"" satt till ""1"":" & rs.RecordCount
rs.Close
Set rs = Nothing
'Exempel på hur man använder arrayen
Dim arr
arr = GetDataArray("select * from tabell")
Response.Write "Antal poster:" & UBound(arr) + 1
</code>
Fördelen med ett recordset på klientsidan är att man har recordcount och filter att använda, fördelen med en array är att den är snabb som attan. Nackdelen med båda dessa varianterna är att man inte kan hålla datat postlåst om man är i VB men det är inget som påverkar när man sitter på webben och utvecklar.Sv: clientsided eller serversided recordset