Avatar billede submann Nybegynder
27. juli 2005 - 14:38 Der 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

3] Er der en "åbning" der er bedre at bruge ?
Avatar billede softspot Forsker
27. juli 2005 - 15:13 #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 :)
Avatar billede softspot Forsker
27. juli 2005 - 15:15 #2
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:

<%
Set objConn = Server.CreateObject("ADODB.Connection")
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")
%>

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 :)
Avatar billede busschou Praktikant
27. juli 2005 - 15:18 #3
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
Avatar billede busschou Praktikant
27. juli 2005 - 15:21 #4
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)
Avatar billede submann Nybegynder
27. juli 2005 - 23:32 #5
Vil det sige at alle min sider skal laves om fra dette:
Set objRS = objConn.Execute("Select * From bruger Order By Id")

til dette:
set objResult = getResult("Select * From bruger Order By Id")

Det er jeg da ikke glad for at høre... Men ok det gør jeg... ;o)

Hvad mener du med "Pas på med navngivninge af variabler" ?

Er der ikke et link til et sted hvor jeg kan lære det med databaser ?

Da jeg mener softspot kom med mest få han point, så desværre ikke nogle til dig busschou i denne omgang... ;o)
Avatar billede busschou Praktikant
27. juli 2005 - 23:38 #6
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)
Avatar billede softspot Forsker
27. juli 2005 - 23:47 #7
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 ;))...
Avatar billede softspot Forsker
27. juli 2005 - 23:50 #8
Din funktion skal så nok se således ud:

<%
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...
Avatar billede softspot Forsker
27. juli 2005 - 23:50 #9
Ups! Du kan godt fjerne parameteren strSQL :)
Avatar billede submann Nybegynder
28. juli 2005 - 00:19 #10
Jeg har faktisk også en funktion til at ordne det med databasen, jeg bruger en lidt modificeret udgave af denne:
http://www.futte.dk/locator.asp?id=2004203532700002

Call OpenDataBase og Call CloseDataBase

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...
Avatar billede softspot Forsker
28. juli 2005 - 00:36 #11
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.
Avatar billede softspot Forsker
28. juli 2005 - 00:57 #12
Nåeh ja, du får lige et svar... :)
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