为什么没有输入参数的PreparedStatement会成功,但是相同版本的WITH输入参数会失败?

时间:2014-01-21 17:27:58

标签: java prepared-statement

我正在运行以下代码:

// Query without parameters
String query = "select data_source from Qc_data_blending_sources where external_object_type_name='well' AND instance_surrogate_key='837410' and attribute_name='preferred_latitude'";
PreparedStatement testPstmt = con.prepareStatement(query);
ResultSet testRs = testPstmt.executeQuery();
if(testRs.next()){
    System.out.println("Result: " + testRs.getString(1));
}

// Query with parameters
sources_query = new StringBuilder("select data_source from Qc_data_blending_sources where external_object_type_name=? AND instance_surrogate_key=? AND attribute_name=?");
sourcesPstmt = con.prepareStatement(sources_query.toString());
sourcesPstmt.setString(1, vo.getWellSurrogateKey()); //set to 837410
sourcesPstmt.setString(2, "well");
sourcesPstmt.setString(3, "preferred_latitude");

dataBlendingSources.append("Preferred latitude: ");
sourcesRs = sourcesPstmt.executeQuery();
if(sourcesRs.next()){
    dataBlendingSources.append(sourcesRs.getString(1) + " \n");
}
else{
    dataBlendingSources.append(" not found, \n");
    System.out.println("Preferred latitude not found. Query: " +
            sources_query.toString() +
            " \ninstance_surrogate_key: " + vo.getWellSurrogateKey() + 
            " attribute_name: preferred_latitude");
}

当我运行它时,它会为第一个查询提供一个有效的结果,并说"未找到首选纬度"对于第二个。是什么赋予了?可能会发生什么?

2 个答案:

答案 0 :(得分:-1)

您似乎完全使用setString(),但如果列类型不是代理键的字符串,则可能需要使用setInt()

prepared statement documentation

  

注意:用于设置的setter方法(setShort,setString等)   IN参数值必须指定与其兼容的类型   定义了输入参数的SQL类型。例如,如果IN   参数有SQL类型INTEGER,那么方法setInt应该是   使用

答案 1 :(得分:-2)

完全脱离墙壁猜测(我可以肯定,如果我编写代码来测试它,但我太懒了):
您在同一连接上调用con.prepareStatement()两次。我建议在从数据库获取另一个prepareStatement之前关闭第一个prepareStatement。他们可能互相干扰。当我完成它时,我也会考虑关闭resultSet。

编码建议:如果你还没有这样做,我建议你在try / catch / finally的finally块中关闭连接,preparedStatement和resultSet,按照你获得它们的相反顺序(在关闭每个之前检查null)。