准备好的语句不返回字符串数字的结果

时间:2014-09-05 05:49:11

标签: java jdbc

我正在尝试从oracle数据库中检索SQL查询的记录 - SELECT data FROM test where id = ?;

这是我检索数据的代码 -

public static String retrieveData(String id) throws IOException {
    String result = "";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
        try {
            String sql = "SELECT data FROM test where id = ?";
            connection = getDBConnection(); //this method gets the db connection
            ps = connection.prepareStatement(sql);
            ps.setString(1, id);
            rs = ps.executeQuery();
            while(rs.next()) {
                result = result + rs.getString("data");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            closeDBConnection(); //closes db connection
        }
        return result;
    }

当我在main方法中调用retrieveData时,它返回null。当我调试时,resultSet为空。我猜的原因是我将我的id作为字符串传递,但也许Oracle并不理解像 - SELECT data FROM test where id = "1234567890";

这样的东西

有人可以指导我如何解决这个问题?我尝试了很多东西,但我似乎无法从数据库获取此ID的数据。我也尝试使用Long.valueOf(String s).longValue();将id转换为long,并将其设置为ps.setLong中的占位符,但它没有帮助。请指教。

4 个答案:

答案 0 :(得分:1)

键入id

的问题

这可能是由于间距差异或其他微妙的差异造成了它们相同的印象。

字符串' 123 ''00123'(例如)等同于'123'类型中的VARCHAR2,而等同于NUMERIC类型,因为 Oracle 将所有这些字符串转换为数字123

最好使用NUMERIC列作为id来避免此类问题。将有效id值限制为整数而不是任意字符串也是有意义的。

使用 Oracle ,您可以继续使用setString,因为它会自动将字符串转换为整数。但我建议您改为使用setIntsetLong(转换id列之后),因为其他数据库解决方案(如 Postgres )将不接受字符串匹配NUMERIC列。


异常处理问题

当您捕获ThrowableException(或其子类型)时,请务必考虑是否可以忽略它,或者必须抛出它以便进一步处理(例如,停止程序,提醒用户或纠正问题。)

在您的代码中,catch块捕获SQLException并打印堆栈跟踪。但它没有做任何其他事情。

        } catch (SQLException e) {
            e.printStackTrace();
        } ...

这意味着您忽略了异常并继续执行程序,就好像没有发生一样。完成return result;阻止后,执行将继续finally

您的方法的调用者永远不会知道SQLException发生了,并且错误地认为没有错误并且返回的数据是正确的。

除非你真正想要的,你应该做的如下:

        } catch (SQLException e) {
            e.printStackTrace(); //it doesn't matter what you do here. the next line is what's important.
            throw e; //throw the exception after printing stack trace, logging, etc.
        } ...

在这种情况下,您的方法会在完成SQLException块后将finally抛出给调用者。执行将继续return result;

这样,您的方法的调用者将收到异常,并且知道发生了错误。然后呼叫者可以采取相应的行动;例如,通过停止程序,警告用户或使用不同的输入重试该方法。

答案 1 :(得分:0)

可能是DEBUG的原因。如果你在“while(rs.next())”行上有一个断点,你观察/检查它然后rs增加一个。然后代码第二次执行rs.next,没有记录 也许...

答案 2 :(得分:0)

你不应该使用数据类型' String'对于id字段,它可能会导致严重的麻烦。尝试将其转换为数值数据类型是可能的,但为什么不首先使用数字。你应该改为int或bigint。另外尝试捕获这样的异常:

try{

}catch(SQLException ex){
    System.out.println("Error at:" +ex.getClass().getName() + ex.getMessage());
}

再试一次,如果你不能调试它并找出原因!祝你好运!

答案 3 :(得分:-1)

请试试这个。用?定义字段名称时删除所有空格?并检查

 SELECT data FROM test where id=?