Einschränkungen konnten nicht aktiviert werden. Eine oder mehrere Zeilen enthalten Werte, die gegen Nicht-Null-, Eindeutigkeits- oder Fremdschlüsseleinschränkungen verstoßen

167

Ich mache einen äußeren Join und habe ihn erfolgreich in der informixDatenbank ausgeführt, aber in meinem Code wird die folgende Ausnahme angezeigt:

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

Einschränkungen konnten nicht aktiviert werden. Eine oder mehrere Zeilen enthalten Werte, die gegen Nicht-Null-, Eindeutigkeits- oder Fremdschlüsseleinschränkungen verstoßen.

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

Die zweite Tabelle, für die ich den Outer Join mache, enthält einen zusammengesetzten Primärschlüssel, der in der vorherigen Outer 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 auf cc1assiscrseval. Der Primärschlüssel lautet (batch_no, crsnum, lect_code).

Wie kann ich dieses Problem beheben?


BEARBEITEN:

Laut @PaulStockRat: Ich mache, was er gesagt hat, und ich bekomme:

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

Also löse ich mein Problem, indem ich es ersetze e.eval, NVL (e.eval,'') evalund dies löst mein Problem. Vielen Dank.

Anyname Donotcare
quelle
Wenn ich ,e.eval,e.batch_no,e.crsnum,e.lect_code,e.prof_courseaus der Abfrage entferne , geht alles in Ordnung. Was ist das Problem bitte.
Anyname Donotcare
Es gibt auch einen Fehler in ADO.NET, bei dem ein "nicht eindeutiger Clustered-Index" ein fehlerhaftes Data.UniqueConstraint-Element in der DataTable erstellt.
Brain2000

Antworten:

350

Dieses Problem wird normalerweise durch eine der folgenden Ursachen verursacht

  • Für Spalten, die nicht auf AllowDBNull festgelegt 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 Dataset

Versuchen Sie, Ihre Abfrage nativ auszuführen, und sehen Sie sich die Ergebnisse an, wenn die Ergebnismenge nicht zu groß ist. Wenn Sie Nullwerte eliminiert haben, wird die Primärschlüsselspalte vermutlich dupliziert.

Um den genauen Fehler zu sehen, können Sie dem generierten Code manuell einen Try / Catch-Block hinzufügen und dann brechen, wenn die Ausnahme ausgelöst wird:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Dies zeigt Ihnen alle fehlerhaften Datenzeilen. Sie können sich dann die RowErrorfür jede dieser Spalten ansehen, aus der hervorgeht, welche Spalte 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 #? dataTable.GetErrors()[0].RowError

Geben Sie hier die Bildbeschreibung ein

PaulStock
quelle
4
Vielen Dank . >? dt.GetErrors()[0] {System.Data.DataRow} HasErrors: true ItemArray: {object[10]} RowError: "Column 'eval' does not allow DBNull.Value."
Anyname Donotcare
4
Genial. Das hat nicht funktioniert, aber ich konnte eine Überwachung für das Dataset hinzufügen und danach .GetErrors eingeben und die Werte erweitern. Das ist äußerst nützlich. Hoffentlich werde ich es nicht vergessen, bevor ich es das nächste Mal brauche :)
dwidel
6
Ja, das war wirklich hilfreich. Der Grund für meinen Fehler war, dass die Länge des Felds länger war als die maximale Länge der Spalte im Tabellenadapter. Eine Sache, die mir aufgefallen ist, war, dass Sie, um den Haltepunkt in der Designer-Datei zu erreichen, zu Extras> Optionen> Debuggen gehen und sicherstellen müssen, dass "Nur meinen Code aktivieren" deaktiviert ist. Anschließend können Sie den Code der Designerdatei durchlaufen.
E-on
1
Vielen Dank an @PaulStock für Ihre Antwort. Ich habe das gleiche Problem gelöst.
Uday
1
Dies war äußerst nützlich. Ich fand eine Nichtübereinstimmung zwischen der Länge der Datenspalte - sie wurde in der Datenbank und nicht im Datensatz erhöht.
Rob
38

Sie können die Einschränkungen für das Dataset deaktivieren. Auf diese Weise 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.

HockeyJ
quelle
1
Dies hat mir geholfen, die Daten zu finden, die mein Problem verursacht haben. Dies waren keine "schlechten Daten", sondern ein schlechtes Verhalten des Datenquellen-Konfigurationsassistenten. Es werden anscheinend keine überarbeiteten Spalteneinschränkungen angezeigt (und ich vermisse eine hinzugefügte Tabelle zum Booten), obwohl ich ausgehe und mit der Datenbank spreche ... und der Cache nicht aktiviert ist.
Fortboise
Danke für diese Antwort. Ich hatte ein Problem mit der Groß- und Kleinschreibung und musste es nur im Datensatz entsprechend einstellen.
Dan
10

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

Dies ist in C #, aber die Konvertierung in VB sollte nicht schwierig 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);
     }
  }

Hoppla - Entschuldigung, PKColumns habe ich hinzugefügt, als ich DataTable erweitert habe, das 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 durchlaufen. In meinem Fall kann ich, da alle meine Datentabellen ihre PK-Spalten kennen, automatisch für alle Tabellen ein Debug für diese Fehler 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.

Wenn Sie mit dem obigen Abschnitt PKColumns verwirrt sind, werden Spaltennamen und -werte ausgedruckt und sind nicht erforderlich. Es werden jedoch hilfreiche Informationen zur Fehlerbehebung hinzugefügt, um festzustellen, welche Spaltenwerte das Problem verursachen können. Wenn Sie diesen Abschnitt entfernen und den Rest behalten, wird der generierte SQLite-Fehler weiterhin gedruckt, wodurch die Spalte mit dem Problem notiert wird.

Shindigo
quelle
1
Genialer Weg, um genau herauszufinden, wo es schief gelaufen ist. Hat mir total geholfen, Probleme in einer Lösung zu ergründen, die ich geerbt habe, wenn es Inkonsistenzen mit den Daten gab. Obwohl es sich um ein DataSet handelte und ich nur jede Tabelle und dann jede Zeile durchlaufen habe. +10 wenn ich könnte.
Andez
Das hat bei mir funktioniert. Es war ein Column 'MyColumn' does not allow DBNull.Value, aber es würde das nicht anders zeigen. Danke :)
Alex
7
  • Stellen Sie sicher, dass die in der Tabellenadapterabfrage genannten Felder mit denen in der von Ihnen definierten Abfrage übereinstimmen. Der DAL scheint keine Fehlpaarungen zu mögen. Dies geschieht normalerweise bei Ihren Sprocs und Abfragen, 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 das in der XSS-Datei enthaltene XML es nicht erfasst hat, suchen Sie den Feldnamen und die Attributdefinition im XML 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-Gewerkschaften können Probleme bedeuten. Ich habe einen Tabellenadapter geändert, indem ich vor den anderen einen Datensatz "Bitte wählen Sie einen Mitarbeiter aus" hinzugefügt habe. Für die anderen Felder habe ich Dummy-Daten bereitgestellt, einschließlich beispielsweise Zeichenfolgen der Länge eins. Der DAL hat das Schema aus diesem ersten Datensatz abgeleitet. Datensätze, die mit Zeichenfolgen der Länge 12 folgen, sind fehlgeschlagen.

Bob Sullentrup
quelle
1
Willkommen bei SO, Bob. Ich habe Ihre Antwort bearbeitet (befindet sich jedoch noch in der Überprüfung). Zum Beispiel möchten wir keine Grüße und Unterschriften in den Antworten haben (dies wird als "Lärm" angesehen, siehe FAQ). Ihr Name und Ihr Gravatar werden ohnehin immer unter der Antwort angezeigt.
Christoffer Lette
5

Das hat bei mir funktioniert, Quelle: hier

Ich hatte diesen Fehler und er hing nicht mit den DB-Einschränkungen zusammen (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 hat einwandfrei funktioniert, bis der Benutzer mehr als 512 in dieses Feld eingegeben hat und die berühmte Fehlermeldung "Einschränkungen konnten nicht aktiviert werden. Eine oder mehrere Zeilen enthalten Werte, die gegen Nicht-Null-, eindeutige oder Fremdschlüssel-Einschränkungen verstoßen" angezeigt werden.

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 Wert 512 für die MaxLength-Eigenschaft, also habe ich in "-1" geändert und es funktioniert !!

Jemandem
quelle
Mein Problem muss auch MaxLength gewesen sein. Ich verwende den VWD 2010-Dataset-Designer. Die Quelltabelle wurde von jemand anderem geändert. Ich habe die SQL-Abfrage so geändert select *, dass alle Spalten aktualisiert werden, aber anscheinend wurden die vorhandenen Längen nicht aktualisiert. Also habe ich die Abfrage geändert, um ein Feld auszuwählen, die .xsd gespeichert, die .xsd in Notepad ++ geöffnet, um zu überprüfen, ob alle bis auf eine der MaxLength-Defs verschwunden sind, und die Abfrage dann erneut geändert select *. DAS hat die MaxLengths aktualisiert und mich über diesen Fehler hinaus gebracht.
Mark Berry
Vielen Dank, ich habe mir den ganzen Tag am Kopf gekratzt, da sich alles gut gemeldet hat. Ich musste auch zu nvarchar (MAX) wechseln, aber die Datentabelle hatte MaxLength bei 10 gehalten! Ich schulde dir etwas zu trinken!
Jon D
4

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 zufällig ein Primärschlüssel zu einer Spalte hinzugefügt oder etwas mit NOT NULL markiert, obwohl es tatsächlich auf null gesetzt ist. Obwohl für die eigentliche Ansichtserstellung auf dem SQL-Datenbankserver weder ein Primärschlüssel noch NOT NULL definiert ist, fügt der VS-Designer diesen Schlüssel / 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.

Shankar Arigela
quelle
3

Dieser Fehler wurde auch in meinem Projekt angezeigt. Ich habe alle hier veröffentlichten Lösungsvorschläge 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-Datasetvariablen zu tun hatte.

In meinem Fall habe ich auch ein .xsd-Objekt, das ich während der Projektentwurfszeit dort abgelegt habe (die Datenzugriffsschicht). Wenn Sie Ihre Datenbanktabellenobjekte in das visuelle Element Dataset ziehen, liest es jede Tabellendefinition aus der zugrunde liegenden Datenbank und kopiert die Einschränkungen genau so in das Dataset-Objekt, 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 "Fremdschlü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 hatte, verschwand das Problem vollständig.

jgarcias
quelle
3

Meins begann zu arbeiten, als ich in AllowDBNulleinem Datumsfeld in einer Datentabelle in der xsd-Datei auf True gesetzt habe.

Roger Perkins
quelle
2

Es klingt so, als ob möglicherweise eine oder mehrere der Spalten ausgewählt werden mit:

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

hat AllowDBNull in Ihrer Dataset-Definition auf False gesetzt.

Sheldon Warkentin
quelle
Ich setze allow null = true für alle Spalten in dieser Tabelle, aber vergebens.
Anyname Donotcare
2

Es ist nicht klar, warum das Ausführen einer SELECT-Anweisung das Aktivieren von Einschränkungen beinhalten sollte. Ich kenne C # oder verwandte Technologien nicht, aber ich kenne die Informix-Datenbank. Mit dem System ist etwas Seltsames los, wenn Ihr Abfragecode Einschränkungen aktiviert (und vermutlich auch deaktiviert).

Sie sollten auch die altmodische, nicht standardmäßige Informix OUTER-Join-Notation vermeiden. Sofern Sie keine unglaublich alte Version von Informix verwenden, sollten Sie den SQL-92-Join-Stil 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 dem Rest der 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 die relevante Teilmenge des Schemas mit den relevanten referenziellen Integritätsbeschränkungen haben, ist es schwer zu wissen, ob dies korrekt ist oder nicht, aber es ist etwas ungewöhnlich, zwischen drei solchen Tabellen zu verbinden.

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

Jonathan Leffler
quelle
2

Vielen Dank für alle bisher gemachten Beiträge. Ich möchte nur hinzufügen, dass man zwar die Datenbank erfolgreich normalisiert, alle Schemaänderungen an der Anwendung (z. B. am Dataset) aktualisiert hat oder so, aber es gibt auch eine andere Ursache: SQL CARTESIAN-Produkt (beim Verknüpfen von Tabellen in Abfragen).

Das Vorhandensein eines kartesischen Abfrageergebnisses führt dazu, dass doppelte Datensätze in der Primärtabelle (oder der Schlüsseltabelle zuerst) von zwei oder mehr Tabellen verbunden werden. Selbst wenn Sie in SQL eine "Where" -Klausel angeben, kann dennoch eine kartesische Klausel auftreten, wenn JOIN mit sekundärer Tabelle beispielsweise den ungleichen Join enthält (nützlich, wenn Daten aus zwei oder mehr nicht verwandten Tabellen abgerufen werden sollen):

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

Lösung hierfür: Tabellen sollten in Beziehung gesetzt werden.

Vielen Dank. chagbert

Chagbert
quelle
1

Ich habe das gleiche Problem gelöst, indem ich dies von falsch auf wahr geändert habe. Am Ende ging ich in die Datenbank und änderte mein Bitfeld, um null zuzulassen, und aktualisierte dann meine xsd und meine wsdl und reference.cs und jetzt ist alles in Ordnung.

this.columnAttachPDFToEmailFlag.AllowDBNull = true;
hamish
quelle
1

Kurze und einfache Lösung:

Gehen Sie zu MSSQL Studio Sever.

Führen Sie die Abfrage der Ursache dieses Fehlers aus: In meinem Fall sehe ich, dass der ID-Wert null war, weil ich vergessen habe, das Inkrement der Identitätsspezifikation um 1 zu setzen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie also 1 für das ID-Feld ein, da es sich um Autoincremane handelt, und ändern Sie, um NULLS in der Entwurfsansicht nicht zuzulassen

Geben Sie hier die Bildbeschreibung ein

Das war der Fehler, der dazu führte, dass meine Bindungsquelle und mein Tabellenadapter bei diesem Code einen Fehler auslösten:

   this.exchangeCheckoutReportTableAdapter.Fill(this.sbmsDataSet.ExchangeCheckouReportTable);
Daniel Adenew
quelle
0

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

Dies gibt direkt den Fehler

So M
quelle
2
Guter Vorschlag, aber das funktioniert nur, wenn es die erste Zeile in der Datentabelle ist, die den Fehler aufweist, nicht wahr? Wenn 100 gute Reihen und dann 1 schlechte Zeile zurückgegeben werden, wird es nicht sein , RowErrorauf Rows(0), wird es?
PaulStock
0

Wenn Sie den Visual Studio-Dataset-Designer verwenden, um die Datentabelle abzurufen, und der Fehler "Einschränkungen konnten nicht aktiviert werden" ausgegeben wird. Ich habe das gleiche Problem: Versuchen Sie, eine Vorschau der Daten des Dataset-Designers selbst anzuzeigen und sie mit der Tabelle in Ihrer Datenbank abzugleichen.

Der beste Weg, um dieses Problem zu lösen, besteht darin, den Tabellenadapter zu löschen und stattdessen einen neuen zu erstellen.

albin.varghese
quelle
0

* Sekundärer Weg: *


Wenn Sie nicht [id] als Primärschlüssel benötigen,

Entfernen Sie das Primärschlüsselattribut:

Klicken Sie in Ihrem DataSet> TableAdapter> mit der rechten Maustaste auf die Spalte [id] und wählen Sie die Taste Löschen ...

Problem wird behoben.

Zolfaghari
quelle
0

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

Ravi
quelle
0

Um diesen Fehler zu beheben, habe ich den problematischen Tabellenadapter vom Dataset-Designer entfernt, das Dataset gespeichert und dann eine neue Kopie des Tabellenadapters aus dem Server-Explorer gezogen, wodurch das Problem behoben wurde

Edwin Ikechukwu Okonkwo
quelle
0

Ich habe dieses Problem behoben, indem ich die .xsd-Datei mit einem XML-Reader geöffnet und eine Einschränkung für eine meiner Ansichten gelöscht habe. Aus welchem ​​Grund auch immer, als ich die Ansicht zu den Daten hinzufügte, wurde einer der Spalten eine Primärschlüsseleinschränkung hinzugefügt, wenn es keine geben sollte.

Die andere Möglichkeit besteht darin, die .xsd-Datei normal zu öffnen, die Tabelle / Ansicht zu betrachten, die das Problem verursacht, und alle Schlüssel zu löschen (Rechtsklick-Spalte, Auswahl delete key), die nicht vorhanden sein sollten.

Peroija
quelle
0

Ich möchte 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 Dataset zwei Tabellen vorhanden sind und eine Beziehung ( DataSet.Reletions.Add()) vom Feld der ersten Tabelle ( chfield) zum Feld der zweiten Tabelle ( ) definiert pfieldist, wird diesem Feld eine implizite Einschränkung hinzugefügt, die eindeutig ist auch wenn dies möglicherweise nicht der Fall ist als solche explizit in Ihrer Definition weder als eindeutig noch als Primärschlüssel angegeben.

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

serop
quelle
0
            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();
                }
            }
Martin.Martinsson
quelle
0

Ich habe den gleichen Fehlertyp erhalten und in meinem Fall wurde er behoben, indem die Auswahlfelder entfernt und durch ein * ersetzt wurden. Keine Ahnung warum es geschah. Die Abfrage hatte keine Tippfehler oder etwas Besonderes.

Nicht die beste Lösung, aber nichts anderes funktionierte und ich wurde erschöpft.

Auf meiner Suche nach einer klaren Antwort fand ich dies auf folgender Adresse : https://www.codeproject.com/questions/45516/failed-to-enable-constraints-one-or-more-rows-cont

Lösung 8

Dieser Fehler wurde auch in meinem Projekt mit Visual Studio 2010 angezeigt. Ich habe andere Lösungen ausprobiert, die in anderen Blogs veröffentlicht wurden, aber überhaupt kein Glück, da das Problem nichts mit der Feldgröße, der Definition der Tabellenschlüsselfelder, den Einschränkungen oder der EnforceConstraintsDatensatzvariablen zu tun hatte .

In meinem Fall habe ich ein .xsd-Objekt, das ich während der Projektentwurfszeit (in der Datenzugriffsschicht) dort abgelegt habe. Wenn Sie Ihre Datenbanktabellenobjekte in das visuelle Element Dataset ziehen, liest es jede Tabellendefinition aus der zugrunde liegenden Datenbank und kopiert die Einschränkungen in dieDataset genau so Objekt, wie Sie sie beim Erstellen der Tabellen in Ihrer Datenbank definiert haben (in meinem Fall SQL Server 2008 R2) ). Dies bedeutet, dass jede Tabellenspalte, die mit der Einschränkung "nicht null" oder "Fremdschlüssel" erstellt wurde, auch im Ergebnis Ihrer SQL-Anweisung oder gespeicherten Prozedur vorhanden sein muss.

Nachdem ich alle eingeschränkten Spalten (nicht null, Primärschlüssel, Fremdschlüssel usw.) in meine Abfragen aufgenommen hatte, verschwand das Problem vollständig.

Möglicherweise müssen nicht alle Tabellenspalten im Ergebnis der Abfrage / gespeicherten Prozedur vorhanden sein. Da die Einschränkungen jedoch weiterhin angewendet werden, wird der Fehler angezeigt, wenn eine eingeschränkte Spalte nicht im Ergebnis angezeigt wird.

Hoffe das hilft jemand anderem.

Babak Bandpey
quelle
-1

In meinem Fall wurde dieser Fehler durch die Größe einer Zeichenfolgenspalte ausgelöst. Was seltsam war, war, als ich genau dieselbe Abfrage in einem anderen Tool ausführte, wiederholte Werte oder Nullwerte waren nicht vorhanden.

Dann stellte ich fest, dass die Größe einer Zeichenfolgenspalte 50 betrug. Als ich die Füllmethode aufrief, wurde der Wert gehackt und diese Ausnahme ausgelöst.
Ich klicke auf die Spalte und setze in den Eigenschaften die Größe auf 200 und der Fehler war weg.

Ich hoffe das hilft

Tapatio
quelle
-1

Ich habe dieses Problem gelöst, indem ich die "Unterauswahl" so gemacht habe:

string newQuery = "select * from (" + query + ") as temp";

Wenn Sie dies auf MySQL tun, werden alle Collunms-Eigenschaften (eindeutig, nicht null ...) gelöscht.

ISFO
quelle