Programming & Webscripting FAQ: ASP
Met dank aan gorgi_19
Inhoud
Links
- www.aspalliance.com
Goed gestructureerde site met regelmatig nieuwe artikelen over ASP en ASP.NET.
- www.15seconds.com
Iets dieper ingaan op de stof voor de gevorderde beginner
- http://msdn.microsoft.com
- http://www.4guysfromrolla.com
- http://www.aspin.com
- http://www.asp101.com
- http://www.activeserverpages.com
- http://www.learnasp.com/learn/
Boeken
- ASP in a Nutshell
Door: A. Keyton Weissinger
ISBN: 1565928431
O'Reilly & Associates Inc. - Beginning Active Server Pages 3.0
Door: David Buser, John Kauffman e.a.
ISBN: 1-861003-38-2
Wrox Press - Professional Active Server Pages 3.0
Door: Dino Esposito, Andrea Chiarelli e.a.
ISBN: 1-861002-61-0
Wrox Press
Algemene tips
1. Gebruik geen request(variabele)
Definieer altijd of je Request.Form, Request.Querystring of Request.Cookies, etc. gebruikt. Op deze wijze is er minder kans op malafide code of input die je niet verwacht.
2. Filter single quotes uit je input als je ze wilt gebruiken in een query
Stel je hebt de query:
1
| "Insert into blaat (veld1) Values ('" & Request.Form("blaat") & "')" |
We vullen vervolgens in, in het veld blaat: Gorgi's Game. De query zou er dan uit zien als:
1
| "Insert into blaat (veld1) Values ('Gorgi's Game')" |
en je ziet zelf al dat dit fout gaat door de single quote. Er moeten op een of andere manier zorgen dat deze dus niet meer voorkomt; dit kan door middel van escapen. Als we de ' vervangen door '' (2x een single quote achter elkaar) dan treedt dit probleem niet meer op.
Een betere code zou dan ook zijn:
1
2
| "Insert into blaat (veld1) Values ('" & _ Replace(Request.Form("blaat"),"'","''") & "')" |
3. Geen include bestanden niet de extensie .inc, maar .inc.asp
Het bestand foobar.inc is anders gewoon te downloaden als deze in een publieke plaats staan. Foobar.inc.asp niet.
4. Code altijd met Option Explicit On
Hiermee wordt je gedwongen om je variabelen te definiëren.
1
2
3
4
| <% iAantal = 5 Response.Write iAantal %> |
Kan dus niet meer; iAantal is niet gedefinieerd. Echter je maakt niet fouten als:
1
2
3
4
| <% iAantal = 5 Response.Write jAantal %> |
waarbij er niets op het scherm verschijnt.
Een goede syntax is nu:
1
2
3
4
5
| <% Dim iAantal iAantal = 5 Response.Write iAantal %> |
Veel gestelde vragen
- Wat is ASP?
- Ok; het is een platform. Welke taal heb ik dan nodig?
- Wat heb je nodig voor asp?
- Hoe verander ik de enters in een textbox naar HTML-enters?
- Mensen plaatsen HTML-code in mijn applicatie! Hoe voorkom ik dit?
- En hoe kan ik deze weer terugzetten naar gewone HTML?
- Ik heb een frames pagina, index.html, met daarin 2 pagina's. Pagina1.asp en pagina2. asp. Echter, als ik index.html laadt, wordt het Session_OnStart event 2 maal uitgevoerd! Hoe kan dit?
- Ik heb een ASP pagina, maar nu wil ik daar ook een grafiek bij hebben.. Hoe doe ik dit?
- Ik gebruik een upload component. Echter, zodra ik ENCTYPE="multipart/form-data" gebruik, kan ik geen Request.Form meer gebruiken?
- Hmmm… Ik lees wel dat ik de schrijfrechten moet wijzigen van het IUSR_account in het security tabblad, maar deze heb ik niet.
- Help! M'n upload form doet het niet?
- Ik wil een " gebruiken in een string, maar dit pikt hij niet. Hoe zorg ik dat ik wel een " weer kan geven?
- Hoe kan ik een enter weergeven in de source, dus geen html-enter?
- Sommigen zeggen dat ik <% Response.Write foobar %>, anderen zeggen dat ik <%= foobar %> moet gebruiken. Wat is correct?
1. Wat is ASP?
ASP staat voor Active Server Pages. In tegenstelling tot wat veel mensen denken, is asp geen taal, maar een platform. In feite bestaat ASP maar uit een paar objecten; de meest gebruikte zijn:
- Application object
- Request object
- Response object
- Server object
- Session object
2. Ok; het is een platform. Welke taal heb ik dan nodig?
Op Internet zijn de meeste voorbeelden in VBScript icm ASP. Dit is ook het meest gebruikt. Echter, je kan ook JScript of Perl gebruiken in combinatie met ASP.
De VBScript en JScript language reference is te downloaden op http://www.microsoft.com/scripting
3. Wat heb je nodig voor asp?
In combinatie met Internet Information Services (IIS / Windows based)
ASP 2.0 draait op IIS 4.0 en Personal web server. IIS 4.0 wordt geleverd bij Windows NT 4.0 Server of hoger. Personal Web Server kan gedraaid worden op Windows NT 4.0 Workstation of Windows 98. Voor beiden moet je het NT Option Pack 4.0 installeren.
ASP 3.0 draait op IIS 5.0 (Windows 2000), IIS 5.1 (Windows XP) of IIS 6.0 (Windows 2003). Tussen deze laatste drie zit voor ASP 3.0 geen verschil.
In combinatie met Apache
ASP is echter ook draaibaar op Apache. Zie bijvoorbeeld http://freshmeat.net/projects/apacheasp/?topic_id=92%2C49%2C90 voor de combinatie met Perl.
Voor de combinatie VBScript / JScript met apache: http://wwws.sun.com/software/chilisoft/index.html
4. Hoe verander ik de enters in een textbox naar HTML-enters?
1
2
3
| Dim strString strString = "TekstMetEnters" strString = Replace(strString,vbCrLf,"<br>") |
5. Mensen plaatsen HTML-code in mijn applicatie! Hoe voorkom ik dit?
1
2
3
| Dim strString strString = "TekstMetHTML" strString = Server.HTMLEncode(strString) |
6. En hoe kan ik deze weer terugzetten naar gewone HTML?
1
2
3
| Dim strString strString = "TekstMetEncodedHTML" strString = Server.HTMLDecode(strString) |
Deze methode bestaat echter (nog) niet in ASP 3.0
7. Ik heb een frames pagina, index.html, met daarin 2 pagina's. Pagina1.asp en pagina2. asp. Echter, als ik index.html laadt, wordt het Session_OnStart event 2 maal uitgevoerd! Hoe kan dit?
Het is niet beter te verwoorden dan EfBe heeft gedaan in deze post
8. Ik heb een ASP pagina, maar nu wil ik daar ook een grafiek bij hebben.. Hoe doe ik dit?
Een hele mooie tutorial is hiervoor geschreven en te vinden op http://www.4guysfromrolla.com/webtech/032603-1.shtml
9. Ik gebruik een upload component. Echter, zodra ik ENCTYPE="multipart/form-data" gebruik, kan ik geen Request.Form meer gebruiken?
Alles is nu encoded, dus ook je form variabelen. Meestal bieden de upload componenten wel een oplossing voor het probleem. De meest gebruikte is ASPUpload; een oplossing hiervoor staat beschreven in http://www.experts-exchange.com/Web/Web_Languages/ASP/Q_20340231.html
10. Hmmm… Ik lees wel dat ik de schrijfrechten moet wijzigen van het IUSR_account in het security tabblad, maar deze heb ik niet.
In Windows XP is deze verborgen. Je kan hem weer zichtbaar maken. Zie hiervoor http://windows.about.com/library/tips/bltip542.htm
11. Help! M'n upload form doet het niet?
In 99% van de gevallen ben je vergeten om je form tag goed te zetten.
Dus niet
1
| <form> |
maar
1
| <form enctype="multipart/form-data"> |
12. Ik wil een " gebruiken in een string, maar dit pikt hij niet. Hoe zorg ik dat ik wel een " weer kan geven?
De meest eenvoudige methode is escapen door hem te 'verdubbelen'. Een voorbeeld:
1
| Response.Write "Dit is een ""stukje"", wat de bedoeling is" |
wordt weergegeven als:
Dit is een "stukje", wat de bedoeling is
13. Hoe kan ik een enter weergeven in de source, dus geen html-enter?
Dit kan je doen door middel van vbCrLf (Visual Basic Carriage Release Line Feed)
Voorbeeld:
1
| Response.Write "Regel 1" & vbCrLf & "Regel 2" |
Levert op
1
2
| Regel 1 Regel 2 |
14. Sommigen zeggen dat ik <% Response.Write foobar %>, anderen zeggen dat ik <%= foobar %> moet gebruiken. Wat is correct?
In deze context zijn beiden correct en gaat het meer uit van een 'netheidsvoorkeur'.
1
| <td><%= Date() %></td> |
levert exact hetzelfde op als
1
| <td><% Response.Write Date() %></td> |
Als de een niet werkt, zal de ander ook niet werken.
Debuggen in ASP
Het debuggen van een asp-applicatie wordt door veel mensen als lastig ervaren, terwijl dit helemaal niet zo hoeft te zijn. Om een probleem op te lossen, is het van belang om er achter te komen wat er fout gaat. Om achter een fout te komen, hanteer ik altijd het volgende stappenplan:
1. Controleer op Norton Antivirus.
Zet Script Blocking uit; deze zorgt er voor dat een pagina's niet meer laden. Zie hiervoor ook dit Symantec artikel
2. Controleer of een simpele pagina het wel doet.
Een goed voorbeeld voor VBScript is:
1
2
3
| <% Response.Write "Hello world" %> |
Als je dit niet op je scherm krijgt, dan heb je geen probleem met je code, maar zit er iets anders fout. Een mogelijke fout kan bijvoorbeeld de Script Blocking van Norton Antivirus zijn.
3. Zorg dat je de foutmelding ziet.
Standaard staat Internet Explorer zo ingesteld, dat je alleen 'vriendelijke foutmeldingen' ziet, dus zonder errors en code, terwijl je dit nu net wel wil zien. Je kan deze optie uitzetten door:
Tools > Internet Options > Advanced > Show Friendly http Errors uitvinken (staat onder het kopje 'browsing')
4. Comment eventuele "On Error Resume Next"
Dit statement zorgt er voor dat fouten genegeerd worden, terwijl je ze juist wel wilt zien. Plaats er daarom een single quote voor (zodat het als commentaar en niet als statement wordt gezien) of haal het tijdens het debuggen weg. Immers, de fouten moeten nu juist te voorschijn komen.
Normaal:
1
2
3
4
| On Error Resume Next ' Option Explicit Dim strQuery strQuery = "Select * FROM tabelnaam" |
Debugmodus
1
2
3
4
| ' On Error Resume Next Option Explicit Dim strQuery strQuery = "Select * FROM tabelnaam" |
5. Zorg dat je de 'foute' variabele op het scherm krijgt
PHP kent error reporting, ASP.Net heeft het Tracing object; asp heeft niets van dit alles.
Wil je debuggen, dan zul je het op de handmatige wijze moeten doen door middel van Response.Write:
1
2
3
4
5
| Dim strSQL strSQL = "Er gaat iets fout in dit SQL statement" Response.Write strSQL ' Zet het statement op je scherm Response.End ' Eindig de uitvoering van je script. |
6. Tik de foutmelding, eventueel gedeelten daarvan, in op Google.
Je bent niet de eerste met de fout! Zorg er wel voor dat je de engelse foutmelding intikt. Google is een enorm snelle bron om oplossingen te vinden, met voorbeeldcode.
Krijg je geen foutmelding, controleer dan je code op oneindige loops.
Vaak voorkomende foutmeldingen en oplossingen
- Expected integer constant
- Item cannot be found in the collection corresponding to the requested name or ordinal
- [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x9dc Thread 0xb5c DBC 0x1468fe4 Jet'
- Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record
- Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
- Subscript out of range
- [Microsoft][ODBC Microsoft Access Driver] Too many client tasks
- [Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query
- The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content
- Active Server Pages error 'ASP 0131' Disallowed Parent Path
- Permission denied
(Met email c.q. CDONTS)
- Server.CreateObject Failed
- Type mismatch
- Number of query values and destination fields are not the same
- Syntax error (missing operator) in query expression
- ActiveX component can't create object: 'Scripting.FileSystemObject'
- Overige foutmeldingen
1. Expected integer constant
Een constante van het type integer werd verwacht. Meestal gaat dit fout icm met het maken van dynamische arrays. De volgende constructie mag niet en levert de fout op:
1
2
3
| Dim iNummer iNummer = 5 Dim arrBlaat(iNummer) |
Een goede constructie is:
1
2
3
4
| Dim iNummer iNummer = 5 Dim arrBlaat(1) Redim arrBlaat(iNummer) |
Tip: Mocht je al waarden in je array hebben staan, die je wilt bewaren, gebruik dan:
1
| Redim Preserve arrBlaat(iNummer) |
2. Item cannot be found in the collection corresponding to the requested name or ordinal
Deze foutmelding komt voor in combinatie met database connecties. Je wilt een veld gaan ophalen, welke niet in de recordset staat. Stel je hebt de query
1
| Select naam From tabel |
De volgende constructie levert dan een foutmelding op:
1
| Response.Write PseudoRecordSetObject.Item("adres") |
De reden: adres zit niet in de recordset; we hebben immers alleen maar "naam" er in laten zetten. Verander, om het probleem op te lossen, bijvoorbeeld de query in
1
| Select naam, adres FROM tabelnaam |
Tip: Het probleem kan ook duiden op een typefout.
Stel je hebt de foute code:
1
| Response.Write PseudoRecordSetObject.Item(adres) |
Hierin staat adres niet tussen quotes. Het wordt dan opgevat als een variabele adres (als Option Explicit niet gedefinieerd of uit staat). Aangezien adres leeg is (we hebben nergens deze variabele gevuld, staat er voor de parser eigenlijk:
1
| Response.Write PseudoRecordSetObject.Item() |
En dit laat al de incorrectheid zien.
3. [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key 'Temporary (volatile) Jet DSN for process 0x9dc Thread 0xb5c DBC 0x1468fe4 Jet'
Deze foutmelding hangt samen met de connectie naar de database. Meestal komt deze doordat de database niet gevonden is. Kortom, het pad naar de database is niet correct. Controleer of de locatie goed is.
Stel je hebt bijvoorbeeld als connectionstring de code
1
2
| strCon = "DRIVER={Microsoft Access Driver (*.mdb)};" & _ "uid=;pwd=letmein; DBQ=" & Server.MapPath("users.mdb") |
Output deze naar het scherm door middel van de regel
1
2
3
4
| strCon = "DRIVER={Microsoft Access Driver (*.mdb)};" & _ "uid=;pwd=letmein; DBQ=" & Server.MapPath("users.mdb") Response.Write strCon Response.End |
Je zal dan iets krijgen van bijvoorbeeld
DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=letmein; DBQ=c::\Inetpub\wwwroot\users.mdb
Controleer of dit laatste pad bestaat.
4. Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record
Deze fout hangt samen het uitlezen van een recordset, welke leeg is. Om de fout goed te begrijpen, is een beetje achtergrond informatie nodig.Een recordset is vergelijkbaar met een tabel. Stel, het resultaat van een query is weergegeven in de volgende recordset, welke we iets nader gaan bekijken:
Index | Achternaam | Voornaam | Leeftijd |
---|---|---|---|
1 | Pietersen | Kees | 21 |
2 | Klaassen | Jan | 22 |
3 | Huisman | Linda | 22 |
1
2
3
4
5
| Set objPagingConn = Server.CreateObject("ADODB.Connection") objPagingConn.Open CONN_STRING Set objPagingRS = Server.CreateObject("ADODB.Recordset") SQL = "SELECT * FROM Bedrijf" objPagingRS.Open SQL, objPagingConn, 3, 1 |
Goed, we hebben op dit punt een recordset geopend. Echter, als we nu doen:
1
| Response.Write objPagingRS("Achternaam") |
Krijgen we de eerder genoemde foutmelding. Waarom? We hebben de recordset geopend, maar we hebben nog geen record aangegeven.
We moeten dus de recordset ook nog gaan lezen:
1
2
| objPagingRS.Read
Response.Write objPagingRS("Achternaam") |
Ook geldt dat als de recordset nu leeg is (dus we geen waarden hebben teruggekregen uit de database) de ook deze foutmelding krijgen. Dan moeten we het statement iets uitbreiden en controleren of er uberhaupt wel waarden zijn teruggegeven:
1
2
3
4
5
6
7
8
9
10
11
| If Not objPagingRS.EOF Then ' Als we niet aan het einde van de recordset zijn, oftewel er zijn geen records objPagingRS.Read Response.Write objPagingRS("Achternaam") Else Response.Write "Geen waarden gevonden" End if |
Het kan echter ook gebeuren dat we niet 1, maar 0 of meerdere records willen uitlezen. Hiervoor kunnen we de volgende code gebruiken:
1
2
3
4
5
6
7
8
9
10
11
| Do While Not ObjPagingRS.EOF ' Zolang we nog niet aan het einde van de recordset zijn Response.Write(objPagingRS.Fields("Achternaam")) ' Zet op het scherm neer de waarde uit het veld "Achternaam" ObjPagingRS.MoveNext ' Ga naar het volgende record toe Loop ' Herhaal de procedure |
Wat vaak vergeten wordt, is de ObjPagingRS.MoveNext. Zonder deze krijg je een oneindige loop en blijft je applicatie aan het laden.
5. Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another
Ook deze fout komt voor in combinatie met database toegang. Vooral als deze database Microsoft Access is. Een mogelijke, foutieve query is:
1
| SELECT soort_dv, positie FROM dienstverb_per WHERE sofi_nr ='174584490' |
Voor Access is namelijk
1
| SELECT soort_dv, positie FROM dienstverb_per WHERE sofi_nr ='174584490' |
Niet gelijk aan
1
| SELECT soort_dv, positie FROM dienstverb_per WHERE sofi_nr =174584490 |
In het eerste geval moet het veld in je database een tekstveld zijn. In het tweede geval moet het veld in je database een numeriek veld zijn.
Samengevat: Teksten moeten aangegeven worden door middel van 'tekst'. Nummers mogen geen single quotes bevatten.
6. Subscript out of range
De meest voorkomende situatie is in combinatie met arrays. Stel je hebt 5 elementen in je array en je wilt het 6e element hebben.
Voorbeeld:
1
2
3
4
5
| Dim arrTest(2) arrTest(1) = "Blaat" arrTest(2) = "Blaat2" Response.Write (arrTest(3)) |
De drie zit in dit geval buiten de range en zit dus niet in de array.
7. [Microsoft][ODBC Microsoft Access Driver] Too many client tasks
Deze fout kan voorkomen als niet alle connection - en recordset objects netjes worden afgesloten. Sluit deze daarom ook altijd en vernietig deze.
Voorbeeld:
1
2
3
4
5
6
7
8
9
| Set objPagingConn = Server.CreateObject("ADODB.Connection") objPagingConn.Open CONN_STRING Set objPagingRS = Server.CreateObject("ADODB.Recordset") ….. set objPagingRS = Nothing objPagingConn.close set objPagingConn = Nothing |
In het laatste gedeelte is te zien dat we de boel vernietigen (op Nothing zetten, resources vrijgeven) en de connectie sluiten (objPagingConn.close)
8. [Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query
NTFS-rechten goed zetten. Dat wil zeggen: IUSR_computernaam account iig schrijfrechten geven op de folder waar de database in staat. Ook moet gecontroleerd worden of de database niet readonly is. Dit kan gebeuren als een database bijvoorbeeld van een cd-rom gekopieerd is.
Een KB artikel, waarin alles goed uitgelegd staat hier
Zie verder ook:
- http://www.webwizguide.info/asp/faq/ODBC_drivers.asp
- http://www.webwizguide.info/asp/faq/server_permissions.asp
Een andere mogelijkheid is dat de database 'gelocked' is. Dit kan gebeuren als je bijvoorbeeld de database nog open hebt staan; door middel van bijvoorbeeld Microsoft Access. Dit mag niet; Microsoft Access moet afgesloten zijn.
9. The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content.
Deze komt komt voor als je nog http headers wilt sturen naar de client, terwijl er al content gestuurd is. Let dan ook op lege spaties bovenaan je pagina. Daarnaast moet Response.Buffer op True staan
Een voorbeeld waarbij het fout gaat:
1
2
3
4
5
| Blaat <% Response.Redirect "foobar.asp" %> |
Zoals je ziet is er al eerst een stukje tekst naar de client gestuurd. (Blaat). Vervolgens wordt er een header gestuurd (Response.Redirect)
Een goed voorbeeld is dan ook:
1
2
3
| <% Response.Redirect "foobar.asp" %> |
Of, iets uitgebreider:
1
2
3
4
5
6
7
| <% If Request.Querystring("ikke") = "ja" Then Response.Redirect "foobar.asp" Else Response.Write "Blaat" End if %> |
Als de querystring "ikke" de waarde "ja" heeft, dan wordt er geredirect, anders wordt blaat op het scherm neer gezet.
Response.Buffer staat nergens in de code genoemd. In IIS 4.0 en PWS is de standaardwaarde False. Daar moet hij dus wel genoemd worden. In IIS 5.x en hoger staat deze standaard op True. Daar hoeft hij dus niet expliciet neergezet te worden.
10. Active Server Pages error 'ASP 0131' Disallowed Parent Path
Als eerste: wat is een parent path? Stel we veronderstellen de volgende code:
1
| <!-- #include file="..\default.htm"--> |
Het gebruik van .. geeft aan dat je naar de parent wil; hier gebruik je dus parent paths. In IIS 4.0 en IIS 5.x staan deze by default op enabled en heb je geen probleem. Echter, Microsoft heeft zich later bedacht in verband met de veiligheid en heeft in IIS 6.0 deze standaard op disabled staan. Ook de BaseLine Security Advisor geeft het advies om hem op disabled te zetten, zodat het 'opeens' ook in disabled kan staan, in IIS 5.x
Om het te enablen /disablen, zie dit artikel.
11. Permission denied (Met email c.q. CDONTS)
Dit heeft te maken met een rechtenprobleem; het IUSR_computernaam account heeft niet genoeg rechten op bepaalde folders. Voor een oplossing, zie http://www.asp101.com/samples/faq/faq_email.asp
12. Server.CreateObject Failed
Het is niet gelukt om een bepaald object aan te maken op de server. Stel je hebt bijvoorbeeld de volgende code:
1
2
3
4
5
6
7
8
9
10
11
| <html> <body> <!-- #include file="inc/connection.inc" --> <% Set Upload = Server.CreateObject("Persits.Upload") Count = Upload.Save(".") Response.Write Count & " file(s) uploaded to c:\upload" %> </body> </html> |
Mocht je deze foutmelding krijgen, dan is of het object helemaal niet geïnstalleerd (in bovenstaand geval was Persists.Upload helemaal niet aanwezig) of niet goed geregistreerd (e.g. de benodigde dll waren niet te vinden)
13. Type mismatch
Dit duidt op een eenvoudige tikfout in je applicatie. Meestal is ook de lijn gegeven. Controleer ook de regels rondom je code op tikfouten, niet afsloten haakjes, vergeten quotes, e.d.
14. Number of query values and destination fields are not the same
Het aantal opgegeven velden en het aantal opgegeven variabelen is niet gelijk.
Stel je hebt de query:
1
| Insert INTO tabelnaam (kolom1, kolom2) Values (waarde1) |
De foutmelding treedt dan op. De reden: Je wilt 2 kolommen gaan gebruiken (kolom1 en kolom2, maar je geeft maar 1 waarde)
Een complexer ogend voorbeeld, maar wat eigenlijk nog gewoon op bovenstaande neerkomt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SQLstring = "INSERT INTO ledenlijst (" SQLstring = SQLstring & "nr,datum,hrmw,voorletters," SQLstring = SQLstring & "naam,adres,postcode,plaats," SQLstring = SQLstring & "telefoon,email,lid,gzl" SQLstring = SQLstring & ") VALUES (" SQLstring = SQLstring & "'" & NewNr & "'," SQLstring = SQLstring & "'" & NewDatum & "'," SQLstring = SQLstring & "'" & Newhrmw & "'," SQLstring = SQLstring & "'" & NewVoorletters & "'," SQLstring = SQLstring & "'" & NewNaam & "'," SQLstring = SQLstring & "'" & NewAdres & "'," SQLstring = SQLstring & "'" & NewPostcode & "'," SQLstring = SQLstring & "'" & NewPlaats & "'," SQLstring = SQLstring & "'" & NewTelefoon & "'," SQLstring = SQLstring & "'" & NewMail & "'," SQLstring = SQLstring & "'" & NewLid & "'" SQLstring = SQLstring & ")" |
15. Syntax error (missing operator) in query expression
Er is iets mis in je query; bepaalde onderdelen lijken te missen. Stel we hebben het volgende stukje code:
1
2
3
4
5
6
7
8
9
| <% Dim Vid, Vbedrijfsnaam Dim SQLvraag SQLvraag = "SELECT * FROM bedrijven WHERE id=" & Vid Set RSCompanies = Verbinding.Execute(SQLvraag) %> |
Bij deze code kan de fout optreden. Hoe pak je nu zo een fout aan? Je weet in welke regel de fout zit. Je weet verder dat er een fout in je SQL syntax zit. De enige oplossing: debuggen.
Zet de query, voordat je hem uitvoert, op het scherm. Bovenstaand levert dan op:
1
2
3
4
5
6
7
8
9
10
11
12
| <% Dim Vid, Vbedrijfsnaam Dim SQLvraag SQLvraag = "SELECT * FROM bedrijven WHERE id=" & Vid Response.Write SQLvraag Response.End ' We commenten deze regel; deze doet even niet mee bij het debuggen. ' Set RSCompanies = Verbinding.Execute(SQLvraag) %> |
Op het scherm verschijnt nu:
SELECT * FROM bedrijven WHERE id=
En de fout blijkt hier nu duidelijk uit.
16. ActiveX component can't create object: 'Scripting.FileSystemObject'
Bij veel hosts is het niet toegestaan om toegang te krijgen tot het FileSystem. Dat betekent dus dat je niet kunt lezen en/of schrijven naar de harddisk van je server. Jammer maar helaas, je zult of je host moeten mailen met de vraag of ze het voor je aan willen zetten of vragen of ze een andere oplossing voor je hebben.
Zie ook dit topic.
17. Overige foutmeldingen
Een aantal overige foutmeldingen staat hier duidelijk beschreven.
[ Voor 196% gewijzigd door NMe op 13-05-2005 17:41 ]
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz