![](/img/trans.png)
[英]PL/SQL JAVA ORACLE ERROR ORA-00904: INVALID IDENTIFIER
[英]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'
有兩種方法可以解決此問題:
用ct
周圍的引號將查詢組裝起來。
將查詢寫為"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.