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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

2回答

3732閲覧

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

mercredi

総合スコア26

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2016/12/14 05:41

編集2016/12/14 11:37

###前提・実現したいこと
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)

###該当のソースコード

Java

1 public void insertTable() throws SQLException, ParseException 2 { 3 String queryco = "Insert into playerandgame(GAME_ID,PLAYER_ID,PLAYING_DATE,SCORE) values (?,?,?,?)"; 4 pst = connection.prepareStatement(queryco); 5 PlayerAndGame pAndg=new PlayerAndGame(); 6 DateFormat format = new SimpleDateFormat("DD-MON-RR",Locale.ENGLISH); 7 8 try{ 9 int GAME_ID = Integer.parseInt(pAndg.getSelectedData()); 10 int PLAYER_ID = Integer.parseInt(pAndg.getSelectedData2()); 11 Date PLAYING_DATE =(Date) format.parse(pAndg.getTxtDate().getText()); 12 int SCORE = Integer.parseInt(pAndg.getTxtScore().getText()); 13 pst.setInt(1, GAME_ID); 14 pst.setInt(2, PLAYER_ID); 15 pst.setDate(3, PLAYING_DATE); 16 pst.setInt(4, SCORE); 17 18 pst.addBatch(); 19 20 pst.executeBatch(); 21 connection.commit(); 22 } 23 catch(Exception e){ 24 System.out.println(this); 25 } 26 27 }

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

PlayAndGameクラスのコード

1class PlayerAndGame extends JFrame { 2 3 private JPanel mainPanel = new JPanel(); 4 private JPanel bottomLeft = new JPanel(); 5 private JPanel topPanel = new JPanel(); 6 private JPanel middlePanel = new JPanel(); 7 private JPanel bottomRight = new JPanel(); 8 private JLabel lLabel = new JLabel(); 9 private JLabel rLabel = new JLabel(); 10 private JLabel lblScore = new JLabel(); 11 private JLabel lblDate = new JLabel(); 12 private DefaultTableModel aModel = new DefaultTableModel(); 13 private DefaultTableModel bModel=new DefaultTableModel(); 14 private JTable lTable = new JTable(aModel); 15 private JTable rTable = new JTable(bModel); 16 private JTextField txtScore = new JTextField(15); 17 private JTextField txtDate = new JTextField(15); 18 private JScrollPane scroll1 = new JScrollPane(lTable); 19 private JScrollPane scroll2 = new JScrollPane(rTable); 20 DatabaseMainTest db = new DatabaseMainTest(); 21 private Vector rows = new Vector(); 22 private Vector columns = new Vector(); 23 private Vector p_rows = new Vector(); 24 private Vector p_columns = new Vector(); 25 String selectedData = null; 26 String selectedData2 = null; 27 28 private JButton btnInsert = new JButton(); 29 private JButton playerButton = new JButton(); 30 private JButton gameButton = new JButton(); 31 32 33 34 public JTable getlTable() { 35 return lTable; 36 } 37 38 public JTable getrTable() { 39 return rTable; 40 } 41 42 public JTextField getTxtScore() { 43 return txtScore; 44 } 45 46 public JTextField getTxtDate() { 47 return txtDate; 48 } 49 50 public String getSelectedData() { 51 return selectedData; 52 } 53 public String getSelectedData2() { 54 return selectedData; 55 } 56 57 public PlayerAndGame() throws SQLException { 58 this.setSize(700, 700); 59 this.setTitle("Game Information"); 60 61 mainPanel.setLayout(new GridLayout(3, 2, 5, 5)); 62 bottomLeft.setLayout(new GridLayout(3, 1, 2, 2)); 63 bottomRight.setLayout(new GridLayout(2, 1, 2, 2)); 64 topPanel.setLayout(new GridLayout(1, 2)); 65 middlePanel.setLayout(new GridLayout(1, 2)); 66 mainPanel.add(lLabel); 67 mainPanel.add(rLabel); 68 mainPanel.add(scroll1); 69 mainPanel.add(scroll2); 70 topPanel.add(lblScore); 71 topPanel.add(txtScore); 72 middlePanel.add(lblDate); 73 middlePanel.add(txtDate); 74 bottomLeft.add(topPanel); 75 bottomLeft.add(middlePanel); 76 bottomLeft.add(btnInsert); 77 bottomRight.add(playerButton); 78 mainPanel.add(bottomLeft); 79 bottomRight.add(gameButton); 80 mainPanel.add(bottomRight); 81 82 83 84 add(mainPanel); 85 86// System.out.print(txtScore.getText().toString()); 87// System.out.print(txtDate.getText().toString()); 88 89 ResultSet gameRS = db.getTableInfo("Game"); 90 ResultSetMetaData gameMD = gameRS.getMetaData(); 91 // create columns headers 92 for (int i = 1; i <= gameMD.getColumnCount(); i++) { 93 columns.addElement(gameMD.getColumnName(i)); 94 } 95 // 96 int row = 0; 97 while (gameRS.next())// loop for rows 98 { 99 Vector vRow = new Vector(); // to store the current row 100 for (int i = 1; i <= gameMD.getColumnCount(); i++)// loop for columns 101 { 102 103 Object columnValue = gameRS.getObject(i); 104 vRow.addElement(columnValue.toString()); 105 106 } 107 row += 1; 108 rows.addElement(vRow);// add individual row vectors to rows 109 110 } 111 112 aModel.setDataVector(rows, columns); 113 gameRS.close();//end of display the game table 114 115 /////////////////////////////////////////////////////////// 116 ResultSet playerRS = db.getTableInfo("Player"); 117 ResultSetMetaData playerMD = playerRS.getMetaData(); 118 // create columns headers 119 for (int i = 1; i <= playerMD.getColumnCount(); i++) { 120 p_columns.addElement(playerMD.getColumnName(i)); 121 } 122 // 123 int playerRow = 0; 124 while (playerRS.next())// loop for rows 125 { 126 Vector vRow = new Vector(); // to store the current row 127 for (int i = 1; i <= playerMD.getColumnCount(); i++)// loop for columns 128 { 129 130 Object columnValue = playerRS.getObject(i); 131 vRow.addElement(columnValue.toString()); 132 133 } 134 row += 1; 135 p_rows.addElement(vRow);// add individual row vectors to rows 136 137 } 138 139 bModel.setDataVector(p_rows, p_columns); 140 playerRS.close();//end of display the player table 141 142 143 144 /////////////////////////////////////////// 145 146 lTable.setCellSelectionEnabled(true); 147 ListSelectionModel cellSelectionModel = lTable.getSelectionModel(); 148 cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 149 150 cellSelectionModel.addListSelectionListener(new ListSelectionListener() { 151 public void valueChanged(ListSelectionEvent e) { 152 153 154 int[] selectedRow = lTable.getSelectedRows(); 155 int[] selectedColumns = lTable.getSelectedColumns(); 156 157 for (int i = 0; i < selectedRow.length; i++) { 158 for (int j = 0; j < selectedColumns.length; j++) { 159 selectedData = (String) lTable.getValueAt(selectedRow[i], selectedColumns[j]); 160 } 161 } 162 System.out.println("Selected: " + selectedData); 163 } 164 165 });// end of selection lister argument for lTable 166 167 rTable.setCellSelectionEnabled(true); 168 cellSelectionModel = rTable.getSelectionModel(); 169 cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 170 171 cellSelectionModel.addListSelectionListener(new ListSelectionListener() { 172 public void valueChanged(ListSelectionEvent e) { 173 174 int[] selectedRow = rTable.getSelectedRows(); 175 int[] selectedColumns = rTable.getSelectedColumns(); 176 177 for (int i = 0; i < selectedRow.length; i++) { 178 for (int j = 0; j < selectedColumns.length; j++) { 179 selectedData2 = (String) rTable.getValueAt(selectedRow[i], selectedColumns[j]); 180 } 181 } 182 System.out.println("Selected: " + selectedData2); 183 } 184 185 });// end of selection lister argument for rTable 186 btnInsert.addActionListener(new ActionListener() // anonymous inner class 187 { 188 @Override 189 public void actionPerformed(ActionEvent arg0) { 190// PreparedStatement pst=db.insertTable(); 191 lblScore.setText(txtScore.getText()); 192 lblDate.setText(txtDate.getText()); 193 try { 194 db.insertTable(); 195 } catch (SQLException e) { 196 // TODO Auto-generated catch block 197 e.printStackTrace(); 198 } catch (ParseException e) { 199 // TODO Auto-generated catch block 200 e.printStackTrace(); 201 } 202 } 203 204 } // end of insert button event handler 205 ); 206 }// end of constructor 207 208 public static void main(String[] args) throws SQLException { 209 210 211 212 DatabaseMainTest db = new DatabaseMainTest(); 213// System.out.println(db.getTableInfo()); 214 PlayerAndGame pAndGame = new PlayerAndGame(); 215 pAndGame.setFont(new Font("Arial", Font.BOLD, 24)); 216 // Validate frames that have preset sizes 217 // Pack frames that have useful preferred size info, e.g. from their 218 // layout 219 220 // Center the window 221 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 222 Dimension frameSize = pAndGame.getSize(); 223 if (frameSize.height > screenSize.height) { 224 frameSize.height = screenSize.height; 225 } 226 if (frameSize.width > screenSize.width) { 227 frameSize.width = screenSize.width; 228 } 229 pAndGame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); 230 pAndGame.setVisible(true); 231 232 } 233 234} // end of PlayerAndGame class

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Java

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

投稿2016/12/14 12:44

編集2016/12/14 13:37
naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercredi

2016/12/14 13: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.*; 書いたり消したりしているのですが、同じ状態です。
naomi3

2016/12/14 13:47

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

2016/12/14 14:25

度々ありがとうございます。 Importを消しエラーは消えました。 Sql developerのフォーマットがDD-MON-RRなので、ずっとそのフォーマットで設定していたのですが、もしかしたらMONやRRを認識しないのではないかと思い、”MONをMM””RRをYY”に変えてみると今度は別のエラーが出てきました。 java.sql.SQLException: Invalid column index 解決には近づいて来ているような気がします。Sql developerのデフォルトフォーマットも変えた方がいいでしょうか?
mercredi

2016/12/14 14: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さんの回答がなければ解決しませんでした。ありがとうございます。
guest

0

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

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

投稿2016/12/14 06:07

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercredi

2016/12/14 11:34

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問