/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Brug af variabler i forbindelse med ADODB/~
Fra : Jørgen Olesen


Dato : 08-06-07 21:18

Se nedenstående 5 linier kode som ligger i filen read.asp:

1: ForumName = Request.QueryString("Group")
2: stForum = chr(34) & ForumName & chr (34)
3: Set database = Server.CreateObject ("ADODB.Connection")
4: database.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "
& Server.MapPath("forum.mdb") &";"
5: Set msgForum = Server.CreateObject ("ADODB.Recordset")
6: msgForum.Open stForum, database, 2, 2

I det viste eksempel vil jeg åbne tabel navnet, som jeg henter
ind fra en parameter jeg kalder siden med.
I eksemplet ville jeg kalde siden med "read.asp?group=support"
for at åbne tabellen support.

Jeg får nedenstående fejlmeddelse, når jeg kalder siden:

"Microsoft JET Database Engine error '80040e14'
Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE',
'SELECT', or 'UPDATE'. "

Den opfatter altså min variabel som en SQL sætning, men hvorfor?

Hvis jeg istedet skriver nedenstående, så er der ingen problemer:

6: msgForum.Open "support", database, 2, 2

Hvordan får jeg fortalt den, med en variabel, hvilken tabel jeg
ønsker at åbne?



--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jørn Andersen (08-06-2007)
Kommentar
Fra : Jørn Andersen


Dato : 08-06-07 22:16

On 08 Jun 2007 20:17:44 GMT, Jørgen Olesen <nospam@nospam.dk> wrote:

>Se nedenstående 5 linier kode som ligger i filen read.asp:
>
>1: ForumName = Request.QueryString("Group")
>2: stForum = chr(34) & ForumName & chr (34)
>3: Set database = Server.CreateObject ("ADODB.Connection")
>4: database.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "
>& Server.MapPath("forum.mdb") &";"
>5: Set msgForum = Server.CreateObject ("ADODB.Recordset")
>6: msgForum.Open stForum, database, 2, 2
>
>I det viste eksempel vil jeg åbne tabel navnet, som jeg henter
>ind fra en parameter jeg kalder siden med.
>I eksemplet ville jeg kalde siden med "read.asp?group=support"
>for at åbne tabellen support.
>
>Jeg får nedenstående fejlmeddelse, når jeg kalder siden:
>
>"Microsoft JET Database Engine error '80040e14'
>Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE',
>'SELECT', or 'UPDATE'. "
>
>Den opfatter altså min variabel som en SQL sætning, men hvorfor?

Ikke nødvendigvis:
<url: http://www.w3schools.com/ado/met_rs_open.asp>

objRecordset.Open source,actconn,cursortyp,locktyp,opt

Parameter Description
* source * Optional. Specifies a data source. The source parameter may
be one of the following:
- A URL
- A relative/full file path name
- A Command object
- An SQL statement
- A stored procedure
- A table name



>Hvis jeg istedet skriver nedenstående, så er der ingen problemer:
>
>6: msgForum.Open "support", database, 2, 2
>
>Hvordan får jeg fortalt den, med en variabel, hvilken tabel jeg
>ønsker at åbne?

2: stForum = ForumName

eller bare:
6: msgForum.Open ForumName, database, 2, 2

Når du har den slags problemer, så test ved at udskrive dine variable,
inden de fejler, for at checke, om de indeholder det, du forventer - fx:

Response.Write stForum
Resonse.End
- inden linie 6.

Good luck!

--
Jørn Andersen,
Brønshøj

Jørgen Olesen (09-06-2007)
Kommentar
Fra : Jørgen Olesen


Dato : 09-06-07 07:54

Jørn Andersen wrote in dk.edb.internet.webdesign.serverside.asp:
>> >1: ForumName = Request.QueryString("Group")
> >2: stForum = chr(34) & ForumName & chr (34)
> >I det viste eksempel vil jeg åbne tabel navnet, som jeg henter
> >ind fra en parameter jeg kalder siden med.
> >I eksemplet ville jeg kalde siden med "read.asp?group=support"
> >for at åbne tabellen support.

Grunden til linie 2 er at jeg ville tilføje apostroffer, så resultatet er
"Support"

> <url: http://www.w3schools.com/ado/met_rs_open.asp>
>
> objRecordset.Open source,actconn,cursortyp,locktyp,opt
>
> Parameter Description
> * source * Optional. Specifies a data source. The source parameter may
> be one of the following:
> - A URL
> - A relative/full file path name
> - A Command object
> - An SQL statement
> - A stored procedure
> - A table name
>

Har studeret w3schools site, men er ikke blevet klogere
Der står faktisk heller ikke at man kan bruge en variabel.

Kan man bruge en SQL sætning som kun vælger tabellen?
Det kunne måske være løsningen.

> >Hvordan får jeg fortalt den, med en variabel, hvilken tabel jeg
> >ønsker at åbne?
>
> 2: stForum = ForumName
>
> eller bare:
> 6: msgForum.Open ForumName, database, 2, 2

Dette svare til at jeg skriver:
6: msgForum.Open support, database, 2, 2
Hvilket ikke er gyldigt da tabel navnet skal være omklamret af apostroffer.

Er iøvrigt prøvet, og resultere i flg. fejlmeddelse:

"ADODB.Recordset error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in
conflict with one another. "

Jeg tolker problemet som forkert type, da

> Når du har den slags problemer, så test ved at udskrive dine variable,
> inden de fejler, for at checke, om de indeholder det, du forventer - fx:
>
> Response.Write stForum

Same procedure here!
Altid udskriv variablen til skærmen, hvis du er i tvivl.
Jeg kunne jo godt lave en IF..THEN eller CASE..OF som tester variablen
ForumName, for derefter at lave hver deres åbning af tabellerne, men det er
både klodset og ufleksibelt.

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jørn Andersen (09-06-2007)
Kommentar
Fra : Jørn Andersen


Dato : 09-06-07 18:08

On 09 Jun 2007 06:53:52 GMT, Jørgen Olesen <nospam@nospam.dk> wrote:

>Jørn Andersen wrote in dk.edb.internet.webdesign.serverside.asp:
>>> >1: ForumName = Request.QueryString("Group")
>> >2: stForum = chr(34) & ForumName & chr (34)
>> >I det viste eksempel vil jeg åbne tabel navnet, som jeg henter
>> >ind fra en parameter jeg kalder siden med.
>> >I eksemplet ville jeg kalde siden med "read.asp?group=support"
>> >for at åbne tabellen support.
>
>Grunden til linie 2 er at jeg ville tilføje apostroffer, så resultatet er
>"Support"

Jamen, det er det skam også - "support" er blot repræsenteret af en
variabel, der hedder ForumName eller stForum.

>> <url: http://www.w3schools.com/ado/met_rs_open.asp>
>> objRecordset.Open source,actconn,cursortyp,locktyp,opt
<snip>

>Har studeret w3schools site, men er ikke blevet klogere
>Der står faktisk heller ikke at man kan bruge en variabel.

Eksemplet er sådan set vist med 5 variable:
objRecordset.Open source,actconn,cursortyp,locktyp,opt

>Kan man bruge en SQL sætning som kun vælger tabellen?
>Det kunne måske være løsningen.

Muligvis, men man skulle også kunne åbne en tabel, selv om jeg aldrig
har brugt det.

>> >Hvordan får jeg fortalt den, med en variabel, hvilken tabel jeg
>> >ønsker at åbne?
>>
>> 2: stForum = ForumName
>>
>> eller bare:
>> 6: msgForum.Open ForumName, database, 2, 2
>
>Dette svare til at jeg skriver:
>6: msgForum.Open support, database, 2, 2

>Hvilket ikke er gyldigt da tabel navnet skal være omklamret af apostroffer.

Nej, det er ikke rigtigt. Når der står > support < uden apostroffer, er
det en variabel - men du har ikke en variabel, der hedder support.
Når der står ForumName, så er det en variabel med værdien "support".
Når der står "support", så betyder anførselstegnene, at det er en streng
med indholdet > support <.

>Er iøvrigt prøvet, og resultere i flg. fejlmeddelse:
>
>"ADODB.Recordset error '800a0bb9'
>Arguments are of the wrong type, are out of acceptable range, or are in
>conflict with one another. "
>
>Jeg tolker problemet som forkert type, da

D kan evt. slå fejl-nummeret op på:
<url: http://www.aspfaq.com/>
- som giver:
<url:
http://tutorials.aspfaq.com/8000xxxxx-errors/why-do-i-get-800a0bb9/800a1391-errors.html>

I dette tilfælde giver det dog ikke ret meget nyt.
Men det fik mig dog til at tænke på, om ikke opt-værdien skal være sat,
når der åbnes en tabel og ikke en SQL-forespørgsel?

I så fald skulle:
>6: msgForum.Open ForumName, database, 2, 2
- i stedet være:
6: msgForum.Open ForumName, database, 2, 2, 2

Prøv om det gør en forskel - ?

Ellers kunne du prøve at skrælle alt det overflødige væk først og se om
det virker:

1: ForumName = "support"
2: StrDsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "
& Server.MapPath("forum.mdb") &";"
3: Set msgForum = Server.CreateObject ("ADODB.Recordset")
4: msgForum.Open ForumName, strDsn, 2, 2, 2

Eller hvis du vil lave en SQL-forespørgsel:
1: strSql = "SELECT * FROM support"
2: StrDsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "
& Server.MapPath("forum.mdb") &";"
3: Set msgForum = Server.CreateObject ("ADODB.Recordset")
4: msgForum.Open strSql, strDsn


>> Når du har den slags problemer, så test ved at udskrive dine variable,
>> inden de fejler, for at checke, om de indeholder det, du forventer - fx:
>>
>> Response.Write stForum
>
>Same procedure here!
>Altid udskriv variablen til skærmen, hvis du er i tvivl.
>Jeg kunne jo godt lave en IF..THEN eller CASE..OF som tester variablen
>ForumName, for derefter at lave hver deres åbning af tabellerne, men det er
>både klodset og ufleksibelt.

Skeln mellem, hvad du bruger til test-formål og hvad du bruger i den
endelige kode. Til test kan man lave mange underlige krumspring for at
finde fejl.

Men under alle omstændigheder skal du lave en eller anden form for
validering af, om ForumName faktisk indeholder noget fornuftigt -
specielt når det er QueryString-varaibel, du bruger:

Jeg bruger *altid* som minimum at teste for tomme strenge:
ForumName = Trim("" & Request.QueryString("Group"))
If ForumName = "" Then
' Fejl
Else
' Fortsæt
End If

I andre tilfælde skal der checkes for SQL-injection
<url: http://www.asp-faq.dk/article/?id=95>
- eller for om resultatet er et tal eller andet - afhænger af
forholdene.


Good luck!

--
Jørn Andersen,
Brønshøj

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408920
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste