# ClassNotFoundException bei verschiedenen MS SQL Treibern trotz Classpath-Eintrag



## ebug (19. Sep 2012)

Hallo!

Ich habe folgendes Problem:

Ich bekomme meine Datenbankanbindung leider nicht hin, wir sind von einem Derby-Server auf einen MS SQL-Server umgezogen (Entscheidung von oben) und ich muss meine Apps dementsprechend anpassen. Leider bekomme ich im Debugging immer eine ClassNotFoundException in der Zeile in der ich den Treiber registrieren will. 

Ich habe zuerst den Treiber von Sourceforge genommen (jtds-1.2.6.jar), da war mein Code wie folgt:


```
try
{
	Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
	Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://123.456.78:1433/db", "user", "pwd");
	DatabaseConnection(connection);
}
...
```

Danach habe ich stattdessen den Microsoft-Treiber (sqljdbc4.jar) eingebunden:


```
try 
{
	Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
	Connection connection = DriverManager.getConnection("jdbc:microsoft:sqlserver://123.456.78:1433/db;user=sa;password=bla");
	DatabaseConnection(connection);
}
...
```

und dann nachdem ich gegoogled hab:


```
try 
{
	Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	Connection connection = DriverManager.getConnection("jdbc:sqlserver://123.456.78:1433/db;user=sa;password=bla");
	DatabaseConnection(connection);
}
...
```

Ich habe auch die jars eingebunden, wenn ich die durchsehe finde ich die entsprechenden Klassen auch. Ich habe inzwischen auch alle möglichen Foren / Hilfeseiten durchforstet, hat alles nix geholfen, da geht es immer nur um den Unterschied zwischen den letzten beiden Codes (SQLS2000/2005).

Was mache ich denn falsch? Hoffe ihr habt eine Idee!

Danke und Gruß
ebug


----------



## SlaterB (20. Sep 2012)

ich habe gerade sqljdbc4.jar von 
Download: Microsoft JDBC Driver 4.0 for SQL Server - Microsoft Download Center - Download Details
geladen, aus der 2.3 MB-Variante

damit gibts bei mir bei Java 1.5 zwar 'UnsupportedClassVersionError: Bad version number in .class file',
aber das wäre ja schon besser als ClassNotFoundException..,
wie bindest du die Jars ein, ist das geübt oder eher provisorisch? ist das Jar in der Auflistung des ClassPaths bei Ausführung,
siehe Programm unten? (ein neues sauberes Programm, gleich in neuem Projekt, ist sowieso gut,
wenn es da geht wäre das für sich gut und kann man immer noch versuchen den Fehler im alten Programm zu finden)

funktioniert zur Übung wiederum, ein altes Jar neu einzubinden (und zwar so dass erst eine Klasse nicht gefunden wird, dann aber durch genau ähnliche Aktion doch?)
im Zweifel ein eigenes Jar mit komplett neuer unbekannter Klasse erstellen, wird die gefunden, aber Treiber-Jars weiterhin nicht?
auf gleichen Ort auf der Festplatte usw. geachtet, nicht "Libararies x,y binde ich so ein, für Library z mache ich es mal ganz anders'

Konsole, IDE, .. ? 


```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        String path = System.getProperty("java.class.path");
        String[] parts = path.split(";");
        for (String part : parts)
        {
            System.out.println(part);
        }
        Class c = Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        System.out.println(c);

    }
}
```


----------



## ebug (20. Sep 2012)

dein Codeschnipsel spuckt mir folgendes aus:

C:\workspace\Test\bin
C:\<ordnereineranderensoftware>\lib\sqljdbc4.jar
class com.microsoft.sqlserver.jdbc.SQLServerDriver

Die JARs binde ich für gewöhnlich wie folgt ein: rechtsklick auf Projekt -> Build Path -> Configure Build Path.. -> Libraries -> Add external JARs ... auswählen und bei Order and export auf select all. Bisher hatte ich damit auch keine Probleme.

Interessant ist, wenn ich in einer neuen Klasse folgenden Code ausführe:


```
public static void main(String[] args)
{    	
	try 
	{
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		Connection connection = DriverManager.getConnection("jdbc:sqlserver://123.4.5.67:1433;databaseName=testdb;user=sa;password=1234");
		DatabaseConnection(connection);
	} 
	catch (ClassNotFoundException e) {
			e.printStackTrace();
	} 
	catch (SQLException e) {
			e.printStackTrace();
	}    
}
    
public static void DatabaseConnection(Connection connection) throws SQLException
{
	Statement statement = connection.createStatement();
	ResultSet resultSet = statement.executeQuery("SELECT ID FROM TABELLE123");
	resultSet.next();
	System.out.println(resultSet.getInt(1));
}
```

Dann spuckt er mir die ID aus. Wenn ich das ganze allerdings Zeile für Zeile debugge sagt er mir bei Class.forName ClassNotFoundException


----------



## SlaterB (20. Sep 2012)

einem Debugger kann ich persönlich nichts abgewinnen, wer weiß schon was der für einen ClassPath benutzt oder sonstige beliebige Fehler einbaut,
klingt jetzt nicht besonders realistisch als Fehlerquelle, eine Erklärung müsste es wohl geben, kann ich nicht nennen

wenn das Programm aber im normalen Durchlauf funktioniert, dann ist das doch was,
mehr kann ich nicht beizutragen erhoffen

oder ist in einem anderen Projekt auch bei Normalablauf noch Sense?


----------



## turtle (21. Sep 2012)

Dann lass die Zeile doch mal weg

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

Diese braucht man den meisten JDBC-Treibern nicht!!


----------



## L-ectron-X (22. Sep 2012)

Vielleicht hilft das weiter: Datenbankverbindung (Java) ? Byte-Welt Wiki


----------

