【问题标题】:Querying to Oracle DB through JDBC gives null while direct query gives the output通过 JDBC 查询 Oracle DB 给出 null 而直接查询给出输出
【发布时间】:2013-05-28 02:22:52
【问题描述】:

我有一个 sql 查询,当我通过 SQLDeveloper 应用程序手动发送到 Oracle DB 时,我得到了我想要的输出。但是,当我尝试通过 JDBC 驱动程序连接和查询为什么会发生这种情况时,相同的查询什么也不返回。请帮帮我。

代码:

String sql = "select * from tablename where id='" + id + "' AND case_id = '" + case_id + "'";

stmt = con.createStatement();
rs = stmt.executeQuery(sql);
System.out.println(sql);
System.out.println("next = " + rs.next());

输出:

select * from tablename where id='1' AND case_id = '1000'
next = false

两个连接(JDBC 和 SQLDeveloper)都使用相同的用户名和密码。所以我认为没有特权或安全问题。

【问题讨论】:

  • 列类型有哪些?
  • 您是否尝试过将 id 和 case_id 的值直接放入代码中?
  • 我已经执行了System.out.println(sql); 行打印的输出sql,我得到了输出
  • 您可能还想在数据库中进行查询日志记录以查看应用程序运行的查询。
  • @BevynQ : idnumber 类型,case_idvarchar2(20 Byte)

标签: java sql oracle jdbc


【解决方案1】:

尝试将“id”作为数字传递。当您将 ID 作为字符串传递时,JDBC 驱动程序会将其转换为 CHAR、VARCHAR 或 LONGVARCHAR。

String sql = "select * from tablename where id=" + id + " AND case_id = '" + case_id + "'";

结果字符串:

select * from tablename where id=1 AND case_id = '1000'

考虑使用带有绑定参数的 PreparedStatement,以避免 sql 注入:

String sql = "select * from tablename where id = ? AND case_id = ?";

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 1);
ps.setString(2, "1000");

ResultSet rs = ps.executeQuery();

参考资料:

http://docs.oracle.com/javase/6/docs/technotes/guides/jdbc/getstart/mapping.html http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

【讨论】:

  • 谢谢你的小费 :)
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多