質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

JavaのStringデータをデータベース用にDateに変換する

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,930

mercredi

score 24

前提・実現したいこと

Eclipseからオラクルデータベースに接続して二つのテーブルを読み込み、その二つのテーブルのプライマリーキーとユーザーインプットの日付とスコアの4つの列で新しいテーブルにデータを挿入したいのですが、ユーザーインプットのStringバリューがDate型に変換されず下記のようなエラーが出てしまいます。

発生している問題・エラーメッセージ

java.text.ParseException: Unparseable date: ""
    at java.text.DateFormat.parse(Unknown Source)
    at exercise1.DatabaseMainTest.insertTable(DatabaseMainTest.java:78)//Date PLAYING_DATE =(Date) format.parse(pAndg.getTxtDate().getText());
    at exercise1.PlayerAndGame$3.actionPerformed(PlayerAndGame.java:204)//db.insertTable();

もしくは

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Illegal pattern character 'O'
    at java.text.SimpleDateFormat.compile(Unknown Source)
    at java.text.SimpleDateFormat.initialize(Unknown Source)
    at java.text.SimpleDateFormat.<init>(Unknown Source)
    at exercise1.DatabaseMainTest.insertTable(DatabaseMainTest.java:78)
    at exercise1.PlayerAndGame$3.actionPerformed(PlayerAndGame.java:204)

該当のソースコード

public void insertTable() throws SQLException, ParseException
          {
                String queryco = "Insert into playerandgame(GAME_ID,PLAYER_ID,PLAYING_DATE,SCORE) values (?,?,?,?)";
                pst = connection.prepareStatement(queryco);
                PlayerAndGame pAndg=new PlayerAndGame();
                DateFormat format = new SimpleDateFormat("DD-MON-RR",Locale.ENGLISH);

                try{
                      int GAME_ID = Integer.parseInt(pAndg.getSelectedData());
                        int PLAYER_ID = Integer.parseInt(pAndg.getSelectedData2());
                        Date PLAYING_DATE =(Date) format.parse(pAndg.getTxtDate().getText());
                        int SCORE = Integer.parseInt(pAndg.getTxtScore().getText());
                        pst.setInt(1, GAME_ID);
                        pst.setInt(2, PLAYER_ID);
                        pst.setDate(3, PLAYING_DATE);
                        pst.setInt(4, SCORE);

                        pst.addBatch();

                    pst.executeBatch();
                    connection.commit();
                    }
                    catch(Exception e){
                        System.out.println(this);
                    }

          }

試したこと

データベースのプラットフォームはSql developerです。Preference->Database:NLSのDate formatはDD-MON-RRになっております。
Javaの列の型をStringにすると挿入できます。
日付入力は'DD-MON-RR'フォーマット以外にもいろいろな型を試してみました。

class PlayerAndGame extends JFrame {

    private JPanel mainPanel = new JPanel();
    private JPanel bottomLeft = new JPanel();
    private JPanel topPanel = new JPanel();
    private JPanel middlePanel = new JPanel();
    private JPanel bottomRight = new JPanel();
    private JLabel lLabel = new JLabel();
    private JLabel rLabel = new JLabel();
    private JLabel lblScore = new JLabel();
    private JLabel lblDate = new JLabel();
    private DefaultTableModel aModel = new DefaultTableModel();
    private DefaultTableModel bModel=new DefaultTableModel();
    private JTable lTable = new JTable(aModel);
    private JTable rTable = new JTable(bModel);
    private JTextField txtScore = new JTextField(15);
    private JTextField txtDate = new JTextField(15);
    private JScrollPane scroll1 = new JScrollPane(lTable);
    private JScrollPane scroll2 = new JScrollPane(rTable);
    DatabaseMainTest db = new DatabaseMainTest();
    private Vector rows = new Vector();
    private Vector columns = new Vector();
    private Vector p_rows = new Vector();
    private Vector p_columns = new Vector();
    String selectedData = null;
    String selectedData2 = null;

    private JButton btnInsert = new JButton();
    private JButton playerButton = new JButton();
    private JButton gameButton = new JButton();



    public JTable getlTable() {
        return lTable;
    }

    public JTable getrTable() {
        return rTable;
    }

    public JTextField getTxtScore() {
        return txtScore;
    }

    public JTextField getTxtDate() {
        return txtDate;
    }

    public String getSelectedData() {
        return selectedData;
    }
    public String getSelectedData2() {
        return selectedData;
    }

    public PlayerAndGame() throws SQLException {
        this.setSize(700, 700);
        this.setTitle("Game Information");

        mainPanel.setLayout(new GridLayout(3, 2, 5, 5));
        bottomLeft.setLayout(new GridLayout(3, 1, 2, 2));
        bottomRight.setLayout(new GridLayout(2, 1, 2, 2));
        topPanel.setLayout(new GridLayout(1, 2));
        middlePanel.setLayout(new GridLayout(1, 2));
        mainPanel.add(lLabel);
        mainPanel.add(rLabel);
        mainPanel.add(scroll1);
        mainPanel.add(scroll2);
        topPanel.add(lblScore);
        topPanel.add(txtScore);
        middlePanel.add(lblDate);
        middlePanel.add(txtDate);
        bottomLeft.add(topPanel);
        bottomLeft.add(middlePanel);
        bottomLeft.add(btnInsert);
        bottomRight.add(playerButton);
        mainPanel.add(bottomLeft);
        bottomRight.add(gameButton);
        mainPanel.add(bottomRight);



        add(mainPanel);

//        System.out.print(txtScore.getText().toString());
//        System.out.print(txtDate.getText().toString());

        ResultSet gameRS = db.getTableInfo("Game");
        ResultSetMetaData gameMD = gameRS.getMetaData();
        // create columns headers
        for (int i = 1; i <= gameMD.getColumnCount(); i++) {
            columns.addElement(gameMD.getColumnName(i));
        }
        //
        int row = 0;
        while (gameRS.next())// loop for rows
        {
            Vector vRow = new Vector(); // to store the current row
            for (int i = 1; i <= gameMD.getColumnCount(); i++)// loop for columns
            {

                Object columnValue = gameRS.getObject(i);
                vRow.addElement(columnValue.toString());

            }
            row += 1;
            rows.addElement(vRow);// add individual row vectors to rows

        }

        aModel.setDataVector(rows, columns);
        gameRS.close();//end of display the game table

        ///////////////////////////////////////////////////////////
        ResultSet playerRS = db.getTableInfo("Player");
        ResultSetMetaData playerMD = playerRS.getMetaData();
        // create columns headers
        for (int i = 1; i <= playerMD.getColumnCount(); i++) {
            p_columns.addElement(playerMD.getColumnName(i));
        }
        //
        int playerRow = 0;
        while (playerRS.next())// loop for rows
        {
            Vector vRow = new Vector(); // to store the current row
            for (int i = 1; i <= playerMD.getColumnCount(); i++)// loop for columns
            {

                Object columnValue = playerRS.getObject(i);
                vRow.addElement(columnValue.toString());

            }
            row += 1;
            p_rows.addElement(vRow);// add individual row vectors to rows

        }

        bModel.setDataVector(p_rows, p_columns);
        playerRS.close();//end of display the player table



        ///////////////////////////////////////////

        lTable.setCellSelectionEnabled(true);
        ListSelectionModel cellSelectionModel = lTable.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {


                int[] selectedRow = lTable.getSelectedRows();
                int[] selectedColumns = lTable.getSelectedColumns();

                for (int i = 0; i < selectedRow.length; i++) {
                    for (int j = 0; j < selectedColumns.length; j++) {
                        selectedData = (String) lTable.getValueAt(selectedRow[i], selectedColumns[j]);
                    }
                }
                System.out.println("Selected: " + selectedData);
            }

        });// end of selection lister argument for lTable

        rTable.setCellSelectionEnabled(true);
        cellSelectionModel = rTable.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {

                int[] selectedRow = rTable.getSelectedRows();
                int[] selectedColumns = rTable.getSelectedColumns();

                for (int i = 0; i < selectedRow.length; i++) {
                    for (int j = 0; j < selectedColumns.length; j++) {
                        selectedData2 = (String) rTable.getValueAt(selectedRow[i], selectedColumns[j]);
                    }
                }
                System.out.println("Selected: " + selectedData2);
            }

        });// end of selection lister argument for rTable
        btnInsert.addActionListener(new ActionListener() // anonymous inner class
        {
            @Override
            public void actionPerformed(ActionEvent arg0) {
//                PreparedStatement pst=db.insertTable();
                lblScore.setText(txtScore.getText());
                lblDate.setText(txtDate.getText());
            try {
                db.insertTable();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }                
            }

        } // end of insert button event handler
        );
    }// end of constructor

    public static void main(String[] args) throws SQLException {



        DatabaseMainTest db = new DatabaseMainTest();
//        System.out.println(db.getTableInfo());
        PlayerAndGame pAndGame = new PlayerAndGame();
        pAndGame.setFont(new Font("Arial", Font.BOLD, 24));
        // Validate frames that have preset sizes
        // Pack frames that have useful preferred size info, e.g. from their
        // layout

        // Center the window
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = pAndGame.getSize();
        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        pAndGame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        pAndGame.setVisible(true);

    }

} // end of PlayerAndGame class
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Javaで日付を扱うのは面倒ですよね。
PreparedStatementのsetDateメソッドに渡す型はjava.sql.Dateです。
java.sql.Dateのコンストラクタへは、1970年1月1日00:00:00.000からのミリ秒(long)を与えます。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // このフォーマットでないときは変えてください。
Date date = sdf.parse(pAndg.getTxtDate().getText()); 
java.sql.Date PLAYING_DATE = new java.sql.Date(date.getTime());
pst.setDate(3, PLAYING_DATE);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/14 22:44

    すごく助かります。いろいろ試してみるとやはり他の列はParseもされてインサートもされます。Dateだけが問題なようで、いろいろ試している最中でした。
    Date型はJavaのDate型とSqlのDate型と違うんですね。両方をインポートしてしまってどちらが使われているかわからなくなっていました。

    今、naomi3さんに教えていただいたコードを貼り付けたのですが

    java.sql.Date PLAYING_DATE = new java.sql.Date(txtDate.getMilliseconds());
    (あれからいろいろ試していて、PLAYING_DATEをGUIクラスのPlayerAndGameクラスで宣言しているので"pAndg.getTxtDate()"の部分が"txtDate"になっています。)
    newした後のDateが横線で消されていて、getMilliseconds();のところがtxtDateにキャストしろとエラーが出ています。

    import java.util.Date;
    import java.sql.*;

    書いたり消したりしているのですが、同じ状態です。

    キャンセル

  • 2016/12/14 22:47

    import java.sql.*;しないで、java.sql.Dateのまま使ってください。java.util.Dateと区別できなくなります。

    キャンセル

  • 2016/12/14 23:25

    度々ありがとうございます。
    Importを消しエラーは消えました。

    Sql developerのフォーマットがDD-MON-RRなので、ずっとそのフォーマットで設定していたのですが、もしかしたらMONやRRを認識しないのではないかと思い、”MONをMM””RRをYY”に変えてみると今度は別のエラーが出てきました。
    java.sql.SQLException: Invalid column index

    解決には近づいて来ているような気がします。Sql developerのデフォルトフォーマットも変えた方がいいでしょうか?

    キャンセル

  • 2016/12/14 23:33

    できました。
    問題はinsertステートメントだったみたいです。

    String queryco = "Insert into playerandgame(GAME_ID,PLAYER_ID,PLAYING_DATE,SCORE) values (?,?,?,?)";



    String queryco = "Insert into playerandgame(GAME_ID,PLAYER_ID,PLAYING_DATE,SCORE) values (?,?,to_date(?, 'yyyy-mm-dd'),?)";

    に変えたらできました。
    naomi3さんの回答がなければ解決しませんでした。ありがとうございます。

    キャンセル

0

エラーメッセージをみる限り、そもそも pAndg.getTxtDate().getText() に、本来のユーザーインプットの文字列が入っていないように見えます。

try の前の時点で、pAndg の内容を確認されましたか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/14 20:34

    回答ありがとうございます。
    ユーザーインプットの後"btnInsert"(JButton)をクリックするとテーブルにInsertされる仕様になっております。
    btnInsertのActionlistenerに
    lblScore.setText(txtScore.getText());
    lblDate.setText(txtDate.getText());
    を追加して入力を確認したのですが、lblScore/lblDate(JLabel)には両方ともボタンを押下するときちんと表示されます。

    念の為にPlayerAndGameクラス(GUIクラス)のコードを追加で貼り付けておきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる