Avatar billede martin_schou Nybegynder
30. oktober 2001 - 11:27 Der er 15 kommentarer og
1 løsning

[ODBC Microsoft Access-driver] Der kan ikke åbnes flere tabeller.

Jeg får sommetider følgende besked, når jeg indsætter data i en Access-database:

\"java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Der kan ikke åbnes flere tabeller.\"

Når den fejl een gang er dukket op, så fortsætter den med at vise sit grimme ansigt. Hvis jeg venter ca 30 minutter, så forsvinder den, men det hjælper ikke at genstarte maskinen.

Der er heller ikke noget reelt mønster i forkomsten, da der een dag kan indsættes over 30.000 entries uden problemer, mens databasen dagen efter kokser, og giver fejlen fra sig efter en enkelt entry.

Nogle forslag (ud over at droppe Access - den vil jeg selv foreslå) til hvordan problemet løses eller hvad problemet er?
Avatar billede disky Nybegynder
30. oktober 2001 - 11:29 #1
hmmm.

det lyder som om du har et problem med for mange åbne connections samtidigt.

Glemmer du at lukke dem lukke dem efter brug ?

Eller hvis du bruge (som du forhåbentligt gør) pooling, at frigive dem til poolen igen ?
Avatar billede kresten Nybegynder
30. oktober 2001 - 11:29 #2
Husker du at lukke connection OVERALT når du har brugt dem?
Avatar billede kresten Nybegynder
30. oktober 2001 - 11:29 #3
doh! du er hurtig disky :)
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 11:35 #4
Connections bliver lukket i det øjeblik, jeg er færdig med den:
[kodestump]
  public void update(String SQLString) throws SQLStatementException
  {
    try
      {
        Statement SQLStatement = DBConnection.createStatement();
        SQLStatement.executeUpdate( SQLString );
        DBConnection.commit();
        SQLStatement.close();
      }
    catch( SQLException e )
      {
        throw new SQLStatementException( e.toString() + \"\\r\\n\" + SQLString );
      } 
  }
[/kodestump]

Det er denne metode, der kaldes, når der skal indsættes data.

Som det ses, kaldes SQLStatement.close() lige efter commit.
Avatar billede kresten Nybegynder
30. oktober 2001 - 11:39 #5
Hvis det er det eneste sted hvor du laver en connection til databasen så må det jo være noget andet.

Måske har det noget at gøre med at Access bare er en fil? Hvis nu OS\'et stadig tror at brugerne nr 1 til 12 stadig har filen åben og giver den måske ikke rettigheder til nr 13?? Prøv at find ud af hvor mange connections du kan have åbne og om der er en sammenhæng mellem antallet og settings i din ODBC??
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 11:39 #6
Hmm ...

\"java.sql.SQLException: [Microsoft][ODBC Microsoft Access-driver] Der kan ikke åbnes flere tabeller.
SELECT * FROM Rådata Where MålerID = 30 AND Tidspunkt >= #2001-10-18# ORDER BY Tidspunkt;
        at Database.SQLInterface.select(SQLInterface.java:103)\"

Havde sgu ikke lige lagt mærke til, at det var ved select, problemet forekom.

[kodestump]
  public ResultSet select(String SQLString) throws SQLStatementException
  {
    try
      {
        Statement SQLStatement = DBConnection.createStatement();
        java.sql.ResultSet resultat = SQLStatement.executeQuery( SQLString );
        //SQLStatement.close();
        return resultat;
      }
    catch( SQLException e )
      {
        throw new SQLStatementException( e.toString() + \"\\r\\n\" + SQLString );/* linje 103 */
      } 
  }
[/kodestump]

Svjh, har jeg udkommenteret SQLStatement.close(), fordi klassen ikke ville compile med det metodekald. Men det vil den, så hvorfor den er (var) udkommenteret, ved jeg sgu ikke helt.

Gad vide om det gør en forskel?
Avatar billede kresten Nybegynder
30. oktober 2001 - 11:40 #7
Du har jo kommenteret close() statementen ud??
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 11:45 #8
Hmm ... hvis jeg ikke har SQLStatement.close() udkommenteret i select(String SQLString), så får jeg følgende fejl:
\"java.sql.SQLException: ResultSet is closed
        at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(Unknown Source)
        at sun.jdbc.odbc.JdbcOdbcResultSet.next(Unknown Source)
        at Database.TabelObjekt.select(TabelObjekt.java:98)\"

Det er ikke ligefrem heldigt, for hvis jeg ikke kan bruge det ResultSet, søgningen returnerer, til noget, hvad er så pointen i at søge?

Tænkte nok, der var en god grund til, at jeg havde udkommenteret SQLStatement.close().
Avatar billede kresten Nybegynder
30. oktober 2001 - 11:49 #9
Det ser ud som om du laver noget i stil med...

1. Lav Select
2. Få resultat
3. Luk Connection
4. Brug data

Kan du så ikke ændre dit Statement Objekts scope sådan at du kan lukke den efter punkt 4? Eh, forstår du ved jeg mener? :)
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 11:51 #10
Det tror jeg, er meget svært, eller meget grimt. Så skal jeg returnere to objekter, eller lave et wrapper-objekt til at gemme de to objekter i.

Kan man ikke gøre det på en pænere måde?
Avatar billede kresten Nybegynder
30. oktober 2001 - 12:22 #11
Du kunne måske lavet et factory patteren af en art, men så er vi vist stadig over i den svære del.

Det er lidt svært at komme med et bud når jeg ikke kender din opbygning osv.
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 12:35 #12
http://www.eksperten.dk/spm/114653

Der kan du jo kigge lidt på min opbygning af databasetilgang.
Avatar billede bredgade Nybegynder
30. oktober 2001 - 14:03 #13
Fjern Commit, den kan forårsagde denne fejl.. Jeg havde problemet og fjernede den så løste det sig...
Avatar billede martin_schou Nybegynder
30. oktober 2001 - 14:06 #14
bredgade:
Der er ikke nogen commit i den metode, som foresager problemet [select(String SQLString)].
Avatar billede martin_schou Nybegynder
30. november 2001 - 08:16 #15
Disky: \"Eller hvis du bruge (som du forhåbentligt gør) pooling, at frigive dem til poolen igen ?\"

Uhm ... jeg bruger måske pooling ... hvordan finder jeg ud af det?
Avatar billede martin_schou Nybegynder
18. december 2001 - 10:29 #16
Øv ... der er åbenbart ikke nogen, der kan svare på spørgsmålet :-/
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
Kurser inden for grundlæggende programmering

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