我正在运行以下代码:
// 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");
}
当我运行它时,它会为第一个查询提供一个有效的结果,并说"未找到首选纬度"对于第二个。是什么赋予了?可能会发生什么?
答案 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)。