# Prepared Statement



## noob (3. Feb 2005)

Ich hab eine MySQL - Datenbank und greife per Java darauf zu. Der Aufbau der Verbindung, das Absetzen von Abfragen läuft ohne Probleme. Jetzt möchte ich per Menü ein 2. Fenster ( JFrame ) öffnen um dort spezielle einzelne MySQL - Befehle besonders abzuarbeiten d.h. ich baue ein Fenster auf, in das ich alle Eingaben mache die für den Grant-Befehl nötig sind. Nach drücken des Buttons "Benutzer anlegen" soll der Grant - Befehl ( wenn möglich als Prepared Statement ) ausgeführt werden. Das alles funktioniert bis auf die Abarbeitung des Befehls, da kommt immer eine NullPointer - Fehlermeldung.

p.s.: Die Verbindung wird in der Klasse Verbindung aufgebaut / conn ist static, da ich ohne in nem anderen Programm-Teil nicht darauf zugreifen konnte.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.sql.*;
import java.io.*;
import java.util.Enumeration;

//Klasse für die Verarbeitung und Ausgabe von "Benutzer anlegen" 
public class Grant{
	
			public Grant(){
		
		Connection conn = null;
		
		PreparedStatement stmt = null;
		ResultSet res = null;
		
		User1.Texte("Aktuell geladene MySQL - Treiber ...");
		for ( Enumeration enum = DriverManager.getDrivers(); enum.hasMoreElements();){
			User1.Texte(enum.nextElement().getClass().getName());
					}
			User1.Texte("Verarbeitung beginnt");
			String sql = "grant all on shanor.* to test@localhost identified by 'test'";
			try{
				stmt = conn.prepareStatement(sql);
				}
				catch(SQLException e){
					User1.Texte("Fehler beim Ausführen der Abfrage: "+e);
				};
				
				try{
					stmt.executeUpdate(sql);
					User1.Texte("\r\nAnzahl Datensätze: "+stmt.getUpdateCount());
				}
				catch(SQLException e){
					User1.Texte("Fehler beim Ausführen " + e);
				}
				try{
					stmt.cancel();
					stmt.close();
				}
				catch(SQLException e){
					User1.Texte("Fehler beim Ausführen " +e);
				}
				try{
					stmt.cancel();
					stmt.close();
				}
				catch(SQLException e){
					User1.Texte("Fehler beim Ausführen " +e);
				}
				}
				}

Vielen Dank für Eure Hilfe...
```


----------



## foobar (3. Feb 2005)

In welcher Zeile fliegt die Exception?

Lass dir mal den Stacktrace ausgeben, dann siehtst du auch wo der Fehler auftritt.


----------



## noob (3. Feb 2005)

Der NullPointer ist bei Zeile 27 stmt = conn.prepareStatement(sql);
Das Programm läuft mindestens bis Zeile 24, da die dortige Meldung korrekt ausgegeben wird....


----------



## foobar (3. Feb 2005)

Du hast keine Connection erzeugt:

```
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb");
```


----------



## noob (3. Feb 2005)

Die Connection hab ich in der Klasse Verbindung erzeugt. Der Verbindungsaufbau funktioniert auch. Das Absetzen von Abfragen ( vom Hauptframe wo auch das Menü integriert ist ) funktioniert einwandfrei. Das obige Problem taucht nur auf, wenn ich vom Hauptframe aus einen neuen JFrame öffne ( wie mein Bsp. oben )...


----------



## abollm (3. Feb 2005)

noob hat gesagt.:
			
		

> Ich hab eine MySQL - Datenbank und greife per Java darauf zu. Der Aufbau der Verbindung, das Absetzen von Abfragen läuft ohne Probleme. Jetzt möchte ich per Menü ein 2. Fenster ( JFrame ) öffnen um dort spezielle einzelne MySQL - Befehle besonders abzuarbeiten d.h. ich baue ein Fenster auf, in das ich alle Eingaben mache die für den Grant-Befehl nötig sind. Nach drücken des Buttons "Benutzer anlegen" soll der Grant - Befehl ( wenn möglich als Prepared Statement ) ausgeführt werden. Das alles funktioniert bis auf die Abarbeitung des Befehls, da kommt immer eine NullPointer - Fehlermeldung.
> [..]


Na, ist ja gut, dass du dich jetzt registriert hast. Kannst du zu deinem vorhandenen Klassenaufbau einmal wesentliche Details geben? Dann glaube ich ist es für alle hier leichter zu beurteilen, wie man dir helfen kann.

Ich z.B. habe nicht genau verstanden, warum du nun unbedingt ein zweites JFrame per Menü für das Ausführen von SQL-Befehlen öffnen möchtest. Also insbesondere dann, wenn, wie du selbst schreibst, das Absetzen von Abfragen ohne Probleme läuft. Heißt das etwa, dass du die Abfrageergebnisse bisher auf der Konsole ausgiebst?


----------



## noob (3. Feb 2005)

Also das Programm ist folgendermaßen aufgebaut:
1. In der Main ist das Menü drin sowie der Aufruf für die Klasse mit der GUI
2. In der GUI - Klasse ( besteht aus JFrame u. JLabel u. JTextfield ) werden die Logindaten eingegeben und per Button wird die Klasse für die Connection geladen und es baut sich ne Verbindung auf. Desweiteren sind in dem GUI - Frame Felder für Ein- und Ausgabe ( jeweils eins  ) wo man eine Abfrage an die DB schicken kann und ne Ausgabe im Ausgabe-JTextArea anzeigen lassen kann
3. Connection - Klasse ( wie bereits oben erwähnt ) zum Aufbau der Verbindung
4. Abfrage - Klasse bekommt von der GUI die Abfrage ( getText()) und führt sie mit stmt.execute() aus. Die Ausgabe landet dann in der GUI - Klasse im Ausgabe - JTextArea.
Soweit läuft das alles auch

Jetzt möchte ich aber für meine DB ein paar spezielle Punkte so einrichten, das man nicht nen SQL-Befehl eigeben muß, sondern nur noch die fehlenden Parameter ( beim grant z.B.: den host, das pw, den namen, usw ). Leider macht mir das Programm hierbei eben jene oben genannten Probleme.
Diese Menüpunkte werde vom Main aus ( wo das Menü definiert ist ) aufgerufen. Es soll ein neues Fenster entstehen ( neuer JFrame ) mit Ein- u. Ausgabebereichten ( JTextfield, Jlabel usw. ). Soweit geht es ja auch noch. 

Dann sollen die Eingaben jedoch in den vorbereiteten Befehl eingefügt werden ( stmt.setString... ) und der Befehl ausgeführt werden. Da das nicht funktioniert hat hab ich es mal ohne die Parameter versucht d.h. den Befehl ganz eingegeben ( z.b.: grant all on .... ). Nur leider kommt hierbei das oben genannte Problem....

Ich hoffe ihr könnt hiermit was anfangen...


----------



## Bleiglanz (4. Feb 2005)

so wie dein Programm oben geschrieben ist, ist im Konstruktor von Grant() einfach conn = null (eine lokale Variable!!), du host dir nirgens eine Connection (z.B. vom DriverManager, oder per übergabe im Konsturktor)???

VERGISS ENDLICH DAS MIT DEM static conn

=> Übergibs einfach mit  public Grant(Connection conn) im Konstruktor


----------



## noob (4. Feb 2005)

Ich hab jetzt das static rausgenommen ( public Connection conn; )
Der Verbindungsaufbau funktioniert noch einwandfrei, doch kann ich nun auch vom Hauptframe aus ( GUI-Frame, der über den ich meine Login - Daten eingebe, eine Abfrage starten kann und mit einem JTextArea für die Ausgabe der Abfrage )keine Abfrage mehr starten.
Bisher hab ich natürlich via stmt = Connect.conn.... ( Connect die Klasse wo die Verbindung aufgebaut wird ) darauf zugegriffen und das geht ja nun nicht mehr ( wg. static ). Also hab ich Connect weggenommen. Nun kommt ein java.lang.NosuchMethodError, wohl weil beim Aufruf von Abfrage ( der Klasse wo die Abfrage Verarbeitet und eine Ausgabe erzeugt wird ) Abfrage A = new Abfrage ( ab.getText()) ja die Connection fehlt.

Das Problem ist jetzt, wenn ich folgendes Versuche geht es auch nicht ( s.u. ). Wie mach ich es richtig?

Abfrage - Aufruf:
Abfrage A = new Abfrage(Connection conn, ab.getText())

Abfrage - Klasse:
....
public Abfrage(Connection conn, String ab){


----------

