0

私はJavaのストアプログラムとアクセスで作成されたデータベースを持っています。データベースには、顧客テーブルと製品テーブルの 2 つのテーブルが既にあります。

主キーが autonumber である order テーブルと order_line テーブルを追加して、このアプリを完成させたいと考えています。こんなテーブルが欲しい…

customer(cust_id, name, ....)
orders(order_no, cust_id, date_purchased,...)
order_line(order_no, product_id, ...)
products(product_id, product_name, price,....)

顧客が製品を購入すると、注文テーブルに新しい値を挿入できました。Access で作成した order_no は autonumber 型であるため、order_line テーブルにも挿入する方法がわかりません。

order_line のテーブルの order_no に入れるために order_no の値を取得するために、最初に select ステートメントを作成しますか? または、これを 1 つのクエリだけに入れる必要があります。

これに経験のある人はいますか?アドバイスをいただければ幸いです。

4

2 に答える 2

1

orders および order_line テーブルへの挿入は、1 つのトランザクションで行う必要があります。そうしている間に、プレーン JDBC を使用してレコードを orders テーブルに挿入している場合は、order_no を OUT パラメータとして登録し、ステートメントの実行後に値を取得して、レコードに属性CallableStatementを設定するために使用できます。order_noorder_line

 // begin transaction
 connection.setAutoCommit(false);

 CallableStatement cs = connection.prepareCall(INSERT_STMT_INTO_ORDERS_TABLE);
 cs.registerOutParameter(1, Types.INT);
 int updateCount = cs.execute();
 // Check the update count.
 long orderNo = cs.getInt(1);

 // CallableStatement csLine for inserting into order_line table
 // for (OrderLine line: orderLines) {
 //     Set the orderNo in line.
 //     set paramters on csLine.
 //     csLine.addBatch();
 // }
 // run the batch and verify update counts
 connection.commit();

 // connection.rollback() on error.
于 2012-10-26T14:50:37.040 に答える
1

JDBC の方法 (データベースに依存しない場合) は、getGeneratedKeys()ステートメントの方法を使用することです。

を使用setAutoCommit(false)し、オプションを指定して最初のクエリを実行しますStatement.RETURN_GENERATED_KEYS(例: PreparedStatementの場合)。

次に、getGeneratedKeys()メソッドを使用してキーを取得します (注: 正確な実装と返される列の数はドライバーの実装によって異なるため、列名で参照してください。

そして、取得したキーを使用して 2 番目のステートメントを実行します。

最後に、commit().

于 2012-10-26T15:00:03.163 に答える