Veelgestelde vragen
In uw pakket wordt standaard het gebruik van Active Server Pages ondersteund. Hierbij hoort natuurlijk ook de ondersteuning voor Access databases. Echter, dit is vaak erg lastig, omdat er diverse factoren bij komen kijken. Om het gebruik van Access databases iets eenvoudiger te maken volgt hieronder een toelichting.
Let op! In verband met een bug in de MDAC (Microsoft Data Access Components, het component dat communicatie verzorgt tussen de webserver en de Access database) drivers van Microsoft, bieden wij geen ondersteuning bij problemen met Microsoft Access 97 databases. Wij raden u aan om van Access 2000, Access XP (2003) of Access 2007 gebruik te maken.
Voorbeeld connectionstrings
Er zijn verschillende manieren om verbinding te maken met een Access database. Via een OLE DB provider of via een ODBC (-Open Database Connectivity-) driver. Een OLE DB connectiestring is:
Access 2007, 2003
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:wwwuwinlognaamdatabasedatabase.accdb;"
ODBC-connectie voorbeelden
MS Access ODBC (2007) : "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=d:wwwexample.comdatabasedatabase.mdb;"
MS Access ODBC (2000, 2003) : "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:wwwexample.comdatabasedatabase.mdb;"
Over het algemeen geldt dat een Ole Db connectie sneller is dan een ODBC connectie en wordt daarom door VEVIDA aanbevolen.
In deze voorbeeld Ole Db connecties kunt u ook logingegevens opnemen. Plaats achter de database naam:
User;Password=;
In sommige gevallen moet dan nog het type van de database in de connectiestring gedefinieerd worden:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:wwwexample.comdatabasedatabase.mdb;Jet OLEDB:Engine;"
Voor meer informatie, bijvoorbeeld: http://msdn.microsoft.com/en-us/library/aa140022.aspx,http://en.wikibooks.org/wiki/JET_Database/Creating_and_connecting.
Omdat "Provider" nogal uiteenlopende waarden kan hebben (wat bij ODBC minder het geval is), is het moeilijk te bepalen hoe uw connection string eruit moet zien met verschillende databases. Op http://www.connectionstrings.com en http://www.carlprothman.net/Default.aspx?tabid=81 vindt u een zo compleet mogelijk overzicht van connectiestrings.
Lezen uit een database
Om met behulp van ASP gegevens uit een database te lezen is onderstaande code afdoende. U dient de stringD:wwwexample.comdatabasedb.mdb uiteraard te vervangen door de lokatie van uw database bestand. De genoemde map database komt overeen met de map database in de root van uw FTP-site.
NB: In dit voorbeeld is het niet nodig om het commando Server.MapPath te gebruiken. Dit commando zal ook in deze setup niet functioneren.
<%@LANGUAGE=VBSCRIPT%>
<%
Option Explicit
Dim Conn, strConn
Set Conn = Server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:wwwexample.comdatabasedb.mdb;"
Conn.Open strConn
Dim DTBrs
Set DTBrs = Server.CreateObject("ADODB.Recordset")
DTBrs.Open "tblTabel", Conn, 3, 3
' Doe hier wat u wilt doen in de database
' U kunt hier de ADO commando's DTBrs("VELDNAAM") of DTBrs.Fields("VELDNAAM") gebruiken.
DTBrs.Close
Conn.Close
Set DTBrs = nothing
Set Conn = nothing
De 3, 3 aan het eind van de 4e regel kan vervangen worden door de officiele VB constanten. Hiervoor dient u echter te beschikken over het bestand adovbs.inc, dit bestand is hier te downloaden.
Schrijven naar een database
Het schrijven naar een database is wat lastiger, omdat hiervoor specifieke rechten moeten worden toegekend aan de database. Om dit te vereenvoudigen kunt u alle databases het best in één directory plaatsen, waarbij wij u aanraden dit in d:wwwexample.comdatabase te doen. Op deze directory hebben wij standaard de rechten geplaatst waarmee u in de database kunt schrijven.
Een voorbeeld script voor schrijven ziet er als volgt uit:
<%@LANGUAGE=VBSCRIPT%>
<%
Option Explicit
Dim Conn, strConn
Set Conn = Server.CreateObject("ADODB.Connection")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:wwwexample.comdatabasedb.mdb;"
Conn.Open strConn
Dim DTBrs
Set DTBrs = Server.CreateObject("ADODB.Recordset")
DTBrs.Open "tblTabel", Conn, 3, 3
' Doe hier wat u wilt doen in de database
' U kunt hier de ADO commando's DTBrs("VELDNAAM") of DTBrs.Fields("VELDNAAM") gebruiken.
DTBrs.Close
Conn.Close
Set DTBrs = nothing
Set Conn = nothing
%>
Of, om een nieuw record aan te maken:
<%
DTBrs.Addnew
DTBrs("VELDNAAM") = "gegevens"
DTBrs("VELDNAAM2") = "gegevens"
DTBrs.Update
%>
En sluit ALTIJD de geopende connecties en recordsets weer af!:
<% DTBrs.Close Conn.Close Set DTBrs = Nothing Set Conn = Nothing %>
Access database verkleinen en optimaliseren
Als een database regelmatig gewijzigd wordt, raken delen va de database gefragmenteerd ("verdeeld"). Hierom moet regelmatig de Compact Database Utility van Access gedraaid worden, om de database te "defragmenteren". Tevens wordt hiermee de database verkleind, wat de performance verbetert en downloadtijd vermindert.
Beschikt u niet over het programma MS Access, dan kunt u de database compacten (verkleinen) met de JetComp utility. Deze kunt u bij Microsoft downloaden:
Jet compact utility.
Of online via een ASP-script:
<%@ %>
<%
Option Explicit
' (c)2005 - 2008 VEVIDA Services BV
' 20051020.1947 - Jan Reilink <info@vevida.com>
' Laatste wijziging: 20080826.1710
'
' Het onderstaande ASP script verkleint (compact) een Access
' database waarna het script redirect naar een op te geven
' pagina, bijvoorbeeld als onderdeel van een CMS.
'
' Wijzig "example.com" in uw eigen inlognaam en de database
' naam "database.mdb" naar de naam van uw database.
Const Jet_Conn_Partial = "Provider=Microsoft.ACE.OLEDB.12.0; Jet OLEDB:Engine; Data source="
' Const Jet_Conn_Partial = "Provider=Microsoft.Jet.OLEDB.4.0; Data source="
Dim LoginNaam, DatabaseNaam, strKlaarURL
Dim strDataBaseFile, strTempFile, strBackupFile
Dim fso, objJRO, SourceFile, DuplicateFile, CompactedFile
' Uw loginnaam
LoginNaam = "example.com"
' Databasenaam
DatabaseNaam = "database.mdb" ' of .accdb voor Access 2007
' Bron database bestand
strDataBaseFile = "d:www" & LoginNaam & "database" & DatabaseNaam
' Compacted database bestand
strTempFile = "d:www" & LoginNaam & "databasetmp_" & DatabaseNaam
' Eventueel Backup bestandsnaam, gebruik accdb als extensie voor Access 2007
' strBackupFile = Replace(strDataBaseFile, "accdb","BAK")
strBackupFile = Replace(strDataBaseFile, "mdb","BAK")
' de bestandsnaam of url van de pagina waarnaar het script moet
' doorverwijzen zodra het klaar is. Standaard naar de root ("/")
strKlaarURL = "/"
' Onder deze regel hoeft u niets aan te passen, tenzij
' u het maken van een backup uit wilt schakelen
' ---------------------------------------------------------------------
Set objJRO = Server.CreateObject("JRO.JetEngine")
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(strDataBaseFile)) Then
Set SourceFile = fso.GetFile(strDataBaseFile)
' Eventueel back-up van de database maken
SourceFile.Copy strBackupFile
If (fso.FileExists(strTempFile)) Then
Set DuplicateFile = fso.GetFile(strTempFile)
DuplicateFile.Delete
Response.Write "Bestaande tempfile is verwijderd!"
End If
objJRO.CompactDatabase Jet_Conn_Partial & strDataBaseFile, Jet_Conn_Partial & strTempFile
SourceFile.Delete
Set CompactedFile = fso.GetFile(strTempFile)
CompactedFile.Copy strDataBaseFile
CompactedFile.Delete
' het script verwijst door naar de volgende pagina zodra het klaar is met
' het compacten van de database.
Response.Redirect strKlaarURL
' of, geef een tekstuele bevestiging (comment de Response.Redirect regel hierboven)
' Response.Write strDataBaseFile & " verkleind."
Else
Response.Write "<b>" & strDataBaseFile & "</b> - Het bestand is niet gevonden!"
End If
Set fso = Nothing
Set objJRO = Nothing
%>
Acccess-gerelateerde foutmeldingen
ASP- en Access-foutmeldingen zijn helaas erg generiek.
Service Unavailable: De voornaamste oorzaak van een Service Unavailable melding is dat de applicatiepool (AppPool), waarin de website draait, stop staat. Dit kan zijn wegens een crash van die AppPool, een crash van een "parser" of driver in die AppPool, of vanwege een moedwillige stopzetting door VEVIDA (bijvoorbeeld bij misbruik, al dan niet door derden).
De foutmelding (0x)8004005 betekent voornamelijk: Access denied, of vaak in een andere vorm: Operation Must Use an Updateable Query. Simpelweg betekent het dat het script bepaalde rechten niet heeft om een actie uit te voeren. De foutmelding "Operation Must Use an Updateable Query" wordt voornamelijk gegeven wanneer een Access-database geen schrijfrechten voor de IUSR (-bezoeker-) heeft. Via MYVEVIDA zijn de schrijfrechten toe te kennen via de link website instellingen. Verwijder hierbij www, vul er "database" voor in de plaats en klik op schrijfrechten toekennen. Ook kan het zijn dat het webruimte quotum vol is, waardoor er geen extra data in de database weggeschreven kan worden.
Couldn't use ; file already in use. : Deze Access database-gerelateerde foutmelding wordt veroorzaakt als een gebruiker een database opent en geen create permissies op de betreffende folder heeft. Er kan door de Jet database engine geen lock-bestand weggeschreven worden. Dit kan twee oorzaken hebben:
- De schrijf-/modify rechten op de database-folder ontbreken;
- Het quotum voor een gebruiker (FTP of IUSR) is vol;
Links naar meer informatie:
- Common Access Database Errors
- You may receive a "file already in use" error message when you try to open an Access database that is located on a server
- You receive a "File already in use" error message when you open a database on a server in Access 2000
- Introduction to .ldb files in Access 2000
Online beheer van een Access database
Het volledig online beheren van een Access database is mogelijk met een pakket zoals dbadmin. De configuratie wijst zichzelf, documentatie en een "dutch language pack" zijn aanwezig.
Het is aan te raden om dbadmin in een beschermde folder te plaatsen. Het pakket genereert een 'dbadmin.xml' bestand met uw databases. Plaatst u deze in dezelfde beschermde folder, of in de database folder.
Dbadmin kunt u ook hier downloaden, inclusief alle beschikbare talen.
Dit pakket is niet door VEVIDA ontwikkeld en is niet "Access 2007 ready".
Tips en aanwijzingen voor het werken met Access databases
Microsoft wijdt een grote pagina aan tips en aanwijzingen voor het werken met, en optimaliseren van, Jet (Access) databases:
How to keep a Jet 4.0 database in top working condition.
1. Belangrijke tip
Veel problemen kunt u zelf oplossen door de "vriendelijke" foutmeldingen van Internet Explorer uit te schakelen. U ziet dan in plaats van de mededeling "HTTP 500 error" een foutmelding met de melding in welke regel er een fout in uw code voorkomt.
U kunt deze optie vinden bij internet opties op het tabblad geavanceerd.
De Web Application Stress Tool is een handige tool waarmee u kunt zien of uw scripting goed is:
http://www.microsoft.com/technet/archive/itsolutions/intranet/downloads/webstres.mspx
2. Gebruik een efficient database ontwerp
Een efficient ontworpen database verbetert de performance van de database. Een efficient ontworpen database.
3. Gebruik geen gereserveerde woorden of gereserveerde karakters voor objectnamen en/of veldnamen
Gereserveerde woorden of karakters die alleen gebruikt worden in of combinatie met andere woorden, gescheiden door spaties, kunnen databasecorruptie veroorzaken.
4. Maak regelmatig een backup van uw database
Bedenk een backup schema wat overeenkomt met de hoeveelheid data die u kunt/mag verliezen. Bijvoorbeeld, als u het zich kunt veroorloven om een dag aan data te verliezen, maak dagelijks een backup. Is een week nog verloorloofd, maak een weekelijkse backup. Een volldige backup van het database bestand is de beste manier om zeker te weten dat u de database kunt herstellen, mocht deze corrupt raken.
5. Microsoft Jet (lees: Access) is een gedeeld databasebestandssysteem.
Een gedeeld databasebestandssysteem betekent; het bestand kan door meerdere gebruikers gedeeld worden en het verwerken van het bestand gebeurt aan de kant van de client. Meerdere client processen gebruiken lees, schrijf en bestandslocking operaties op hetzelfde bestand. Als een proces niet afgerond kan worden bestaat de kans dat het bestand in een incomplete staat of in een corrupte staat blijft staan. Een proces wordt mogelijk niet afgerond door de volgende redenen:
o Als een client onverwacht stopt (men sluit de browser, de PC crasht, enz)
o Als een netwerkverbinding naar de server wegvalt (de gebruiker zit plotseling zonder internet)
Microsoft Jet is niet bedoelt voor high-stress server applicaties, high-concurrency server applicaties of 24 uur per dag, zeven dagen per week server applicaties. Dit is inclusief server applicaties zoals web applicaties, e-commerce applicaties, transactionele applicaties en server-berichten applicaties. Voor deze typen applicaties, de beste oplossing is om te kiezen voor een echt client/server database systeem, zoals MySQL of MS SQL Server.
Als u Microsoft Jet in high-stress applicaties zoals Microsoft Internet Information Server (IIS) gebruikt kunt u één van de volgende problemen ondervinden:
o Database corruptie
o Stabiliteitsproblemen, zoals IIS (de applicatiepool) crasht, of "locking up"
o Onverwachte fouten of continu driver (MDAC, OLE DB provider) fouten om te verbinden met een geldige database
6. Minimaliseer het aantal gelijktijdige connecties vanaf iedere client
We raden u aan om steeds slechts één connectie met een Microsoft Access database te makne. Iedere verbinding vertegenwoordigt een individuele client verbinding met de database, zelfs als deze verbindingen vanaf hetzelfde clientproces afkomstig zijn.
Om performance en netwerk I/O (Input/Output) te optimaliseren en om de multi-user stress op de backend database te verminderen, ontwerp de applicatie om een enkele connectie met de database te maken. Verdeel deze verbinding over meerdere recordsets mocht dit nodig zijn. Dit heeft het bijkomende voordeel dat lees- en schrijfvertragingen in de applicatie tegengegaan worden. Standaard is er een vertraging van vijf seconden tussen het schrijven van een waarde naar de database en de mogelijkheid om deze geüpdate waarde te lezen als er voor het lezen en schrijven twee verschillende connecties worden gemaakt. Dit geldt ook als de twee verbindingen door hetzelfde proces gemaakt worden.
7. Maak gebruik van ADO om te verbinden met een Microsoft Access database
Als u een verbinding maakt met een Microsoft Access database via ADO dan raden wij aan om de Microsoft Jet OLE DB Provider te gebruiken, in plaats van de Microsoft Access ODBC driver. Meer informatie hierover kunt u vinden op:
Using Microsoft Jet with IIS
Mocht u een reactie hebben naar aanleiding van dit artikel dan kunt u dit via de communicatiemodule op MyVEVIDA naar ons sturen.





















