# SQLException: No suitable driver bei DB2



## SchlechterInformatiker (29. Jan 2009)

Hallo allerseits, bin mal wieder hier um ne dumme Frage zu stellen:

Dieser Code...


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Datenbank
{
	public static void main(String[] args)
	{
      Connection cn = null;
      Statement  st = null;
      ResultSet  rs = null;

      try 
      {
		Class.forName("COM.ibm.db2.jdbc.net.DB2Driver");
		java.sql.Driver d = (java.sql.Driver)Class.forName("COM.ibm.db2.jdbc.net.DB2Driver").newInstance();
		System.out.println(d.acceptsURL("jdbc:db2:Test"));
      }
      catch (ClassNotFoundException e) 
      {
		e.printStackTrace();
	  } 
      catch (InstantiationException e) 
      {
		e.printStackTrace();
	} catch (IllegalAccessException e) 
	{
		e.printStackTrace();
	} catch (SQLException e) 
	{
		e.printStackTrace();
	}
      try 
      {
		cn = DriverManager.getConnection("jdbc:db2:Test","db2admin","test");
      } 
      catch (SQLException e) 
      {
		e.printStackTrace();
      }
	}
}
```

...liefert folgende Ausgabe



```
false
java.sql.SQLException: No suitable driver found for jdbc:db2:Test
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at Datenbank.main(Datenbank.java:37)
```

Wenn ich aber 


```
System.out.println(d.acceptsURL("jdbc:db2://localhost:50000/Test"));
```

und


```
cn = DriverManager.getConnection("jdbc:db2://localhost:50000/Test","db2admin","test08");
```


verwende, funktioniert es.

Wenn ich das nun ohne den Umweg "localhost" machen will, wie muss ich das dann machen bzw. was ist an "jdbc:db2:Test" so falsch? Laut Tutorials müsste das doch auch funktionieren...


----------



## tfa (29. Jan 2009)

Welches Tutorial? Nimm lieber die Dokumentation des DB2-Treibers.
Die jdbc-URL von DB2 muss eben den Hostnamen enthalten, sonst gibt's den Fehler.


----------



## SchlechterInformatiker (29. Jan 2009)

Mein Tutorial:

http://beuter.dynalias.com/javainsel7/javainsel_22_005.htm#mj730ba4edc8f42232f7127d9e51c2c803

Unter Punkt 22.5.5 steht in der Tabelle



> jdbc:derby:net://host:1527/


Das sieht für mich auch so aus als ob da noch eine IP-Adresse bzw. localhost hinein muss, aber bei DB2 steht



> jdbc:db2://database



Mit


```
cn = DriverManager.getConnection("jdbc:db2://Test","db2admin","test");
```

hat's auch nicht funktioniert.

Und auf der IBM Seite http://publib.boulder.ibm.com/infocenter/db2luw/v8//index.jsp hab ich folgendes gefunden unter
Entwickeln->Datenbankanwendungen->Programmieren von Anwendungen->Java->JDBC->Herstellen einer Verbindung zu einer Datenquelle->Herstellen einer Verbindung zu einer Datenquelle



> Syntax for a URL for the DB2 JDBC Type 2 Driver:
> 
> Read syntax diagramSkip visual syntax diagram>>-jdbc:db2:database-------------------------------------------><



Und ein Beispiel ist auch dabei:



> Example: Setting the user ID and password in a java.util.Properties object:
> 
> Properties properties = new Properties(); // Create Properties object
> properties.put("user", "db2adm");         // Set user ID for connection
> ...



Da steht ja auch 





> "String url = "jdbc:db2:toronto";


Demnach müsste es doch so auch gehen, wie ich ursprünglich vorhatte - ohne localhost usw. also, so in etwa:

```
cn = DriverManager.getConnection("jdbc:db2:Test","db2admin","test");
```

mfg


----------



## tfa (29. Jan 2009)

Das Tutorial von IBM gilt nur für den Typ2-Treiber. Oben siehst du die Treiberklasse:


> "COM.ibm.db2.jdbc.app.DB2Driver"



Du verwendest den Typ 3-Treiber (COM.ibm.db2.jdbc.net), da ist offensichtlich der Hostname Vorschrift. Versuch's mit Typ 2, obwohl der eigentlich veraltet ist. Oder nimm gleich Typ 4 (siehe anderer Thread) und gib den Hostnamen mit an, also localhost. Wo ist das Problem?

http://www.ibm.com/developerworks/data/library/techarticle/0307zikopoulos/0307zikopoulos.html


----------



## SchlechterInformatiker (29. Jan 2009)

Ahja, wenn in 

```
Class.forName("COM.ibm.db2.jdbc.net.DB2Driver");
```
 das _net_ durch _app_ ersetze, gehts mit 

```
cn = DriverManager.getConnection("jdbc:db2:Test","db2admin","test08");
```

Ist ja auch irgendwie verständlich dass eine IP gefordert wird wenn ich irgendwas aus dem net-Unterpaket nehme...
das kommt eben davon wenn man sich aus verschiedenen Tutorials und Beispielen irgendwas zusammenbastelt.

Wieder was gelernt. Ich schau mir das mit dem Typ4 Treiber mal an, allerdings ist das DB2 welches ich habe auch schon ziemlich alt...

Vielen Dank, tfa!



P.S.: Ein Problem war das nicht wirklich, es hat ja mit localhost funktioniert. Aber ich wills halt dann schon ganz genau wissen wenn etwas nicht so tut wie ich denke


----------

