2012-05-12 11 views
1

これは奇妙なものです... 私は2つのテーブルtableAとtableBを持っています tableBはtableAに外部キーを持っています。c#ora-02291エラー

私はsprocsを2つ持っています.1つはテーブルAに、もう1つはテーブルBにあります。

odp.netを使用する最初のsprocを実行して、tableAにレコードを挿入します。 SQLPlusを開いてこのレコードを選択することができます。

次に、第2のsprocを実行して、tableBに挿入します。 それは私がタイプミスなどをチェック、ダブル、トリプル、クワッドを持って

"ORA-02291-整合性制約違反 - 親キー - 見つかりません" で失敗...何もありません。

SQLPlusでこの同じ操作を手動で行うと、同じsprocsを使用しても問題がなくなります。

これは、12時間以上も私を殺しているので、わかりやすくなければならないことがあります。 ここにsprocsがあります。

SPROCA

CREATE OR REPLACE PROCEDURE genData_TestTrackerSegment 
    (
    INTX_ID IN IntxSegment.IntxID%TYPE, 
    siteid IN INT 
) 
AS 
BEGIN 
INSERT INTO INTXSEGMENT(INTXID,INTXTYPEID,VERSION,ISPRIVATE, 
SEGMENTTYPE,STARTDATETIME,INTXDIRECTION,SITEID) 
VALUES(INTX_ID,1,1,0,1,SYSDATE,1,siteid); 
COMMIT; 
END; 

SPROCB

CREATE OR REPLACE PROCEDURE genData_TestTrackerPart 
    (
    INTX_ID IN IntxSegment.IntxID%TYPE, 
    INTX_PART_ID IN INTX_PARTICIPANT.INTX_PART_ID%TYPE, 
    INDIVID IN INDIVIDUAL.INDIVID%TYPE, 
    CALLID IN INTX_PARTICIPANT.CALLIDKEY%TYPE 
)AS 
BEGIN 
INSERT INTO 
INTX_PARTICIPANT(INTXID,INTX_PART_ID,INDIVID,ROLE, 
CALLIDKEY,RECORDED,VERSION,STARTDATETIME) 
VALUES(INTX_ID,INTX_PART_ID,INDIVID,1,CALLID,1,1,SYSDATE); 
COMMIT; 
END; 
+0

テーブルAとテーブルBのINTXIDのタイプ(DB内)は何ですか?どのような型にあなたの.netコードにマップされていますか? –

+0

データベース・タイプ:CHAR(22) Oracle.DataAccess.Client.OracleParameter.DBType:文字列 OracleParameter.OracleDBType:VARCHAR2 OracleParameter.OracleDBTypeEx:VARCHAR2 – Wjdavis5

+0

あなたはそれが例外をスローして、外部キー参照のINTXSEGMENT.INTXIDだことは確かです他の外部キー制約ではありませんか?これをデバッグするには、その外部キーを無効にしてテストを実行し、成功した場合はINTX_PARTICIPANTテーブルの内容をチェックしてINTXID列の値を確認します。 – spencer7593

答えて

0

うん、私は一定以上だ - それは疑いようFKEYの影なしです。
これは私がこれを修正したと言われています.....これはsooooooo stupidところで。
私は、ODP.NETの「名前付きパラメータ」が、ストアドプロシージャで参照されているのと同じ順序でこれらのパラメータを追加する必要がないという(間違った)仮定の下にいました。短いストーリー - 私がこれを約4回書き直した後、私はパラメータの順序を変更しましたが、これは修正されました。 -

0

ORA-02291エラーは、使用されているFKの1つが有効なpkではなく、他のテーブルの既存のpkではないことを意味します。

ちょうどあなたのテーブルに挿入された各FKが有効なものであることを確認してください。