无法在mysql中插入空日期值

时间:2013-01-24 17:33:01

标签: java mysql sql

String datum = datumInvoer.getText();

    **String bdate = bdatumInvoer.getText();**

    String[] speler = spelers.getSelectedItem().toString().split(" ");


    String[] toernooi = toernooien.getSelectedItem().toString().split(" ");
    try {
        PreparedStatement query = con.prepareStatement("INSERT INTO `fullhouse`.`inschrijving_toernooi` ( `IT_datum`, `IT_betaaldatum`, `speler`, `toernooi`) VALUES (?, ?, ? ,?)");
        query.setString(1, datum);
        query.setString(2, bdatum);
        query.setString(3, speler[0]);
        query.setString(4, toernooi[0]);

        query.execute();

我已将默认值设置为NULL,但它仍然不会插入它我接近将数据类型更改为varchar。

错误:日期值不正确

delimiter $$

CREATE TABLE `inschrijving_toernooi` (
  `IT_code` int(11) NOT NULL AUTO_INCREMENT,
 `IT_datum` date DEFAULT NULL,
  `IT_betaaldatum` date DEFAULT NULL,
 `speler` int(11) NOT NULL,
 `toernooi` int(11) NOT NULL,
PRIMARY KEY (`IT_code`),
UNIQUE KEY `aaa` (`speler`,`toernooi`),
 KEY `FS_code_idx` (`speler`),
KEY `FT_code_idx` (`toernooi`),

3 个答案:

答案 0 :(得分:1)

首先将日期参数从字符串转换为日期。对于以下代码。

String bdate = bdatumInvoer.getText();
// get the correct date Format
// follow the link to get correct date format
// throws ParseException 
Date date = new SimpleDateFormat("dd-MM-yyyy").parse(bdate);

Class SimpleDateFormat API

现在在准备好的声明中将它们设置为如下所示的日期。由于您的表结构允许表格中的日期。

query.setDate(2, date);

现在您仍然希望将null设置为该列,然后您可以使用并告诉您的查询在预准备语句中使用以下格式设置null。

query.setNull(2, java.sql.Types.DATE);

query.setDate(2, null);

setNull API

Mapping of java.sql.Types to SQL types

我认为这将解决您的问题。

答案 1 :(得分:0)

您需要更改将参数传递给准备好的语句

的方式

应该是下面的内容。而datum和bdatum应该是Date类型。如果你不使用数据库中定义的类型,你可以将无效数据传递给你的sql,这会导致异常。

query.setDate(1, datum);
query.setDate(2, bdatum);
query.setInt(3, speler[0]);
query.setInt(4, toernooi[0]);

答案 2 :(得分:0)

我怀疑你的bdatum变量包含一个空字符串。如果要插入SQL null,则需要传入null,而不是空字符串。 (当我在具有类似插入的机器上尝试此操作时,尝试插入空字符串时出现“不正确的日期值”,但没有null。)

if ("".equals(bdatum))
    bdatum = null;

ps.setString(2, bdatum);

当您在JDBC中传入一个字符串中的日期值时,MySQL将尝试解析它,但空字符串("")不是有效值。这与您尝试使用日期文字进行插入的方式类似:

INSERT INTO `some_table` (`some_nullable_date_column`) VALUES ('2000-01-01') -- this works
INSERT INTO `some_table` (`some_nullable_date_column`) VALUES (NULL) -- this works
INSERT INTO `some_table` (`some_nullable_date_column`) VALUES ('') -- this fails

顺便说一句,传入一个日期值的字符串语义错误,并且可能不如将字符串解析为Date对象,然后将其传递给{{1} }。