簡體   English   中英

Oracle Java SQL異常錯誤:ORA-0094

[英]Oracle Java SQL Exception Error: ORA-0094

我正在嘗試為此按鈕編寫一個函數。 我希望能夠向其傳遞一個textfield值,並能夠進入我的數據庫以檢索一些信息.....

有人可以向我解釋發生了什么,並為我解決這種瘋狂問題嗎?

謝謝大家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);
    }

}

讓我猜想…… 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注入攻擊的攻擊。)

您正在將值作為查詢的一部分傳遞,並且您正在執行的字符串連接使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(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM