Ошибка исключения Oracle Java SQL: ORA-0094 - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь написать функцию для этой кнопки. Я хочу иметь возможность передать ему значение текстового поля и войти в мою базу данных для получения некоторой информации .....

Может кто-нибудь объяснить мне, что происходит и дать мне решение этого безумия?

Спасибо всем xD

Я продолжаю сталкиваться с этой глупой проблемой:

 ACTION1 createdoracle.jdbc.driver.T4CConnection@484845aa

 Exception:java.sql.SQLSyntaxErrorException: ORA-00904: "ART": invalid identifier

Код:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    //CLASS TYPE 
    //LIST ALL OFFERED CLASSES AND REVENUE


    try{
        String classtype = jTextField1.getText().trim();
        if(classtype.equals("")){
            JOptionPane.showMessageDialog(this, "Sorry Wrong input.... Please try again....");
        }
        else if(classtype != ""){
            try
            {
                    Class.forName("oracle.jdbc.driver.OracleDriver");
                    Connection conn=DriverManager.getConnection(
                    "jdbc:oracle:thin:@fourier.cs.iit.edu:1521:orcl",
                    "usr","pwd");
                    Statement stmt = conn.createStatement();
                    System.out.println("ACTION1 created"+conn+"\n\n");


                    String ct = jTextField1.getText().trim();
                    //String aa = "SELECT * FROM CLASS WHERE TYPE="+classtype;
                    //System.out.println(aa);

                    ResultSet rset = stmt.executeQuery("SELECT * FROM CLASS WHERE TYPE="+ct);
                    while (rset.next()) { 
                        System.out.println(rset.getString("TITLE") + " ");
                    }

                    JOptionPane.showMessageDialog(this, "Class Type: "+classtype);


                    stmt.close();
                    conn.close();
                    System.out.println("Connection Closed");
            }
            catch(Exception sqle){
                    System.out.println("\nException:"+sqle);
            }
        }
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(this, "Please Retry input....", "Error", JOptionPane.ERROR_MESSAGE);
    }

}

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Позвольте мне угадать ... строка ct начинается с "ART" (или какого-либо варианта)?

Если это так, проблема в том, что SQL требует кавычек вокруг строковых литералов. Ваш запрос, вероятно, выглядит для Oracle примерно так:

    SELECT * FROM CLASS WHERE TYPE=Art of War

но это должно выглядеть как

    SELECT * FROM CLASS WHERE TYPE='Art of War'

Есть два способа исправить это:

  1. Соберите запрос с символами кавычек вокруг ct.

  2. Напишите запрос как "SELECT * FROM CLASS WHERE TYPE=?", используйте PreparedStatement вместо Statement и используйте метод setString для предоставления значения параметра.

Если все сделано правильно, второй подход является одновременно более безопасным и более эффективным. (Проблема с разбивкой строки запроса и использованием Statement заключается в том, что вы потенциально делаете себя уязвимым для атак SQL-инъекций.)

2 голосов
/ 01 марта 2012

Вы передаете значение как часть запроса, и конкатенация строк, которую вы делаете, превращает SQL в:

SELECT * FROM CLASS WHERE TYPE=ART

(где ART - значение ct из текстового поля), поэтому он пытается найти столбец в таблице с именем ART. При абсолютном минимуме вам необходимо заключить в кавычки строку:

ResultSet rset = stmt.executeQuery("SELECT * FROM CLASS WHERE TYPE='" + ct + "'");

Но на самом деле не делайте этого; как @Andreas_D говорит, что вы оставляете себя открытым для SQL-инъекций. Всегда используйте подготовленные операторы и связывайте переменные:

String sql = "SELECT * FROM CLASS WHERE TYPE=?";
PrepareStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, ct);
ResultSet rset = stmt.executeQuery(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...