Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么没有输入参数的PreparedStatement会成功,但是具有输入参数的相同版本会失败?_Java_Prepared Statement - Fatal编程技术网

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

Java 为什么没有输入参数的PreparedStatement会成功,但是具有输入参数的相同版本会失败?,java,prepared-statement,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 =

我正在运行以下代码:

// 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");
}

当我运行它时,它会为第一个查询提供一个有效的结果,并为第二个查询显示未找到首选纬度。有什么好处?这里会发生什么事?

完全是胡说八道,我想我可以确定是否编写了测试代码,但我太懒了: 在同一个连接上调用con.prepareStatement两次。我建议先关闭第一个prepareStatement,然后再从数据库中获取另一个prepareStatement。他们可能互相干扰。我也会考虑关闭结果集,当我完成它。 编码建议:如果您还没有这样做,我建议在try/catch/finally的finally块中关闭连接、preparedStatement和resultSet,按相反的顺序,在关闭每个连接之前检查它们是否为null。

看起来您完全在使用setString,但是,例如,如果列类型不是代理键的字符串,则可能需要使用setInt

Per:

注:setter用于设置的方法有setShort、setString等 IN参数值必须指定与兼容的类型 已定义输入参数的SQL类型。例如,如果 参数具有SQL类型整数,则方法setInt应为 用过


看起来您在第二个查询中将param 2设置为well,这是第一个查询中的第一个参数。另外,为什么要在源代码查询中使用StringBuilder?ResultSet testRs=testPstmt.executeQuery;iftestRs.next{System.out.printlnResult:+testRs.getString1;}此操作后,可以调用testRs.close,然后启动第二个操作。告诉我是什么happen@Goibniu发现问题,给他一个cookie@Goibniu该死,你说得对!我就知道会是那样的傻事。非常感谢。你说得对,我也不知道为什么过去的我也选择了StringBuilder。哈哈,有时候需要第二双眼睛才能发现问题: