# Programmeren in ASP.NET/Appendix: foutmeldingen

Hieronder vind je een lijst met de meest voorkomende foutberichten in ASP.NET, wat de oorzaak is, en wat je eraan kan verhelpen.

## Compileerfouten

| Foutboodschap | Oorzaak | Oplossing |
| OleDbConnection is not defined | Je vergat de imports <%@ Import NameSpace="System.Data" %> <%@ Import NameSpace="System.Data.OleDb" %> toe te voegen. | Voeg deze imports toe bovenaan in de aspx-pagina. |
| Reference to a non-shared member requires an object reference | Je gebruikt de naam van een object als een variabele. Dit kan gebeuren als je per ongeluk TextBox schrijft in plaats van TextBox1. | Gebruik geen namen van objecten als ID. |
| Unrecognized configuration section "connectionstrings" | De site draait in ASP.NET 1.x, maar de code vereist 2.0 | Verander de versie van ASP.NET (in IIS) |
| Name "x" is not declared | Je verwijst naar een variabele of object welke niet gedeclareerd werd Je probeert een control te gebruiken in je code, maar de control heeft niet het runat="server"-attribuut Je probeert een control te gebruiken in code die niet in een subroutine of functie staat | Declareer de variabele of het object met Dim Voeg het runat="server" attribuut toe Zet je code binnen een Sub-blok, bijvoorbeeld Page_Load |

## Gewone runtimefouten

| Foutboodschap | Oorzaak | Oplossing |
| Server cannot access application directory | De gebruiker ASPNET heeft geen toegang tot de folder waar je bestanden staan. Dit kan gebeuren als je bestanden bijvoorbeeld ergens binnen “My Documents” staan. | Geef toegang door rechts te klikken op de folder, ga naar Properties, dan Security, en voeg ASPNET toe. Geef minimum leesrecht aan deze gebruiker. |
| Object reference not set to an instance of an object. De objectverwijzing is niet op een exemplaar van een object ingesteld. | Je verwijst naar een object dat wel gedeclareerd werd, maar nog niet aangemaakt werd met New bijvoorbeeld: Dim cm As OleDbCommand cm.ExecuteReader → cm is nog niet aangemaakt | Maak het object aan met New of geef het een waarde |
| Object variable or With block variable not set. | Je vraagt een property of methode van een object dat niet bestaat, bijvoorbeeld: Page.Controls(10).ID als er minder dan 11 controls op de pagina staan, dan bestaat Controls(10) niet. | Verbeter je code, zodat ze het juiste object gebruikt. |
| Specified cast is not valid | Je probeert een object van één type om te zetten in een object van een ander type, en de omzetting is niet mogelijk. Bijvoorbeeld: Dim tb As TextBox = Panel1.Controls(0) Dit mislukt als Panel1.Controls(0) bijvoorbeeld een Label is, en geen tekstbox. Je kan geen label casten naar een tekstbox. | Zorg ervoor dat het object dat je probeert te casten van het juiste type is. |
| Array bounds cannot appear in type specifiers | Je schreef een van de volgende opdrachten: Dim a As type Dim a As type(param1) Vermoedelijk vergat je het sleutelwoord New | Schrijf: Dim a As New type Dim a As New type(param1) |
| Access denied to 'c:\inetpub\wwwroot' directory. Failed to start monitoring directory changes | ASP.NET werkt onder een aparte ASPNET-useraccount (ter beveiliging met weinig rechten). Deze account moet leesrechten hebben op de map waarin het ASP.NET-bestand staat dat je wil uitvoeren, of toch tenminste op het web.config-bestand en op de bin-folder. Een van de folders in het pad bestaat uit meer dan 8 letters | Je kunt dit aanpassen via de eigenschappen van de map en de bestanden. Zie https://www.asp.net/security.aspx voor meer informatie. Hernoem de folders zodat elke folder maximaal 8 letters bevat |
| It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. | Je maakte een bepaalde instelling (zoals "Authentication") in web.config, maar deze instelling mag alleen in web.config van de root gemaakt worden. | Maak de instelling alleen in het bestand web.config dat in de root staat |

## Runtime fouten met databanken algemeen

| Foutboodschap | Oorzaak | Oplossing |
| No value given for one or more required parameters | Je hebt de naam van een veld fout getypt, of je hebt je van naam vergist. Dit komt doordat elke naam in de SQL-streng die niet gekend is in de databank wordt beschouwd als een parameter. Voor elk ? of @veldnaam in de SQL-streng moet er een cm.Parameters.AddWithValue staan. | Verbeter de SQL-opdracht Voeg de nodige parameters toe aan het Command-object |
| The number of query values and destination fields are not the same | Bij een INSERT- of UPDATE-SQL-opdracht heb je meer of minder parameters geschreven (met ?) dan velden | Verbeter de SQL-opdracht |
| Data type mismatch in criteria expression. | Er is een fout in de INSERT-, UPDATE-, DELETE- of SELECT-opdracht. | Verbeter de SQL-opdracht |
| Syntax error in INSERT INTO statement | typfout in het INSERT-commando een van de veldnamen is een gereserveerd woord, zoals Date, Time, Begin, enz... | Verbeter de SQL opdracht Verander de veldnaam in de databank, of zet de veldnaam tussen vierkante haken. |
| No data exists for the row/column. | De datareader bevat geen gegevens. Je probeert gegevens van een datareader op te vragen, maar je vergat dr.Read of dr.Read was False. | Roep eerst dr.Read aan Controleer of dr.Read als resultaat True teruggaf. |
| Format of the initialization string does not conform to specification starting at index 0 | Er staat een fout in de connectiestring | Schrijf een juiste connectiestring. |
| AllowCustomPaging must be true and VirtualItemCount must be set for a DataGrid with ID x when AllowPaging is set to true and the selected datasource does not implement ICollection' | Paging werkt niet bij een DataGrid als de datasource een DataReader is. | Gebruik een DataSet in plaats van een DataReader voor databinding. Je kan ook "custom paging" gebruiken, zoals de foutboodschap aanraadt, maar dat is veel moeilijker. |
| Een keuzelijst of dropdownlijst verschijnt met "System.Data.Comm.DbDataRecord Error" | Je vergat de DataTextField-property van de lijst in te stellen. | Stel DataTextField in op een veld uit de data source. |
| Parameter ?_n has no default value | De n$^e$ parameter (van een OleDbCommand of SqlCommand) kreeg de waarde "Nothing" | Zorg ervoor dat de parameter een geldige waarde krijgt. |
| Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done. | Je schreef iets als: cm.Parameters.AddWithValue("kolom",TextBox1) | Verander het in: cm.Parameters.AddWithValue("kolom",TextBox1.Text) |
| DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'x'. | Je hebt een datacontrol die het veld 'x' moet tonen (via databinding), maar het veld zit niet in de SELECT-opdracht. | Zorg ervoor dat de SELECT-opdracht het veld 'x' bevat. |

## Runtime fouten met Access

| Foutboodschap | Oorzaak | Oplossing |
| The Microsoft Jet database engine cannot open the file x.mdb. It is already opened exclusively by another user, or you need permission to view its data. De Microsoft Jet-database-engine kan het bestand x.mdb niet openen. Het is exclusief geopend door een andere gebruiker of u hebt een machtiging nodig om de gegevens te kunnen bekijken. | De databank is open in Access. De zogenaamde "another user" ben jij waarschijnlijk zelf. De databank werd tijdens een vorige poging geopend, maar niet gesloten (doordat het programma halfweg stopte) De applicatie heeft niet het recht om de databank te openen | Sluit de databank (of tenminste de tabel of query) in Access. Meestal zit er niets anders op dan de pc te herstarten. Voorkom dit probleem door de connectie te sluiten in een Finally blok Geef de applicatie leesrecht op het access mdb-bestand. |
| Operation must use an updateable query De bewerking moet worden uitgevoerd op een query die kan worden bijgewerkt. Could not delete from specified tables | De databank is read-only voor ASP.NET. | Geef de applicatie schrijf-recht op het access mdb-bestand. Meestal moet de gebruiker ASPNET (of de gebruiker NETWORK SERVICE op Windows 2003) schrijfrecht geven.Tip: maak een aparte folder voor de databank, en geef schrijfrecht op deze folder. Dan werkt het ook als je de databank kopieert. Gebruik de folder app_data in ASP.NET 2.0 |
| Could not find installable ISAM | Er staat een fout in de OLEDB-connectiestreng, bv "DataSource" i.p.v. "Data Source". | Controleer de connectiestreng. |
| IErrorInfo.GetDescription failed with E_FAIL(0x80004005) | Je gebruikte een gereserveerd woord voor de naam van een veld in je tabel (zoals "Begin", "Start", "End", "Language", "Zone", "Action", "Position", "Date" of "Time") | Geef een andere naam, of zet de naam tussen vierkante haken [ ] in de SQL-opdracht. |
| You tried to assign the Null value to a variable that is not a Variant data type | Je probeert een null-waarde toe te voegen in een veld waar dit niet mag. Indien dit voorkomt tijdens een INSERT-operatie op een Access-databank met een datacontrol, staat er waarschijnlijk een AutoNumber-veld in de INSERT-opdracht, bv INSERT INTO tbl (ID,Naam) VALUES (@ID,@Naam) | Verwijder het AutoNumber-veld uit de INSERT-opdracht. Verwijder ook de overeenkomstige parameter. |

## Runtime fouten met SQL Server

| Foutboodschap | Oorzaak | Oplossing |
| SQL Server does not exist or access denied | De naam van de server is niet juist De server is gestopt Je hebt geen toegang | Geef de juiste servernaam Start de server Stel de beveiliging juist in |
| Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.Login failed for user '\' | Zie https://support.microsoft.com/?id=247931 | Stel de beveiliging juist in |
| Login failed for user 'NT AUTHORITY\NETWORK SERVICE'. | De gebruiker heeft geen toegang tot SQL Server | Voeg de groep IIS_WPG toe als login voor de SQL Server-instantie |
| An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, … | De naam van de server is niet juist De server is gestopt Je hebt geen toegang | Hoewel de foutboodschap SQL Server 2005 vermeldt, kan dit even goed voorkomen bij SQL Server 2000 Geef de juiste servernaam Start de server Stel de beveiliging juist in |
| Unable to open the physical file "C:\Inetpub\website\App_Data\aspnetdb.mdf". | De gebruiker ASPNET heeft geen toegang tot de folder App_Data | Wijzig de beveiliging van de folder App_Data |