Database koppeling binnen een JFrame

Status
Niet open voor verdere reacties.

Warranty

Gebruiker
Lid geworden
3 nov 2006
Berichten
100
Weer een klein vraagje. Het is me gelukt om een database koppeling op te zetten in een frame binnen mijn applicatie in JBuilder 2005.

Ik wil dat hetgeen wat ingevuld word in een tekstvak een variabele word die ik kan wegschrijven naar een database.

Simpel code is:

Code:
contentPane.add(tekstveld1);
        tekstveld1.setBounds(180, 20, 150, 20);

Hoe zorg ik dat hetgeen wat ingevuld word in dit tekstveld een variabele word?

Danku alvast :thumb:
 
Uit je voorbeeldcode is het niet af te leiden, maar aangenomen dat jouw tekstveld een JTextField of JTextArea is, kun je met de methode getText() de inhoud opvragen. Dit levert een String als resultaat op en is dus als zodanig op te slaan:
Code:
String tekst = tekstveld1.getText();

Deze functies zijn allemaal te vinden in de API op de site van Sun: http://java.sun.com/j2se/1.5.0/docs/api/
 
Dankje voor de moeite, het is idd gelukt om variabelen naar de database te schrijven.

Maar nu rest mij nog 1 ding: informatie uit de database halen om te laten zien in mijn tekstvelden binnen de frame.

Hoe doe ik dat precies?

Ik heb iets geprobeert van:

Code:
"SELECT naam FROM tabel1 Where naam is 'Warranty'"

String bla = ("naam");
tekstveld1.setText(bla);

Zoiets was het dacht ik, alleen het werkt gewoon niet helemaal lekker. Hoe moet het dan?
 
Dat ligt er helemaal aan wat je voor interface met de database hebt. Als je de query uitvoert, wat krijg je dan voor resultaat terug? Als dat een String is, dan kun je met tekstveld1.setText(...) inderdaad wel het resultaat in je tekstveld zetten.
 
Ik zal ff uitgebreider neerzetten wat ik wil hebben.

Dit is mijn code voor iets wegschrijven naar een database:

Code:
    class Knop2Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            String  naam = tekstveld2.getText();

            try {

                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                Connection conn = DriverManager.getConnection(
                        "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

                Statement ttoevoegen = conn.createStatement();
                ttoevoegen.executeUpdate(
                        "INSERT INTO Tabel1 (naam) VALUES ('" + naam + "')");

//Extra
                System.out.println("Connected To Access");
                conn.close();
//Extra

            }

            catch (SQLException se)
            {
                System.out.println(se);
            }

            catch (Exception ex)
            {
                System.out.println(ex);
            }

        }
    }

Onder een Knophandler met een actionlistener omdat ik wil dat hij het pas opslaat als je op de knop "opslaan" drukt. Logisch toch?

Maar wat ik nu wil is een frame om de gegevens te bekijken. Ik wil de tekstvakken dus op setEditable(false); hebben en wil in die tekstvakken data uit de database zetten.

Ik wil dus dat hij de database connectie al maakt als de frame word geopend, en dat hij dan de data uit de database koppelt aan een variabele ofzo, zodat ik de value van de variabele (de info uit de database dus) kan neerzetten in een tekstvak.

Nou is de vraag hoe doe ik dit allemaal? Ik heb al een zooitje aangekloot maar als ik 1 ding heb geleerd met Java is het dit: Kloot niet zomaar wat aan in Java, want dan gaat het nooit lukken... :p
 
Die select-query die je eerder gepost hebt is goed, alleen wordt er geen resultaat gegenereerd. hier een voorbeeldje :) (hier nog meer ;)).


Over dat aankl*ten in java: geen problemen mee, doet t prima :p


Edit: Ik heb even in mn eigen java-code gezocht en dit gevonden:
Code:
			OpenDatabase(); // eigen functie, wat het doet lijkt me duidelijk

			// De query
			String query = "SELECT naam FROM tabel ORDER BY naam DESC";
			// De resultset
			ResultSet rs = statement.executeQuery(query);

			// Haal de waarden uit de resultset
			while (rs.next())
			{
			    // Variabelen
                            String naam = rs.getString("naam");
			}
			SluitDatabase(); // eigen functie, wat het doet lijkt me duidelijk
Hopelijk kan je hier wat mee :thumb:
 
Laatst bewerkt:
Dankje! Ik heb er nog niks van geprobeert maar ik denk wel dat ik er wat mee kan. Alleen niet voordat ik weet hoe ik een database connectie moet opzetten zodra de frame word geopend.

Code:
            try {

                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                Connection conn = DriverManager.getConnection(
                        "jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");

            catch (SQLException se)
            {
                System.out.println(se);
            }

            catch (Exception ex)
            {
                System.out.println(ex);
            }
}


Dit is zo'n beetje de code voor de koppeling met de database. Maar waar kan ik deze nog meer neerzetten? Ik heb hem nu in onder een actionlistener, maar kan ik hem ook onder een eigen class ofzo zetten? En op welke manier dan? Een klein voorbeeldje zou reuze helpen!

Dankje zowiezo al voor het bovenstaande, en jij ook Sauria :thumb:
 
Wij moesten (voor school) een applicatie maken met een achterliggende database.

We hebben voor het openen en sluiten van de database dus aparte functies gemaakt, deze hebben wij jammer genoeg niet in een aparte klasse gezet (kom ik nu achter).

De code:
Code:
	public void OpenDatabase() throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection("jdbc:mysql://localhost/CHWPROD?user=root");
		statement = connection.createStatement();
	}

	public void SluitDatabase() {
		try
		{
			connection.close();
		}
		catch (Exception ex)
		{
			ex.getStackTrace();
		}
	}
Deze functies kan je makkelijk in een nieuwe klasse zetten en zo gebruiken.

Verder riepen wij deze functies pas aan zodra we ze moesten gebruiken (bij het ophalen, wijzigen etc). Gewoon voordat je de query uitvoert even 'openDatabase()' aanroepen, en nadat je alles in een variabele hebt gestopt (na de while) even een 'sluitDatabase()'.

Ik hoop dat je hier wat aan hebt :thumb:


Edit: pas t wel even aan met je eigen database-driver etc :)
 
Laatst bewerkt:
Hmmm, even een simpel voorbeeldje:

Code:
package jdbc_test;

import java.awt.*;
import javax.swing.*;
import java.sql.*;
import javax.swing.*;
import java.awt.event.*;
import com.borland.dx.sql.dataset.Database;
import com.borland.dx.sql.dataset.*;

public class Frame1 extends JFrame {
    JPanel contentPane;
    BorderLayout borderLayout1 = new BorderLayout();
    
    JTextField tekstveld1 = new JTextField("");
    JButton knop1 = new JButton("Opslaan");
    Database database1 = new Database();

    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(null);
        setSize(new Dimension(400, 300));
        setTitle("Frame Title");
    
        knop1.addActionListener(new Knop1Handler());
        knop1.setBounds(180, 20, 80, 20);
        contentPane.add(knop1);
        
        contentPane.add(tekstveld1);
        tekstveld1.setBounds(10, 20, 150, 20);
    }
    
    class Knop1Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
//
        }
    }
}

Waar zou ik dit alles van jou moeten neerzetten?

Ik heb het al een beetje geprobeert maar hij zet rode streepjes onder "connection", wat dus wil zeggen dat ze niet willen werken... Ik heb geen idee hoe het komt. Zover ik weet doe ik het goed...

Sorry voor de vele vragen :rolleyes:

Edit:
Ik zat te denken: misschien heb ik nog een import nodig? Ik heb eigenlijk geen idee wat ik fout doe (als ik al iets fout doe). De exacte code met connection = DriverManager herkent hij niet bij mij. Misschien moet ik hem nog declareren ofzo. Maar hoe dan? iets van: connection = new connection(); ik zeg maar wat :)
 
Laatst bewerkt:
Sorry voor de dubbelpost maar update:

Code:
package jdbc_test;

import java.awt.*;
import javax.swing.*;
import java.sql.*;
import javax.swing.*;
import java.awt.event.*;
import com.borland.dx.sql.dataset.*;

public class Frame1 extends JFrame {
    JPanel contentPane;
    BorderLayout borderLayout1 = new BorderLayout();
    
    JTextField tekstveld1 = new JTextField("");
    JButton knop1 = new JButton("Opslaan");

    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    public void jbInit() throws Exception {
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(null);
        setSize(new Dimension(400, 300));
        setTitle("Frame Title");
    
        knop1.addActionListener(new Knop1Handler());
        knop1.setBounds(180, 20, 80, 20);
        contentPane.add(knop1);
        
        contentPane.add(tekstveld1);
        tekstveld1.setBounds(10, 20, 150, 20);
    }
    
    class Knop1Handler implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            try
            {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                Connection conn = DriverManager.getConnection("jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");
                Statement lezen = conn.createStatement();

                ResultSet rs = lezen.executeQuery(
                        "SELECT naam FROM Tabel1 where Naam = 'Julien'");

                while (rs.next())
                        {
                            //System.out.println(rs.getString(1));
                            //System.out.println(rs.getString(4));

                            // Variabelen
                            String naam = rs.getString("naam");
                            tekstveld1.setText(naam);
                        }

                    System.out.println("Connected To Access");
                    conn.close();
            }
            catch (Exception ex)
            {
                    ex.getStackTrace();
            }
        }
    }
}

Deze code werkt perfect!

Alleen mijn probleem is dat ik hem nu onder een actionlistener heb staan. Dus hij doet het pas als ik op de knop druk. Ik wil juist dat hij dit allemaal doet zodra hij de frame al opent. Hoe doe ik dat?
 
Verplaats de code van onder je actionListener naar je constructor (in dit geval je 'public Frame1()'):
Code:
public Frame1() 
{
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }

            try
            {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
                Connection conn = DriverManager.getConnection("jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=c:/Erusmus.mdb;");
                Statement lezen = conn.createStatement();

                ResultSet rs = lezen.executeQuery(
                        "SELECT naam FROM Tabel1 where Naam = 'Julien'");

                while (rs.next())
                        {
                            //System.out.println(rs.getString(1));
                            //System.out.println(rs.getString(4));

                            // Variabelen
                            String naam = rs.getString("naam");
                            tekstveld1.setText(naam);
                        }

                    System.out.println("Connected To Access");
                    conn.close();
            }
            catch (Exception ex)
            {
                    ex.getStackTrace();
            }
}

Niet getest, maar zo zou het moeten werken (misschien dat er ergens een { of } teveel/weinig staat :p) :thumb:


Wat ik niet snap; je query is "SELECT naam FROM tabel1 WHERE naam='Julien'". Dan heb je de naam toch al lijkt mij? Waarom dan opnieuw ophalen? ;)
 
Ik wou hem niet opnieuw ophalen, ik wil hem maar 1 keer ophalen en dat is op het moment dat de frame word geopend. Maar het is inmiddels gelukt. tnx!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan