我正在尝试从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中的占位符,但它没有帮助。请指教。
答案 0 :(得分:1)
id
列这可能是由于间距差异或其他微妙的差异造成了它们相同的印象。
字符串' 123 '
或'00123'
(例如)不等同于'123'
类型中的VARCHAR2
,而是等同于NUMERIC
类型,因为 Oracle 将所有这些字符串转换为数字123
。
最好使用NUMERIC
列作为id
来避免此类问题。将有效id
值限制为整数而不是任意字符串也是有意义的。
使用 Oracle ,您可以继续使用setString
,因为它会自动将字符串转换为整数。但我建议您改为使用setInt
或setLong
(转换id
列之后),因为其他数据库解决方案(如 Postgres )将不接受字符串匹配NUMERIC
列。
当您捕获Throwable
或Exception
(或其子类型)时,请务必考虑是否可以忽略它,或者必须抛出它以便进一步处理(例如,停止程序,提醒用户或纠正问题。)
在您的代码中,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=?