Avatar billede firehat Nybegynder
13. februar 2003 - 20:34 Der er 4 kommentarer og
2 løsninger

Database prob...

Darvs..

Har nu sidet en lille times tid uden at finde ud af dette:

######## Fejl: #########
ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/romerne/opret.asp, line 42


######### Kode: ########
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("lande.mdb")
Conn.Open DSN

strSQL = "Select max(Brugere) from Lande"
Set rs = Conn.Execute(strSQL)

Response.Write rs("Brugere")

Conn.Close
Set Conn = Nothing


- Jeg ved at Databasen 'lande.mdb' og tabelen 'Lande' og rækken 'Brugere' findes...

Hvad kan problemet være ?

Tak på forhånd :)

/Firehat.dk
Avatar billede nazaq Nybegynder
13. februar 2003 - 20:38 #1
Da du søger efter max(brugere) vil sql ikke returnere feltet brugere :-)

Løsning 1:
strSQL = "Select max(Brugere) as mBrugere from Lande"
...
Response.Write rs("mBrugere")

Løsning 2:
strSQL = "Select max(Brugere) from Lande"
...
Response.Write rs(0)

/Nazaq
Avatar billede firehat Nybegynder
13. februar 2003 - 20:44 #2
hmm...hvorfor viser den så ikke det højeste tal som er i rækken Brugere ?
Avatar billede nazaq Nybegynder
13. februar 2003 - 21:11 #3
Virker mit forslag ikke?

Det er fordi du specifikt beder om rækken 'Brugere' fra recordset'et (Response.Write rs("Brugere")
), og det findes ikke.

Du beder SQL om at lave et recordset til dig som indeholder det højeste tal i 'Brugere' kolonnen (strSQL = "Select max(Brugere) from Lande"), men du glemmer at fortælle SQL hvad den skal kalde den række tallet står i.

Som et eksperiment kan du jo prøve at køre din SQL sætning i Access og se hvilket navn kolonnen får, den plejer at give den 'expr0001' eller noget i den stil.

Hvis du gerne vil have en bedre uddybning så sig lige til.

/NaZaq
Avatar billede firehat Nybegynder
14. februar 2003 - 13:17 #4
vil gerne have en bedre uddybning...forstår ikke ret meget af det..
- Jeg når nok ikke at svare før en uge pga Skiferie :)
Avatar billede nazaq Nybegynder
14. februar 2003 - 14:02 #5
Løste mit forslag ikke dit problem? Det er ikke for pointenes skyld men jeg vil da gerne vide om jeg hjælper di rigtigt :-)

Men kan da lige prøve :-)

Du skal holde de forskellige ting adskildt.

Tabellen (databasen) er der hvor du har dataene liggende som du kender dem (i kolonner og rækker)

Recordset (rs) er den 'beholder' som ASP bruger til at gennemløbe en tabel, som enten er 'rå' eller manipuleret via SQL

SQL er et sprog som bl.a kan tage data fra en eksisterende tabel og præsentere dem på en anden måde.

SQL kan tage data fra en eksisterende tabel og manipulere dem så de ser helt anderledes ud, og derefter give dem videre til ASP som et recordset. Dette recordset indeholder data fra tabellen men de ligner ikke nødvendigvis den originale tabel, der kan være færre poster og andre kolonner.

Hvis vi tager din kode step for step hjælper det måske

-Set Conn = Server.CreateObject("ADODB.Connection")
-DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
-DSN = DSN & "DBQ=" & Server.MapPath("lande.mdb")
-Conn.Open DSN

Her opretter du forbindelsen til databasen. Dataene i dine tabeller er 'rå' her så hvis du vælger at se dem igennem vha. et recordset vil du se præsis hvad du ser når du er i access.

-strSQL = "Select max(Brugere) from Lande"
-Set rs = Conn.Execute(strSQL)

Her sker der noget. Du har nu valgt at lave et recordset vha. SQL. SQL har absolut intet med asp at gøre, det er et uafhængigt sprog (som ASP kan starte op) til at manipulere databaser med, og det er nok det der er grunden til du ikke helt forstår det.
Du sender en SQL sætning afsted til database driveren som fortæller at du fra Lande tabellen gerne vil have det største tal fra Brugere kolonnen. Resultatet er et recordset som du putter ind i rs variablen.
Hvis du kigger på recordset'et så vil du se en række med en kolonne, kolonnens navn har SQL selv valgt fordi du ikke har bedt om et bestemt navn.


-Response.Write rs("Brugere")

Her vil du så gerne have at ASP skal skrive indholdet af kolonne Brugere i rs. Desværre findes kolonne Brugere ikke i rs. Den findes i din tabel, men du har ikke 'programmeret' SQL til at den også skal inkluderes i det recordset som den aflevere til ASP.

-Conn.Close
-Set Conn = Nothing

Og til sidst lukker du forbindelsen til databasen.

Det bliver måske nemmere at forstå hvis du ser din rs variabel (som jo indeholder recordset'et) som en slags array. Du kan tilgå kolonnerne på 2 måder, enten ved at skrive hvad navnet er eller ved at fortælle kolonne nummeret.
Har du et recordset med 3 kolonner ID - Land - Brugere, så kan du få indholdet fra brugere ved at skrive rs("brugere") eller ved at bede om kolonne 2 rs(2) (arrays starter jo altid ved 0). Er det ID det drejer sig om så er det enten rs("ID") el. rs(0).

I din SQL laver du kun en kolonne (select max(brugere)) og da du ikke ved hvad den kolonne hedder kan du læse indholdet vha. rs(0)
Laver du en SQL til ovenstående tabel (ID - Land - Brugere) som kun henter kolonnerne ID og Brugere 'select id,brugere' kan du få indholdet fra brugere ved at skrive rs("brugere") el. rs(1). Er det ID det drejer sig om så er det enten rs("ID") el. rs(0).
Skriver du 'select brugere,id' i din SQL er det lige omvendt, rs("ID") giver stadig ID kolonnen men rs(0) giver nu Brugere kolonnen mens rs(1) giver ID.

Håber det hjalp lidt ellers find en side om SQL og test lidt af deres ting i Access

/NaZaq
Avatar billede midas_dk Nybegynder
14. februar 2003 - 15:27 #6
NaZaq >> Det var en gevaldig forklaring...

firehat >> Har ikke gidet læse den lange forklaring, så her er en kort:

Når man laver en SELECT sætning, kan man vælge at returnere data direkte fra et felt (f.eks. "SELECT Brugere FROM Lande"). SQL er dog et smart sprog, som også kan lave beregninger for dig. Det er det, der sker når du laver Max(Brugere) - og det betyder så at det ikke længere er et felt i databasen, der returneres, men derimod et resultat af en beregning! Dette resultat kan ikke tilgås ved at forespørge på et kolonnenavn.

Det (nemmeste?) du kan gøre er at lave lidt om i din SQL sætning:

SELECT Max(Brugere) AS maxBrugere FROM Lande

- og derefter kan du forespørge på _variablen_ maxBrugere i stedet for.

Capisce?
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
Kurser inden for grundlæggende programmering

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