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);
 }
}
}`

上記のコードが実行されてビルドされると...出力なし。run: 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);
}
}
}`

このコードの出力: run: 2020603 BUILD SUCCESSFUL (合計時間: 1 秒)

上記の Int は、探している列の ID です。

誰かが私がやっていることを理解するのを手伝ってくれますか...それは私がPSに渡している変数のフォーマットですか? ありがとう、Sコーリス

4

1 に答える 1

1

これを変える:

sqlappname="'XXXY01'";

これに:

sqlappname="XXXY01";

コメントの更新:

PreparedStatements には複数の利点があります。例えば:

  • SQL インジェクションから保護するのに役立ちます。入力は変数にバインドされ、入力はステートメントの作成には使用されません。

  • (SQL ステートメント自体を変更するのではなく) バインド変数のみが変更される場合、rdbms はおそらくステートメント キャッシュを利用できます。

  • ステートメントは非常に読みやすくなります。引用符の引用などをいじる必要はありません。

この場合、引用の意味が混乱したようです。オリジナルの sqlappname="'XXXY01'" では、二重引用符で Java 文字列を宣言し、一重引用符で SQL 文字列を宣言していました。準備されたバージョン: sqlappname="XXXY01" では、「これはバインドする文字列です」とだけ言っており、準備されたステートメントで、バインドが文字列になることを指定しています。

于 2012-04-12T02:14:47.687 に答える