如何插入日期

时间:2011-12-16 12:54:14

标签: java date jdbc

我写了一个用于插入当前日期的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;
       }

你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

  

java.sql.SQLException:索引:: 1

时缺少IN或OUT参数

您已定义了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开发人员。

答案 1 :(得分: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所说,要设定日期,最好在setDate()上使用PreparedStatement方法。但是,在使用Oracle时,您还可以考虑使用TO_DATE Oracle函数(请参阅http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions183.htm),该函数将字符串转换为Oracle日期。 e.g。

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

可以根据需要更改格式字符串

答案 2 :(得分:2)

在SQL中的WHERE语句中不能有INSERT子句。在我看来,您希望为表中已有的用户设置上次登录时间,而不是向表中添加行。在这种情况下,您需要使用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)正如您所做的那样。这在很大程度上取决于您使用的是哪个数据库。