27. juli 2005 - 14:38Der er
11 kommentarer og 1 løsning
Database forbindelse
Vil lige starte med at sige at jeg ved ikke noget om database forbindelser...
Normalt bruger jeg denne i en include fil: <% Set objConn = Server.CreateObject ("ADODB.Connection") objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/database/database.mdb") & ";" & "Persist Security Info=False" %>
og så åbner jeg tabellen med denne: <% Set objRS = objConn.Execute("Select * From bruger Order By Id") %> Men den virker ikke til noget paging jeg er ved at se om jeg kan lære
I det eksempel om paging jeg har står det sådan her: <% Set objConn = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/database/database.mdb") strSQL = "SELECT * FROM bruger ORDER BY Id ASC" objConn.Open strSQL, strDSN, 1 %>
Det har jeg så prøvet at ændre til dette: <% Set objConn = Server.CreateObject("ADODB.RecordSet") objConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("/database/database.mdb") %> og så åbne tabellen med denne: <% Set objRS = objConn.Execute("Select * From bruger Order By Id") %> men det virker ikke...
Og så er mine spørgsmål...
1] Hvad er forskellen på denne: Set objConn = Server.CreateObject ("ADODB.Connection") objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/database/database.mdb") & ";" & "Persist Security Info=False"
og denne:
Set objConn = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/database/database.mdb") strSQL = "SELECT * FROM bruger ORDER BY Id ASC" objConn.Open strSQL, strDSN, 1
2] Hvordan omskriver jeg denne så jeg kan have den i en include fil ? Set objConn = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/database/database.mdb") strSQL = "SELECT * FROM bruger ORDER BY Id ASC" objConn.Open strSQL, strDSN, 1
1: den første åbner en forbindelse, den anden gør det samme, men laver også et opslag i databasen...
2: læg dette i en separat asp-fil <% function getResult(strSQL) Set objResult = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/database/database.mdb") objResult.Open strSQL, strDSN, 1 Set getResult = objResult end function %>
og kald funktionen getResult derfra hvor du skal lave et opslag
set objResult = getResult("SELECT * FROM tabel1")
3: hvis det fungerer for dig er det vel ok. M.a.o synes jeg ikke umiddelbart der er noget at udsætte på din metode, så det kan du vist gost være bekendt :)
Denne fungerer ikke fordi et ADODB.Recordset ikke har en metode der hedder Execute, den ligger på ADODB.Connection-objektet. Din kode skal altså se således ud for at fungere:
og så åbne tabellen med denne: <% Set objRS = objConn.Execute("Select * From bruger Order By Id") %>
Pas på med navngivninge af variable, det kan være lidt forvirrende hvis du kalder en variabel noget som egentlig signalerer noget andet... men det kommer nok med forståelsen af databaser :)
Hvis du har set på paging så ser man tit at man laver et ADODB.Recordset når der arbejdes på access databaser Det gøres der fordi access har nogle indbyggede metoder til netop brug i paging, i andre databaser benytter man LIMIT, men det kan man ikke i access eksempel på paging http://activedeveloper.dk/artikler/default.asp?articleid=31
jeg er ikke klog nok til at forklare forskellen præcist, men det er noget med hvordan man åbner sine records I den normale connection får man returneret et recordset som en collection man kan løbe igennem i asp I den med recordset kan man definere hvordan man ønsker at åbne og løbe recordsettet igennem så vidt jeg har forstået, Men det er et stort emne, så må hellere lade en større ekspert forklare det præcist ;o)
submann >> det er helt ok, men du har jo stadig ikke fået en ordentlig forklaring på hvad forskellen på ADODB.RecordSet og ADODB.Connection, hvilket jo lå i dit spørgsmål :o) Men det kan man selvfølgelig slå præcis op på msdn.com , angående at du ikke er meget for at lave en funktion, tja, det er jo op til hvordan man selv har det med det. Jeg har altid en funktion til at åbne og danne forbindelsen, og en til at lukke og slette forbindelsen, men jeg har ikke en til at udføre sql med, det ser jeg som dobbelt arbejde i og med der allerede eksisterer en Execute metode til ens objekt, og hvorfor opfinde den dybe tallerken på ny ;o)
Det var mest ment som et princip for hvordan du kan gøre koden mere vedligeholdelsesvenlig (da du kun skal rette dit connection-setup et sted på den måde). Jeg vil også give Busschou ret i at selve execute-delen godt kan flyttes ud af funktionen...
Mht. navngivningen, så nævnte jeg det fordi du i et af eksemplerne benytter objConn (hvilket jeg umiddelbart opfatter som et connection baseret på navnet) som et recordset og det kan skabe forvirring. Det er absolut ikke nogen regel om at du _SKAL_ navngive dine variabel med nogle bestemte ord (kun efter en bestemt syntaks :)), så det er mere for din egen skyld... når nu du skal tilbage og vedligeholde din kode på et senere tidspunkt (10 års erfaring har lært mig lidt ;))...
<% function getConnection(strSQL) Set objConn = Server.CreateObject("ADODB.Connection") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/database/database.mdb") objConn.Open strDSN Set getConnection = objConn end function %>
I øvrigt vil jeg da anbefale, af sikkerhedsmæssige årsager, at du lægger din database udenfor roden af dit website, da den ellers kan downloades via browseren, hvis man gennemskuer adressen...
Jeg er lige gået i gang med at gennemgå dette: http://www.w3schools.com/ado/default.asp for jeg kan da se på det i skriver at jeg slet ikke ved nok om det... ;o)
Det fortæller vel hvad der er at vide, eller hvad ?
Jeg regner da med at de fortæller forskeller på ADODB.RecordSet og ADODB.Connection
Jeg ville også gerne have databasen uden for roden men det tilbyder http://www.secnet.dk ikke, desværre, derfor har jeg kaldt den noget sindsygt langt med tal og bogstaver...
Fair nok at lægge databasen indefor roden og kalde den noget suspekt ;) - bare du så gør noget ekstra ud af at beskytte dine sider for database-fejl, der kan afsløre hvad din database hedder og hvor den ligger (se evt. på fejlhåndtering i VBScript, herunder On Error Resume Next).
Angående en funktion til at oprette forbindelse til databasen, så synes jeg personligt at det er ret fikst at man får en connection tilbage fra den, da det gør dine scripts mere uafhængige af hvilken kontekst de befinder sig i (dvs. de krav der er til det kaldende kode om hvilke variable der er nødvendige for at koden kan udføres). Som jeg læser dine OpenDataBase og CloseDataBase, så er det subs der arbejder på noget globalt (hvilket i de fleste tilfælde frarådes hvis man kan undgå dem - og det kan du her :)).
Et hurtigt kig ned over siden du henviser til ang. ADO-forklaring, så ser overskrifterne lovende ud, så der tror jeg godt du kan finde en del af hvad du har brug for. Basalt set så skaffer en connection en konteket og en forbindelse til databasen, hvori der kan arbejdes med en given database's elementer og et recordset er et resultat af en forspørgsel i databasen, altså noget konkret data.
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.