0
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 に変更しようとしています。

エラー: 日付の値が正しくありません

区切り記号 $$

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`),
4

3 に答える 3

0

準備済みステートメントにパラメーターを渡す方法を変更する必要があります

以下のようになるはずです。また、datum と bdatum は Date 型である必要があります。データベースで定義されているタイプを使用しない場合、無効なデータをSQLに渡すことができ、例外が発生します。

query.setDate(1, datum);
query.setDate(2, bdatum);
query.setInt(3, speler[0]);
query.setInt(4, toernooi[0]);
于 2013-01-24T17:52:21.020 に答える
0

bdatum変数に空の文字列が含まれていると思われます。nullSQL 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に間違っており、文字列をオブジェクトに渡す前に解析するよりも堅牢性が低い可能性がありますPreparedStatement

于 2013-01-24T17:53:56.820 に答える