Avatar billede ircnoob Nybegynder
12. april 2006 - 08:17 Der er 38 kommentarer

Simpelt sql spørgsmål

ResultSet rs = stmt.executeQuery("SELECT ID "+
                    "FROM Medlemmer "+
                    "WHERE navn ='" + GUI3.jTextField3.getText () + "'");

Hvorfor virker dette ikke.. :S

ResultSet rs = stmt.executeQuery("insert into MEDLEMMER values (100, '" + GUI3.getNavn() + "', '" + GUI3.byTextField.getText () + "')");

Denne benytter jeg før og den fungerer fint.. men hvad skal jeg ændre for at få den select til at fungerer også ?

Select virker hvis jeg erstatter '" + GUI3.jTextField3.getText () + "' med fx 'hansen' ... Den skal blot tage input fra et textfelt og slå id op på det navn jeg der skriver..
Avatar billede kalp Novice
12. april 2006 - 08:46 #1
den får vel ikke hentet noget ud af dit tekstfelt..
har du forskellige gui'er? siden du ikke skriver  jTextField3.getText()
eller this.jTextField3.getText()
Avatar billede kalp Novice
12. april 2006 - 08:46 #2
hov...skulle ikke være svar
Avatar billede ircnoob Nybegynder
12. april 2006 - 08:56 #3
æh er database-klassen jeg kalder fra.. så derfor.. men hvorfor får den ikke hentet noget så.. ? Hvordan bør jeg så gøre det.. Det fungerer jo når jeg inserter noget.. ?
Avatar billede kalp Novice
12. april 2006 - 09:07 #4
Når du indsætter kalduer du GUI3.getNavn() og GUI.byTextField.getText()
du må kunne se hvad der er anderledes med det tekst felt frem for det du bruger når du indsætter.. det som hedder jTextField3
Avatar billede ircnoob Nybegynder
12. april 2006 - 09:29 #5
kan du se nogen forskel for jeg kan ikke .. ? Kan copy paste det og bruge det felt fra den anden men hjælper nu ikke..
Avatar billede kalp Novice
12. april 2006 - 09:31 #6
man skal nok se koden i
GUI3

hvis du siger det ligger der i.
Avatar billede ircnoob Nybegynder
12. april 2006 - 09:53 #7
hvad vil du se ?? Er jo bare et textfelt der ligger der ?
Avatar billede kalp Novice
12. april 2006 - 09:56 #8
vi forvirrer hinanden.. udskriv istedet din sql så kan du se fejlen.

String sql = "SELECT ID "+
                    "FROM Medlemmer "+
                    "WHERE navn ='" + GUI3.jTextField3.getText () + "'";

System.out.print(sql);
ResultSet rs = stmt.executeQuery(sql);
Avatar billede ircnoob Nybegynder
12. april 2006 - 10:07 #9
fårk .. :D

fejl40 du .. hehe...

Nå men hvordan kan jeg så nu få det resultat fra database-klassen smidt tilbage til GUI3 så den kan printe resultatet ud ?
Avatar billede kalp Novice
12. april 2006 - 10:09 #10
Har GUI3 en reference til din database klasse? eller er det kun din database klasse som har en reference til GUI3 ?
for det kan kun lade sig gøre hvis GUI3 også kender din database klasse..
Avatar billede ircnoob Nybegynder
12. april 2006 - 11:09 #11
æh jo.. altså har bare de gettext metoder fra databsen der hiver fra gui p.t .. ?
Avatar billede javaisnice Nybegynder
12. april 2006 - 21:11 #12
Du skal kalde rs.getNext, og derefter rs.getString(1) rs.getString(2) etc....
Avatar billede javaisnice Nybegynder
12. april 2006 - 21:13 #13
rettelse: rs.next() og ikke getNext()
Avatar billede ircnoob Nybegynder
13. april 2006 - 17:36 #14
Hvordan vil du gøre det javaisnice ? Har jo flere metoder i database-klassen der benytter den funktion .. ? kan du komme med et eksempel kode, altså indtaster søge-kriterie i et textfelt i gui3, som sendes til test (database), der her laver en select.. som så skal printes ud i gui3 i fx et jtable ..
Avatar billede javaisnice Nybegynder
13. april 2006 - 22:43 #15
Nu har jeg ikke set din kode, men det lyder som dårligt design!! når du har et ResultSet er du nødt til, at kalde rs.next() for at få den første række - derefter kalder du den igen for at få næste række. eks.:

while(rs.next){

  String attribut1 = rs.getSting("attributNavn");
  String attribut2 = rs.getString("attributNavn");

}
Avatar billede ircnoob Nybegynder
14. april 2006 - 01:20 #16
dårligt design .. ?? Har netop fået afvide at jeg skal holde database delen væk fra gui-delen ? Jeg kan godt printe ud i database-klassen, men jeg vil jo netop gerne have det smidt ud i gui i stedet.. ?
Avatar billede javaisnice Nybegynder
14. april 2006 - 08:08 #17
Nej jeg har jo heller ikke set din kode, men for at udskrive dit resultset kan du bruge ovenstående eksempel. Har du prøvet det???
Avatar billede javaisnice Nybegynder
14. april 2006 - 08:24 #18
Du kan jo bare få din databaseklasse-metode til at returnere ResultSet, og så behandle ResultSet som du vil hvis det skal være forskelligt fra gang til gang....
Avatar billede ircnoob Nybegynder
14. april 2006 - 14:00 #19
public static void findMedlem()             
    {
          Connection connection = null;
    try {
        // Load the JDBC driver
        String driverName = "oracle.jdbc.driver.OracleDriver";
        Class.forName(driverName);
   
        // Create a connection to the database
        String serverName = "127.0.0.1";
        String portNumber = "1521"; //4500
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String username = "system";
        String password = "system";
        connection = DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
        System.out.println("Could not find the db driver");
        // Could not find the database driver
    } catch (SQLException e) {
        System.out.println("Could not connect to the database");
        // Could not connect to the database
    }
           
    try {
        // Create a result set containing all data from my_table
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT ID, navn FROM Medlemmer WHERE navn ='" + GUI3.jTextField1.getText () + "'");  // '" + GUI3.jTextField3.getText () + "'
   
        // Fetch each row from the result set
        while (rs.next()) {
            // Get the data from the row using the column index
            String s = rs.getString(1);
            System.out.println( "ID: " + rs.getString(1) + "\tNavn: " + rs.getString(2));
            // Get the data from the row using the column name
            s = rs.getString("col_string");
            // System.out.println (s);
        } //
    } catch (SQLException e) {
        System.out.println(e);
    }

altså denne funktion i en databaseklasse kalder jeg fra min gui-klasse (gui3), som så læser input fra textfield og slår op på det.. og det kan den fint printe ud i databaseklassen .. men skulle gerne have det ud i gui igen også jo .. :)
håber jeg fik gjort det lidt mere klart hvad jeg laver af rod .. :)
Avatar billede javaisnice Nybegynder
14. april 2006 - 19:49 #20
Det ser nogenlunde ud, men tror det ville være en fordel at tage medlemsNavn ind som parameter i database klassen og returnere ResultSet til gui3:

public ResultSet findMedlem(String medlemsNavn);


og derefter køre ResultSet igennem i GUI3:


ResultSet rs = databaseklasse.findMedlem(GUI3.jTextField3.getText());

String str = "";
while (rs.next()) {

String a = rs.getString(1);
String b = rs.getString(1);

str = str + a + b;
}

textAreaX.setText(str);
Avatar billede ircnoob Nybegynder
16. april 2006 - 11:24 #21
Okay det lyder sq fornuftigt nok men lidt grøn til java endnu så skal nok bede om en hjælpende hånd .. :)

Compiling 1 source file to GUI3.java:318: cannot find symbol
symbol  : class ResultSet .. ( ResultSet rs = test.findMedlem(GUI3.jTextField3.getText());)

Gode råd søges :D
Avatar billede ircnoob Nybegynder
16. april 2006 - 11:27 #22
glem det .. desværre er min database blevet lukket af uransagelige årsager så vender lige tilbage når jeg har fundet ud af at få den låst op igen.. tak så vidt nu
Avatar billede ircnoob Nybegynder
16. april 2006 - 12:02 #23
Nej den hoster over at den mangler et return statement..  men først efter at jeg erstatter med public ResultSet findMedlem(String medlemsNavn) .. er lidt tom for ideer der.. ?
Avatar billede javaisnice Nybegynder
16. april 2006 - 12:22 #24
Jeg laver lige et eksempel til hvordan din findMedlem() kunne se ud:

public ResultSet findMedlem(String medlemsNavn){

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Medlemmer WHERE navn ='"+medlemsNavn+"'");

return rs;

}

Dette returnerer så et ResultSet, som du kan håndtere i din GUI3
Avatar billede ircnoob Nybegynder
16. april 2006 - 13:15 #25
Æh ja altså skulle mene jeg har det samme, men går helt i kage for mig.. har vrøvl over det med missing return fortsat i hvert fald..

  public static ResultSet findMedlem(String medlemsNavn)             
    {
          Connection connection = null;
    try {
        // Load the JDBC driver
        String driverName = "oracle.jdbc.driver.OracleDriver";
        Class.forName(driverName);
   
        // Create a connection to the database
        String serverName = "127.0.0.1";
        String portNumber = "1521"; //4500
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String username = "system";
        String password = "system";
        connection = DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
        System.out.println("Could not find the db driver");
        // Could not find the database driver
    } catch (SQLException e) {
        System.out.println("Could not connect to the database");
        // Could not connect to the database
    }
           
    try {
        // Create a result set containing all data from my_table
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT ID, navn FROM Medlemmer WHERE navn  ='"+medlemsNavn+"'");  // '" + GUI3.jTextField3.getText () + "'
        return rs;
//   
//        // Fetch each row from the result set
//        while (rs.next()) {
//            // Get the data from the row using the column index
//            String s = rs.getString(1);
//            System.out.println( "ID: " + rs.getString(1) + "\tNavn: " + rs.getString(2));
//            // Get the data from the row using the column name
//            s = rs.getString("col_string");
//            // System.out.println (s);
//        } //
    } catch (SQLException e) {
        System.out.println(e);
    }

//    return rs;
}
}
Avatar billede javaisnice Nybegynder
16. april 2006 - 14:00 #26
Er det med vilje du har udkommateret return rs??. Følgende kode giver ikke mig problemer:

public static ResultSet findMedlem(String medlemsNavn) {
        Connection connection = null;           
        ResultSet rs = null;
       
        try {
            // Load the JDBC driver
            String driverName = "oracle.jdbc.driver.OracleDriver";
            Class.forName(driverName);
           
            // Create a connection to the database
            String serverName = "127.0.0.1";
            String portNumber = "1521"; //4500
            String sid = "XE";
            String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
            String username = "system";
            String password = "system";
            connection = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            System.out.println("Could not find the db driver");
            // Could not find the database driver
        } catch (SQLException e) {
            System.out.println("Could not connect to the database");
            // Could not connect to the database
        }
       
        try {
            // Create a result set containing all data from my_table
            Statement stmt = connection.createStatement();
            rs = stmt.executeQuery("SELECT ID, navn FROM Medlemmer WHERE navn  ='"+medlemsNavn+"'");  // '" + GUI3.jTextField3.getText () + "'
            return rs;

        } catch (SQLException e) {
            System.out.println(e);
        }
       
        return rs;
    }
Avatar billede ircnoob Nybegynder
16. april 2006 - 14:13 #27
weee :D
Avatar billede ircnoob Nybegynder
18. april 2006 - 18:40 #28
public static void resultat()
    {                     
        try {
        ResultSet rs = test.findMedlem(GUI3.jTextField3.getText());

String str = "";
while (rs.next()) {

String a = rs.getString(1);
String b = rs.getString(2);

str = str + a + b;


}
        jTextField6.setText(str);       
        }
     
 
catch (SQLException e) {
    }   
    }
-------------------------
GUI3.java:336: unreported exception java.lang.Exception; must be caught or declared to be thrown

Kan du lige hjælpe med den og så komme med et svar til point :) ?
Avatar billede ircnoob Nybegynder
18. april 2006 - 20:25 #29
nm løst..

try {
            // Load the JDBC driver
            Scanner fileScanner = new Scanner (new FileInputStream("DBconfig.txt"));
            String driver = fileScanner.nextLine();
            Class.forName(driver);
            String serverName = fileScanner.nextLine();
            String portNumber = fileScanner.nextLine();
            String sid = fileScanner.nextLine();
            String username = fileScanner.nextLine();
            String password = fileScanner.nextLine();
            String url = fileScanner.nextLine();
         
        connection = DriverManager.getConnection(url, username, password);
        }

Denne læser en config fil med:
oracle.jdbc.driver.OracleDriver
127.0.0.1
1521
XE
system
system
jdbc:oracle:thin:@serverName:portNumber:" + sid

MEN alt virker indtil jeg rammer url med jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid .. det vil den ikke snuppe og kan ikke connecte til databasen .. hvordan fixer man lige den ?
Avatar billede ircnoob Nybegynder
18. april 2006 - 20:56 #30
String by = rs.getString(3);

hvordan kan det være jeg ikke kan benytte denne, virker fint med rs.getString(1 OG 2)
.. altså hvis jeg erstatter dit kode blot med et 3'tal i GetString så virker det ikke.. :( .. der er ellers lige en extra column .. ?
Avatar billede javaisnice Nybegynder
19. april 2006 - 08:46 #31
Hvilken fejl kommer der ved: String by = rs.getString(3);
Avatar billede ircnoob Nybegynder
19. april 2006 - 15:05 #32
glem det hehe bare mig der huskede forkert i min select ..

Nu mangler jeg sårn set kun denne detailje..
import java.awt.*;
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableFromDatabase extends JFrame
{
    public TableFromDatabase()
    {
        Vector columnNames = new Vector();
        Vector data = new Vector();

        try
        {
            //  Connect to the Database

            String driverName = "oracle.jdbc.driver.OracleDriver";
        Class.forName(driverName);
   
        // Create a connection to the database
        String serverName = "127.0.0.1";
        String portNumber = "1521"; //4500
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String username = "system";
        String password = "system";
        Connection connection = DriverManager.getConnection(url, username, password);
            //  Read data from a table

            String sql = "Select * from medlemmer";
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery( sql );
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            //  Get column names

            for (int i = 1; i <= columns; i++)
            {
                columnNames.addElement( md.getColumnName(i) );
            }

            //  Get row data

            while (rs.next())
            {
                Vector row = new Vector(columns);

                for (int i = 1; i <= columns; i++)
                {
                    row.addElement( rs.getObject(i) );
                }

                data.addElement( row );
            }

            rs.close();
            stmt.close();
        }
        catch(Exception e)
        {
            System.out.println( e );
        }

        //  Create table with database data

        JTable table = new JTable(data, columnNames);

        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );

        JPanel buttonPanel = new JPanel();
        getContentPane().add( buttonPanel, BorderLayout.SOUTH );
    }

    public static void main(String[] args)
    {
        TableFromDatabase frame = new TableFromDatabase();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
}

Her kan jeg fint nok generere en jtable med alt data .. MEN hvorn får jeg ryddet op i dette mix af gui og database .. altså hvordan får jeg vist den jtable i gui3 i stedet for i database-klassen som nu .. :) ?
Avatar billede javaisnice Nybegynder
19. april 2006 - 19:10 #33
Det bedste design ville være, at lave en klasse, som returnerer en databaseconnection, og en DatabaseFacade klasse, som har ansvaret for, at udføre queries. I din gui kan du så nøjes med, at kalde databasefacaden...har du brug for kode eksempler??
Avatar billede ircnoob Nybegynder
20. april 2006 - 13:38 #34
Ville jeg i hveert fald være meget taknemlig for.. ville være kanon hvis du lige gad det :) ..
Avatar billede javaisnice Nybegynder
20. april 2006 - 14:25 #35
Det er bare helt iorden...her kommer der to klasser - en DatabaseConnection-klasse, og en DatabaseFacade-klasse:

package control;

import java.sql.*;

/**
*
* @author Michael Dipo
*/
public class DataBaseConnection {
    private static DataBaseConnection INSTANCE = new DataBaseConnection();
    private Connection conn = null;
    public static DataBaseConnection getInstance(){
        return INSTANCE;
    }
    /** Creates a new instance of DataBaseConnection */
    private  DataBaseConnection() {
        try{
            Class.forName("org.gjt.mm.mysql.Driver");
           
        } catch (ClassNotFoundException cnfe){
            System.err.println("ClassNotFound"+ cnfe);
        }
        String host = "localhost";
        String dbName = "eshop";
        int port = 3306;
        String uName = "root";
        String pWord = "michael";
        try{
            conn = DriverManager.getConnection("jdbc:mysql://"+host+"/"+dbName+"?user="+uName+"&password="+pWord);
        } catch (SQLException SQLE){
            System.out.println("SQLException" + SQLE);
        }
       
    }
    public Connection getConnection(){
        return conn;
    }
   
}


------------------------------------------------------------------

public class DatabaseFacade {
   
   
/** Creates a new instance of DatabaseHandler */
    public DatabaseFacade() {
    }
   
    public ResultSet findMedlem(String medlemsId)throws SQLException{
       
         
        Connection conn = DataBaseConnection.getInstance().getConnection();
        Statement stat = conn.CreateStatement();
        ResultSet rs = stat.executeQuery("SELECT *
        FROM MEDLEM WHERE MEDLEMSID='"+MEDLEMSID+"'");
       
        /*Her kan du alternativt behandle ResultSet og istedet returnere en String eller et Medlem-objekt hvis det er nødvendigt - ideen er så, at du kalder denne metode fra din GUI3*/
        return rs;
    }
Avatar billede javaisnice Nybegynder
20. april 2006 - 14:26 #36
}
Avatar billede ircnoob Nybegynder
20. april 2006 - 20:05 #37
Yep nemlig, skal vist være som du nævner til sidst.. Noget med at jeg skal lave et  medlems-object.. skal jeg så have en medlems-klasse ? eller hvorn .. :s
Avatar billede javaisnice Nybegynder
20. april 2006 - 21:14 #38
Jep...hvis du ikke allerede har en medlems-klasse skal du lave sådan en.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester