我写了一个用于插入当前日期的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 :(得分: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
)正如您所做的那样。这在很大程度上取决于您使用的是哪个数据库。