webForumDet fria alternativet

Loopa igenom samma RecSet två gånger

ASP

6 svar · 287 visningar · startad av Calevan

Medlem sedan maj 20031 173 inlägg
Frågan#1

Jag har ett RecSet som jag vill gå igenom två gånger. detta gick fint förut, då jag använde RecSet.MoveFirst

nu använder jag dock parameteriserade frågor och command-objekt för att skapa mitt RecSet:

  Set Connect = Server.CreateObject("ADODB.Connection")
  Connection()
  Set Command = server.createobject("ADODB.Command")
  Command.ActiveConnection = Connect
  strSQL = "SELECT..."
  Command.CommandText = strSQL
  Command.Parameters.Append(Command.CreateParameter("AlbumID", adVarChar, adParamInput, 10, strAlbumID))
  Set RecSet = Command.Execute()

detta ledde till att jag fick upp detta felmedelandet:
"Rowset position cannot be restarted"
och efter lite googlande hittade jag denna förklaringen:
"the execute methods of ADO objects can not return anything but a read only, forward only recordset"

jag undrar nu; stämmer förklaringen, jag använde ju execute förut också (fast på connection, inte på command) och hur kommer jag runt detta problemet? just nu skapar jag två identiska record sets så använder jag först den enda och sen den andra, men det känns inte så optimalt.

hjälp mottages tacksamt!

Medlem sedan juni 2004533 inlägg
#2

Beskrivningen stämmer. Ifall du använder Connection.Execute för att skapa recordsetet så kan du inte heller använda MoveFirst.

Du kan öppna ett recordset med ett Command-objekt:

Set RecSet = Server.CreateObject("ADODB-Recordset")
RecSet.Open Command, , 3, 1
Medlem sedan nov. 20017 144 inlägg
#3

...eller använda getrows() och skriva ut posterna två ggr med en sub eller liknande.

Medlem sedan maj 20031 173 inlägg
#4

Set RecSet = Connect.Execute(SQL) använde jag förut och det fungerade utmärkt att gå till fösta posten med den.
Set RecSet = Command.Execute() som jag använder nu fungerar det dock inte med, så något är lustigt... jaja, det ska ialla fall inte gå då.

men jag kan altså skriva RecSet.Open Command, , 3, 1 istället? vet att jag har fått förklarat för mig skillnaden på open och execute och att de då sa att execute var bättre, men jag minns inte varför. är det dåligt att använda open?

Medlem sedan juni 2004533 inlägg
#5

Det som är dåligt med att använda open är när man använder det för att öppna recordsetet med mer resurskrävande egenskaper än man behöver, som till exempel att öppna recordsetet för skrivning när man bara ska läsa ifrån det.

Parametrarna 3 (adOpenStatic) och 1 (adLockReadOnly) är lämpliga för de egenskaper du behöver av recordsetet, alltså att kunna hoppa omkring i det, men bara läsa ifrån det.

Medlem sedan maj 20031 173 inlägg
#6

då blir ju den givna frågan, vilket kostar mest resurser, att öppna med open eller att göra såhär:

  Set RecSet = Command.Execute()
  Set RecSet2 = Command.Execute()

att lägga över det i en array med getRows leder till så mycket kodning när man ska skriva ut det så även om det är ett bra förslag så tror jag att jag hoppar det.

tack!

Medlem sedan juni 2004533 inlägg
#7

Jag tror att det är aningen snabbare att öppna ett recordset med lite sämre prestanda än att öppna två.

Ifall du inte vill använda en array så är ett alternativ att göra ett disconnected recordset:

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.CursorLocation = 3 'adUseClient
objRS.Open strSQL, objConnection, 3, 1
'adOpenStatic,adLockBatchOptimistic
Set objRS.ActiveConnection = Nothing

När du plockar bort kopplingen ifrån recordsetet så kommer det automatiskt att först läsa all datat ifrån databasen och du får ett helt fristående recordset.

252 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)