Í framhaldi af greinini hans Moose um að telja færslurnar í grunninum ákvað ég að fjalla aðeins og cursor type-in í ASP sem recordset getur verið stillt á. Ég man að þegar ég byrjaði á ASP var þetta eitt því sem ruglaði mig dáltíð og því langar mig að greiða úr flækjunni fyrir þá sem eru að bölva þessu núna.

Moose benti réttilega á að réttast væri að nota ADO til þess að telja færslurnar en þá er hægt að gera:
nFjoldi = objRS.recordcount
það sem flestir klikka á að er gleyma stilla cursor type. Það leiðir til þess að maður fær oftast út:
nFjoldi = -1

Sem stenst nátturlega ekki alveg. Því datt mér í hug að skrifa aðeins um þetta mál. Útskýra hvert cursor type fyrir sig og enda þetta með að taka dæmi um hvernig þau haga sér (eða réttara sagt: hvernig þau láta recordsettið haga sér).

adOpenForwardOnly cursor
Þetta er default cursor type þegar maður opnar recordset. Þetta er einnig það “lélegasta”. Eins og nafnið gefur til kynna getur maður aðeins flakkað/flett áfram. Ef maður reynir að fara aftur á bak eða á ákveðið record klikkar allt (lokar recordsettinu og endurkeyrir skipunina).

adOpenStatic cursor
Þarna eru gögnin í raun og veru “dauð”. En static þýðir einmitt kyrrstæður / kyrrstöðu-.
Semsagt við erum bara að opna “kyrrstæðugögn”. Maður getur flakkað afturábak og áfram.
Þetta er í raun og veru bara snapshot af gögnunum. Breytingar á gögnum eða nýjum recordum sjást ekki, þ.e.a.s þú sérð bara gögnin sem uppfylltu skilyrðin þín á þeim tíma sem skipunin var keyrð.

adOpenKeySet cursor
Þarna er sótt “Primary Key Values” eða gildin á því sem þú stilltir sem “Primary Key” (mjög oft einhverskonar id). Þú getur flakkað fram og tilbaka og þá sækir hún gögnin sem samavara “primary key” gildinu. Þarna sérðu allar breytingar á gögnum sem eiga sér stað. En þú sérð ekki ný record, því þau voru ekki grunninum þegar þú keyrðir skipunina.

adOpenDynamic cursor
Þetta er svona háþróaðasta cursor type-ið. Þarna geturu flakkað fram og tilbaka og þú sérð breytingar á gögnum og sérð ný record.

Nú eruð þið sjálfsagt að pæla í hvað ég meina með að segja “breytingar á gögnum og recordum” og mig langar að útskýra þetta með pínu öfgadæmi:

Segjum að maður sé með einhver milljón record í grunninum. Við skulum núna sækja þessi milljón record og skella í recordsettið okkar. Þar sem þetta er svona hrikalega stórt tekur það hana 5 min að sækja öll gögnin. Á þessum fimm mínútum er einmitt greinhöfundurinn að breyta fréttinni sinni (breyting á gögnum) og annar að skrifa nýja frétt (nýtt record). Svona myndi þá recordsettið haga sér:

ef recordsettið er stillt á adOpenStatic færðu ekki upp breytinguna á fréttinni og ekki heldur nýju fréttina
ef recordsettið er stillt á adOpenKeySet sérðu breytinguna á fréttinni en ekki nýju fréttina
ef recordsettið er stillt á adOpenDynamic sérðu bæði breytinguna og nýju fréttina.


Nú þegar þið eruð með dæmin myndi ég mæla með að þið kíktuð hratt yfir hvernig cursor type-in haga sér til þess að ná þessu alveg 200%

// Uppfært 30.12.01
Það er einnig vert að minnast á eitt sem stórgleymdist og það eru constant-arnir fyrir cursor type-in, þeir eru mjög einfaldir, svo þið getið sloppið við að include-a adovbs.inc. En þeir eru:
adOpenForwardOnly = 0
adOpenKeyset = 1
adOpenDynamic = 2
adOpenStatic = 3

Þá má einnig nefna það að þið getið sloppið við að nota cursor type-in með því að nota ekki ekta recordsett og gert einfaldlega
set rs = objConn.Execute(strSQL)

EN nota bene, þið tapið líka helling af eiginleikum sem ekta recordset hefur enda er það heilsteyptur object sem hefur helling af property-um og function-um. Þannig að ég nota alltaf ekta recordsett, en mér fannst allt í lagi að benda á þessa lausn líka.

Bestu Kveðju