Oracle Java SQL异常错误:ORA-0094

时间:2012-03-01 08:58:50

标签: java sql oracle

我正在尝试为此按钮编写一个函数。我希望能够传递一个文本字段值,并能够进入我的数据库以检索一些信息.....

有人可以向我解释发生了什么,并为我提供解决这种疯狂的方法吗?

谢谢大家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 个答案:

答案 0 :(得分:3)

让我猜一下...... ct字符串是以“ART”(或某些变体)开头的吗?

如果是这样,问题是SQL需要围绕字符串文字的引号。你的查询可能看起来像这样的东西:

    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方法提供参数值。

  3. 如果处理得当,第二种方法更安全,更有效。 (对字符串进行字符串攻击并使用Statement的问题在于,您可能会使自己容易受到SQL注入攻击。)

答案 1 :(得分:2)

您将值作为查询的一部分传递,并且您正在执行的字符串连接使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();