【问题标题】:Oracle JDBC select with WHERE return 0Oracle JDBC select with WHERE return 0
【发布时间】:2009-10-01 10:25:41
【问题描述】:

类似的问题: Strange problem with JDBC, select returns null 但人们并没有要求这个。

我的代码:

public int myMethod(String day) throws SQLException{
  String sql = "Select count(*) from MyTable WHERE someColumn = " + day;
  Connection connection = ConnFactory.get();
  PreparedStatement prepareStatement = null;
  ResultSet resultSet = null;
  int ret = -1;
  try{
      prepareStatement = connection.prepareStatement(sql);
      resultSet = prepareStatement.executeQuery(sql);
      if(resultSet.next()){
          ret = resultSet.getInt(1);
      }
  }
  catch(SQLException sqle){
      // closing statement & ResultSet, log and throw exception
  }
  finally{
     // closing statement & ResultSet
  }
  ConnFactory.kill(connection);

  return ret;
}

此代码始终返回 0。我尝试在执行前记录 sql,并尝试在 SQLdeveloper 中运行它并获得正确的值(超过 100)。 当我删除 WHERE 时,sql = "Select count(*) from MyTable 查询返回表中所有行的数量。 我将 Oracle 10g 与 ojdbc-14.jar(来自 maven repo 的最新版本)和 Java 6 一起使用。

【问题讨论】:

  • 如果返回 0,则没有与您的 WHERE 匹配的行。干净利落。在客户端(例如 SQLDeveloper)中运行相同的查询并查看结果。

标签: java sql jdbc oracle10g


【解决方案1】:

day 没有被正确引用,我建议使用准备好的语句 like 准备好的声明如下:

...
try {
    prepareStatement = connection.prepareStatement("Select count(*) from MyTable WHERE someColumn = ?");
    prepareStatement.setString(1,day);
...

等同于:

sql = "Select count(*) from MyTable WHERE someColumn = '" + day + "'";

与后者相比有几个优势(主要是安全性和性能)。见:

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html

【讨论】:

    【解决方案2】:

    首先不建议这样使用sql。因为它会导致 SQL 注入。

    以后尝试像下面这样使用并使用 PreparedStatement 执行

    String sql = "Select count(*) from MyTable WHERE someColumn = ? "
    

    您是否尝试过解决方案

    String sql = "Select count(*) from MyTable WHERE someColumn = '" + day + "'";
    

    【讨论】:

      【解决方案3】:

      karim79 是个好答案,您忘记在“日”值中添加撇号

      String sql = "Select count(*) from MyTable WHERE someColumn = '" + day + "'";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2013-04-08
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-11-26
        相关资源
        最近更新 更多