[java/sql] sprawdzanie zapytania SQL

0

Witam serdecznie,

mam problem z wyświetlaniem zapytania SQL przypisanego do zmiennej "text" z pola "jTextArea2". Pobrany tekst jest potem obsługiwany przez "jButton5" .
Chciałabym wyświetlać wynik tekstu, który jest przypisany potem do zapytania "sql".

Jeśli wprowadzę np takie zapytanie do pola jTextArea2;

select * from employess

lub

select id, first_name from employess

wyświetli mi prawidłowo, ale jeśli chce wyświetlić np:

select id from employess

lub

select first_name from employess

pojawia mi się błąd "nie poprawny index kolumny". Wiem czemu tak się dzieje , bo mam wypisane, że chce 2 pola wyświetlić a nie 1:

 jTextArea3.append("\n"+ rs.getString(1)+"\t"+ rs.getString(2));

Mam ogromna prośbę o uzyskanie jakiejś wskazówki, z jakiej funkcji powinnam skorzystać, aby sprawdzać zmienną "text" i do niej przypisać odpowiednie zapytanie lub jak poprawić, aby wczytało odpowiednie kolumny :
jTextArea3.append("\n"+ rs.getString(1)+"\t"+ rs.getString(2));

Obsługa przycisku przedstawia się poniżej :

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {
        String driver = "oracle.jdbc.driver.OracleDriver";
        String serverName = "localhost";
        String portNumber = "1521";
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String pass = "kasia";
        String user = "kasia";
        String sql = "";


        try {

            String text = jTextArea2.getText();
            jTextArea3.setText(text);

            if (text == null ? "" == null : text.equals("")) {
                jTextArea3.setText("Please enter some query SQL... ");
            } else {
               sql=text;  // tu czegoś też mi bakuje :( ?
                jTextArea3.setText(sql);
            }
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
            PreparedStatement ps = con.prepareStatement(sql);

            ResultSet rs = ps.executeQuery();
            jTextArea3.append(null);
            while (rs.next()) {
                jTextArea3.append("\n"+ rs.getString(1)+"\t"+ rs.getString(2));  //tu chyba też mam żle :(
            }
            ps.close();
            con.close();


        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());

        }

    }
0

Z PreparedStatement lub ResultSet weź ResultSetMetaData (getMetaData), a z tego ostatniego uzyskasz ilość kolumn czy ich nazwy.

0

jak w zapytaniu wyciagasz tylko jedna kolumne to jak potem chcesz wypisac dwie ? w wynikowym resultsetcie jest tylko jedna

0

dobrze mam już ilość kolumn, ale bym chciała, aby działało w ten sposób, że użytkownik wprowadza jakieś zapytanie np

select id, first_name .....itp(ile chce rekordów wprowadza) from employes

i tyle, ile wpisze rekordów one się wyświetlą. Nie za bardzo rozumiem jak mam je wypisać ..

Proszę uprzejmie o wskazówkę...?

       try {

            String text = jTextArea2.getText();
            jTextArea3.setText(text);

            if (text == null ? "" == null : text.equals("")) {
                jTextArea3.setText("Please enter some query SQL... ");
            } else {
                sql = text;
                jTextArea3.setText(sql);
            }
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
            PreparedStatement ps = con.prepareStatement(sql);

            ResultSet rs = ps.executeQuery();

            ResultSetMetaData metaData = rs.getMetaData();
            int rowCount = metaData.getColumnCount();

            for (int i = 0; i < rowCount; i++) {
                jTextArea3.append(null);
                while (rs.next()) {
                    jTextArea3.append("\n" + ........); /* Tu nie wiem co mam wprowadzić, aby wypisało wszystkie rekordy jakie użytkownik wprowadził do pola "jTextArea2" i zatwierdził przyciskiem 
ten wyjątek obsługuje przycisk 
*/
                }
            }
            ps.close();
            con.close();


        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());

        }

Tu może brakować, czegoś bardziej skomplikowanego ....?

0

Właśnie nie wiem jak mam wypisać zawartość kolumn w zależności ile wprowadzi użytkownik...?

próbowałam szukać różnych funkcji ,np equals ale stwierdziłam że porównanie strinów nie za bardzo pomoże w rozwiązaniu mi mojego problemu.

Teraz wyświetla mi nazwy rekordów, a jak wyświetlić wartości rekordów. Proszę uprzejmie o jakoś wskazówkę..?

Obsługa przycisku przedstawia się w ten sposób:

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        String driver = "oracle.jdbc.driver.OracleDriver";
        String serverName = "localhost";
        String portNumber = "1521";
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String pass = "ola";
        String user = "ola";
        String sql = "";

        try {

            String text = jTextArea2.getText();
            jTextArea3.setText(text);
            if (text == null ? "" == null : text.equals("")) {
                jTextArea3.setText("Please enter some query SQL... ");
            } else {
                sql = text;
                jTextArea3.setText(sql);
            }
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
            PreparedStatement ps = con.prepareStatement(sql);

            ResultSet rs = ps.executeQuery();

            ResultSetMetaData metaData = rs.getMetaData();
            int rowCount = metaData.getColumnCount();
            jTextArea3.append(null);

            // while (rs.next()) {
            for (int i = 0; i < rowCount; i++) {
                jTextArea3.append("\n" + metaData.getColumnName(i + 1) + "  \t");
            }
//          }

            ps.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    } 
0
 (...)
        try {

            String text = jTextArea2.getText();
            jTextArea3.setText(text);
            if (text == null ? "" == null : text.equals("")) {
                jTextArea3.setText("Please enter some query SQL... ");
            } else {
                sql = text;
                jTextArea3.setText(sql);
            }
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
            PreparedStatement ps = con.prepareStatement(sql);

            ResultSet rs = ps.executeQuery();
           ResultSetMetaData rsmd = rs.getMetaData();

            ResultSetMetaData metaData = rs.getMetaData();
            int rowCount = metaData.getColumnCount();
            jTextArea3.append(null);

            // while (rs.next()) {
            for (int i = 0; i < rowCount; i++) {
                jTextArea3.append("\n" + rs.getString(i + 1) + "  \t");
            }
//          }

            ps.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    } 

jakos tak chyba bedzie :) nie testowalem wiec glowy nie dam ale mniej wiecej chodzi o to, zeby z resultseta wyciagnac jego meta dane, w ktorych sa zapisanie informacje o tabeli. btw rekordy, zwane tez krotkami to wpisy w tabeli, kolumny to atrybuty

0

a no i to 'while(rs.next())' ma tam byc, nie zauwazylem :)

0

Zapewne przyda się (przed while(rs.next()))

rs.beforeFirst();
0

jak wprowadzam :

             while (rs.next()) {
            for (int i = 0; i < rowCount; i++) {
                jTextArea3.append("\n" + metaData.getColumnName(i + 1) + "  \t");
            }
        }

pojawiają się nazwy rekordów, gdy wprowadzam polecenie

select * from employes

ale gdy już np

select id from employes

pojawiają się ich więcej:
ID
ID
ID
...
Nadal nie jest to moim zamierzeniem.
Ja bym chciała, aby wyświetlało zawartość rekordów które wprowadzi użytkownik do pola "jTextArea2" ,zatwierdzi przyciskiem i wtedy wyświetlą się rekordy w polu "jTextArea3"

Jak wprowadziłam

rs.beforeFirst();
             while (rs.next()) {
            for (int i = 0; i < rowCount; i++) {
                jTextArea3.append("\n" + metaData.getColumnName(i + 1) + "  \t");
            }
        }

pojawia mi się błąd Oracla:

Niepoprawna operacja dla zestawu wyników "tylko do przesłania": beforeFirst

nadal nie wiem jak rozwiązać problem .. hhmmm ...?

0

**DZIĘKUJE
SERDECZNIE
DZIAŁA **

                                        <jupi>

1 użytkowników online, w tym zalogowanych: 0, gości: 1