ORA-01847每月的日期必须介于1月和最后一天之间 - 将日期插入Oracle数据库

时间:2015-12-05 19:34:37

标签: java sql oracle netbeans

我正在尝试将信息输入java程序并将该信息存储在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'))
);

我对此很新,在网上找不到类似的问题。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

我对查看代码后出现的错误感到相当惊讶,但错误消息有时会产生误导或模糊,不知道该怎么想!但我想我可以帮忙......

首先,您尝试将 String 值放入 Date 列:

ps.setString(9, date);

应该

ps.setDate(9, date);

当然在这一点上,变量“date”仍然是一个String变量......这是不会做的!

您必须将包含日期的字符串转换为 SQL 日期数据类型(Java日期数据类型也不会起作用)!

所以,你有这条线:

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语句中添加以下行(如果它还没有):

import java.text.DateFormat;

这应该可以解决问题。当然,如果区域设置或您在String中具有日期的格式不同,则需要在SimpleDateFormat()函数的参数中调整该信息。

此外,您可能希望将名为date的变量(即使它不是Java保留字)更改为能够清楚它是什么类型的日期...类似于:{ {1}},createDateupdateDate

在路上,花点时间考虑一下变量,类等的命名,清晰明确!除了使代码更清晰易懂之外,您不会有可能意外地尝试使用保留字或现有类的名称等。

答案 1 :(得分:1)

我冒险使用您的Java代码,您的数据库和您的用户不同意正确格式化的日期应该是什么样子。要验证这一点,请在致电Connection.prepareStatement()时设置断点,并检查datedobt的值。

我建议更改第一个代码块中的行

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