1

共通フィールドがLoad_IDである2つのテーブルがあります。最初のPKは、2番目のFKと1対多の関係にあります。例えば:

Table1:
1, someValue

Table2:
1, value1, ...  
1, value2, ... 
1, value3, ... 

値がユーザー入力から取得されるASP.NETクラスに実際の挿入ステートメントを埋め込みました。

 "INSERT INTO Compare_Header_Table VALUES
(compare_sequence.nextval, //other values are inserted here)

PKを自動インクリメントするために使用しているシーケンスは次のとおりですCREATE SEQUENCE compare_sequence; 。シーケンスのデフォルトは増分1と初期値1であるため、トリガーを作成したりパラメーターを指定したりしなくても機能するようです。これは私の目的には問題ありません。

問題が発生しているのは、2番目のテーブルのFKを最初のテーブルのPKにリンクしようとしているところです。各テーブルに挿入するための個別のメソッドがあるため、単純に使用することはできませんcompare_sequence.currval。そのため、毎回新しい接続を作成しています。これらを1つのメソッドに結合したくないのは、C#クラスの論理構造を変更する必要があるためです。これは、そのままにしておきます。

これを機能させる方法について何か提案はありますか?

4

2 に答える 2

3

あなたができることは、RETURNING原因を使用して割り当てられた値を取得することです:

 INSERT INTO Compare_Header_Table (ID) VALUES
        (compare_sequence.nextval)
 returning id into some_value;

これsome_valueは、最初のクラスから渡し、2 番目のクラスに渡す必要があるローカル変数です。それをどれだけ正確に行うかは、アーキテクチャによって異なります。

ちなみに、「毎回新しい接続を作成しています」と言うとき、これは c# の専門用語であり、実際には毎回新しいデータベース接続を作成しているわけではないことを願っています。それはかなり高価な操作だからです。

もう 1 つは、親レコードと子レコードを作成するために別のセッションにいる場合、トランザクションはどうなるでしょうか。各挿入をコミットする必要があります (そうしないと、子を挿入しようとしたときに、新しい親レコードが外部キーの検証に表示されません)。

于 2013-02-19T16:57:55.733 に答える
1

操作を別々のセッションで実行する場合INSERTは、生成されたキーを最初のステートメントから取得し、データを に挿入するメソッドに渡す必要がありますtable2。データベースのラウンドトリップを必要とせずに生成されたキーを取得する 1 つの方法は、次のようにすることです。

INSERT INTO compare_header_table
  VALUES( compare_sequence.nextval,
          ... )
 RETURNING name_of_primary_key_column
      INTO :bind_variable
于 2013-02-19T16:56:03.523 に答える