web-dev-qa-db-ja.com

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

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

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

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

私は問題を知っていますが、それを修正する方法がわかりません。

外部結合を作成する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。に置き換えることで問題を解決し、これで問題が解決します。どうもありがとう。

153

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

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

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

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

enter image description here

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

enter image description here

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

enter image description here

313
PaulStock

データセットの制約を無効にできます。不正なデータを特定し、問題の解決に役立ちます。

例えば.

dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");

Fillメソッドは少し異なる場合があります。

35
HockeyJ

これにより、テーブル内でエラーのあるすべての行が検出され、行の主キーとその行で発生したエラーが出力されます...

これはC#ですが、VBに変換するのは難しくありません。

 foreach (DataRow dr in dataTable)
 {
   if (dr.HasErrors)
     {
        Debug.Write("Row ");
        foreach (DataColumn dc in dataTable.PKColumns)
          Debug.Write(dc.ColumnName + ": '" + dr.ItemArray[dc.Ordinal] + "', ");
        Debug.WriteLine(" has error: " + dr.RowError);
     }
  }

申し訳ありませんが、PKColumnsは、DataTableの主キーを構成するすべての列を示すDataTableを拡張したときに追加したものです。データテーブルの主キー列がわかっている場合は、ここでループできます。私の場合、すべてのデータテーブルがPK colを知っているため、すべてのテーブルに対してこれらのエラーのデバッグを自動的に作成できます。

出力は次のようになります。

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
8
shindigo
  • テーブルアダプタクエリで指定されたフィールドが、定義したクエリのフィールドと一致することを確認します。 DALは不一致を好まないようです。これは通常、テーブルに新しいフィールドを追加した後、sprocとクエリで発生します。

  • データベースのvarcharフィールドの長さを変更し、XSSファイルに含まれるXMLがそれを取得していない場合、XMLでフィールド名と属性定義を見つけて、手動で変更します。

  • 返されるデータに関連していない場合、テーブルアダプタの選択リストから主キーを削除します。

  • SQL Management Studioでクエリを実行し、重複したレコードが返されないようにします。重複したレコードは、このエラーの原因となる重複したプライマリキーを生成する可能性があります。

  • SQLユニオンは問題を引き起こす可能性があります。 「アダプターを選択してください」レコードを他のレコードの前に追加して、1つのテーブルアダプターを変更しました。他のフィールドには、たとえば長さ1の文字列を含むダミーデータを提供しました。 DALは、その初期レコードからスキーマを推測しました。長さ12の文字列で続くレコードは失敗しました。

7
Bob Sullentrup

これは私のために働いた、ソース: here

このエラーが発生しましたが、DBの制約とは関係ありませんでした(少なくとも私の場合)。レコードのグループを返すGetRecordクエリを含む.xsdファイルがあります。そのテーブルの列の1つは「nvarchar(512)」であり、プロジェクトの途中で「nvarchar(MAX)」に変更する必要がありました。

ユーザーがそのフィールドに512を超える値を入力するまですべてが正常に機能し、「制約を有効にできませんでした。1つ以上の行に非NULL、一意、または外部キー制約に違反する値が含まれます」というエラーメッセージが表示され始めます。

解決策:DataTableの列のすべてのMaxLengthプロパティを確認します。

「nvarchar(512)」から「nvarchar(MAX)」に変更した列には、MaxLengthプロパティの値が512のままであったため、「-1」に変更すると動作します!!。

5
Somebody

問題は、データアクセスデザイナーにあります。 Visual Studioで、「サーバーエクスプローラー」からデザイナーウィンドウにビューをプルすると、列に主キーがランダムに追加されるか、実際にはnullに設定されていますが、NOT NULLに何かがマークされます。 SQL dbサーバーでの実際のビューの作成には、プライマリキーが定義されていないか、NOT NULLが定義されていませんが、VSデザイナーはこのキー/制約を追加しています。

これはデザイナーで確認できます。列名の左側にキーアイコンが表示されます。

解決策:鍵アイコンを右クリックして、「鍵の削除」を選択します。これで問題が解決するはずです。列を右クリックして[プロパティ]を選択し、VSデータアクセスデザイナで列のプロパティのリストを表示して、値を適切に変更することもできます。

4
Shankar Arigela

このエラーは私のプロジェクトでも表示されていました。ここに投稿された提案されたすべてのソリューションを試しましたが、問題はフィールドサイズ、テーブルキーフィールドの定義、制約、またはEnforceConstraintsデータセット変数とは関係がないため、まったく運がありませんでした。

私の場合、プロジェクトの設計時にそこに置く.xsdオブジェクト(データアクセスレイヤー)もあります。データベーステーブルオブジェクトをDatasetビジュアルアイテムにドラッグすると、基になるデータベースから各テーブル定義を読み取り、データベースにテーブルを作成したときに定義したとおりに制約をDatasetオブジェクトにコピーします(SQL Server 2008 R2場合)。つまり、「NULL以外」または「外部キー」の制約で作成されたすべてのテーブル列は、SQLステートメントまたはストアドプロシージャの結果にも存在する必要があります。

すべてのキー列と「not null」として定義された列をクエリに含めた後、問題は完全に消えました。

3
jgarcias

Xsdファイルのデータテーブルの日付フィールドでAllowDBNullをTrueに設定すると、鉱山が機能し始めました。

3
Roger Perkins

これまでのすべての入力に感謝します。 DBを正常に正規化し、アプリケーションのスキーマ変更(データセットなど)を更新したかもしれませんが、それを追加したいのですが、別の原因もあります:sql CARTESIAN製品(クエリでテーブルを結合するとき)。

デカルトクエリの結果が存在すると、2つ以上のテーブルが結合されているプラ​​イマリ(またはキーファースト)テーブルにレコードが重複します。 SQLで "Where"句を指定しても、たとえばセカンダリテーブルとのJOINに不等結合が含まれていると、デカルトが発生する場合があります(2つ以上のUNrelatedテーブルからデータを取得する場合に便利です)。

FROM tbFirst内部結合tbSystem ON tbFirst.reference_str <> tbSystem.systemKey_str

これに対する解決策:テーブルは関連している必要があります。

ありがとう。シャグバート

2
Chagbert

SELECTステートメントの実行に制約の有効化が必要な理由は明らかではありません。私はC#や関連技術を知りませんが、Informixデータベースは知っています。クエリコードが制約を有効にしている(おそらく無効にしている)場合、システムで何か奇妙なことが起こります。

また、昔ながらの非標準のInformix OUTER結合表記も避ける必要があります。信じられないほど古いバージョンのInformixを使用していない限り、SQL-92スタイルの結合を使用する必要があります。

あなたの質問は2つの外部結合に言及しているようですが、クエリの例では1つだけを示しています。それもまた少々不可解です。

e」と残りのテーブル間の結合条件は次のとおりです。

AND c.crsnum = e.crsnum  
AND c.batch_no = e.batch_no  
AND d.lect_code= e.lect_code 

これは珍しい組み合わせです。関連する参照整合性制約を持つスキーマの関連サブセットがないため、これが正しいかどうかを知ることは困難ですが、そのような3つのテーブルを結合することは少し珍しいです。

これはあなたの問題に対する決定的な答えではありません。ただし、いくつかのガイダンスを提供する場合があります。

2

おそらく1つ以上の列が選択されているように聞こえます:

   e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course

データセット定義でAllowDBNullFalseに設定しています。

2

これをfalseからtrueに変更して、同じ問題を解決しました。最後に、データベースにアクセスして、ビットフィールドを変更してnullを許可し、xsdを更新し、wsdlとreference.csを更新しました。

this.columnAttachPDFToEmailFlag.AllowDBNull = true;
1
hamish

*二次方法:*


[id]を主キーとして使用する必要がない場合、

主キー属性を削除します。

dataSetで> TableAdapter> [id]列を右クリックし、Deleteキーを選択します...

問題は修正されます。

0
Zolfaghari

DirectCast(dt.Rows(0)、DataRow).RowError

これは直接エラーを与えます

0
Som

私もこの問題を抱えていましたが、基礎となるSQLサーバーで変更された列の修正されたサイズを反映するように* .xsdを変更した後に解決されました。

0
Ravi

上記の例外に、例外の別の考えられる理由を追加したいだけです(特に、データセットスキーマを手動で定義したい人のために)。

データセットに2つのテーブルがあり、最初のテーブルのフィールド(chfield)から2番目のテーブルのフィールド(pfield)にリレーションシップ(DataSet.Reletions.Add())が定義されている場合、暗黙的な制約がそのフィールドに追加されるようになりますuniqueたとえ定義として一意でも主キーでもないように明示的に指定されていない場合でも。

結果として、その親フィールド(pfield)に反復値を持つ行がある場合、この例外も発生します。

0
serop

XMLリーダーで.xsdファイルを開き、ビューのいずれかに設定された制約を削除することで、この問題を解決しました。なんらかの理由で、ビューをデータに追加したときに、主キー制約が存在しないはずの列の1つに主キー制約を追加しました。

もう1つの方法は、.xsdファイルを通常どおりに開き、問題の原因となっているテーブル/ビューを見て、存在しないはずのキー(右クリック列、delete keyを選択)を削除することです。

0
peroija
            using (var tbl = new DataTable())
            using (var rdr = cmd.ExecuteReader())
            {
                tbl.BeginLoadData();

                try
                {
                    tbl.Load(rdr);
                }
                catch (ConstraintException ex)
                {
                    rdr.Close();
                    tbl.Clear();

                    // clear constraints, source of exceptions
                    // note: column schema already loaded!
                    tbl.Constraints.Clear();
                    tbl.Load(cmd.ExecuteReader());
                }
                finally
                {
                    tbl.EndLoadData();
                }
            }
0

Visual Studioデータセットデザイナーを使用してデータテーブルを取得する場合、「制約を有効にできませんでした」というエラーがスローされます。同じ問題に直面しました。データセットデザイナー自体からデータをプレビューし、データベース内のテーブルと照合してみてください。

この問題を解決する最善の方法は、テーブルアダプターを削除し、代わりに新しいアダプターを作成することです。

0
albin.varghese

このエラーを修正するには、データセットデザイナーから問題のあるテーブルアダプターを取り外し、データセットを保存し、サーバーエクスプローラーからテーブルアダプターの新しいコピーをドラッグして修正しました。

0
Edwin Ikechukwu