# Was ist falsch?



## gote (22. Jan 2006)

Ich will ein Programm schreiben (im Moment Konsole und später in AWT) das PMs aus einer MySql Datenbank abfragt. Aber was ist an dem code falsch? er kann den treiber nicht finden. ich weiss nicht ob auch irgendwas daran falsch ist das das mysql online steht.im moment ist das eine betaversion die bundesländer einwoghner anzeigt. es geht mir nur um die richtige datenbankanbindung. hier der code:


```
//Java-Applikation mit Datenbankzugriff
import java.sql.*;

public class VocamusPM {
  public static void main (String args[])  {


    // Treiber laden 
    try  {
       Class.forName("com.mysql.jdbc.Driver");
    } 
    catch (Exception e)  {
       System.out.println("JDBC/ODBC-Treiber konnte nicht geladen werden.");
       return;
    }

    // Verbindung zu Datenbank aufbauen
    Statement  befehl     = null;
    Connection verbindung = null;
    try  {
       verbindung = DriverManager.getConnection (
                      "mysql.lima-city.de",
                      "derusername",
                      "meinpw");
       befehl = verbindung.createStatement();
    } 
    catch (Exception e)  {
       System.err.println("Verbindung zu konnte nicht hergestellt werden");
    }

    // Daten auslesen
    try {
       ResultSet datenmenge;
       datenmenge = befehl.executeQuery("SELECT * FROM bndlaender ORDER BY Bundesland;");

       // Überschriften ausgeben
       System.out.println();
       System.out.println("  Bundesland \t   Einwohner (in Mio) ");
       System.out.println();

       // Einzelne Datensätze ausgeben
       String land;
       int    einw;

       while(datenmenge.next())  {
         land = datenmenge.getString("Bundesland");
         einw = datenmenge.getInt("Einw (in Mio)");
         System.out.println("  "+land+" \t\t "+einw);
       }
  
       verbindung.close();
    }
    catch (Exception e) {
       e.printStackTrace();
    }
  }
}
```


----------



## gote (22. Jan 2006)

kennt sich keiner mit jdbc und mysql aus?


----------



## Xandro (23. Jan 2006)

Der Pfad zur MySQL-Connector-Treiberklasse ist falsch.

Probier mal folgendes:


```
Class.forName("org.gjt.mm.mysql.Driver");
```


----------



## Bleiglanz (23. Jan 2006)

forumssuche mysql classpath

du hast die jar nicht im Classpath


----------



## gote (23. Jan 2006)

ich hatte den treiber net im verzeichnís, trortdem danke


----------



## gote (23. Jan 2006)

So, ich bin weiter, jetzt hat er Stress mit MySQL. Was ist jetzt wieder am Löschenbefehl falsch?


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;


public class VocamusPM extends JFrame
{




VocamusPM(String titel)
{
super(titel);


setLayout(new FlowLayout());


setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


}



public static void main (String args[])  {
	
	 VocamusPM fenster = new VocamusPM("Vocamus PM");
	 fenster.pack();
	 fenster.setSize(300,75);
	 fenster.setVisible(true);

}
	 public void paint(Graphics g) {
	 
    // Treiber laden 
    try  {
       Class.forName("com.mysql.jdbc.Driver");
    } 
    catch (Exception e)  {
       System.out.println("JDBC/ODBC-Treiber konnte nicht geladen werden.");
       return;
    }

    // Verbindung zu Datenbank aufbauen
    Statement  befehl     = null;
    Connection verbindung = null;
    try  {
       verbindung = DriverManager.getConnection (
                      "jdbc:mysql://mysql.lima-city.de/DB199576841",
                      "MeinUsername",
                      "MeinPasswort");
       befehl = verbindung.createStatement();
    } 
    catch (Exception e)  {
       System.err.println("Verbindung zu konnte nicht hergestellt werden");
    }

    // Daten auslesen
    try {
       ResultSet datenmenge;
       datenmenge = befehl.executeQuery("SELECT * FROM PM ORDER BY Name;");

       // Überschriften ausgeben
       g.drawString("  An \t  Betreff \t Von \t ID",20,100);

       // Einzelne Datensätze ausgeben
       String name;
       String betreff;
       String von;
       int id;
       int nummer;
       String abgefragt;

       while(datenmenge.next())  {
         name = datenmenge.getString("Name");
         betreff = datenmenge.getString("Betreff");
         von = datenmenge.getString("Von");
         id = datenmenge.getInt("ID");
         nummer = datenmenge.getInt("Nummer");
         abgefragt = datenmenge.getString("Abgefragt");
         
         
        while (abgefragt == "n") {
        	int höhe = 250;
        	datenmenge = befehl.executeQuery("UPDATE PM Set Abgefragt = 'n' WHERE Abgefragt = 'n';");
            g.drawString("  " + name + "\t" + betreff + "\t" + von + "\t" + id,20,höhe);
            datenmenge = befehl.executeQuery("DELETE FROM PM WHERE Abgefragt=j;");            
            höhe += 20;
        }

       }
  
       verbindung.close();
    }
    catch (Exception e) {
       e.printStackTrace();
    }
  }

}
```


----------



## Roar (23. Jan 2006)

du meine güte! in der paint() methode MALT man. ich hab zwar schon einiges gesehen, aber ne sql abfrage in der paint() ... 
es reicht doch auch wenn die3 abfrage einmal ausgeführt wird, und nicht jedesmal wenn man das fenster resized, oder? 
außerdem schau nochmal in der faq wie man strings vergleicht :!:


----------



## gote (23. Jan 2006)

ich muss die abfragen doch so machen, sonst gehen doch die variebalen verloren weil die lokal sind.


----------



## Roar (23. Jan 2006)

speicher die daten halt zwischen, als instanzvariable, was du da machst is quark. hast du mal dein fenster resized und geguckt wioe lang das dauert bis sich die gui wieder aufgebaut hat?


----------



## gote (23. Jan 2006)

nathürlich ist das schwachsinn. der gibt nen error in der console aus und öffnet ein leeres fenster. ich versuch das mit ner klasse zu regeln.


----------



## gote (26. Jan 2006)

also, ich hab das jetzt geändert auf folgendes:


```
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.sql.*;


public class VocamusPM extends JFrame 
{ 


VocamusPM(String titel) 
{ 
super(titel); 


setLayout(new FlowLayout()); 


setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 


} 


public static void main (String args[])  { 
    
    VocamusPM fenster = new VocamusPM("Vocamus PM"); 
    fenster.pack(); 
    fenster.setSize(300,75); 
    fenster.setVisible(true); 


 
    } 

public void paint(Graphics g) {

	
	MySQL.verbinden();
	MySQL.auslesen();

	
}

}
```

und die Class MySQL:


```
import java.sql.*;
import java.awt.*;
 


public class MySQL {

	String name; 
	String betreff; 
	String von; 
	int id; 
	int nummer; 
	String abgefragt;
	
	
	MySQL() {

		

	}
	
	
	
	public static void verbinden() {
		
	    // Treiber laden 
	    try  { 
	       Class.forName("com.mysql.jdbc.Driver"); 
	    } 
	    catch (Exception e)  { 
	       System.out.println("JDBC/ODBC-Treiber konnte nicht geladen werden."); 
	       return; 
	    } 

	    // Verbindung zu Datenbank aufbauen 
	    Statement  befehl     = null; 
	    Connection verbindung = null; 
	    try  { 
	       verbindung = DriverManager.getConnection ( 
	                      "jdbc:mysql://mysql.lima-city.de/DB199576841", 
	                      "USER46908", 
	                      "25602560"); 
	       befehl = verbindung.createStatement(); 
	    } 
	    catch (Exception e)  { 
	       System.err.println("Verbindung zu konnte nicht hergestellt werden");
	       
	       
	    } 
	    
	    
	    
	    
	    
	}
	
	
	public static void auslesen() {
		
	    // Daten auslesen 
	    try { 
	       ResultSet datenmenge; 
	       datenmenge = befehl.executeQuery("SELECT * FROM PM ORDER BY Name;");
	    
	    
	       // Einzelne Datensätze ausgeben 

	    
	    
	    
	       while(datenmenge.next())  { 
	         name = datenmenge.getString("Name"); 
	         betreff = datenmenge.getString("Betreff"); 
	         von = datenmenge.getString("Von"); 
	         id = datenmenge.getInt("ID"); 
	         nummer = datenmenge.getInt("Nummer"); 
	         abgefragt = datenmenge.getString("Abgefragt"); 
	         
		       verbindung.close()
			    
			    catch (Exception e) { 
			       e.printStackTrace(); 	
		
		}
	         
	       }}
		

	
	

	    


}
```


Was ist daran schon wieder falsch? Das er mit drawString keine MySQL Variable ausgeben kann is mir klar, aber wie sonst?


----------



## PoiSoN (26. Jan 2006)

1.) Ich verstehe immer noch nicht, warum du die beiden Methoden in der paint aufrufst?? Warum machst du 
das nicht in der main?

2.) Wenn du SQL-Abfragen mit Java ausführst, benötigt der SQL-String kein Semikolon.

3.) Wie wärs wenn du einen parametrisierten Konstruktor VocamusPM(String,String,String,int,int,String)
anlegen würdest und diesen in der auslesen() mit den Werten aus der DB füllst. Diese VocamusPM-Objekte
kannst du dann als Array oder innerhalb eines Vectors zurückgeben und in deinem JFrame wie gewünscht 
innerhalb irgendwelcher Labels/Textareas/was auch immer ausgeben.


----------

