# Microsoft-SQL: No suitable driver found



## StYxXx (26. Apr 2010)

Hallo,

das Thema gab es schon ein paar mal, aber in den alten Threads steht nichts, was geholfen hat. Deswegen somit gleich mein erster Beitrag als neuer Hilfegesuch-Thread 

Ich habe folgendes Problem: Ich versuche auf Ubuntu mit Eclipse eine JSP-Anwendung zu basteln, die sich zu einem MSSQL-Server verbindet. Die Treiber habe ich runtergeladen und sie funktionieren auch mit fremden Anwendungen (z.B. "DBVisualizer"). Schreibe ich selbst etwas, erhalte ich jedoch immer: 

"java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver SQL-Fehler: java.sql.SQLException: No suitable driver found for jdbc:sqlserver://..."

Im Code steht: 

```
try {
   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(ClassNotFoundException ex)
{
 out.println("JDBC-Treiber nicht gefunden! " + ex);
}try {
   Connection oConnection =
 DriverManager.getConnection("jdbc:sqlserver://....
```

Ich habe bei Eclipse die sqljdbc4.jar und sqljdbc.jar zum Projekt hinzugefügt ("Java Build Path" -> "Libraries"), zudem die CLASSPATH-Umgebungsvariable gesetzt und auch geprüft. Trotzdem erhalte ich auch nach Tomcat-Neustart die obige Meldung schon bei bei Class.forName (".."). Ich habe schon abwechselnd mal die sqljdbc4.jar und die sqljdbc.jar getestet und auch den Name verdreht ("com.microsoft.jdbc.sqlserver.SQLServerDriver" statt "com.microsoft.sqlserver.jdbc.SQLServerDriver"). Half nichts. Die Serverangaben sind korrekt (wie gesagt, mit DBVisualizer geht es), der Code war ohnehin nur copy&paste vom eigentlichen Server mit absoluter Adressangabe.

echo $CLASSPATH sagt
".:/usr/share/Microsoft SQL Server JDBC Driver/sqljdbc_2.0/enu/sqljdbc4.jar" (hatte es auch ohne ".:" probiert), der Pfad stimmt. 
Hatte zudem die jars auch schon in "/usr/share/tomcat5.5/shared/lib/" kopiert, ebenso ohne Effekt.

Inzwischen weiß ich nicht mehr weiter und die ganzen Anleitungen, inkl. der von MS selbst, nennen keine neuen Tipps mehr.

Jemand eine Idee? 
Danke,
styxxx


----------



## maki (26. Apr 2010)

Ich nutz jTDS für sowas


----------



## bronks (26. Apr 2010)

maki hat gesagt.:


> Ich nutz jTDS für sowas


Ich nicht!


----------



## bronks (26. Apr 2010)

StYxXx hat gesagt.:


> ... Im Code steht:
> 
> ```
> ...
> ...



Richtig wäre: jdbc:microsoft:sqlserver://....


----------



## StYxXx (30. Apr 2010)

bronks hat gesagt.:


> Richtig wäre: jdbc:microsoft:sqlserver://....


Macht für das Problem keinen Unterschied, da der Fehler bereits früher bei Class.forName() ausgelöst wird. [edit: Habe es natürlich auch ausprobiert.] Auf einem Server geht es aber auch ohne "microsoft". :bahnhof:

jTDS sagt mir nichts, kann ja mal danach suchen. Letztendlich wäre es aber auch nur eine Umgehung des Problems, keine Lösung


----------



## Bartleby (30. Apr 2010)

Wo tritt die Exception denn nun genau auf? 

```
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver SQL-Fehler: 
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://..."
```
kann doch nicht beim Class.forName() auftreten - woher soll er denn die angegebene jdbc-Adresse nehmen?
Außerdem passt die Fehlermeldung auch nicht zu deinem Codeschnipsel, da müsste ja "JDBC-Treiber nicht gefunden! " ausgegeben werden.

Ich bin mir nicht ganz sicher, wo der Fehler denn nun eigentlich auftritt, da du einmal von Eclipse und einmal vom Tomcat schreibst.
Aber versuche die Klasse "com.microsoft.sqlserver.jdbc.SQLServerDriver" doch mal im Eclipse zu öffnen (einfach via Strg+Shift+T), dann siehst du in welchem jar sie liegt und ob die Schreibweise korrekt ist. Wenn nun eine ClassNotFoundException auftritt, liegt dieses jar definitiv nicht im Classpath.

Alternativ könntest du noch versuchen,

```
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance()
```
aufzurufen, damit wird der Treiber definitiv beim DriverManager registriert, wo ich mir ohne newInstance() nicht sicher bin.


----------



## L-ectron-X (30. Apr 2010)

Schau dir das mal an: Datenbankverbindung (Java) - Byte-Welt Wiki
Hilft das?


----------



## StYxXx (1. Mai 2010)

Bartleby hat gesagt.:


> Wo tritt die Exception denn nun genau auf?
> 
> Außerdem passt die Fehlermeldung auch nicht zu deinem Codeschnipsel, da müsste ja "JDBC-Treiber nicht gefunden! " ausgegeben werden.


Ah, du hast recht. Ich hab zuviel abgekürzt, sorry für die Verwirrung. Fehlermeldungen treten an beiden Stellen auf. Nochmal der Code, wie er jetzt aussieht, diesmal mit allen wichtigen Stellen:


```
<%@ page language="java" import="java.sql.*,javax.naming.*,javax.sql.*" %>

<%

try {
   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
}
catch(ClassNotFoundException ex)
{
 out.println("JDBC-Treiber nicht gefunden! " + ex);
}try {
   Connection oConnection =
DriverManager.getConnection("jdbc:sqlserver://<adresse>:<port>;databaseName=<name>;user=<user>;password=<kennwort>");

  // HTML-Zeugs
  
   oConnection.close();

}
catch(SQLException sql)
{
 out.println("SQL-Fehler: " + sql);
}%>
```

Und die Fehlermeldung lautet:


> JDBC-Treiber nicht gefunden! java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver SQL-Fehler: java.sql.SQLException: No suitable driver found for jdbc:sqlserver://<adresse>:<port>;databaseName=<name>;user=<user>;password=<kennwort>



Ich hatte selbst übersehen, dass es sich hier um zwei Fehlermeldungen handelt. 



Bartleby hat gesagt.:


> Ich bin mir nicht ganz sicher, wo der Fehler denn nun eigentlich auftritt, da du einmal von Eclipse und einmal vom Tomcat schreibst.
> Aber versuche die Klasse "com.microsoft.sqlserver.jdbc.SQLServerDriver" doch mal im Eclipse zu öffnen (einfach via Strg+Shift+T), dann siehst du in welchem jar sie liegt und ob die Schreibweise korrekt ist. Wenn nun eine ClassNotFoundException auftritt, liegt dieses jar definitiv nicht im Classpath.



Ich nutze Eclipse, Tomcat 5.5 habe ich ebenfalls installiert und wird von Eclipse gestartet. Ich las, dass man die Treiber nicht nur bei Eclipe einbinden, sondern auch in diverse Tomcat-Verzeichnisse kopieren soll, damit sowas funktioniert. Ob das stimmt, weiß ich natürlich nicht. Hab die jar-Dateien aber auf jeden Fall ohne Wirkung auch in Tomcats Unterverzeichnisse kopiert (einmal nach "/usr/share/tomcat5.5/server/lib"  und einmal nach "/usr/share/tomcat5.5/shared/lib" - "/usr/share/tomcat5.5" ist das Tomcat-Installationsverzeichnis). Außerdem habe ich eine $CLASSPATH-Umgebungsvariable angelegt, die nach einigen Spielereien nun folgendes ausgibt:


> echo $CLASSPATH
> .:/usr/share/tomcat5.5/shared/lib:/usr/share/Microsoft SQL Server JDBC Driver/sqljdbc_2.0/enu/sqljdbc4.jar:/usr/share/jTDS - SQL Server and Sybase JDBC driver


 bzw. jetzt nach nochmaliger Änderung ".:/usr/share/tomcat5.5/shared/lib/sqljdbc.jar". Im Grunde habe ich da schon alles ausprobiert einzutragen. Dachte, das wäre auch in jedem Fall nötig.

In Eclipse habe ich die jar-Dateien über "Project" -> "Properties" -> "Java Build Path" -> "Add external JARs" hinugefügt. 
Bei "Open Type" wusste ich nicht genau, was ich eingeben sollte. Tippe ich allerdings "jdbc" findet es auch sowas wie "JDBCCallSyntaxTranslator - com.microsoft.sqlserver.jdbc" und unten steht "com.microsoft.sqlserver.jdbc - /usr/sha...DBC Driver/sqljdbc_2.0/enu/sqljdbc.jar" (letzteres der Pfad, in welchem die Treiber liegen), was für mich so klingt, als wäre der Treiber definitiv gefunden worden, sonst würde Eclipse nichts darüber wissen. Bei Doppelklick kommt nur, dass kein Quelltext angehängt wäre und mir wird der Syntax für Methoden der CallSyntaxTranslator-Klasse gezeigt. Sieht für mich ok aus?

Das mit dem newInstance() habe ich probiert, ändert nichts (siehe Code oben). Im Wiki steht es eigentlich genauso, wie ich es gemacht habe.

Bei den jTDS-Treibern habe ich jedoch das gleiche Problem, also ebenfalls die ClassNotFound-Fehlermeldung (java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver), obwohl ich dort nach Anleitung vorging und über "Open Type" einiges finde. Sieht also so aus, als gäbe es ein allgemeines Problem mit den nichtgefundenen Klassen. Kann es sein, dass Tomcat die nicht findet, Eclipse aber schon? Dann wäre auch die Frage, warum nichts gefunden wird. ???:L


----------



## JohannisderKaeufer (5. Mai 2010)

Ersetze in deinem Code


```
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
```
durch

```
new com.microsoft.sqlserver.jdbc.SQLServerDriver();
```

Damit siehst du in Eclipse gleich ob die entsprechende Klasse im Classpath auftaucht und das während dem Compilieren.

Wenn das dann klappt, kannst du es wieder in obiges ändern.


----------



## StYxXx (7. Mai 2010)

Huhu,

danke für den Tipp.
Zunächst gibt es in der Eclipse-IDE die Meldung "cannot be resolved to a type". Füge ich die sqljdbc.jar oder die sqljdbc4.jar zum Build-Path hinzu (wie ja oben getan), verschwindet diese Fehlermeldung und auch die Autovervollständigung während dem Tippen funktioniert (zumindest bist "com.microsoft.sqlserver.jdbc"). Man sollte meinen, alles wäre ok.
Aber beim Aufruf der entsprechenden Seite auf dem Webserver (nach "run on server" auf http://127.0.0.1:8182/test/test.jsp) kommt im Browser:


> type Exception report
> 
> message
> 
> ...




Was mit noch aufgefallen ist:
"<%@page import="com.microsoft.sqlserver.jdbc.*"%>" verursacht beim Seitenaufruf keinen Fehler und "<%@page import="com.microsoft.sqlserver.jdbc.SQLServerDriver"%>" einen "Only a type can be imported. com.microsoft.sqlserver.jdbc.SQLServerDriver resolves to a package"-Fehler (die Eclipse-IDE meldet nie was). Heißt das nicht, dass auch was gefunden wird?


----------



## StYxXx (11. Mai 2010)

Hab's noch immer nicht rausbekommen


----------



## maki (11. Mai 2010)

Du solltest die jar in deinen WEB-INF/lib stecken, sonst wird das nix.
CLASSPATH Variable kannst du getrost vergessen, bei WebApps sowieso, aber nicht nur da.

Ach ja, diesen Code solltest du nicht in einer JSP verpacken, dafür gibt es Servlets.


----------

