我正在尝试为此按钮编写一个函数。我希望能够传递一个文本字段值,并能够进入我的数据库以检索一些信息.....
有人可以向我解释发生了什么,并为我提供解决这种疯狂的方法吗?
谢谢大家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);
}
}
答案 0 :(得分:3)
让我猜一下...... ct
字符串是以“ART”(或某些变体)开头的吗?
如果是这样,问题是SQL需要围绕字符串文字的引号。你的查询可能看起来像这样的东西:
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注入攻击。)
答案 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();