Как вставить дату - PullRequest
       17

Как вставить дату

0 голосов
/ 16 декабря 2011

Я написал 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 ]

5 голосов
/ 16 декабря 2011

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 a DATE вместо явно VARCHAR, а затем установить его на setDate(). Таким образом, вам будет легче позволить БД выбирать / сортировать результаты по дате на более позднем этапе.

Последнее, но не менее важное, пожалуйста, прочитайте Соглашения об именах Java . Методы и имена переменных в стиле PHP затрудняют чтение кода Java для обычных разработчиков Java.

2 голосов
/ 16 декабря 2011

Вы не можете иметь предложение WHERE в операторе INSERT в SQL. Мне кажется, что вы хотите установить время последнего входа в систему для пользователя, который уже находится в таблице, вместо добавления строки в таблицу. В этом случае вам нужно вместо этого использовать оператор 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), как вы делаете, будет работать. Это очень сильно зависит от того, какую базу данных вы используете.

2 голосов
/ 16 декабря 2011

В вашем запросе три параметра (? символов), поэтому вам нужно установить столько параметров. Вы устанавливаете только один из них (третий), поэтому вам нужно иметь

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, вы также можете рассмотреть возможность использования функции Oracle TO_DATE (см. 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;

Строка формата может быть изменена в соответствии с вашими потребностями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...