制約を有効にできませんでした。1 つ以上の行に、非 NULL、一意、または外部キー制約に違反する値が含まれています。質問する

制約を有効にできませんでした。1 つ以上の行に、非 NULL、一意、または外部キー制約に違反する値が含まれています。質問する

外部結合を作成し、informixデータベースで正常に実行しましたが、コードで次の例外が発生します。

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

制約を有効にできませんでした。1 つ以上の行に、非 NULL、一意、または外部キー制約に違反する値が含まれています。

問題はわかっていますが、解決方法がわかりません。

外部結合を作成する 2 番目のテーブルには、前の外部結合クエリでは null である複合主キーが含まれています。

編集:

    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) です。

この問題を解決するにはどうすればよいですか?


編集:

アドバイスによると@PaulStock、私は彼の言う通りにすると、次の結果が得られます。

? dt.GetErrors()[0] {System.Data.DataRow} HasErrors: true ItemArray: {object[10]} RowError: "列 'eval' では DBNull.Value は許可されません。"

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

ベストアンサー1

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

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

クエリをネイティブに実行して、結果セットが大きすぎないかどうかを確認してください。null 値を削除した場合、主キー列が重複していると思われます。

または、正確なエラーを確認するには、生成されたコードに次のように Try/Catch ブロックを手動で追加し、例外が発生したときに中断します。

ここに画像の説明を入力してください

次に、コマンドウィンドウ内で、GetErrorsエラーが発生しているテーブルのメソッドを呼び出します。C
#の場合、コマンドは次のようになります。VB? dataTable.GetErrors()
の場合、コマンドは次のようになります。? dataTable.GetErrors

ここに画像の説明を入力してください

これにより、エラーのあるすべてのデータ行が表示されます。次に、それぞれについて を見るとRowError、問題のある列と無効な列がわかります。したがって、エラーのある最初のデータ行のエラーを確認するには、次のコマンドを使用します。
? dataTable.GetErrors(0).RowError
または、C# では次のようになります。? dataTable.GetErrors()[0].RowError

ここに画像の説明を入力してください

おすすめ記事