# Fehler in Datenbankanbindung Servlet -> Access



## Rolf (21. Feb 2006)

Hi,
ich habe eine DB unter Access angelegt (EU). Dort ist eine Tabelle wormholes drin, mit ID, Bezeichnung, Eingang, Ausgang.

Habe diese unter Systemsteuerung->Verwaltung->ODBC auch eingebunden.

Wenn ich eine normale Klasse mit main-methode schreibe funktioniert das auch. Jedoch bei der Einbindung in nem Servlet gibs Probleme.

Fehlermeldung:
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben

Quellcode:

Wurmloch Klasse (Ausschnitte)

```
public Wurmloch(String id, String name, String eingang, String ausgang)
    {
        this.id = id;
        this.name = name;
        this.eingang = eingang;
        this.ausgang = ausgang;
    }

...

Connection con;
Statement st;
ResultSet rs;

...

public void add()
    {
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }
        catch(ClassNotFoundException e)
        {
            notFoundException = true;
            notFoundExplanation = e;
        }
        try
        {
            con = DriverManager.getConnection("jdbc:odbc:EU");
            st = con.createStatement();
            st.executeUpdate("INSERT INTO wormholes VALUES ('"+id+"','"+name+"','"+eingang+"','"+ausgang+"')");
            st.close();
            con.close();
        }
        catch(SQLException e)
        {
            sqlexception = e;
        }
    }
```

Servlet


```
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException 
    {
            PrintWriter out = response.getWriter();
            
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("Eingetragenes Wurmloch:
");
            
            Wurmloch a = new Wurmloch("6","6.tes","6","7");
            
            out.println(a.id+"
");
            out.println(a.name+"
");
            out.println(a.eingang+"
");
            out.println(a.ausgang+"
");
            
            a.add();
            
            if (a.notFoundException) out.println("ClassNotFound: "+a.notFoundExplanation);
            out.println("SQLEXCEPTION IN ADD: "+a.sqlexception); <--- HIER der Fehler
            out.println("</body>");
            out.println("</html>");
            
            out.close();
        
    }
    
   
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
```

Die Fehlermeldung an sich ist ja eindeutig.
Muss in das Tomcat Verzeichnis der Treiber für ODBC reingemacht werden? Wenn ja welcher wäre das und woher bekomme ich den?
Und warum findet er die Datenquelle nicht, obwohl sie bei ner normalen main method class gefunden wird, nur beim servlet nicht?


----------



## SamHotte (21. Feb 2006)

Bin mir nicht ganz sicher mit Servlets, aber müssen die Datenquellen da nicht in irgend so einem XML-Konfigurationsfile angegeben sein? Sowas wie der Deployment Descriptor?
Bei 'ner normalen Java-Anwendung (=Klasse mit main()-Methode) sucht die lokale VM den richtigen Treiber, bei einem Servlet muss man das dem Tomcat irgendwie sagen.


----------



## Bleiglanz (21. Feb 2006)

Systemsteuerung->Verwaltung->ODBC 

hast du sie als System DSN eingetragen? User DSN funzt normalerweise nicht!

und

läuft die Webanwendung auf dem gleichen Rechner?


----------



## Guest (21. Feb 2006)

ja die webandwendung läuft auf dem gleichen Rechner.

Ich hatte es als user-dns.
Hab dann jetzt mal das bei system-dns auch noch eingetragen.

Jetzt is die Fehlermeldung schon mal anders 0_o

-->> java.sql.SQLException: General error

Mit der web.xml denk ich mal läuft nix schief.

web.xml


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
  <servlet>
    <servlet-name>Wormhole</servlet-name>
    <servlet-class>Wormhole</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Wormhole</servlet-name>
    <url-pattern>/Wormhole</url-pattern>
  </servlet-mapping>
  
</web-app>
```

im webapps verzeichnis von tomcat hab ich ein Verzeichnis eu

Servlet ist zu erreichen über -> http://localhost:8080/eu/Wormhole

gesamte Servlet Ausgabe im Browser:

```
Eingetragenes Wurmloch:
6
6.tes
6
7
SQLEXCEPTION IN ADD: java.sql.SQLException: General error
```


----------



## SamHotte (21. Feb 2006)

Der General Error kommt mitunter (bei Access), wenn du den Index bereits eingefügt hast (in deinem Fall evtl. die ID) - schau mal nach, ob der Datensatz schon existiert.
Darüber hinaus solltest du evtl. gleich in der Wurmloch-Klasse beim Statement.executeUpdate(..) den Rückgabewert auswerten - das ist bei einem INSERT die Anzahl der eingefügten Datensätze.


----------



## Rolf (22. Feb 2006)

Ich habe nochmal die Datenbank aus der Verwaltung geschmissen.

Rechner neu gestartet und dann nochmal getestet und jetzt funktioniert es.

Habe dann nochmal das servlet jeweils mit der Datenbank in USER-DSN und System-DSN ausgeführt und tatsächlich,
bei USER-DSN findet er es nicht - unter obiger Fehlermeldung - und bei System-DSN geht das in die Tabelle eintragen einwandfrei.

Danke für die Hilfe


----------

