2015-12-05 4 views
1

Я пытаюсь ввести информацию в программу java и сохранить эту информацию в базе данных оракула. Но при попытке ввода данных даты я получаю сообщение об ошибке. Это данные, которые я пытаюсь отправить:ORA-01847 день месяца должен быть между 1 и последним днем ​​месяца - вставка даты в базу данных Oracle

int id = Integer.parseInt(id_text.getText()); 
    String name = name_text.getText(); 
    String dobt = id_text.getText(); 
    String address = addr_text.getText(); 
    int number = Integer.parseInt(num_text.getText()); 
    String gender = gender_text.getText(); 
    int club = Integer.parseInt(club_text.getText()); 
    int county = Integer.parseInt(county_text.getText()); 
    String date = date_text.getText(); 
    String type = type_text.getText(); 

Я ввода данных в текстовые поля и хранение этих данных в указанных выше переменных. Тогда я пытаюсь отправить эти переменные значения к моему столу с PreparedStatement так:

ps = conn.prepareStatement("INSERT INTO player VALUES(?,?,?,?,?,?,?,?,?,?)"); 
      ps.setInt(1, id); 
      ps.setString(2, name); 
      ps.setString(3, dobt); 
      ps.setString(4, address); 
      ps.setInt(5, number); 
      ps.setString(6, gender); 
      ps.setInt(7, club); 
      ps.setInt(8, county); 
      ps.setString(9, date); 
      ps.setString(10, type); 
      int i = ps.executeUpdate(); 

Вот таблица я пытаюсь вставить в:

CREATE TABLE player 
(
    member_id INT PRIMARY KEY NOT NULL, 
    member_name VARCHAR2(70) NOT NULL, 
    date_of_birth DATE, 
    member_address VARCHAR2(300), 
    contact_number INT NOT NULL, 
    gender VARCHAR2(1) NOT NULL CHECK(gender IN('f','m')), 
    club_seeding INT NOT NULL, 
    county_seeding INT NOT NULL, 
    renewal_date DATE, 
    m_type VARCHAR(9) NOT NULL CHECK(m_type IN('junior','student', 'senior', 'family', 'associate')) 
); 

Я довольно новыми для этого, и не могут найти похожие проблемы в Интернете. Любая помощь будет принята с благодарностью!

+0

, пожалуйста, предоставьте структуру таблицы ... я полагаю, это Datetime в DB – Naruto

+0

Какие значения вы вводите для DATE_OF_BIRTH и RENEWAL_DATE? –

+0

Im с использованием формата YYYY-MM-DD –

ответ

1

Я бы рискнул вашим Java-кодом, ваша база данных и ваш пользователь не согласны с тем, как должна выглядеть правильно отформатированная дата. Чтобы убедиться в этом, установите точку останова при вызове Connection.prepareStatement() и проверьте значение date и dobt.

Я предлагаю изменение линии в первом блоке кода

String dobt = id_text.getText(); 
String date = date_text.getText(); 

в

java.text.DateFormat formatter = java.text.DateFormat.getDateInstance() 
java.util.Date dobt = formatter.parse(
java.util.Date date = formatter.parse(date_text.getText()); 

и во втором использовании блока

ps.setDate(3, dobt); 
ps.setDate(9, date); 

Читайте на DateFormat класса для более информация о датах синтаксического анализа.

Кроме того, после кодирования, мне интересно, хотите ли вы извлечь dobt из id_text?

+0

Im получение этой ошибки: незарегистрированное исключение ParseException; должны быть пойманы или объявлены наброшенными на строку: –

+0

java.util.Date date = formatter.parse (date_text.getText()); –

+0

Новое на Java, я понимаю. Вам нужно прочитать об обработке исключений, но теперь добавьте 'throws ParseException' в функцию, содержащую указанный выше код. Вам также понадобится в конце концов поймать это исключение, возможно, везде, где вы ловите SQLExceptions, которые бросают функции JDBC. –

2

Я довольно удивлен ошибкой, которую вы получаете после просмотра кода, но сообщения об ошибках могут иногда вводить в заблуждение или настолько расплывчатыми, что не знаете, что думать! Но я думаю, что могу помочь ...

Прежде всего, вы пытаетесь поставить значение в Строка в Дата колонки:

ps.setString(9, date); 

Это должно быть:

ps.setDate(9, date); 

Конечно, в этой точке переменная «дата» по-прежнему является переменной String ... которая просто не будет делать!

Вы должны преобразовать свою строку, содержащую дату в SQL Тип данных даты (тип данных Java Date также не поможет)!

Так, где у вас есть строка:

String date = date_text.getText(); 

Заменить его:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy", Locale.US); 
java.sql.Date date = (java.sql.Date)df.parse(date_text.getText()); 

Для того, чтобы использовать функцию SimpleDateFormat(), вам нужно будет иметь следующую строку добавлены с другими (если его там еще нет):

import java.text.DateFormat; 

Это должно сделать трюк. Конечно, если языковой стандарт или формат, в котором вы указали дату в своей строке, различны, вам нужно будет отрегулировать эту информацию в параметрах функции SimpleDateFormat().

Кроме того, вы можете изменить переменную: date (даже если это не Java зарезервированное слово) к чему-то, что становится ясно, какой даты ее ... что-то вроде: createDate, updateDate, birthDate.

Вниз, это окупается, чтобы занять немного дополнительного времени, чтобы подумать о том, как вы называете переменные, классы и т. Д. Ясность ясности ясности! Кроме того, чтобы сделать код более понятным, у вас не будет возможности, что вы можете случайно использовать зарезервированное слово или имя существующего класса и т. Д.

+0

Проблема заключается в анализе даты на строку –

+0

Или наоборот –

Смежные вопросы