# Problem mit SQL Connection



## Pierro (30. Mai 2004)

Moins....

ich schreibe ein Anwendung die mittels GUI auf `ne SQL- Datenbank zugreift. Ist ein Studien- Projekt. Ich hab` nun zum Beispiel folgende Funktion, die auch funktioniert:


```
void freieKaefige_actionPerformed(ActionEvent e) {
    try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();

        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT * FROM penAvailability");

        // Daten einlesen und auf dem Bildschirm ausgeben
		textbereich.setText(null);
		int available;
        available = 1;
        while (rs.next())
        {

            if (available == 1)
            {
            	textbereich.append("Verfügbare Käfige: "+ rs.getString("Quantity")+"\t\n");
            	available++;
            }
            else
            textbereich.append( "Belegte Käfige: " + rs.getString("Quantity")+"\t\n");
        }
        //alle Objekte schließen
        st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
  }
```

Hier wird das Ganze über einen dropdown-Menüeintrag aktiviert. Ich habe dann zum Beispiel folgende Funktion, die ich bei Bedarf aufrufen möchte und die an einem button auf der GUI hängt:


```
void abschicken_entlassen_actionPerformed(ActionEvent e) {
  	
  	try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        String tiernummer2 = kaefignummer_einweisung_combo1.getItemAt(kaefignummer_einweisung_combo1.getSelectedIndex()).toString();
        //Query ausführen
        ResultSet rs;
        textbereich.setText(null);
        st.execute("delete from petpen where penNo = '" + tiernummer2 + "'");
        st.executeUpdate("update pen set penStatus = 'A' where penNo = (select penNo from petpen where petNo = '" + tiernummer2 + "'");
        textbereich.setText("Das Tier mit der Nummer " + tiernummer2 + " wurde erfolgreich entlassen!"); 
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        textbereich.setText("Die Aktion konnte nicht durchgeführt werden. Bitte überprüfen Sie Ihre Verbindung zur Datenbank.");
    }


  }
```

Hier krieg ich aber immer `ne NullPointer exception! Also in jder Funktion auf der GUI. Folgende Fehlermeldung kommt dann zum Beispiel:

```
java.lang.NullPointerException
        at fenster.abschicken_entlassen_actionPerformed(fenster.java:492)
        at fenster$12.actionPerformed(fenster.java:237)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:17
86)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1839)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:245)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2
31)
        at java.awt.Component.processMouseEvent(Component.java:5100)
        at java.awt.Component.processEvent(Component.java:4897)
        at java.awt.Container.processEvent(Container.java:1569)
        at java.awt.Component.dispatchEventImpl(Component.java:3615)
        at java.awt.Container.dispatchEventImpl(Container.java:1627)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
        at java.awt.Container.dispatchEventImpl(Container.java:1613)
        at java.awt.Window.dispatchEventImpl(Window.java:1606)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
java.lang.NullPointerException
        at fenster.abschicken_entlassen_actionPerformed(fenster.java:492)
        at ActionListener.actionPerformed(fenster.java:660)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:17
86)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1839)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:245)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:2
31)
        at java.awt.Component.processMouseEvent(Component.java:5100)
        at java.awt.Component.processEvent(Component.java:4897)
        at java.awt.Container.processEvent(Container.java:1569)
        at java.awt.Component.dispatchEventImpl(Component.java:3615)
        at java.awt.Container.dispatchEventImpl(Container.java:1627)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483
)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
        at java.awt.Container.dispatchEventImpl(Container.java:1613)
        at java.awt.Window.dispatchEventImpl(Window.java:1606)
        at java.awt.Component.dispatchEvent(Component.java:3477)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:201)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

        at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
```

Das Problem ist immer folgende Zeile:


```
st = connection.createStatement();
```

Es wird alles compiliert aber zur Laufzeit dann immer dieser Fehler. Ich weiß einfach nicht woran es liegt zumal es über das Menü ja funktioniert bei anderen Funktionen.  

Ich habe auch einige Funktionen geschrieben die ich im Konstruktor aufrufe weil sofort auf der GUI einige Tabellendaten erscheinen sollen. also sowas:


```
void kaefignummer_einweisung_combo_auswahl(){
	
try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT penNo FROM pen where penStatus = 'A'");
		String test = "test";
        textbereich.setText(null);
        while (rs.next())
        {
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           kaefignummer_einweisung_combo.addItem(makeObj(rs.getString("penNo")));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  }
```

Hier kommt dann auch nach Start des Programms gleich die Nullpointer Exception, die sich immer auf die connection- Zeile bezieht.

Ich hoffe die Beschreibung ist ausführlich genug und jemand kann helfen...

Also danke schonmal und gute Nacht...

Gruß Pierre

P.S. Noch was anderes:

Ich hab als Überschriften Buttons genommen. War wahrscheinlich nicht so clever... disabled kann man ja nix mehr lesen ;-) Gibt es ne Möglichkeit einen JButton zu disablen aber im Aussehen nicht zu verändern? Bzw. einfach die Schriftfarbe zu setzen?


----------



## DP (30. Mai 2004)

dann ist dein connection-object null bzw. closed.

bau mal folgendes für deine connection ein:



> Connection conn;
> Class.forName("com.mysql.jdbc.Driver").newInstance();
> conn = DriverManager.getConnection("jdbc:mysql://localhost/db1?user=1&password=pw");



dann sollte das mit deinem statement klappen. 

btw: nicht vergessen, die connection zu töten wenn dein query vorbei ist.

grüße


----------



## Pierro (30. Mai 2004)

Also in einer eigenen Klasse in der ich den login bewerkstellige baue ich die connection so auf:


```
try {
    	//JDBC-Treiber-Klasse laden
        Class.forName("com.inet.tds.TdsDriver").newInstance();
	    // Timeout-Wert (Sek.) für Login- und Query setzen
 	    DriverManager.setLoginTimeout(10);
        // Datenbank-Connection herstellen
       Connection connection = DriverManager.getConnection(s_url,"s_username","s_passwort");
        // Datenbank auswählen
       connection.setCatalog("s_dbname");
        frame.connection = connection;
	}
    catch (Exception e) {
        e.printStackTrace();
      //  System.exit(0);
    }
```

Und das Ganze funktoiniert ja auch für die Methoden, die an Dropdown-Menüpunkten hängen. Kann damit ohne Probleme die Datenbank auslesen. Warum aber ist für die buttons die auf der GUI liegen der Wert NULL? Das kann ich einfach nicht nachvollziehen. der Compiler merkt ja auch nix, connection muss also bekannt sein. Warum ist diese aber leer?


----------



## Pierro (30. Mai 2004)

Ich poste mal den kompletten Quellcode für diese Klasse. Vielelicht sieht ja jemand auf Anhieb warum das Ganze nicht läuft:


```
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.*;
import javax.swing.border.*;
import java.sql.*;


/**
 * 

Title: Stationäre Aufnahme von Haustieren</p>
 * 

Description: Es können Tiere Zwingern zugeordnet werden.</p>
 * 

Copyright: Copyright (c) 2004</p>
 * 

Pierre Aden</p>
 * @author Pierre Aden
 * @version 1.0
 */



public class fenster extends JFrame {
	
public static String s_url = "jdbc:inetdae:139.13.31.131:1435";
public static String s_username;
public static String s_password;
private static String s_dbname = "DBXXXXXXX";
public Connection connection;
public Statement st;
  JPanel contentPane;
  JMenuBar jMenuBar1 = new JMenuBar();
  JMenu jMenuFile = new JMenu();
  JMenuItem jMenuFileExit = new JMenuItem();
  JMenu jMenuHelp = new JMenu();
  JMenuItem jMenuHelpAbout = new JMenuItem();
  JMenu anzeigen = new JMenu();
  JMenuItem kaefigBelegung = new JMenuItem();
  JMenuItem freieKaefige = new JMenuItem();
  JMenuItem kaefigDetails = new JMenuItem();
  JTextArea textbereich = new JTextArea();
  JScrollPane ScrPnlItemStock = new JScrollPane(textbereich,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

  JButton belegen = new JButton();
  JButton kaefig_nummer = new JButton();
  JButton belegt_frei = new JButton();
  JComboBox kaefignummer_combo = new JComboBox();
  JComboBox belegt_frei_combo = new JComboBox();
  TitledBorder titledBorder1;
  TitledBorder titledBorder2;
  JButton abschicken_belegt_frei = new JButton();
  JButton einweisen = new JButton();
  JButton kaefig_nummer_einweisung = new JButton();
  JButton tiername_einweisung = new JButton();
  JComboBox kaefignummer_einweisung_combo = new JComboBox();
  JComboBox tiername_einweisung_combo = new JComboBox();
  JButton abschicken_einweisung = new JButton();
  JButton entlassen = new JButton();
  JButton tiername_entlassen = new JButton();
  JButton abschicken_entlassen = new JButton();
  JComboBox kaefignummer_einweisung_combo1 = new JComboBox();
  

  //Construct the frame
  public fenster() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
      
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

private Object makeObj(final String item)  {
     return new Object() { public String toString() { return item; } };
   }
   
   

  //Component initialization
  private void jbInit() throws Exception  {


    contentPane = (JPanel) this.getContentPane();
    titledBorder1 = new TitledBorder("");
    titledBorder2 = new TitledBorder("");
    contentPane.setLayout(null);
    this.setSize(new Dimension(640, 530));
    this.setTitle("Stationäre Aufnahme");
    jMenuFile.setText("Programm");
    jMenuFileExit.setText("beenden");

    jMenuFileExit.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMenuFileExit_actionPerformed(e);
      }
    });
    //jMenuFileExit.addActionListener(new fenster_jMenuFileExit_ActionAdapter(this));

    anzeigen.setText("Anzeigen");
    kaefigBelegung.setText("aktuelle Käfigbelegung");
    freieKaefige.setText("Anzahl freier / belegter Käfige");
    kaefigDetails.setText("Käfigdetails anzeigen");

    kaefigBelegung.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kaefigBelegung_actionPerformed(e);
      }
    });

    freieKaefige.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        freieKaefige_actionPerformed(e);
      }
    });

    kaefigDetails.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kaefigDetails_actionPerformed(e);
      }
    });

	
    jMenuHelp.setText("Hilfe");
    jMenuHelpAbout.setText("Über");
    jMenuHelpAbout.addActionListener(new fenster_jMenuHelpAbout_ActionAdapter(this));
    // Textbereich anlegen
    textbereich.setDisabledTextColor(Color.black);
    textbereich.setEditable(true);
    textbereich.setText("");
    textbereich.setBounds(new Rectangle(0, 270, 630, 160));
    ScrPnlItemStock.setBounds(new Rectangle(5, 295, 625, 173));
    // Menü anzeigen
    belegen.setBounds(new Rectangle(1, 6, 158, 26));
    belegen.setEnabled(false);
    belegen.setFont(new java.awt.Font("Serif", 1, 14));
    belegen.setForeground(Color.white);
    belegen.setBorder(titledBorder2);
    belegen.setDebugGraphicsOptions(0);
    belegen.setDoubleBuffered(false);
    belegen.setToolTipText("");
    belegen.setContentAreaFilled(true);
    belegen.setDisabledIcon(null);
    belegen.setFocusPainted(true);
    belegen.setRolloverEnabled(false);
    belegen.setText("Käfig belegt / frei");

    kaefig_nummer.setText("Käfignummer");
    kaefig_nummer.setBounds(new Rectangle(0, 35, 157, 30));
    kaefig_nummer.setEnabled(false);
    belegt_frei.setBounds(new Rectangle(166, 35, 151, 30));
    belegt_frei.setEnabled(false);
    belegt_frei.setFont(new java.awt.Font("MS Sans Serif", 0, 11));
    belegt_frei.setText("belegt /frei");
    kaefignummer_combo.setToolTipText("Hier bitte die den zu kennzeichnenden Käfig auswählen");
    kaefignummer_combo.setBounds(new Rectangle(1, 67, 155, 21));
    
    kaefignummer_combo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kaefignummer_combo_actionPerformed(e);
      }
    });
    
    
    belegt_frei_combo.setBackground(Color.white);
    belegt_frei_combo.setAlignmentX((float) 0.5);
    belegt_frei_combo.setToolTipText("Käfig als belegt / frei kennzeichnen");
    belegt_frei_combo.setBounds(new Rectangle(166, 67, 152, 20));
    belegt_frei_combo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        belegt_frei_combo_actionPerformed(e);
      }
    });
    abschicken_belegt_frei.setBounds(new Rectangle(327, 63, 109, 22));
    abschicken_belegt_frei.setFont(new java.awt.Font("Dialog", 1, 11));
    abschicken_belegt_frei.setToolTipText("Auswahl bestätigen und in Datenbank erfassen.");
    abschicken_belegt_frei.setText("Abschicken");
    abschicken_belegt_frei.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        abschicken_belegt_frei_actionPerformed(e);
      }
    });
    einweisen.setText("Tier einweisen");
    einweisen.setBorder(titledBorder2);
    einweisen.setFont(new java.awt.Font("Serif", 1, 14));
    einweisen.setBounds(new Rectangle(1, 107, 158, 26));
    einweisen.setEnabled(false);
    kaefig_nummer_einweisung.setBounds(new Rectangle(0, 136, 154, 30));
    kaefig_nummer_einweisung.setEnabled(false);
    kaefig_nummer_einweisung.setText("Käfignummer");
    tiername_einweisung.setText("Tiernummer");
    tiername_einweisung.setBounds(new Rectangle(167, 136, 151, 30));
    tiername_einweisung.setEnabled(false);
    kaefignummer_einweisung_combo.setToolTipText("Bitte Käfignummer des Käfigs auswählen, ich welchen das Tier eingewiesen " +
    "werden soll.");
    kaefignummer_einweisung_combo.setBounds(new Rectangle(1, 169, 155, 21));
    kaefignummer_einweisung_combo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kaefignummer_einweisung_combo_actionPerformed(e);
      }
    });
    tiername_einweisung_combo.setToolTipText("Nr. des Tieres, welches dem Käfig zugeordnet werden soll.");
    tiername_einweisung_combo.setVerifyInputWhenFocusTarget(true);
    tiername_einweisung_combo.setBounds(new Rectangle(167, 169, 152, 19));
    tiername_einweisung_combo.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        tiername_einweisung_combo_actionPerformed(e);
      }
    });
    abschicken_einweisung.setText("Abschicken");
    abschicken_einweisung.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        abschicken_einweisung_actionPerformed(e);
      }
    });
    abschicken_einweisung.setFont(new java.awt.Font("Dialog", 1, 11));
    abschicken_einweisung.setToolTipText("Auswahl bestätigen und in Datenbank erfassen.");
    abschicken_einweisung.setBounds(new Rectangle(327, 167, 109, 22));
    entlassen.setBounds(new Rectangle(-1, 204, 155, 26));
    entlassen.setEnabled(false);
    entlassen.setFont(new java.awt.Font("Serif", 1, 14));
    entlassen.setBorder(titledBorder2);
    entlassen.setText("Tier entlassen");
    tiername_entlassen.setBounds(new Rectangle(2, 233, 151, 30));
    tiername_entlassen.setEnabled(false);
    tiername_entlassen.setAlignmentX((float) 0.0);
    tiername_entlassen.setText("Tiernummer");
    abschicken_entlassen.setBounds(new Rectangle(163, 264, 109, 22));
    abschicken_entlassen.setFont(new java.awt.Font("Dialog", 1, 11));
    abschicken_entlassen.setToolTipText("Auswahl bestätigen und in Datenbank erfassen.");
    abschicken_entlassen.setText("Abschicken");
    abschicken_entlassen.addActionListener(new ActionListener(this));
    abschicken_entlassen.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        abschicken_entlassen_actionPerformed(e);
      }
    });
    kaefignummer_einweisung_combo1.setToolTipText("Name des Tieres, welches aus seinem Käfig entlassen wird.");
    kaefignummer_einweisung_combo1.setBounds(new Rectangle(1, 265, 153, 21));
    kaefignummer_einweisung_combo1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kaefignummer_einweisung_combo1_actionPerformed(e);
      }
    });
    jMenuFile.add(jMenuFileExit);
    jMenuHelp.add(jMenuHelpAbout);
    // Elemente des Menüs anzeigen
    anzeigen.add(kaefigBelegung);
    anzeigen.add(freieKaefige);
    anzeigen.add(kaefigDetails);
    jMenuBar1.add(jMenuFile);
    jMenuBar1.add(anzeigen);
    jMenuBar1.add(jMenuHelp);
    contentPane.add(kaefig_nummer, null);
    contentPane.add(belegen, null);
    this.setJMenuBar(jMenuBar1);
    this.setResizable(false);
    textbereich.setEnabled(false);
    contentPane.add(belegt_frei, null);
    contentPane.add(abschicken_belegt_frei, null);
    contentPane.add(belegt_frei_combo, null);
    contentPane.add(kaefignummer_combo, null);
    contentPane.add(tiername_entlassen, null);
    contentPane.add(entlassen, null);
    contentPane.add(kaefignummer_einweisung_combo, null);
    contentPane.add(tiername_einweisung_combo, null);
    contentPane.add(kaefig_nummer_einweisung, null);
    contentPane.add(tiername_einweisung, null);
    contentPane.add(kaefignummer_einweisung_combo1, null);
    contentPane.add(einweisen, null);
    contentPane.add(abschicken_entlassen, null);
    contentPane.add(abschicken_einweisung, null);
    contentPane.add(ScrPnlItemStock, null);
    kaefignummer_combo_auswahl();
    belegt_frei_combo_auswahl();
    kaefignummer_einweisung_combo_auswahl();
    tiername_einweisung_combo_auswahl();
    kaefignummer_einweisung_combo1_auswahl();
}
    
  	

  
  //File | Exit action performed
  public void jMenuFileExit_actionPerformed(ActionEvent e) {
    System.exit(0);
  }
  //Help | About action performed
  public void jMenuHelpAbout_actionPerformed(ActionEvent e) {
    fenster_AboutBox dlg = new fenster_AboutBox(this);
    Dimension dlgSize = dlg.getPreferredSize();
    Dimension frmSize = getSize();
    Point loc = getLocation();
    dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
    dlg.setModal(true);
    dlg.pack();
    dlg.show();
  }
  //Overridden so we can exit when window is closed
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      jMenuFileExit_actionPerformed(null);
    }
  }


  void kaefigBelegung_actionPerformed(ActionEvent e) {
    try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();

        //Query ausführen
        ResultSet rs = st.executeQuery("select * from petpen");

        // Daten einlesen und auf dem Bildschirm ausgeben
        // nur Projektname und Mittel werden ausgegeben
		textbereich.setText(null);
		textbereich.append( "Käfignummer	Tiernummer	Einlieferung am		entlassen am		Kommentar"+"\t\n");
		while (rs.next())
        {
        	textbereich.append("    "+ rs.getString("penNo")+"\t");
        	textbereich.append("   "+ rs.getString("petNo")+"\t");
        	textbereich.append(""+ rs.getString("DateIn")+"\t");
        	textbereich.append(""+ rs.getString("DateOut")+"\t");
        	textbereich.append(""+ rs.getString("comments")+"\t\n");
        }
        //alle Objekte schließen
        st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
  }

// Anzahl der freien / belegten Käfige wird ausgegeben.
void freieKaefige_actionPerformed(ActionEvent e) {
    try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();

        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT * FROM penAvailability");

        // Daten einlesen und auf dem Bildschirm ausgeben
        // nur Projektname und Mittel werden ausgegeben
		textbereich.setText(null);
		int available;
        available = 1;
        while (rs.next())
        {

            if (available == 1)
            {
            	textbereich.append("Verfügbare Käfige: "+ rs.getString("Quantity")+"\t\n");
            	available++;
            }
            else
            textbereich.append( "Belegte Käfige: " + rs.getString("Quantity")+"\t\n");
        }
        //alle Objekte schließen
        st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
  }

void kaefigDetails_actionPerformed(ActionEvent e) {
    try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();

        //Query ausführen
        ResultSet rs = st.executeQuery("select * from pen");

        // Daten einlesen und auf dem Bildschirm ausgeben
        // nur Projektname und Mittel werden ausgegeben
		textbereich.setText(null);
		textbereich.append( "Käfignummer	Kapazität	Verfügbar/ Nicht verfügbar	Klinik Nr."+"\t\n");
		while (rs.next())
        {
        	textbereich.append("    "+ rs.getString("penNo")+"\t");
        	textbereich.append("   "+ rs.getString("penCapacity")+"\t");
        	textbereich.append("	  		"+ rs.getString("penStatus")+"\t");
        	textbereich.append("	   "+ rs.getString("clinicNo")+"\t\n");
        }
        //alle Objekte schließen
        st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
  }
  

  void kaefignummer_combo_actionPerformed(ActionEvent e) {
   	  
  }


  void belegt_frei_combo_actionPerformed(ActionEvent e) {

  }

  void kaefignummer_einweisung_combo_actionPerformed(ActionEvent e) {

  }

  void tiername_einweisung_combo_actionPerformed(ActionEvent e) {

  }

  void kaefignummer_einweisung_combo1_actionPerformed(ActionEvent e) {
  	

  }

  void abschicken_belegt_frei_actionPerformed(ActionEvent e) {
  	try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        String nummer1 = kaefignummer_combo.getItemAt(kaefignummer_combo.getSelectedIndex()).toString();
        String belegt_frei1 = belegt_frei_combo.getItemAt(belegt_frei_combo.getSelectedIndex()).toString();
        //Query ausführen
        ResultSet rs;
        textbereich.setText(null);
        if (belegt_frei1.equals("frei"))
        {
        	st.executeUpdate("update pen set penStatus = 'A' where penNo = '" + nummer1 + "'");
        	textbereich.setText("Der Käfig mit der Nummer " + nummer1 + " wurde erfolgreich als " + belegt_frei1 + " gekennzeichnet."); 
    	}
        else
        	{
        	st.executeUpdate("update pen set penStatus = 'N' where penNo = '" + nummer1 + "'");
        	textbereich.setText("Der Käfig mit der Nummer " + nummer1 + " wurde erfolgreich als " + belegt_frei1 + " gekennzeichnet.");	
        	}
        
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        textbereich.setText("Die Aktion konnte nicht durchgeführt werden. Bitte überprüfen Sie Ihre Verbindung zur Datenbank.");
    }

  } 

  

  void abschicken_einweisung_actionPerformed(ActionEvent e) {
  	try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        String nummer2 = kaefignummer_einweisung_combo.getItemAt(kaefignummer_einweisung_combo.getSelectedIndex()).toString();
        String tiername1 = tiername_einweisung_combo.getItemAt(tiername_einweisung_combo.getSelectedIndex()).toString();
        //Query ausführen
        ResultSet rs;
        textbereich.setText(null);
        st.execute("insert into petPen values('" + nummer2 + "','" + tiername1 +"', '" + "12.5.2004" + "', '',''))");
        st.executeUpdate("update pen set penStatus = 'N' where penNo = '" + nummer2 + "'");
        textbereich.setText("Das Tier mit der Nummer " + tiername1 + " wurde erfolgreich dem Käfig mit der Nummer " + nummer2 + " zugeordnet."); 
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        textbereich.setText("Die Aktion konnte nicht durchgeführt werden. Bitte überprüfen Sie Ihre Verbindung zur Datenbank.");
    }


  }

  void abschicken_entlassen_actionPerformed(ActionEvent e) {
  	
  	try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        String tiernummer2 = kaefignummer_einweisung_combo1.getItemAt(kaefignummer_einweisung_combo1.getSelectedIndex()).toString();
        //Query ausführen
        ResultSet rs;
        textbereich.setText(null);
        st.execute("delete from petpen where penNo = '" + tiernummer2 + "'");
        st.executeUpdate("update pen set penStatus = 'A' where penNo = (select penNo from petpen where petNo = '" + tiernummer2 + "'");
        textbereich.setText("Das Tier mit der Nummer " + tiernummer2 + " wurde erfolgreich entlassen!"); 
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        textbereich.setText("Die Aktion konnte nicht durchgeführt werden. Bitte überprüfen Sie Ihre Verbindung zur Datenbank.");
    }


  }

  
  
 void kaefignummer_combo_auswahl(){
 try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT penNo FROM pen");
		String test = "test";
        textbereich.setText(null);
        while (rs.next())
        {
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           kaefignummer_combo.addItem(makeObj(rs.getString("penNo")));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  } 
 
 
 void belegt_frei_combo_auswahl(){
 
        
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           belegt_frei_combo.addItem(makeObj("frei"));
           belegt_frei_combo.addItem(makeObj("belegt"));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
   



void kaefignummer_einweisung_combo_auswahl(){
	
try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT penNo FROM pen where penStatus = 'A'");
		String test = "test";
        textbereich.setText(null);
        while (rs.next())
        {
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           kaefignummer_einweisung_combo.addItem(makeObj(rs.getString("penNo")));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  }
  

void tiername_einweisung_combo_auswahl(){
	
try
    {
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT petNo FROM pet");
		String test = "test";
        textbereich.setText(null);
        while (rs.next())
        {
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           kaefignummer_einweisung_combo.addItem(makeObj(rs.getString("petNo")));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  }
  
  
void kaefignummer_einweisung_combo1_auswahl(){
	
try
    {
        
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT petNo FROM pet");
		String test = "test";
        textbereich.setText(null);
        while (rs.next())
        {
           // kaefignummer_combo.addItem(rs.getString("penNo"));
           kaefignummer_einweisung_combo1.addItem(makeObj(rs.getString("petNo,petName")));
          //  textbereich.append( rs.getString("mittel")+"\t\n");
        }
        //alle Objekte schließen
      //  st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  }
  

	
}

class fenster_jMenuHelpAbout_ActionAdapter implements java.awt.event.ActionListener {
  fenster adaptee;

  fenster_jMenuHelpAbout_ActionAdapter(fenster adaptee) {
    this.adaptee = adaptee;
  }
  public void actionPerformed(ActionEvent e) {
    adaptee.jMenuHelpAbout_actionPerformed(e);
  }


}


	

class ActionListener implements java.awt.event.ActionListener {
  fenster adaptee;

  ActionListener(fenster adaptee) {
    this.adaptee = adaptee;
  }
   public void actionPerformed(ActionEvent e) {
   adaptee.abschicken_entlassen_actionPerformed(e);
    
  }
}
```

Das Ganze hab ich mit dem JBuilder erstellt. 

Diese Methode zum Beispiel funktioniert:


```
void freieKaefige_actionPerformed(ActionEvent e)
```

Dieser hier zum Beispiel nicht:

```
void kaefignummer_combo_auswahl()
```

Ist bestimmt offensichtlich aber ich seh den Wald vor lauter Bäumen nicht....


----------



## Freakazoid (31. Mai 2004)

moin pierre...
klingt verdammt nach db2 bei prof wulff :lol:  :lol:  :lol: 
hehe,hatte ich letztes semester auch.....

hab gerade keine zeit mir das weiter anzuschauen,kann das aber gerne heute abend mal überfliegen,oder sonst morgen....ich schreib dich dann mal über icq an wenn ick was finde,hab dich ja noch von st2 drin :roll: 

gr33tz Timo


----------



## Guest (31. Mai 2004)

Hi Timo,

ist ja witzig, Du tummelst Dich auch hier? Die Welt ist klein ;-). Ja, das ist die Aufgabe bei Wulff. Ganz schön viel Arbeit der Kram... und das neben Multimedia. Damit bin ich zum Glück jetzt durch.

Die DB Anwendung läuft einigermaßen bis auf einige Probleme. Manches konnte ich inzwischen schon lösen. Einen connect bekomme ich immerhin aber es tauchen weitere Probleme auf. Wäre nett wenn Du Dir das mal angucken könntest. Sag dann am besten vorher eben Bescheid damit ich Dir den aktuellen Stand zuschicken kann.

Gruß Pierro


----------



## Pierro (31. Mai 2004)

oops... da war ich nicht eingeloggt. Der Gast war natürlich ich ;-).


----------



## Jaraz (31. Mai 2004)

Pierro hat gesagt.:
			
		

> Diese Methode zum Beispiel funktioniert:
> 
> 
> ```
> ...



Bei dem Quellcode den du gepostet hast, mit Sicherheit nicht.
Es sei denn du öffnest eine Connection von außen, was mich bei deiner Art zu proggen nicht wundern würde.



			
				Pierro hat gesagt.:
			
		

> Ist bestimmt offensichtlich aber ich seh den Wald vor lauter Bäumen nicht....



Du siehst den Fehler vor lauter schlechtem Code nicht.

Alles in eine Klasse, da kannste auch Shellscripte schreiben.
Ansicht, Datenhaltung und Controller gemischt bis zum geht nicht mehr, wer soll das denn nachher lesen.
Klassen schreibt man klein.

Studierst du wirklich, gibt es zu der Vorlesung eine Internetseite?

Gruß Jaraz


----------



## Pierro (31. Mai 2004)

Kein Grund beleidigend zu werden. Ich habe nie behauptet dass das Programm ein Lehrbeispiel für guten Code ist. Ich hab`  die GUI mit JBuilder erstellt und daher war das dann alles eine Klasse. Sicher hätte man das übersichtlicher gestalten können aber da ich ewig nicht programmiert hab` wollte ich mich halt nicht mit den Zugriffsproblemen quälen die ich oft hatte. Das Teil soll nur laufen, ich hab` noch andere Sachen zu tun.

Also bitte konstruktive Vorschläge wie das Problem zu lösen ist oder , auf altkluge Sprüche kann ich gut vezichten. Wenn ich meinen Code bewerten lassen will dann schreib ich das schon. 

Außerdem studiere ich Wirtschaftsinformatik und nicht Informatik, ich will also kein Programmierer werden.

Gruß Pierre


----------



## Jaraz (31. Mai 2004)

Hi,

wenn du das als Beleidigung aufgefasst hast, tut mir das leid.
Ich kann nur einfach nicht verstehen warum sich Leute ohne jede Struktur an größere Aufgabestellungen versuchen und sich dann wundern warum das ganze nicht funktioniert und mit Try and Error Stunden verschwenden in denen sie die Prinzipien locker hätten lernen können.

Schlußendlich heißt es dann Java ist eine schlechte Programmiersprache.

Im großen und ganzen ging der Vorwurf an deinen Dozent und nicht an dich, deswegen auch die Frage ob es zu der Vorlesung Materialien im Netz gibt.

Die Lösung wurde schon gepostet, deine Connection ist null und du musst Sie am besten im Konstruktor füllen.

 Class.forName("...").newInstance();
 connection = DriverManager.getConnection("..."); 

Die Punkte mit den Werten deines JDBC Treibers füllen.

Gruß Jaraz


----------



## Pierro (31. Mai 2004)

Hi,

unsere Dozenten versuchen und schon das "dirty programming" abzugewöhnen . Das klappt bei mir halt nicht so wirklich weil ich wie gesagt lange nix mit Java gemacht habe und oft Probleme damit hatte, dass ich auf bestimmte Sachen nicht zugreifen konnte weil ich schlicht vergessen hatte wie es geht. Aus Bequemlichkeit macht man dann halt alles in einer Klasse.

Klar, nicht die beste Methode aber ich programmiere einfach zu selten und vergesse viele Grundlagen daher wieder. Und aus Zeitdruck kann ich das nun auch nicht alles wieder lernen sondern probiere das Programm zum laufen zu bekommen. Wenn ich damit durch bin verspreche ich auch, mir mal über die gundsätzliche Struktur von Programmen Gedanken zu machen ;-). Das kommt in der Tat etwas kurz in Vorlesungen...

back to topic:

Das mit der connection hab` ich nun hinbekommen wenn ich auch noch immer nicht verstanden habe warum die Menüpunkte keine connection aufgebaut haben mussten im Konstruktor sonden auch so funktionieren. Ich habe ja ein Klasse, die den Login bewerkstelligt und die dann die connection aufbaut. Die gepostete Klasse Fenster kann dann aber nix damit anfangen, außer die Menüpunkte eben. Es funktioniert jedenfalls wenn ich der Klasse Fenster im Konstrukter nochmal die connection generiere. Was solls....

Es bleiben noch einige andere Probleme. Ich habe es immerhin endlich hinbekommen ein aktuelles Datum im Format dd.mm.yyyy an sql zu übergeben, bin reichlich stolz auf mich. Wenn mich schon keiner lobt muss ich es eben selber machen . 

Es bleiben 2 größere Probleme:

1. Die Tabellenstruktur gibt vor, dass  eine Nummer als char gespeichert wird. Dadurch sortiert sql natürlich so:

1
10
11
.
.
.
2
20
21
.
.
.

usw. Kann ich sql dazu überreden das richtig zu sortieren durch irgendein "order by" oder so oder muss das Feld in der Tabelle integer werden um das zu bewerkstelligen. Das möchte er nicht wegen diverser Fremdschlüssel- Probleme.


2.

Ich habe folgende Funktion, die aus einer Combobox Werte ausliest und daraus ein sql- statement generiert: 

```
void abschicken_entlassen_actionPerformed(ActionEvent e) {
  	
  if (kaefignummer_einweisung_combo1.getItemCount() > 0)
	  {
	  	try
	    {
	        //Statement erzeugen
	        Statement st = connection.createStatement();
	        String tiernummer2 = kaefignummer_einweisung_combo1.getItemAt(kaefignummer_einweisung_combo1.getSelectedIndex()).toString();
	        
	        //Query ausführen
	        ResultSet rs;
	        textbereich.setText(null);
	        textbereich.setText("Das Tier mit der Nummer " + tiernummer2 + " wurde erfolgreich entlassen!");
	        st.executeUpdate("update pen set penStatus = 'A' where penNo = (select penNo from petpen where petNo = '" + tiernummer2 + "')");
	        st.execute("delete from petpen where petNo = '" + tiernummer2 + "'");
	        
	        
	        
	        tiername_einweisung_combo.removeAllItems();
	        tiername_einweisung_combo_auswahl();
	        
	        kaefignummer_einweisung_combo.removeAllItems();
	        kaefignummer_einweisung_combo_auswahl();
	        	        
	        kaefignummer_einweisung_combo1.removeAllItems();
           kaefignummer_einweisung_combo1_auswahl();
	         
	        //alle Objekte schließen
	        st.close();
	    }
	    catch (Exception ex)
	    {
	        ex.printStackTrace();
	        textbereich.setText("Die Aktion konnte nicht durchgeführt werden. Bitte überprüfen Sie Ihre Verbindung zur Datenbank.");
	    }
	}

  }
```

Die Funktion 


```
kaefignummer_einweisung_combo1.removeAllItems();
```

verursacht einen Fehler. Anstatt nur den aktuellen Wert aus der Combobox zu lesen und die delete Anweisung durchzuführen werden immer gleich 2 Werte durch die aufrufende Funktion  gelöscht. Ich seh einfach nicht, wo ich ihn das Ganze 2 mal durchlaufen lasse?! Hier die Funktion, welche die Combobox füllt:


```
void kaefignummer_einweisung_combo1_auswahl(){
	
try
    {
        
        
        //Statement erzeugen
        Statement st = connection.createStatement();
        //Query ausführen
        ResultSet rs = st.executeQuery("SELECT petNo FROM pet where petNo in (select petNo from petpen)");
 
        while (rs.next())
        {
           kaefignummer_einweisung_combo1.addItem(makeObj(rs.getString("petNo")));
        }
        //alle Objekte schließen
        st.close();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }

  }
```


Kann sich jemand erklären, warum hier 2 Werte gelöscht werden und nicht nur einer? ich lösche doch nur alle items aus der Liste der Combobox und füge dann wieder alle jetzt noch vorhandenen wieder hinzu?

Danke und Gruß

Pierre


----------



## Jaraz (31. Mai 2004)

Pierro hat gesagt.:
			
		

> Das mit der connection hab` ich nun hinbekommen wenn ich auch noch immer nicht verstanden habe warum die Menüpunkte keine connection aufgebaut haben mussten im Konstruktor sonden auch so funktionieren. Ich habe ja ein Klasse, die den Login bewerkstelligt und die dann die connection aufbaut. Die gepostete Klasse Fenster kann dann aber nix damit anfangen, außer die Menüpunkte eben. Es funktioniert jedenfalls wenn ich der Klasse Fenster im Konstrukter nochmal die connection generiere. Was solls....



Ah, jetzt habe ich auch die Übergabe gefunden.  :wink: 
frame.connection = connection; 

Also ist die Frage warum die connection auf einmal null ist?

Erzeugst du im weiteren Verlauf vielleicht einen zweiten Frame und arbeitest mit dem weiter?
Wird login auch immer vorher aufgerufen? Falls nicht, kommt natürlich keine Verbindung zustande.

Gruß Jaraz


----------



## Pierro (31. Mai 2004)

Einen zweiten Frame baue ich nicht auf, es läuft allem in einem. Mir war wohl einfach nicht klar, dass die connection vorher wieder aufgebaut werden muss... Naja, funzt ja nun, bedankt!

Hast du vielleicht noch `ne Idee die anderen beiden Punkte betreffend?

greetz Pierre


----------



## Pierro (31. Mai 2004)

Yo,

SELECT CONVERT (INTEGER, petNo) as petNo
FROM pet order by petNo

hat den gewünschten Effekt gebracht.

Zum anderen Problem:

Ich hatte 2 action listener an nem Button, daher ist der Kram immer 2 mal ausgeführt worden.

Vielen Dank für die Hilfe, das wars von mir ;-)

greetz Pierro


----------

