Lufos Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 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 Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 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(); } Zitieren
Lufos Geschrieben 30. Juni 2009 Autor Geschrieben 30. Juni 2009 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^^. Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 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 Zitieren
Lufos Geschrieben 30. Juni 2009 Autor Geschrieben 30. Juni 2009 (bearbeitet) 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 30. Juni 2009 von Lufos Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 (bearbeitet) 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 30. Juni 2009 von silver112 Zitieren
elSusto Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 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); } Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 Aufgabe 2: private void createButtons() { public void actionPerformed(java.awt.event.ActionEvent e) { //Hier wird dein Code stehen query = txtQuery.getText(); executeQuery(); } Hier war einer schneller Zitieren
Lufos Geschrieben 30. Juni 2009 Autor Geschrieben 30. Juni 2009 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? Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 Nein das //@@TO DO@@ ist lediglich ein Kommentar, der überall im Code stehen kann... und vermutlich den gemeinen Studenten als Hilfe dient, dass diese Methode dafür verantwortlich sein kann Unsere Codestelle ist die exakte... Zitieren
Lufos Geschrieben 30. Juni 2009 Autor Geschrieben 30. Juni 2009 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" Zitieren
silver112 Geschrieben 30. Juni 2009 Geschrieben 30. Juni 2009 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(); } Zitieren
Lufos Geschrieben 30. Juni 2009 Autor Geschrieben 30. Juni 2009 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 Zitieren
Empfohlene Beiträge
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.