【问题标题】:How to insert date如何插入日期
【发布时间】:2011-12-16 12:54:13
【问题描述】:

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

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

【问题讨论】:

  • 更重要的是,你得到了什么例外?它们通常包含完整的答案。
  • javax.servlet.ServletException: java.sql.SQLException: 索引处缺少 IN 或 OUT 参数:: 1 javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

标签: java date jdbc


【解决方案1】:

java.sql.SQLException: 索引处缺少 IN 或 OUT 参数:: 1

您已经定义了 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】:

    您的查询中有三个参数(? 字符),因此您需要设置这么多参数。你只设置了其中一个(第三个),所以你需要有

    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 时,您也可以考虑使用 TO_DATE 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;
    

    可以更改格式字符串以满足您的需要

    【讨论】:

      【解决方案3】:

      您不能在 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) 是否有效。这在很大程度上取决于您使用的是哪个数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 2021-03-22
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多