1

我整天都在为这个问题苦苦挣扎。在阅读了 Statements(S) 和 PreparedStatements(PS) 之间的好处之后,我决定将我所有的 S 转换为 Netbeans 中的 PS。我惊讶地发现没有错误,但是......我的代码执行也没有输出。

import java.sql.*;
public class ViewingMySQL {
public static void main(String[] args) {

 //Declare Variables
 Connection con;
 ResultSet rs;
 Statement stmt;
 String sqlappname;

 PreparedStatement findAppID_lookup= null;
 String findAppID_lookup_stmt="select app.ID as APPID" 
 +" from IntergraphIN_AppTranslation" 
 +" inner    join app on app.unit=IntergraphIN_AppTranslation.UnitName" 
 +" where IntergraphIN_AppTranslation.IntergraphUnitName=(?)";

try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection("jdbc:odbc:database","username","password");
sqlappname="'XXXY01'";
findAppID_lookup= con.prepareStatement(findAppID_lookup_stmt);
findAppID_lookup.setString(1, sqlappname);
rs = findAppID_lookup.executeQuery();

if(rs.next()){
System.out.println(rs.getInt("APPID"));
}

rs.close();
findAppID_lookup.close();

}
 catch(Exception e){
 System.err.println(e);
 }
}
}`

当上面的代码执行和构建时......没有输出。运行:BUILD SUCCESSFUL(总时间:1 秒)

我原来是:

import java.sql.*;

public class ViewingMySQL {

public static void main(String[] args) {
//Declare Vars
Connection con;
ResultSet rs;
Statement stmt;
String sqlappname;

try{

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection("jdbc:odbc:Database","username","password");

sqlappname="'XXXY01'";

stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);

rs = stmt.executeQuery("SELECT ID FROM app where AppName="+sqlappname);
if(!rs.isBeforeFirst()){
    rs.close();
    rs = stmt.executeQuery("select app.ID from IntergraphIN_AppTranslation"
    +" inner join app"
    +" on app.unit=IntergraphIN_AppTranslation.UnitName"
    +" where IntergraphIN_AppTranslation.IntergraphUnitName="+sqlappname);
}

if(rs.next()){
System.out.println(rs.getInt(1));
}
rs.close();
stmt.close();
con.close();
}catch(Exception e){
System.err.println(e);
}
}
}`

此代码输出:运行:2020603 BUILD SUCCESSFUL(总时间:1 秒)

您在上面看到的 Int 是我要查找的列的 ID。

有人可以帮我理解我在做什么...是我传递给 PS 的变量的格式吗?谢谢,斯科利斯

4

1 回答 1

1

改变这个:

sqlappname="'XXXY01'";

对此:

sqlappname="XXXY01";

更新重新评论:

PreparedStatements 有很多好处。例如:

  • 它可以帮助防止 sql 注入:输入绑定到变量,输入不用于创建语句

  • 如果只有绑定变量更改(而不是更改 sql 语句本身),则 rdbms 可能会使用语句缓存

  • 这些陈述可以更容易阅读:你不必搞乱引用引号等

在这种情况下,引用的含义似乎变得混乱。原文:sqlappname="'XXXY01'",双引号是声明java字符串,单引号是sql字符串。在准备好的版本中:sqlappname="XXXY01",我们只是说“这是要绑定的字符串”,并且我们在准备好的语句中指定我们的绑定将是一个字符串。

于 2012-04-12T02:14:47.687 回答