1. ホーム
  2. c#

[解決済み] 制約の有効化に失敗しました。1つ以上の行が非Null、ユニーク、または外部キー制約に違反する値を含んでいます。

2022-04-20 03:27:49

質問

外部結合を作成して informix データベースで、次のような例外が発生しました。

DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);

制約の有効化に失敗しました。1 つまたは複数の行に値が含まれています。 NULL 以外、ユニーク、または外部キー制約に違反しています。

問題は分かっているが、どうすれば解決できるのか分からない。

外部結合を行う2番目のテーブルには複合プライマリキーがあり、前の外部結合クエリではNULLになっています。

EDITです。

    SELECT UNIQUE a.crs_e,  a.crs_e  || '/ ' || a.crst crs_name, b.period,
           b.crscls, c.crsday, c.from_lect, c.to_lect,
           c.to_lect - c.from_lect + 1 Subtraction, c.lect_kind, e.eval, e.batch_no,
           e.crsnum, e.lect_code, e.prof_course
    FROM rlm1course a, rfc14crsgrp b, ckj1table c, mnltablelectev d,
         OUTER(cc1assiscrseval e)  
    WHERE a.crsnum = b.crsnum 
    AND b.crsnum = c.crsnum 
    AND b.crscls = c.crscls 
    AND b.batch_no = c.batch_no 
    AND c.serial_key = d.serial_key  
    AND c.crsnum = e.crsnum  
    AND c.batch_no = e.batch_no  
    AND d.lect_code= e.lect_code 
    AND d.lect_code = .... 
    AND b.batch_no = ....

問題はテーブルで発生します cc1assiscrseval . 主キーは (batch_no, crsnum, lect_code) です。

この問題を解決するにはどうしたらよいですか?


EDITです。

によると @PaulStock のアドバイスがあります。 彼の言うとおりにすると、私は得をします。

<ブロッククオート

? dt.GetErrors()[0] {System.Data.DataRow} {System.Data.DataRow}。HasErrors: true ItemArray: {object[10]}のように RowError: "列 'eval' は DBNull.Value." を許可していません。

そこで、次のように置き換えることで問題を解決しました。 e.eval を , NVL (e.eval,'') eval .これで私の問題は解決しました。 どうもありがとうございました。

どのように解決するのですか?

この問題は、通常、次のいずれかが原因で発生します。

  • AllowDBNullに設定されていないカラムに対してnull値が返される。
  • 同じ主キーで重複した行が返される。
  • データベースとデータセット間のカラム定義(例:charフィールドのサイズ)の不一致。

クエリをネイティブで実行してみて、結果セットが大きすぎなければ、結果を見てみてください。NULL値を排除しているのであれば、主キーのカラムが重複しているのではないかと推測されます。

あるいは、正確なエラーを確認するために、生成されたコードに Try/Catch ブロックを手動で追加して、例外が発生したときにブレークさせることもできます。

次に、コマンドウィンドウで GetErrors メソッドを、エラーが発生したテーブルに対して実行します。

C#の場合、コマンドは次のようになります。 ? dataTable.GetErrors()

VBの場合、コマンドは ? dataTable.GetErrors

これで、エラーが発生したすべてのデータローが表示されます。次に RowError をクリックすると、無効なカラムとその問題が表示されます。つまり、エラーのある最初のデータロウのエラーを見るには、次のようにコマンドを実行します。

? dataTable.GetErrors(0).RowError

またはC#では次のようになります。 ? dataTable.GetErrors()[0].RowError