java jdbc 复合主键_java – 使用已排序的主键和外键JDBC的列添加行

我的程序有一个添加项目和完成交易选项. FinishTransaction类要求用户输入客户的信息,付款方式和付款.

总付款显示在窗口中.当用户单击结帐按钮时,数据应从CUSTOMER表(插入客户信息),ORDERS表(插入项目的信息)和TRANSACTION表(插入交易信息)中传输.

事务表有一列TRANS_CUSTNUM,它是一个引用CUSTOMER表中CUST_NUM的外键.

我的程序工作正常,除了TRANSACTION表.它不会在我的SQL开发人员中添加一行.您认为我的代码有什么问题?

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.sql.*;

import java.util.logging.*;

public class FinishTransaction extends JFrame implements ActionListener{

JLabel totalLabel;

JLabel nameLabel;

JLabel addressLabel;

JLabel contactLabel;

JLabel custPaymentLabel;

JLabel methodLabel;

JLabel creditCardLabel;

JTextField totalTextField;

JTextField nameTextField;

JTextField addressTextField;

JTextField contactTextField;

JTextField custPaymentTextField;

JTextField creditCardTextField;

final JButton mainMenuButton = new JButton("Main Menu");

final ButtonGroup bGroup = new ButtonGroup();

final JRadioButton cashRadioButton = new JRadioButton("Cash");

final JRadioButton creditRadioButton = new JRadioButton("Credit Card");

final JButton checkoutButton = new JButton("Checkout");

static FinishTransaction fin = new FinishTransaction();

static AddItem add = new AddItem();

static int total = 0;

static int payment = 0;

static int change = 0;

static String payment_desc;

static int creditCard;

public FinishTransaction(){

//ui

}

public void actionPerformed(ActionEvent e){

if(checkoutButton.getName().equals(((Component)e.getSource()).getName())){

try{

payment = Integer.parseInt(custPaymentTextField.getText());

if(payment>=total){

change = payment - total;

JOptionPane.showMessageDialog(this, "Thank you for shopping! Your change is "+change, "Exiting", JOptionPane.INFORMATION_MESSAGE);

}

else

JOptionPane.showMessageDialog(this, "Your payment is not enough. Please try again!", "Error!", JOptionPane.ERROR_MESSAGE);

}

catch(NumberFormatException a){

JOptionPane.showMessageDialog(this, "Invalid input", "Error!", JOptionPane.ERROR_MESSAGE);

}

Connection conn = null;

PreparedStatement pstmt = null;

PreparedStatement pstmt2 = null;

PreparedStatement pstmt3 = null;

String URL = "jdbc:oracle:thin:@VAIO:49160:xe";

String USER = "mariel";

String PASS = "1234";

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

try {

String name = nameTextField.getText();

String address = addressTextField.getText();

int contact = Integer.parseInt(contactTextField.getText());

conn = DriverManager.getConnection(URL, USER, PASS);

String sql = "INSERT INTO CUSTOMER " +

"VALUES(CustNumSeq.NEXTVAL, ?, ?, ?)";

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, name);

pstmt.setString(2, address);

pstmt.setInt(3, contact);

pstmt.executeUpdate();

for(int index=0;index

String sql2 = "INSERT INTO ORDERS "+

"VALUES(OrderNumSeq.NEXTVAL, ?, ?)";

pstmt2 = conn.prepareStatement(sql2);

pstmt2.setInt(1,add.itemNum[index]);

pstmt2.setInt(2, add.quantity[index]);

pstmt2.executeUpdate();

}

creditCard = Integer.parseInt(creditCardTextField.getText());

String sql3 = "INSERT INTO TRANSACTION " +

"VALUES(TransNumSeq.NEXTVAL, CustNumSeq.NEXTVAL, ?, ?, ?, ?)";

pstmt3 = conn.prepareStatement(sql3);

pstmt3.setInt(1, payment);

pstmt3.setString(2, payment_desc);

pstmt3.setInt(3, creditCard);

pstmt3.setInt(4, change);

pstmt.executeUpdate();

}

catch (SQLException ex) {

}

catch(NumberFormatException a){

JOptionPane.showMessageDialog(this, "Invalid input", "Error!", JOptionPane.ERROR_MESSAGE);

}

}

catch(ClassNotFoundException ex) {

System.out.println("Error: unable to load driver class!");

System.exit(1);

}

catch(NumberFormatException a){

JOptionPane.showMessageDialog(this, "Invalid input", "Error!", JOptionPane.ERROR_MESSAGE);

}

finally{

try{

if(pstmt!=null)

pstmt.close();

}

catch(SQLException se2){

}

try{

if(pstmt2!=null)

pstmt2.close();

}

catch(SQLException se2){

}

try{

if(pstmt3!=null)

pstmt3.close();

}

catch(SQLException se2){

}

try{

if(conn!=null)

conn.close();

}

catch(SQLException se){

}

}

}

else if(mainMenuButton.getName().equals(((Component)e.getSource()).getName())){

EmployeeMode emp = new EmployeeMode();

emp.setVisible(true);

emp.setResizable(false);

emp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

emp.setSize(400,300);

this.setVisible(false);

}

if(creditRadioButton.isSelected()){

creditCardLabel.setVisible(true);

creditCardTextField.setVisible(true);

payment_desc = "Credit Card";

}

else if(cashRadioButton.isSelected()){

creditCardLabel.setVisible(false);

creditCardTextField.setVisible(false);

payment_desc = "Cash";

}

}

public static void main(String args[]){

fin.setVisible(true);

fin.setResizable(false);

fin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

fin.setSize(500,400);

}

}

(编者)

工作生成的代码:

String name = nameTextField.getText();

String address = addressTextField.getText();

int contact = Integer.parseInt(contactTextField.getText());

conn = DriverManager.getConnection(URL, USER, PASS);

for(int index=0;index

String sql = "INSERT INTO ORDERS "+

"VALUES(OrderNumSeq.NEXTVAL, ?, ?)";

pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,add.itemNum[index]);

pstmt.setInt(2, add.quantity[index]);

pstmt.executeUpdate();

}

String sql2 = "INSERT INTO CUSTOMER " +

"VALUES(CustNumSeq.NEXTVAL, ?, ?, ?)";

String generatedColumns[] = {"CUST_NUM"};

pstmt2 = conn.prepareStatement(sql2, generatedColumns);

pstmt2.setString(1, name);

pstmt2.setString(2, address);

pstmt2.setInt(3, contact);

pstmt2.executeUpdate();

ResultSet rs = pstmt2.getGeneratedKeys();

custNum = rs.getInt("CUST_NUM");

creditCard = Integer.parseInt(creditCardTextField.getText());

String sql3 = "INSERT INTO TRANSACTION " +

"VALUES(TransNumSeq.NEXTVAL, ?, ?, ?, ?, ?)";

pstmt3 = conn.prepareStatement(sql3);

pstmt3.setInt(1, custNum);

pstmt3.setInt(2, payment);

pstmt3.setString(3, payment_desc);

pstmt3.setInt(4, creditCard);

pstmt3.setInt(5, change);

pstmt3.executeUpdate();

解决方法:

我很确定这个sql insert语句不正确.

String sql3 = "INSERT INTO TRANSACTION " +

"VALUES(TransNumSeq.NEXTVAL, CustNumSeq.NEXTVAL, ?, ?)";

您正在将记录插入TRANSACTION并尝试在CUSTOMER(CustNumSeq.NEXTVAL)上推进序列.你应该尝试使用

//when inserting into CUSTOMER

pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

pstmt.execute();//make the insert

//and then simply grab the key

ResultSet rs = stmt.getGeneratedKeys();

if (rs.next())

id = rs.getObject(1);

请注意,并非每个JDBC驱动程序都支持返回生成的键,因此您可能必须使用一个额外的select来获取最后生成的键.

最后,您将不得不更改此部分以反映上面所做的更改

String sql3 = "INSERT INTO TRANSACTION " +

"VALUES(TransNumSeq.NEXTVAL, ?, ?, ?, ?, ?)";

pstmt3 = conn.prepareStatement(sql3);

pstmt3.setInt(1, id);

pstmt3.setInt(2, payment);

pstmt3.setString(3, payment_desc);

pstmt3.setInt(4, creditCard);

pstmt3.setInt(5, change);

标签:java,jdbc,prepared-statement,oracle-sqldeveloper

来源: https://codeday.me/bug/20191003/1848667.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断
这是一个比较广泛的问题,需要详细讨论才能给出完整的答案。以下是一个简单的信息管理系统的实现步骤: 1. 设计数据库表结构 首先需要设计数据库表结构,包括表名、字段名、数据类型、主键外键等等。这里以学生信息为例,可以设计一个包含学生 ID、姓名、性别、年龄等字段的学生表。 2. 编写数据库连接代码 使用 JDBC 连接数据库,需要先加载数据库驱动,然后获取数据库连接对象,最后创建 Statement 或 PreparedStatement 对象执 SQL 语句。 3. 编写数据操作代码 根据需求,编写增、删、改、查等数据操作代码,使用 SQL 语句操作数据库。例如,可以编写一个添加学生信息的方法,将学生信息插入到学生表中。 4. 编写界面代码 使用 Swing 或 JavaFX 等 GUI 框架,编写界面代码,实现用户交互。例如,可以设计一个添加学生信息的界面,包括输入学生信息的文本框和确认按钮。 5. 实现业务逻辑 将界面和数据操作代码结合起来,实现业务逻辑。例如,当用户点击添加学生信息的确认按钮时,调用添加学生信息的方法,将用户输入的学生信息插入到学生表中。 6. 测试和优化 最后进测试和优化,确保系统运稳定、界面友好、功能完善。 以上是一个简单的信息管理系统的实现步骤,具体实现细节还需要根据具体需求进调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值