実現したいこと以下の環境下でjavaからGUIを表示して、
日付(YYYY-MM-DD),社員ID,金額を入力して
sales表にインサートする。
ご教示お願い致します。
環境 Windows10
psql (PostgreSQL) 16.3
java openjdk 11.0.16.1 2022-08-12 LTS
DB構造
postgres=# \d sales
テーブル"public.sales"
列 | タイプ | 照合順序 | Null 値を許容 | デフォルト
--------------+---------------+----------+---------------+----------------------------------------
sale_id | integer | | not null | nextval('sales_sale_id_seq'::regclass)
employee_id | integer | | |
date | date | | not null |
sales_amount | numeric(10,2) | | not null |
事象:日付の型が違うというメッセージがでる。
型はdate型なので、問題なく見える。
以上の環境下でインサートしようとすると
rg.postgresql.util.PSQLException: ERROR: 列"date"は型dateですが、式は型character varyingでした ヒント: 式を書き換えるかキャストする必要があります。
とエラーになってしまいます。
ソース
引用テキスト
import javax.swing.;
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.Date; // Dateクラスをインポート
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class SalesEntryApp extends JFrame {
private JTextField dateField;
private JTextField employeeIdField;
private JTextField salesAmountField;
private JButton submitButton;
public SalesEntryApp() { createView(); setTitle("Sales Entry"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(300, 200); setLocationRelativeTo(null); setResizable(false); } private void createView() { JPanel panel = new JPanel(); getContentPane().add(panel); panel.setLayout(new GridLayout(4, 2)); JLabel dateLabel = new JLabel("Date (YYYY-MM-DD):"); panel.add(dateLabel); dateField = new JTextField(); panel.add(dateField); JLabel employeeIdLabel = new JLabel("Employee ID:"); panel.add(employeeIdLabel); employeeIdField = new JTextField(); panel.add(employeeIdField); JLabel salesAmountLabel = new JLabel("Sales Amount:"); panel.add(salesAmountLabel); salesAmountField = new JTextField(); panel.add(salesAmountField); submitButton = new JButton("Submit"); submitButton.addActionListener(new SubmitButtonActionListener()); panel.add(submitButton); } private class SubmitButtonActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String dateString = dateField.getText(); Date date = Date.valueOf(dateString); // 文字列をjava.sql.Dateに変換 int employeeId = Integer.parseInt(employeeIdField.getText()); double salesAmount = Double.parseDouble(salesAmountField.getText()); // デバッグメッセージを追加 System.out.println("Date: " + date); System.out.println("Employee ID: " + employeeId); System.out.println("Sales Amount: " + salesAmount); // データベースに接続してデータを挿入 String url = "jdbc:postgresql://localhost:5432/postgres"; String user = "postgres"; String password = ""; String query = "INSERT INTO sales (date, employee_id, sales_amount) VALUES (?, ?, ?)"; try (Connection con = DriverManager.getConnection(url, user, password); PreparedStatement pst = con.prepareStatement(query)) { pst.setDate(1, date); // setStringの代わりにsetDateを使用 pst.setInt(2, employeeId); pst.setDouble(3, salesAmount); pst.executeUpdate(); JOptionPane.showMessageDialog(null, "Sales data submitted successfully!"); } catch (SQLException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage()); } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new SalesEntryApp().setVisible(true); } }); }
}
引用テキスト
回答1件
あなたの回答
tips
プレビュー