Ich mache einen äußeren Join und habe ihn erfolgreich in der informix
Datenbank 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 @PaulStock
Rat: 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,'') eval
und dies löst mein Problem. Vielen Dank.
,e.eval,e.batch_no,e.crsnum,e.lect_code,e.prof_course
aus der Abfrage entferne , geht alles in Ordnung. Was ist das Problem bitte.Antworten:
Dieses Problem wird normalerweise durch eine der folgenden Ursachen verursacht
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:
Rufen Sie dann im Befehlsfenster die
GetErrors
Methode 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
Dies zeigt Ihnen alle fehlerhaften Datenzeilen. Sie können sich dann die
RowError
fü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
quelle
>? dt.GetErrors()[0] {System.Data.DataRow} HasErrors: true ItemArray: {object[10]} RowError: "Column 'eval' does not allow DBNull.Value."
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
Die Füllmethode kann für Sie etwas anders sein.
quelle
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.
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:
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.
quelle
Column 'MyColumn' does not allow DBNull.Value
, aber es würde das nicht anders zeigen. Danke :)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.
quelle
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 !!
quelle
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ändertselect *
. DAS hat die MaxLengths aktualisiert und mich über diesen Fehler hinaus gebracht.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.
quelle
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.
quelle
Meins begann zu arbeiten, als ich in
AllowDBNull
einem Datumsfeld in einer Datentabelle in der xsd-Datei auf True gesetzt habe.quelle
Es klingt so, als ob möglicherweise eine oder mehrere der Spalten ausgewählt werden mit:
hat AllowDBNull in Ihrer Dataset-Definition auf False gesetzt.
quelle
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: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.
quelle
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):
Lösung hierfür: Tabellen sollten in Beziehung gesetzt werden.
Vielen Dank. chagbert
quelle
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.
quelle
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 also 1 für das ID-Feld ein, da es sich um Autoincremane handelt, und ändern Sie, um NULLS in der Entwurfsansicht nicht zuzulassen
Das war der Fehler, der dazu führte, dass meine Bindungsquelle und mein Tabellenadapter bei diesem Code einen Fehler auslösten:
quelle
DirectCast (dt.Rows (0), DataRow) .RowError
Dies gibt direkt den Fehler
quelle
RowError
aufRows(0)
, wird es?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.
quelle
* 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.
quelle
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.
quelle
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
quelle
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.quelle
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 ( ) definiertpfield
ist, 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.quelle
quelle
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
EnforceConstraints
Datensatzvariablen 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 die
Dataset
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.
quelle
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
quelle
Ich habe dieses Problem gelöst, indem ich die "Unterauswahl" so gemacht habe:
Wenn Sie dies auf MySQL tun, werden alle Collunms-Eigenschaften (eindeutig, nicht null ...) gelöscht.
quelle