Avatar billede oleko Nybegynder
13. maj 2003 - 22:39 Der er 9 kommentarer og
1 løsning

Access database mdb fil er låst efter ASP.Net programfejl

Jeg har et ASP.Net program, som anvender en Access database
ved hjælp af ADO.Net. Databasen og programmet kører på en server, som jeg kun har FTP adgang til.
Problemet er, at hvis der opstår en fejl for eksempel på grund af en forkert SQL sætning, så er Access mdb filen blevet låst og kan derfor ikke opdateres mere.
Avatar billede simon.ulsnes Nybegynder
13. maj 2003 - 22:59 #1
Ak ja, endnu en god grund til at holde sig langt væk fra Access-databaser... :)
Nej, du må undskylde at jeg ikke kan hjælpe dig, men så vidt jeg ved findes der simpelthen ikke en direkte løsning på dette problem (andet end at Microsoft retter denne åbenlyse fejl i .NET Framework). Når dette sker for mig (jeg arbejder en del med XML hvor det samme ofte kan ske), plejer jeg bare at dræbe aspnet_wp.exe via Task Manager, men det er jo ikke noget du har adgang til...

- Simon
Avatar billede odegaard Nybegynder
14. maj 2003 - 15:28 #2
når du arbejder med fil-connections, så sørg ALTID for at have en try/catch på, så du er sikker på at du kan få objektet lukket.
Avatar billede odegaard Nybegynder
14. maj 2003 - 15:30 #3
fx.
try {
    myConn.Open
  [...]
catch ex as System.Exception
  myConn.Close
  Throw New Exception(ex) 'smid en exception så du stadig kan se hvad der gik galt.
end try
Avatar billede oleko Nybegynder
14. maj 2003 - 15:34 #4
Tak for rådet.
Men bare der var en udvej, som også virker, når man er glemsom.
Avatar billede odegaard Nybegynder
14. maj 2003 - 15:57 #5
Jamen det ER udvejen! Håndtering af Exceptions er en MEGET vigtig del af programmering. Hvis du åbner noget, skal du altid huske at lukke for den igen. Det samme gælder også for forbindelser til fx. MSSQL databaser!!! Der er grænser for hvor mange forbindelser du kan have åbne til en database, selvom det er en MSSQL eller en Oracle database. Godt nok timer forbindelsen ud efter noget tid, men det gør access-databaseforbindelsen nu også.

Har du 100.000 brugere i timen, og opstår der en fejl du ikke har tænkt på, i 0.1% af kaldende til databasen, så skal der ikke meget til at opbruge en servers hukommelse og tilgængelige forbindelser.
Avatar billede burningice Nybegynder
16. maj 2003 - 11:12 #6
odegaard>> det er pænere at smide ens Close i Finally-blocken :), og hvorfor kaste en ny exception hvis man ikke skriver noget mere informativt... så er det måske bedre at kaste den eksisterende exception videre

Try {
  conn.Open
} Finally {
  conn.Close
}

Finally vil jo ALTID blive kørt
Avatar billede odegaard Nybegynder
16. maj 2003 - 11:44 #7
cyberfessor: Grunden til at jeg ikke smider den i finally, var netop for at kunne smide min exception, således at jeg stadig kan debugge. Og exception'en indeholder da alt hvad der er af information, så hvad ville være bedre at skrive?
Men i den sidste ende, så har du da ret i at man bør have den i finally.
Avatar billede burningice Nybegynder
16. maj 2003 - 16:36 #8
odegaard>> man kunne skrive en ny besked, ala Throw New Exception("Der skete en fejl under åbning af databasen")

Hvis man bare kaster en ny exception indeholdende den man har fanget, så er det hurtigere bare at lade den exception der evt. bliver kastet blive fanget senere i hireakiret...

Man kan dog stadigvæk uden problemer have en/flere catch-blokke selvom man har en finally-block.

Try {
  conn.Open
} Catch (OleDbException exc) {
  Throw New DataException("Der skete en fejl under åbningen af databasen", exc);
}
Finally {
  conn.Close
}
Avatar billede odegaard Nybegynder
16. maj 2003 - 20:10 #9
Min pointe er jo netop at den original exception indeholder MEGET mere information end din egen tolkning: "Der skete en fejl under åbning af databasen"
Hvor hvilken slags fejl?!?? Og skal jeg så til at fange samtlige mulige exceptions?
Avatar billede burningice Nybegynder
16. maj 2003 - 21:03 #10
odegaard>> hvis du kigger godt efter, så inkluderer jeg jo netop den exception jeg har fanget som InnerException i den nye jeg kaster.

Og ja, ideen er at man laver flere catch-blokke, alt efter hvilken slags exception der kan blive kastet. I dette tilfælde kan man læse sig til at OleDbException bliver kastet af OleDbConnection-klassen hvis der er noget der går galt... en optimal kode ville derfor nok være

Try {
  conn.Open
} Catch (OleDbException exc) {
  Throw New DataException("Der skete en fejl under åbningen af databasen", exc);
}
Catch (Exception exc) {
  Throw New Exception("Der skete en uventet fejl", exc);
}
Finally {
  conn.Close
}
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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