Zum Inhalt springen

probleme mit JDBC


Lufos

Empfohlene Beiträge

hi,

ich soll für ein praktikum(SQL,datanbanken) auch 3 java aufgaben lösen und stoße da an meine grenzen...von java hab ich nicht den geringsten schimmer und nach stundenlangem suchen im internet konnte ich wenigstens die erste lösen(laden des oracle treibers und verbinden mit der db)

zum 2. problem: es geht speziell darum, eine einfrage mit dem absenden einer abfrage zu verbinden. ich habe absolut keine ahnung was ich machen soll und wäre über jeden ratschlag mehr als dankbar.

hier der code:

/**

     * Ausfuehrung der DB-Anfrage

     */

    private void executeQuery(){

        try {

            // @@TO DO@@

            // Verbinden Sie hier die eingebene Einfrage mit dem Absenden einer Abfrage

            // Hinweis: Das Textfeld heißt "txtQuery"



            //Erzeugung eines Statements

            Statement statement = connection.createStatement();

            //Holen Ergebnismenge der Anfrage

            ResultSet resultSet = statement.executeQuery(query);

            showResult(resultSet);

            //Schliessen des ResultSets

            resultSet.close();

        } catch (SQLException e) {

            JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler beim Ausführen der Abfrage", JOptionPane.ERROR_MESSAGE);

            e.printStackTrace();

        }        

    }


    /**

     * Ausgabe der Ergebnismenge in der TextArea

     */

    private void showResult(ResultSet resultSet){

        try {

            this.txtResult.setText("");

            // Holen der Metadaten der Datenbank

            ResultSetMetaData metaData = resultSet.getMetaData();

            // Anzahl der Tabellenspalten

            int number = metaData.getColumnCount();

            // Ausgabe der Spaltennamen 

            addTextToArea("\n");

            for (int i=1;i<=number;i++){

                // Name der Tabellenspalte

                String name = metaData.getColumnName(i);

                // Ausgabe der Spaltennamen in der TextArea

                addTextToArea(name + "   ");

            }

            addTextToArea("\n");

            addTextToArea("--------------------------------\n");

bei der dritten aufgabe steht nur "Geben Sie die Spaltenwerte zeilenweise aus"

da der obrige code für mich chinesisch ist, weis ich gar nit was die von mir wollen =(.

ich erwarte nicht, dass ihr das problem für mich löst, ein paar tips wären ganz nett, da ich wirklich null ahnung von java habe.

mfg

Lufos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

kannst du die Aufgabe mal präzisieren? Du sollst von einer Anfrage die Ergebnisse ausgeben? Ansonsten erfolgt das ungefähr nach folgenden Schema.

Achtung: ResultSet beginnt immer bei 1 nicht bei 0! Deshalb Frage ich den Tabellennamen mit rs.getString(1) ab.

Bsp.: Abfrage aller Tabellen


PreparedStatement ps = null;

ResultSet rs = null;

try {

  String stm = "select t.table_name from user_tables t order by t.table_name";

   ps = con.prepareStatement(stm);

   rs = ps.executeQuery();


   while (rs.next()) {

              System.out.println( rs.getString(1) );

    }

 } finally {

   if (rs != null)

       rs.close();

    if (ps != null)

   ps.close();

  }

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke.nein kann ich leider nicht. das ist schon die originalaufgabenstellung im code. nochmal rauskopiert:

// @@TO DO@@

// Verbinden Sie hier die eingebene Einfrage mit dem Absenden einer Abfrage

// Hinweis: Das Textfeld heißt "txtQuery"

mehr infos habe ich nicht.ich weis ja selber nicht mal was ich machen soll^^.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, also du hast

 ResultSet resultSet = statement.executeQuery(query);

d.h. du hast irgendwo einen String "query"... Diesen sollt nun sicher mit einem Textfeld verbinden.
query = txtQuery.getText();

und das wohl in einer Action-Methode die von irgendeinen OK-Button ausgeführt wird! Hast eine Action-Methode?

1. String belegen

2. executeQuery() aufrufen

Link zu diesem Kommentar
Auf anderen Seiten teilen

so wie ich das verstanden habe, wird gleich oben im quellcode der button und das textfeld mit "null" initialisiert. ich kopiere einfach mal den gesamten quellcode hierrein und markiere die aufgabenstellungen farbig.

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;


import java.awt.event.*;

import java.awt.*;


import javax.swing.JFrame;

import javax.swing.JTextField;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JPanel;

import javax.swing.JButton;

import javax.swing.JTextArea;

import javax.swing.WindowConstants;


/**

 * Hauptfenster der Anwendung. Hier finden Sie alle Aufgaben, die zu lösen sind. Suchen Sie einfach

 * nach der Zeichenkette <i>@@TO DO@@</i> oder gehen Sie die Datei zeilenweise durch.

 * @author David Zellhöfer

 *

 */

public class FrameJDBC extends JFrame implements WindowListener{


//	 String für die Anfrage an das DBMS

	private String query = "SELECT * FROM some_table"; 

//	Variable für die Verbindung zur Datenbank

	private Connection connection = null; 


// Variablen für die GUI

	private javax.swing.JPanel jContentPane = null;  

	private JScrollPane scrlPane = null;

	private JPanel mainPanel = null;

	private JPanel buttonPanel=null;

	private JButton btnQuery = null;

	private JTextArea txtResult = null;

	private JTextField txtQuery=null;


	/**

	 * Konstruktor für das Fenster und seiner Widgets

	 */

	public FrameJDBC() {

		super();

		init();

		initDBConnection();

	}

	/**

	 * Initialisierung der GUI

	 */

	private void init() {

		this.setTitle("DB/DM Java-Übung");

		this.addWindowListener(this);

		this.setContentPane(getJPanel());

		this.setSize(500, 400);

		this.validate();

	}


	/**

	 * Öffnen der Datenbankverbindung

	 */

	private void initDBConnection(){

		//@@TO DO@@

		//Setzen Sie die JDBC-URL und Ihren Login korrekt

		//Hinweise: Der mitgelieferte Treiber ist ein Oracle-Thin-Treiber

		//			Informationen zu Oracle und JDBC sind im Internet gut dokumentiert

		String url ="jdbc:zensiert:@zensiert:zensiert:zensiert";

		String username = "zensiert"; //Nutzername

		String password = "zensiert"; //Passwort


		// Instanzierung des Oracle-Treibers

		try {

			Class.forName("oracle.jdbc.driver.OracleDriver");

		}

		catch(ClassNotFoundException e) {

			JOptionPane.showMessageDialog(null, e.getMessage(), "Kein Treiber gefunden", JOptionPane.ERROR_MESSAGE);

			e.printStackTrace();

			System.exit(1);

		}

		//Erstellung einer Verbindung zur Datenbank

		try {

			connection = DriverManager.getConnection(url, username, password);

		} catch (SQLException e) {

			JOptionPane.showMessageDialog(null, e.getMessage(), "Kein Verbindungsaufbau möglich", JOptionPane.ERROR_MESSAGE);

			e.printStackTrace();

		}

	}

	/**

	 * Ausfuehrung der DB-Anfrage

	 */

	private void executeQuery(){

		try {

			[COLOR="Red"]// @@TO DO@@

			// Verbinden Sie hier die eingebene Einfrage mit dem Absenden einer Abfrage

			// Hinweis: Das Textfeld heißt "txtQuery"[/COLOR]



			//Erzeugung eines Statements

			Statement statement = connection.createStatement();

			//Holen Ergebnismenge der Anfrage

			ResultSet resultSet = statement.executeQuery(query);

			showResult(resultSet);

			//Schliessen des ResultSets

			resultSet.close();

		} catch (SQLException e) {

			JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler beim Ausführen der Abfrage", JOptionPane.ERROR_MESSAGE);

			e.printStackTrace();

		}		

	}


	/**

	 * Ausgabe der Ergebnismenge in der TextArea

	 */

	private void showResult(ResultSet resultSet){

		try {

			this.txtResult.setText("");

			// Holen der Metadaten der Datenbank

			ResultSetMetaData metaData = resultSet.getMetaData();

			// Anzahl der Tabellenspalten

			int number = metaData.getColumnCount();

			// Ausgabe der Spaltennamen 

			addTextToArea("\n");

			for (int i=1;i<=number;i++){

				// Name der Tabellenspalte

				String name = metaData.getColumnName(i);

				// Ausgabe der Spaltennamen in der TextArea

				addTextToArea(name + "   ");

			}

			addTextToArea("\n");

			addTextToArea("--------------------------------\n");

			[COLOR="Red"]//@@TO DO@@

			// Geben Sie die Spaltenwerte zeilenweise aus[/COLOR]


		} catch (SQLException e) {

			e.printStackTrace();

		}


	}


	/**

	 * Fügt eine Text zur TextArea hinzu ohne diese zu überschreiben

	 */

	private void addTextToArea(String str){

		getJTextArea().setText(getJTextArea().getText()+ str);

	}


	/**

	 * Erzeugt die eigentliche GUI

	 */  

	private JPanel getJPanel() {

		mainPanel = new JPanel();

		mainPanel.setLayout(new BorderLayout());

		this.txtQuery=new JTextField();

		this.txtQuery.setText(this.query);

		mainPanel.add(txtQuery,BorderLayout.NORTH);

		createButtons();

		mainPanel.add(buttonPanel,BorderLayout.SOUTH);

		mainPanel.add(getJScrollPane(), BorderLayout.CENTER);


		return mainPanel;

	}

	/**

	 * Erzeugt die Buttons der Anwendung

	 */    

	private void createButtons() {

		this.buttonPanel=new JPanel();

		this.buttonPanel.setLayout(new FlowLayout());


		if (btnQuery == null) {

			btnQuery = new JButton();

			btnQuery.setText("Abfrage senden");

			btnQuery.addActionListener(new java.awt.event.ActionListener() { 

				public void actionPerformed(java.awt.event.ActionEvent e) {  

					JOptionPane.showMessageDialog(null, "Die Abfrage wird nun gesendet. Die Rückgabe der Ergebnisse kann einige Zeit dauern.", "Verbinden mit der DB", JOptionPane.INFORMATION_MESSAGE);

					executeQuery();

				}

			});

		}


		buttonPanel.add(btnQuery);

	}

	/**

	 * Erzeugt eine TextArea zur Anzeige des Anfrageergebnisses	

	 */    

	private JTextArea getJTextArea() {

		if (txtResult == null) {

			txtResult = new JTextArea();

			txtResult.setColumns(20);

			txtResult.setRows(20);

			txtResult.setText("");

		}

		return txtResult;

	}

	/**

	 * Erzeugt ein ScrollPane	

	 */    

	private JScrollPane getJScrollPane() {

		if (scrlPane == null) {

			scrlPane = new JScrollPane(getJTextArea());

		}

		return scrlPane;

	}


	/**

	 * Schließt die DB-Verbindung

	 */

	public void dispose(){

		try {

			if(connection!=null)

				connection.close();

		} catch (SQLException e) {

			JOptionPane.showMessageDialog(null, e.getMessage(), "Fehler beim Verbindungsabbau", JOptionPane.ERROR_MESSAGE);

			e.printStackTrace();

		}

	}


	@Override

	public void windowClosing(WindowEvent arg0) {

		this.dispose();

		System.exit(0);

	}

	@Override

	public void windowActivated(WindowEvent arg0) {

		// TODO Auto-generated method stub


	}

	@Override

	public void windowClosed(WindowEvent arg0) {

		// TODO Auto-generated method stub


	}

	@Override

	public void windowDeactivated(WindowEvent arg0) {

		// TODO Auto-generated method stub


	}

	@Override

	public void windowDeiconified(WindowEvent arg0) {

		// TODO Auto-generated method stub


	}

	@Override

	public void windowIconified(WindowEvent arg0) {

		// TODO Auto-generated method stub


	}

	@Override

	public void windowOpened(WindowEvent arg0) {

		// TODO Auto-generated method stub	

	}

 }  

reicht da der code
query = txtQuery.getText();

um das textfeld zu verbinden?

Bearbeitet von Lufos
Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay ich schau es mir mal an..

mal eine Frage der WindowListener ist von dir?

Ich würde den gänzlich rauschmeißen und in der init-Methode die eine Zeile ergänzen. Da schließt das Teil auch ;)

private void init() {

...

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

...

String url ="jdbc:zensiert:@zensiert:zensiert:zensiert";

sollte bei Oracle so sein:

String url = "jdbc:oracle:thin:@zensiert:zensiert:zensiert" //host:port:sid müssten auch gepflegt werden

Bearbeitet von silver112
Link zu diesem Kommentar
Auf anderen Seiten teilen

ja so bekommst du einfach den inhalt aus dem text feld in deinen String.


	/**

	 * Erzeugt die Buttons der Anwendung

	 */    

	private void createButtons() {

		this.buttonPanel=new JPanel();

		this.buttonPanel.setLayout(new FlowLayout());


		if (btnQuery == null) {

			btnQuery = new JButton();

			btnQuery.setText("Abfrage senden");

			btnQuery.addActionListener(new java.awt.event.ActionListener() { 

				public void actionPerformed(java.awt.event.ActionEvent e) {  

					JOptionPane.showMessageDialog(null, "Die Abfrage wird nun gesendet. Die Rückgabe der Ergebnisse kann einige Zeit dauern.", "Verbinden mit der DB", JOptionPane.INFORMATION_MESSAGE);

                                                               [FONT="Arial Black"][B][SIZE="3"] query = txtQuery.getText();[/SIZE][/B][/FONT]

					executeQuery();

				}

			});

		}


		buttonPanel.add(btnQuery);

	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

super, danke euch. ich werd mir das mal zu gemüte führen. und nein der windowslistener ist nicht von mir. ich habe daran gar nix gemacht. und ja ich habe "jbdc:oracle:thin ebenfalls zensiert, weil ich eben keine ahnung hab, welche angaben da nicht für die öffentlichkeit bestimmt sind^^.

ich habe das eigentlich so verstanden, dass ich meinen code an die

@@TO DO@@ kommentarstellen einfügen muss. kann ich also

query = txtQuery.getText();

executeQuery();

da auch hinschreiben, oder muss das an die stelle die ihr beschrieben habt und was müsste dann an die @@TO DO@@ stelle?

Link zu diesem Kommentar
Auf anderen Seiten teilen

alles klar. nochmal einen riesen dank an euch. ich werd das jetzt so reinschreiben. wenn mir jetzt noch jemand sagt wie ich die spaltenwerte zeilenweise ausgeben kann, dann kann ich glücklich sterben. =)

mfg

Lufos

PS:

ich weis echt nicht, wieso wir mit java-aufgaben betraut werden, wenn wir davon keine ahnung haben und weder in der vorlesung noch in den übungen darauf eingegangen wird. da hätten die auch sagen können "schreibt einen chinesisch aufsatz"

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde es so machen...

Kein Informatikstudium aber programmieren @ UNI?

private void showResult(ResultSet resultSet){

		try {

			this.txtResult.setText("");

			// Holen der Metadaten der Datenbank

			ResultSetMetaData metaData = resultSet.getMetaData();

			// Anzahl der Tabellenspalten

			int number = metaData.getColumnCount();

			// Ausgabe der Spaltennamen 

			addTextToArea("\n");

			for (int i=1;i<=number;i++){

				// Name der Tabellenspalte

				resultSet.getString(i+1);

				String name = metaData.getColumnName(i);

				// Ausgabe der Spaltennamen in der TextArea

				addTextToArea(name + "   ");

			}

			int row = 0;

			[B]while(resultSet.next()){

				//Erste Zeile und erste Spalte = "Zeile:0, Spalte:0"

				for (int i=0; i< number; i++){

					addTextToArea("Zeile: " + row + ", Spalte: " + i );

					addTextToArea("Value: " + resultSet.getString(i+1));

				}

				row++; 

			}[/B]


			addTextToArea("\n");

			addTextToArea("--------------------------------\n");

			//@@TO DO@@

			// Geben Sie die Spaltenwerte zeilenweise aus


		} catch (SQLException e) {

			e.printStackTrace();

		}

Link zu diesem Kommentar
Auf anderen Seiten teilen

juhu,danke dir.

ja, mein studium hat nix mit programmieren zu tun und trotzdem muss ich mich durch java/c++ aufgaben/prüfungen quälen. ich werd das nie wieder rbauchen danach und versteh den sinn davon auch nich. wenn es mich interessieren würde, würde ich info studieren. aber naja da kann man nix machen. zum glück gibt es ja hilfsbereite menschen in foren, sonst hätt ich gar keine chance^^.

danke an alle.

mfg

Lufos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...