2011-12-16 95 views
-2

我寫了一個Java代碼中插入當前日期,但是當我嘗試運行它發生異常:如何插入日期

public void Session_Table_Update (String Update_User) throws SQLException{ 
      String SQL_Statement = null; 
      error_Message = null; 
      if (ds == null) throw new SQLException(error_Database = "No data source");  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException(error_Database = "No connection");  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
        SQL_Statement = "INSERT INTO USERS (LAST_LOGIN) VALUES (?,?,?) WHERE USERZ ="+ Update_User; 

         PreparedStatement insertQuery = conn.prepareStatement(SQL_Statement); 
         insertQuery.setString(3, "2.2.2011"); 

         insertQuery.executeUpdate();     


         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 

      return; 
     } 

你能不能幫我解決這個問題?

+0

您使用的數據庫是? – 2011-12-16 12:56:08

+2

更重要的是,你會得到什麼例外?它們通常包含整個答案。 – BalusC 2011-12-16 12:58:48

回答

2

在查詢中有三個參數(?個字符),所以您需要設置多個參數。你只設置其中一個(第三個),所以你需要有

insertQuery.setString(1, "something"); 
insertQuery.setString(2, "something else"); 
insertQuery.setString(3, "2.2.2011"); 

或者其他set*方法取決於你的數據類型。請參閱http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

正如BalusC所說,要設置日期,最好在PreparedStatement上使用setDate()方法。但是,在使用Oracle時,您也可以考慮使用Oracle函數(請參閱http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm),該函數將字符串轉換爲Oracle日期。例如

"INSERT INTO USERS (LAST_LOGIN) VALUES (?,?,TO_DATE(?, 'D.M.YYYY')) WHERE USERZ ="+ Update_User; 

格式字符串是可以改變的,以滿足您的需求

5

值java.sql.SQLException:缺少IN或OUT參數的指數:: 1

你definied 3值佔位符(?,?,?)

SQL_Statement = "INSERT INTO USERS (LAST_LOGIN) VALUES (?,?,?) WHERE USERZ ="+ Update_User; 

但是,你只設置1值而不是3.

insertQuery.setString(3, "2.2.2011"); 

您需要將(?,?,?)(?)

SQL_Statement = "INSERT INTO USERS (LAST_LOGIN) VALUES (?) WHERE USERZ ="+ Update_User; 
// ... 
insertQuery.setString(1, "2.2.2011"); 

無關到具體的問題,我還建議由另一個佔位符替換Update_User避免SQL注入漏洞。

SQL_Statement = "INSERT INTO USERS (LAST_LOGIN) VALUES (?) WHERE USERZ = ?"; 
// ... 
insertQuery.setString(1, "2.2.2011"); 
insertQuery.setString(2, Update_User); // Or should it be `setLong()`? 

我還建議讓LAST_LOGIN一個DATE類型,而不是顯然是一個VARCHAR然後setDate()設置。通過這種方式,您可以更輕鬆地讓數據庫在稍後根據日期選擇/排序結果。

最後但並非最不重要,請閱讀Java Naming Conventions。 PHP風格的方法和變量名稱會讓Java代碼更難讀取到普通的Java開發人員。

2

你不能在一個SQL語句INSERT一個WHERE條款。在我看來,您希望爲已經在表中的用戶設置最後一次登錄時間,而不是向表中添加一行。在這種情況下,你需要使用一個UPDATE語句來代替,像

SQL_Statement = "UPDATE USERS SET LAST_LOGIN = ? WHERE USERZ = ?"; 
PreparedStatement insertQuery = conn.prepareStatement(SQL_Statement); 
insertQuery.setString(1, "2.2.2011"); 
insertQuery.setString(2, Update_User); 

我在與BalusC同意,你也應該傳遞用戶名使用的佔位符,而不是它串聯到SQL字符串。

但是,我無法確定將日期設置爲字符串(2.2.2011),因爲您正在執行此操作。這很大程度上取決於您使用的是哪個數據庫。