外部結合を作成し、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