# No suitable driver



## Guest (20. Nov 2007)

Hallo

Ich möchte in mein Projekt die HSQLDB Datenbank einbinden, jedoch bekomme ich folgenden Fehler:


> java.sql.SQLException: No suitable driver


Habe auch schon mal rumgeschaut und es soll an dieser Zeile liegen:

```
Connection con =DriverManager.getConnection( "jdbc:hsqldb:file:E:/Java/Haus/DB","sa","");
```

Aber was stimmt daran nicht?
(Habe es auch schon ohne ...:file:... probiert, selbes Ergebnis)


----------



## thE_29 (21. Nov 2007)

Guckst du: http://www.torsten-horn.de/techdocs/java-sql.htm

Das fehlt dir: 
	
	
	
	





```
Class.forName( "org.hsqldb.jdbcDriver" );
```

Natürlich brauchst du dazu das Driver jar File (hsqldb.jar) 

Kriegst wahrscheinlich da: http://hsqldb.org/


----------



## Guest (21. Nov 2007)

hi
nee, habe ich in der Main (ok, habe ich auch nicht gesagt gehabt...)

glaube es liegt daran, dass ich beim Start einen Thread starte...
weil wenn der thread läuft und ich es dann aufrufe, bekomme ich die Fehlermeldung nicht...

aber Danke trotzdem ersteinmal


----------



## The_S (22. Nov 2007)

Zeig doch mal den kompletten Code. Evtl. wird (durch den Thread) versucht die Connection aufzubauen, bevor der Treiber überhaupt geladen wurde!?


----------



## Guest (22. Nov 2007)

Die Main:


```
public class Main 
{
	static JFrame frame;
	static Logger log = Logger.getLogger("de.myname.UseHSQLDB");
	public static void main(String[] args) 
	throws SQLException, ClassNotFoundException, UnknownHostException, IOException 
	{		
		
		frame = new Test();
		log.log(Level.INFO, "Starting to load JDBCDriver... ");
		Class.forName("org.hsqldb.jdbcDriver");
		log.log(Level.INFO, "JDBC Driver successfully loaded!");		
		frame.setBounds(10,35,295,770);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
```


Test:

```
class SThread extends Thread
{...}

public class Test extends JFrame implements MouseListener
{...
	public Test() throws UnknownHostException, IOException, SQLException
	{
		super("Test");
		{			
		    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		    JLabel label = new JLabel();
		    JPanel panel = new JPanel();
		    panel.add(label);
		    panel.setBackground(Color.blue);
		    this.getContentPane().add(panel);		    
		    SThread sthr = new SThread();
		    sthr.start();
		    checkdb.checkhouse();
			
		}
	}

}
```

Und, die CheckDB


```
public class checkdb
{
	static void checkhouse () throws SQLException
	{
		Connection con =DriverManager.getConnection( "jdbc:hsqldb:file:E:/Java/Haus/DB","sa","");					
		ResultSet rs;
		String sqlQuery;
		Statement stmt = con.createStatement();	
		sqlQuery = "SELECT * FROM haus";
		rs = stmt.executeQuery(sqlQuery);
		while (rs.next())
		{
			...
		};
	};
}
```


----------



## The_S (23. Nov 2007)

Mal von dem sehr gewöhnungsbedürftigen Code abgesehen (viel zu viel static, wo keines benötigt wird, Klassennamen schreibt man groß, ...), würde ich dir dringend raten, den Treiber BEVOR du die Connection aufbaust zu laden.


----------



## Gast (23. Nov 2007)

Hi...

jup, mit den Klassennamen haste recht, aber warum gewöhnungsbedürftiger Code?


----------



## The_S (23. Nov 2007)

wie gesagt, recht viel static benutzt, wo es imho nicht sein müsste. Und ansonsten schaut es so auch nicht unbedignt so gut strukturiert aus. Kann aber natürlich auch sein, dass ich mich irre, ich kenn das komplette Projekt/Klassen ja nicht.

Gehts jetzt?


----------



## Guest (23. Nov 2007)

Jup, jetzt geht's  :applaus: 
Lag an der MAIN:

ALTE:


			
				Anonymous hat gesagt.:
			
		

> Die Main:
> 
> 
> ```
> ...



NEUE:

```
public class Main 
{
	static JFrame frame;
	static Logger log = Logger.getLogger("de.myname.UseHSQLDB");
	public static void main(String[] args) 
	throws SQLException, ClassNotFoundException, UnknownHostException, IOException 
	{		
		log.log(Level.INFO, "Starting to load JDBCDriver... ");
		Class.forName("org.hsqldb.jdbcDriver");
		log.log(Level.INFO, "JDBC Driver successfully loaded!");		
		frame = new Test();																								<<---daran
		frame.setBounds(10,35,295,770);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
```

DANKEEEEEE


----------



## Gast (23. Nov 2007)

habe gerade mal wegen den "static" geschaut, ohne will Eclipse nicht...
(wenn du das in der Main gemeint hast...)


----------



## The_S (23. Nov 2007)

nein, ich mein nicht in der main-methode. Das muss static sein. Aber kannst dir ja bei Gelegenheit n bisschen was zu OOP durchlesen  .


----------



## Gast (23. Nov 2007)

hm, static wird nur das, wo es eclipse will, dass es static wird...


----------



## Guest (24. Nov 2007)

Habe ein weiteres "kleines" Problemchen und zwar rufe ich in der Test, die Fkt inhaus() aus der Klasse AllDB (ehemals checkdb) auf...

Das Problem besteht nun darin, wenn ich einen Datensatz einfüge, wird es auch bei "Ausgabe zur Kontrolle" korrekt dargestellt, jedoch wenn ich das Programm schliesse und aus der hsqldb/demo den DBManager aufrufe, steht der Datensatz nicht in der Tabelle.
Wenn ich mehrere Eingebe, wird jeweils der Letzte nicht mit reingeschrieben, obwohl er richtig angezeigt wird, bei "Ausgabe zur Kontrolle"



```
static String inhaus (String Strasse, String ort, int status) throws SQLException
{
	int j = -1;
	int adridx = 0;	
	Connection con = DriverManager.getConnection( "jdbc:hsqldb:file:E:/Java/Haus/DB","sa","");		
	stmt = con.createStatement();
	//---------------------------------------------------------------------------------------------------------------------------
	sqlQuery = "SELECT * FROM Adresse WHERE ort ='"+ort+"'";
	rs = stmt.executeQuery(sqlQuery);
	while (rs.next())
	{adridx = rs.getInt("adr_idx");}
	System.out.println("ort: "+ort+" / adridx: "+adridx);
	System.out.println("Strasse: "+Strasse);	
	//--------------------------------------------------------------------------------------------------------------------------- // Einschreiben in die Tabelle
	sqlQuery = "SELECT * FROM Familie";
	rs = stmt.executeQuery(sqlQuery);
	while (rs.next())
	{j++;}			//Zeilenanzahl vestimmen
	String sqlQuery1 = "INSERT INTO Familie (fam_Idx, Adr_Idx, Status, Status2, Strasse) VALUES ("+(j+1)+" ,"+adridx+", "+status+", 2, '"+Strasse+"')";
	stmt1 = con.createStatement();
	stmt1.executeUpdate(sqlQuery1);
	//--------------------------------------------------------------------------------------------------------------------------- //Ausgabe zur Kontrolle
	sqlQuery = "SELECT * FROM Familie";
	rs = stmt.executeQuery(sqlQuery);
	while (rs.next())
	{System.out.println("fam_Idx: "+rs.getInt("fam_Idx")+" /adr_Idx: "+rs.getInt("adr_Idx")+" /Status: "+rs.getInt("Status")+" /Status2: "+rs.getInt("Status2")+" /Strasse: "+rs.getString("Strasse")+" /TS: "+rs.getTimestamp("TS"));}
	stmt.close();
	con.close();
}
```

Hat da jemand eine Ahnung, wie man den letzten Datensatz noch mit reinbekommt?


----------



## The_S (24. Nov 2007)

Fährst du die Datenbank sauber runter?


----------



## Guest (24. Nov 2007)

hm, erwischt  :wink:
nee, hatte es drinne, aber wenn man mit dem X schliesst, wird es nicht ausgeführt...

werde ich noch ändern... Danke für den Hinweis!!!


----------



## thE_29 (26. Nov 2007)

Das Problem war, du hast den Frame erzeugt bevor du die Treiber geladen hast und deswegen hats den schön zerbrösselt weil er keinen Treiber gefunden hat!!


----------



## Guest (29. Nov 2007)

nee, es war schon so, das ich keinen Shutdown drinne hatte, wenn ich das Fenster mit "X" geschlossen hatte, weil erst durch den "Shutdown" speichert er den gecachten Datensatz (also den letzten) in die DB...

aber mit:

```
stmt.execute("Checkpoint");
```

soll es auch gehen...


----------

