wake-up-neo.com

Fehler beim Aktivieren der Einschränkungen Eine oder mehrere Zeilen enthalten Werte, die gegen Nicht-Null-, eindeutige oder Fremdschlüsseleinschränkungen verstoßen

Ich mache einen äußeren Join und habe erfolgreich in der Datenbank informix ausgeführt, erhalte jedoch die folgende Ausnahme in meinem Code:

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

Fehler beim Aktivieren der Einschränkungen Eine oder mehrere Zeilen enthalten Werte gegen Nicht-Null-, eindeutige oder Fremdschlüssel-Beschränkungen.

Ich kenne das Problem, weiß aber nicht, wie ich es beheben kann.

Die zweite Tabelle, für die ich den äußeren Join mache, enthält einen zusammengesetzten Primärschlüssel, der in der vorherigen äußeren Join-Abfrage null ist.

BEARBEITEN:

    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 = ....

Das Problem tritt bei der Tabelle cc1assiscrseval auf. Der Primärschlüssel lautet (batch_no, crsnum, lect_code).

Wie kann dieses Problem behoben werden?


BEARBEITEN:

Nach @PaulStock rat: Ich mache, was er sagte, und erhalte:

? dt.GetErrors () [0] {System.Data.DataRow} HasErrors: true ItemArray: {object [10]} RowError: "In der Spalte 'eval' ist DBNull.Value nicht zulässig."

Also löse ich mein Problem, indem ich e.eval durch NVL (e.eval,'') eval ersetzt, und das löst mein Problem . Vielen Dank.

145

Dieses Problem wird normalerweise durch eine der folgenden Ursachen verursacht

  • für Spalten, die nicht auf AllowDBNull gesetzt sind, werden Nullwerte zurückgegeben
  • doppelte Zeilen, die mit demselben Primärschlüssel zurückgegeben werden.
  • eine Nichtübereinstimmung in der Spaltendefinition (z. B. Größe der Zeichenfelder) zwischen der Datenbank und dem Datensatz

Versuchen Sie, Ihre Abfrage systemeigen auszuführen, und überprüfen Sie die Ergebnisse, wenn die Ergebnismenge nicht zu groß ist. Wenn Sie Nullwerte eliminiert haben, wird davon ausgegangen, dass die Primärschlüsselspalten dupliziert werden.

Um den genauen Fehler zu sehen, können Sie dem generierten Code auch manuell einen Try/Catch-Block hinzufügen, der beim Auslösen der Ausnahme unterbrochen wird:

enter image description here

Rufen Sie dann im Befehlsfenster die Methode GetErrors für die Tabelle auf, um den Fehler zu erhalten.
Für C # wäre der Befehl ? dataTable.GetErrors()
Für VB lautet der Befehl ? dataTable.GetErrors

enter image description here

Daraufhin werden alle fehlerhaften Datenzeilen angezeigt. Sie können dann die RowError für jede dieser anzeigen, die Ihnen die Spalte mitteilen sollte, die zusammen mit dem Problem ungültig ist. Um den Fehler der ersten fehlerhaften Datenzeile zu sehen, lautet der Befehl:
? dataTable.GetErrors(0).RowError
oder in C # wäre es ? dataTable.GetErrors()[0].RowError

enter image description here

320
PaulStock

Sie können die Einschränkungen für das Dataset deaktivieren. So können Sie fehlerhafte Daten identifizieren und das Problem beheben.

z.B. 

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

Die Füllmethode kann für Sie etwas anders sein.

34
HockeyJ

Dadurch werden alle fehlerhaften Zeilen in der Tabelle gefunden, der Primärschlüssel und der in dieser Zeile aufgetretene Fehler werden ausgedruckt.

Dies ist in C #, aber das Konvertieren in VB sollte nicht schwer sein.

 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);
     }
  }

Ups - sorry, PKColumns habe ich hinzugefügt, wenn ich DataTable erweitert habe und mir alle Spalten mitteilt, aus denen der Primärschlüssel der DataTable besteht. Wenn Sie die Primärschlüsselspalten in Ihrer Datentabelle kennen, können Sie sie hier durchgehen. In meinem Fall kann ich, da alle meine Daten ihre PK-Spalten kennen, Debugging für diese Fehler automatisch für alle Tabellen schreiben.

Die Ausgabe sieht folgendermaßen aus:

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
8
shindigo
  • Stellen Sie sicher, dass die in der Tabellenadapterabfrage genannten Felder mit denen in der von Ihnen definierten Abfrage übereinstimmen. Die DAL scheint Unstimmigkeiten nicht zu mögen. Dies tritt normalerweise bei Ihren Sprocs und Abfragen auf, nachdem Sie einer Tabelle ein neues Feld hinzugefügt haben. 

  • Wenn Sie die Länge eines varchar-Felds in der Datenbank geändert haben und die in der XSS-Datei enthaltene XML-Datei nicht abgerufen hat, suchen Sie den Feldnamen und die Attributdefinition in der XML-Datei und ändern Sie sie manuell. 

  • Entfernen Sie Primärschlüssel aus Auswahllisten in Tabellenadaptern, wenn sie nicht mit den zurückgegebenen Daten zusammenhängen. 

  • Führen Sie Ihre Abfrage in SQL Management Studio aus, und stellen Sie sicher, dass keine doppelten Datensätze zurückgegeben werden. Doppelte Datensätze können doppelte Primärschlüssel generieren, die diesen Fehler verursachen. 

  • SQL-Unionen können Probleme buchstabieren. Ich habe einen Tabellenadapter modifiziert, indem ein "Bitte auswählen" -Datensatz vor den anderen hinzugefügt wurde. Für die anderen Felder habe ich Dummy-Daten bereitgestellt, z. B. Zeichenfolgen der Länge eins. Die DAL hat das Schema aus diesem ursprünglichen Datensatz abgeleitet. Aufzeichnungen mit Zeichenfolgen der Länge 12 sind fehlgeschlagen. 

7
Bob Sullentrup

Das hat für mich funktioniert, Quelle: hier

Ich hatte diesen Fehler und er hatte nichts mit den DB-Einschränkungen zu tun (zumindest in meinem Fall). Ich habe eine XSD-Datei mit einer GetRecord-Abfrage, die eine Gruppe von Datensätzen zurückgibt. Eine der Spalten dieser Tabelle war "nvarchar (512)", und mitten im Projekt musste ich sie in "nvarchar (MAX)" ändern.

Alles funktionierte einwandfrei, bis der Benutzer mehr als 512 in dieses Feld eingegeben hat und wir die bekannte Fehlermeldung "Fehler beim Aktivieren der Einschränkungen" erhalten. Eine oder mehrere Zeilen enthalten Werte, die gegen Nicht-Null-, eindeutige oder Fremdschlüssel-Beschränkungen verstoßen.

Lösung: Überprüfen Sie alle MaxLength-Eigenschaften der Spalten in Ihrer DataTable.

Die Spalte, die ich von "nvarchar (512)" in "nvarchar (MAX)" geändert habe, hatte immer noch den 512-Wert für die MaxLength-Eigenschaft, also habe ich auf "-1" geändert und es funktioniert !!.

5
Somebody

Das Problem liegt beim Data Access Designer. Wenn wir in Visual Studio eine Ansicht aus dem "Server-Explorer" in das Designer-Fenster ziehen, wird entweder ein Primärschlüssel für eine Spalte zufällig hinzugefügt oder ein NOT-NULL-Element markiert, obwohl es tatsächlich auf Null gesetzt ist. Obwohl für die eigentliche View-Erstellung auf dem SQL-Datenbankserver kein Primärschlüssel definiert oder NOT NULL definiert ist, fügt der VS-Designer diesen Schlüssel bzw. diese Einschränkung hinzu.

Sie können dies im Designer sehen - es wird mit einem Schlüsselsymbol links neben dem Spaltennamen angezeigt. 

Lösung: Klicken Sie mit der rechten Maustaste auf das Schlüsselsymbol und wählen Sie 'Schlüssel löschen'. Dies sollte das Problem lösen. Sie können auch mit der rechten Maustaste auf eine Spalte klicken und "Eigenschaften" auswählen, um die Liste der Eigenschaften einer Spalte im VS Data Access Designer anzuzeigen und die Werte entsprechend zu ändern.

4
Shankar Arigela

Dieser Fehler zeigte sich auch in meinem Projekt. Ich habe alle hier vorgeschlagenen Lösungen ausprobiert, aber überhaupt kein Glück, da das Problem nichts mit der Feldgröße, der Definition der Tabellenschlüsselfelder, den Einschränkungen oder der EnforceConstraints-Dataset-Variablen zu tun hatte.

In meinem Fall habe ich auch ein .xsd-Objekt, das ich während der Projektierungszeit (Data Access Layer) dort abgelegt habe. Wenn Sie Ihre Datenbanktabellenobjekte in das visuelle Element Dataset ziehen, werden alle Tabellendefinitionen aus der zugrunde liegenden Datenbank gelesen und die Einschränkungen in das Dataset - Objekt genau so eingefügt, wie Sie sie beim Erstellen der Tabellen in Ihrer Datenbank definiert haben (SQL Server 2008 R2 in my Fall). Dies bedeutet, dass jede Tabellenspalte, die mit der Einschränkung "nicht null" oder "fremder Schlüssel" erstellt wurde, auch im Ergebnis Ihrer SQL-Anweisung oder gespeicherten Prozedur vorhanden sein muss.

Nachdem ich alle Schlüsselspalten und die als "nicht null" definierten Spalten in meine Abfragen aufgenommen habe, ist das Problem vollständig verschwunden.

3
jgarcias

Mein Computer begann zu arbeiten, als ich AllowDBNull in einem Datumsfeld einer Datentabelle in der Xsd-Datei auf "True" (Wahr) gesetzt habe.

3
Roger Perkins

Vielen Dank für alle bisher getätigten Eingaben. Ich möchte nur hinzufügen, dass eine DB erfolgreich normalisiert wurde, Schemaänderungen an ihrer Anwendung (z. B. an Dataset) aktualisiert wurden oder so. Es gibt auch eine andere Ursache: sql CARTESIAN-Produkt (beim Zusammenfügen von Tabellen in Abfragen). 

Das Vorhandensein eines kartesischen Abfrageergebnisses führt zu doppelten Datensätzen in der primären (oder ersten Schlüssel-) Tabelle von zwei oder mehr Tabellen, die verbunden werden .. Selbst wenn Sie in der SQL eine "Where" -Klausel angeben, kann ein Cartesian-Befehl trotzdem auftreten JOIN mit Sekundärtabelle enthält beispielsweise den ungleichen Join (nützlich, wenn Daten aus zwei oder mehr UN-bezogenen Tabellen abgerufen werden sollen):

VON tbFirst INNER JOIN tbSystem ON tbFirst.reference_str <> tbSystem.systemKey_str

Lösung dafür: Tabellen sollten verwandt sein.

Vielen Dank. Chagbert

2
Chagbert

Es ist nicht klar, warum die Ausführung einer SELECT-Anweisung das Aktivieren von Einschränkungen beinhaltet. Ich kenne C # oder verwandte Technologien nicht, aber ich kenne die Informix-Datenbank. Es passiert etwas Ungewöhnliches im System, wenn Ihr Abfragecode Einschränkungen aktiviert (und vermutlich auch deaktiviert).

Sie sollten auch die altmodische, nicht standardisierte Informix-OUTER-Join-Notation vermeiden. Wenn Sie nicht eine unglaublich alte Version von Informix verwenden, sollten Sie den SQL-92-Stil von Joins verwenden.

Ihre Frage scheint zwei äußere Verknüpfungen zu erwähnen, aber Sie zeigen nur eine in der Beispielabfrage. Auch das ist ein bisschen rätselhaft.

Die Verbindungsbedingungen zwischen 'e' und den übrigen Tabellen sind:

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

Dies ist eine ungewöhnliche Kombination. Da wir nicht über die relevante Teilmenge des Schemas mit den relevanten Einschränkungen der referentiellen Integrität verfügen, ist es schwierig zu wissen, ob dies richtig ist oder nicht, aber es ist ein wenig ungewöhnlich, drei solcher Tabellen zu verbinden.

Nichts davon ist eine endgültige Antwort auf Ihr Problem. Es kann jedoch einige Hinweise geben.

2

Es klingt wie eine oder mehrere der Spalten, die ausgewählt wurden mit:

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

hat AllowDBNull in Ihrer Dataset-Definition auf False gesetzt.

2

Ich habe das gleiche Problem gelöst, indem ich dies von falsch in wahr geändert habe. am ende bin ich in die datenbank gegangen und habe mein bitfeld geändert, um null zu erlauben, und dann mein xsd aktualisiert und mein wsdl und reference.cs aktualisiert.

this.columnAttachPDFToEmailFlag.AllowDBNull = true;
1
hamish

* Sekundärweg: *


Wenn Sie [ID] nicht als Primärschlüssel verwenden müssen,

Entfernen Sie das Primärschlüsselattribut:

klicken Sie im DataSet> TableAdapter> mit der rechten Maustaste auf die Spalte [ID]> und wählen Sie Schlüssel löschen ...

Problem wird behoben.

0
Zolfaghari

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

Dies gibt direkt den Fehler

0
Som

Ich hatte auch dieses Problem und es wurde behoben, nachdem * * .xsd geändert wurde, um die geänderte Größe der Spalte zu berücksichtigen, die im zugrunde liegenden SQL-Server geändert wurde.

0
Ravi

Sie möchten nur einen weiteren möglichen Grund für die Ausnahme zu den oben aufgeführten hinzufügen (insbesondere für Personen, die das Datensatzschema manuell definieren möchten): 

wenn in Ihrem Datensatz zwei Tabellen vorhanden sind und eine Beziehung (DataSet.Reletions.Add()) von dem Feld der ersten Tabelle (chfield) zu dem Feld der zweiten Tabelle (pfield) definiert ist, wird diesem Feld eine implizite Bedingung hinzugefügt, die eindeutig) ist Auch wenn es in Ihrer Definition nicht explizit als solches angegeben ist, weder als eindeutiger noch als Primärschlüssel.

Wenn Sie also Zeilen mit wiederkehrenden Werten in diesem übergeordneten Feld (pfield) haben, wird diese Ausnahme ebenfalls angezeigt.

0
serop

Ich habe dieses Problem behoben, indem ich die .xsd-Datei mit einem XML-Reader geöffnet und eine Einschränkung gelöscht habe, die in einer meiner Ansichten platziert wurde. Aus irgendeinem Grund habe ich beim Hinzufügen der Ansicht zu den Daten eine Primärschlüsseleinschränkung zu einer der Spalten hinzugefügt, wenn es keine hätte geben sollen.

Die andere Möglichkeit ist, die .xsd-Datei normal zu öffnen, die Tabelle/Ansicht zu betrachten, die das Problem verursacht, und alle Schlüssel zu löschen (rechte Maustaste, delete key auswählen), die nicht vorhanden sein sollten.

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

Wenn Sie den Visual Studio-Dataset-Designer verwenden, um die Datentabelle abzurufen, und der Fehler "Fehler beim Aktivieren der Einschränkungen" ausgegeben wird. Ich hatte das gleiche Problem, versuchen Sie, eine Vorschau der Daten vom Daten-Designer selbst anzuzeigen, und ordnen Sie sie der Tabelle in Ihrer Datenbank zu. 

Um dieses Problem zu lösen, löschen Sie am besten den Tabellenadapter und erstellen stattdessen einen neuen. 

0
albin.varghese

Um diesen Fehler zu beheben, nahm ich den problematischen Tabellenadapter vom Dataset-Designer ab, speicherte das Dataset und zog dann eine neue Kopie des Tabellenadapters aus dem Server-Explorer und das Problem wurde behoben

0
Edwin Ikechukwu