2009-10-01 51 views
2

類似的問題到: Strange problem with JDBC, select returns null 但人們並沒有要求這一點。Oracle JDBC選擇與WHERE返回0

我的代碼:

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查詢返回表中所有行的數量。 我用ojdbc-14.jar的Oracle 10g(從行家回購最後一個版本)和Java 6

+0

如果它返回0,則沒有與您的WHERE匹配的行。乾淨利落。在客戶端(例如SQLDeveloper)中運行相同的查詢並查看結果是什麼。 – 2009-10-01 14:10:27

回答

5

day沒有被正確引用,我會如下建議使用一個事先準備好的聲明一份準備好的聲明:

... 
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

4

首先使用SQL的這樣是不可取的。因爲它會導致SQL注入。

在未來嘗試使用類似下面,並使用PreparedStatement的執行

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

您的解決方案並嘗試

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

karim79是很好的答案,你忘了你的「天添撇號跡象「值

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