0

別のクラスから「publicstaticNEW_QUERY」を読み込む必要がありますが、メソッドが呼び出されたときに変更される変数がクエリ内にあります。この「publicstatic」を呼び出して、別のクラスから更新されたQUERYを取得するにはどうすればよいですか。

これがJavaコードです。

package artemispm.autocalc;

import java.sql.*;
import java.util.*;
import a7.unittests.dao.UnitTestHelper;
import artemispm.serverutil.*;
import artemispm.trdo.*;
import artemispm.parser.*;

public abstract class TRBaseScoreCalculator implements ExpressionParserLookup {
                           
/******THIS IS THE PLACE I NEED TO HAVE CORRECTED**********/
/*HOW DO I FORCE THIS TO PUSH VALUES INTO 'match' and 'useFor'*/
/**SO THAT I CAN CALL NEW_QUERY FROM ANOTHER CLASS *****/
/****IT SAYS 'match' and 'useFor' cannot be resolved****/

public static String NEW_QUERY = "select count(userfieldid) from tr_userfield where calcexpression like '%" + match + "%'and usefor like '%" + useFor +"%'";

public Connection               m_con;
protected String                m_characName        = "";

public boolean isThisCharacInUse(Connection con, String characName,String useFor) 
throws SQLException, TRException {
    boolean result;        
    String match = "[" + TRBaseSql.rewrapQuotes(characName) + "]";
  
    if(TRBaseSql.getDatabaseType(con) == TRBaseSql.DBTYPESQLSERVER) {
        match = "[[]" + TRBaseSql.rewrapQuotes(characName) + "]";
    }
    
    TRSystemSQL sql = new TRSystemSQL();
    TRSystem sys=sql.getSystem(con);
    result =    (   sys.getScoreCalculation() != null 
                &&  sys.getScoreCalculation().indexOf(match) >= 0  );
    if (result) return(result);
    else {
        
        int count;

        /*****THIS IS THE PLACE I NEED HELP AT  12/5/2012 ******/

        count = sql.executeGetInt(con, NEW_QUERY , null);
        
        if (count > 0) return true;
        count = sql.executeGetInt(con, 
                "select count(characid) from tr_charac where calcexpression like '%" + match + "%'and usefor like '%" + useFor +"%'" , null);
        return (count > 0);
        }
}
}

これに加えて、私はここでは試みていませんが、仕様にあるように私はそうすることになっています:

  • すべての埋め込みSQLステートメントを見つけて、まだ定数を使用していない埋め込みSQLの定数を実装します。

  • Sqlステートメント作成内の文字列連結をString.format()に置き換えます。

  • String.formatコマンドの場合、既存の%記号をエスケープする必要があります。これらのシンボルは、LIKE操作でよく使用されます。

    私が行っているのは、別のファイルからの各クエリの単体テストで、MSSQLServer2005からMYSQLへのデータ移行が正しいことを確認することです。

STRING.FORMATSPECを前提とした最良のソリューションは以下のとおりです。これは正しいです。テストは合格しましたが、可能な限り元のコードを少し変更することになっていると思いました

package artemispm.autocalc;

import java.sql.*;
import java.util.*;
import a7.unittests.dao.UnitTestHelper;
import artemispm.serverutil.*;
import artemispm.trdo.*;
import artemispm.parser.*;

public abstract class TRBaseScoreCalculator implements ExpressionParserLookup {
                           
/******THIS IS THE PLACE I NEED TO HAVE CORRECTED**********/
/*HOW DO I FORCE THIS TO PUSH VALUES INTO 'match' and 'useFor'*/
/**SO THAT I CAN CALL NEW_QUERY FROM ANOTHER CLASS *****/
/****IT SAYS 'match' and 'useFor' cannot be resolved****/

public static String NEW_QUERY = String.format( "select count(userfieldid) from tr_userfield where calcexpression like %s and usefor like %s", "?", "?");

public Connection               m_con;
protected String                m_characName        = "";

public boolean isThisCharacInUse(Connection con, String characName,String useFor) 
throws SQLException, TRException {
    boolean result;        
    String match = "[" + TRBaseSql.rewrapQuotes(characName) + "]";
  
    if(TRBaseSql.getDatabaseType(con) == TRBaseSql.DBTYPESQLSERVER) {
        match = "[[]" + TRBaseSql.rewrapQuotes(characName) + "]";
    }
    
    TRSystemSQL sql = new TRSystemSQL();
    TRSystem sys=sql.getSystem(con);
    result =    (   sys.getScoreCalculation() != null 
                &&  sys.getScoreCalculation().indexOf(match) >= 0  );
    if (result) return(result);
    else {
        
        int count;

        /*****THIS IS THE PLACE I NEED HELP AT  12/5/2012 ******/

        PreparedStatement stmt = con.prepareStatement(TRBaseScoreCalculator.NEW_QUERY);
        stmt.setString(1, "%"+match+"%");
        stmt.setString(2, "%"+useFor+"%");
        
        count = sql.executeGetInt(con, stmt.toString() , null);
        
        if (count > 0) return true;
        count = sql.executeGetInt(con, 
                "select count(characid) from tr_charac where calcexpression like '%" + match + "%'and usefor like '%" + useFor +"%'" , null);
        return (count > 0);
        }
}
}
4

2 に答える 2

3

静的変数/メソッドはlass定義に関連付けられているため、非静的変数/メソッドを使用することはできません。

matchおよびが静的でない場合useFor(その場合)、次のような静的qqueryを使用することはできません。

public static String NEW_QUERY = "select count(userfieldid)from tr_userfield where calcexpression like'%" + match + "%' and usefor like'%" + useFor + "%'";

クエリでプレースホルダーを次のように使用することをお勧めします。

 public static String NEW_QUERY = 
           "select count(userfieldid) from tr_userfield "+
            " where calcexpression like ? and usefor like ?";

および使用場所については、クエリパラメータセットメソッドを使用して値を渡します。

   PreparedStatement stmt= con.prepareStatement(TRBaseScoreCalculator.NEW_QUERY);
   stmt.setString(1,"%"+match+"%");
   stmt.setString(1,"%"+useFor+"%");

編集:使用したい場合はString.format、以下を試してください:

 public static String NEW_QUERY =  "select count(userfieldid) from tr_userfield "+
                           "  where calcexpression like '%s' and usefor like '%s'";

クエリ文字列を使用している行で、次の手順を実行します。

 String updatedQuery = String.format(TRBaseScoreCalculator.NEW_QUERY, 
                                      "%"+match+"%", "%"+useFor+"%");
 count = sql.executeGetInt(con, updatedQuery, null);

しかし、それでも私はPraparedStatementルートを好みます。その場合、不要にする必要はありませんString.format

于 2012-12-05T21:08:21.883 に答える
1

sを使用するPreparedStatementと、非静的コンテンツが静的コンテキストから参照されるというこの問題を回避できるだけでなく、おまけにアプリケーションが簡単に侵害されなくなります。

于 2012-12-05T21:12:04.307 に答える