Échec de l’activation des contraintes. Une ou plusieurs lignes contiennent des valeurs en violation de contraintes non nulles, uniques ou de clé étrangère

Je fais une jointure externe et je l’exécute avec succès dans la firebase database informix mais j’obtiens l’exception suivante dans mon code:

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

Échec d’activation des contraintes. Une ou plusieurs lignes contiennent des valeurs en violation de contraintes non nulles, uniques ou de clé étrangère.

Je connais le problème, mais je ne sais pas comment le réparer.

La deuxième table dans laquelle je fais la jointure externe contient une clé primaire composite qui est nulle dans la précédente requête de jointure externe.

MODIFIER:

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

Le problème se produit avec la table cc1assiscrseval . La clé primaire est (batch_no, crsnum, lect_code).

Comment régler ce problème?


MODIFIER:

Selon le conseil de @PaulStock : je fais ce qu’il a dit et je reçois:

? dt.GetErrors () [0] {System.Data.DataRow} HasErrors: true ItemArray: {object [10]} RowError: “La colonne ‘eval’ n’autorise pas DBNull.Value.”

Donc, je résous mon problème en remplaçant e.eval par, NVL (e.eval,'') eval . Et cela résout mon problème. Merci beaucoup.

Ce problème est généralement causé par l’un des éléments suivants

  • valeurs nulles renvoyées pour les colonnes non définies sur AllowDBNull
  • les lignes en double sont renvoyées avec la même clé primaire.
  • une incohérence dans la définition de colonne (par exemple, taille des champs de caractères) entre la firebase database et le jeu de données

Essayez d’exécuter votre requête en mode natif et examinez les résultats si le jeu de résultats n’est pas trop volumineux. Si vous avez éliminé les valeurs NULL, je suppose que les colonnes de la clé primaire sont dupliquées.

Ou, pour voir l’erreur exacte, vous pouvez append manuellement un bloc Try / Catch au code généré, comme cela, et le briser lorsque l’exception est déclenchée:

entrer la description de l'image ici

Ensuite, dans la fenêtre de commande, appelez la méthode GetErrors sur la table pour obtenir l’erreur.
Pour C #, la commande serait ? dataTable.GetErrors() ? dataTable.GetErrors()
Pour VB, la commande est ? dataTable.GetErrors ? dataTable.GetErrors

entrer la description de l'image ici

Cela vous montrera toutes les lignes de données qui ont une erreur. Vous pouvez alors regarder RowError pour chacun d’eux, ce qui devrait vous indiquer la colonne invalide avec le problème. Donc, pour voir l’erreur de la première ligne de données en erreur, la commande est la suivante:
? dataTable.GetErrors(0).RowError
ou en C # ce serait ? dataTable.GetErrors()[0].RowError ? dataTable.GetErrors()[0].RowError

entrer la description de l'image ici

Vous pouvez désactiver les contraintes sur le jeu de données. Cela vous permettra d’identifier les mauvaises données et de résoudre le problème.

par exemple

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

La méthode de remplissage peut être légèrement différente pour vous.

Cela va trouver toutes les lignes de la table qui ont des erreurs, imprimer la clé primaire de la ligne et l’erreur qui s’est produite sur cette ligne …

C’est en C #, mais le convertir en VB ne devrait pas être difficile.

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

Oups – désolé PKColumns est quelque chose que j’ai ajouté lorsque j’ai étendu DataTable qui me dit toutes les colonnes qui constituent la clé primaire du DataTable. Si vous connaissez les colonnes de la clé primaire dans votre datatable, vous pouvez les parcourir en boucle. Dans mon cas, comme toutes mes datatables connaissent leurs colonnes PK, je peux écrire le débogage de ces erreurs automatiquement pour toutes les tables.

La sortie ressemble à ceci:

 Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J', has error: Column 'HAIR_COLOR' does not allow DBNull.Value. 
  • Assurez-vous que les champs nommés dans la requête de l’adaptateur de table correspondent à ceux de la requête que vous avez définie. La DAL ne semble pas aimer les inadéquations. Cela se produira généralement à vos sprocs et requêtes après avoir ajouté un nouveau champ à une table.

  • Si vous avez modifié la longueur d’un champ varchar dans la firebase database et que le fichier XML contenu dans le fichier XSS ne l’a pas récupéré, recherchez le nom du champ et la définition d’atsortingbut dans le fichier XML et modifiez-le manuellement.

  • Supprimez les clés primaires des listes de sélection dans les adaptateurs de table si elles ne sont pas liées aux données renvoyées.

  • Exécutez votre requête dans SQL Management Studio et assurez-vous que les enregistrements en double ne sont pas renvoyés. Les enregistrements en double peuvent générer des clés primaires en double qui provoquent cette erreur.

  • Les unions SQL peuvent causer des problèmes. J’ai modifié un adaptateur de table en ajoutant un enregistrement «veuillez sélectionner un employé» précédant les autres. Pour les autres champs, j’ai fourni des données factices, par exemple des chaînes de longueur un. La DAL a déduit le schéma de cet enregistrement initial. Les enregistrements suivants avec des chaînes de longueur 12 ont échoué.

Cela a fonctionné pour moi, source: ici

J’ai eu cette erreur et elle n’était pas liée aux contraintes de la firebase database (du moins dans mon cas). J’ai un fichier .xsd avec une requête GetRecord qui renvoie un groupe d’enregistrements. Une des colonnes de cette table était “nvarchar (512)” et au milieu du projet, je devais la changer en “nvarchar (MAX)”.

Tout a bien fonctionné jusqu’à ce que l’utilisateur entre plus de 512 sur ce champ et nous commençons à recevoir le fameux message d’erreur “Échec de l’activation des contraintes. Une ou plusieurs lignes contiennent des valeurs en violation de contraintes non nulles, uniques ou étrangères”.

Solution: Vérifiez toutes les propriétés MaxLength des colonnes de votre DataTable.

La colonne que j’ai changée de “nvarchar (512)” à “nvarchar (MAX)” avait toujours la valeur 512 sur la propriété MaxLength, donc j’ai changé pour “-1” et ça marche !!.

Le problème est avec le concepteur d’access aux données. Dans Visual Studio, lorsque nous extrayons une vue de “Explorateur de serveurs” vers la fenêtre du concepteur, cela ajoute une clé primaire à une colonne de manière aléatoire ou marque quelque chose dans une valeur NOT NULL, bien qu’elle soit définie sur null. Bien que la création réelle de View sur le serveur SQL SQL n’ait pas de clé primaire définie ou que le NOT NULL soit défini, le concepteur VS ajoute cette clé / contrainte.

Vous pouvez voir cela dans le concepteur – il est affiché avec une icône de clé à gauche du nom de la colonne.

Solution: Cliquez avec le bouton droit sur l’icône de la clé et sélectionnez «Supprimer la clé». Cela devrait résoudre le problème. Vous pouvez également cliquer avec le bouton droit sur une colonne et sélectionner “Propriétés” pour afficher la liste des propriétés d’une colonne dans le concepteur d’access VS Data et modifier les valeurs en conséquence.

Cette erreur apparaissait également dans mon projet. J’ai essayé toutes les solutions proposées ici, mais pas de chance car le problème n’a rien à voir avec la taille des champs, la définition des champs de clé de table, les contraintes ou la variable de jeu de données EnforceConstraints.

Dans mon cas, j’ai aussi un object .xsd que j’ai placé pendant la conception du projet (la couche d’access aux données). Lorsque vous faites glisser vos objects de table de firebase database dans l’élément visuel Dataset, il lit chaque définition de table dans la firebase database sous-jacente et copie les contraintes dans l’object Dataset exactement comme vous les avez créées dans votre firebase database (SQL Server 2008 R2). Cas). Cela signifie que chaque colonne de table créée avec la contrainte “not null” ou “foreign key” doit également être présente dans le résultat de votre instruction SQL ou de votre procédure stockée.

Après avoir inclus toutes les colonnes clés et les colonnes définies comme “non nul” dans mes requêtes, le problème a complètement disparu.

Cela ressemble à une ou plusieurs colonnes sélectionnées avec:

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

AllowDBNull est défini sur False dans votre définition de jeu de données.

Il n’est pas clair pourquoi l’exécution d’une instruction SELECT doit impliquer l’activation de contraintes. Je ne connais pas les technologies C # ou connexes, mais je connais une firebase database Informix. Il y a quelque chose d’étrange avec le système si votre code d’interrogation active (et supprime probablement aussi) les contraintes.

Vous devez également éviter l’ancienne notation de jointure Informix OUTER non standard. Si vous n’utilisez pas une ancienne version d’Informix, vous devez utiliser le style de jointure SQL-92.

Votre question semble mentionner deux jointures externes, mais vous n’en affichez qu’une dans l’exemple de requête. Cela aussi est un peu déroutant.

Les conditions de jonction entre ‘ e ‘ et le rest des tables sont les suivantes:

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

Ceci est une combinaison inhabituelle. Comme nous n’avons pas le sous-ensemble pertinent du schéma avec les contraintes d’intégrité référentielle pertinentes, il est difficile de savoir si cela est correct ou non, mais il est inhabituel de joindre 3 tables de ce type.

Rien de tout cela n’est une réponse définitive à votre problème; Cependant, cela peut fournir des indications.

Merci pour toutes les consortingbutions faites jusqu’ici. Je veux juste append que même si on a réussi à normaliser la firebase database, à mettre à jour les modifications de schéma dans leur application (par exemple, un jeu de données), il y a une autre cause: produit SQL CARTESIAN (lors de la jonction de tables dans des requêtes).

L’existence d’un résultat de requête cartésien entraînera des enregistrements en double dans la table principale (ou la première clé) de deux ou plusieurs tables jointes. Même si vous spécifiez une clause “Where” dans le SQL, un cartésien peut toujours apparaître si JOIN avec la table secondaire par exemple contient la jointure inégale (utile pour obtenir des données de 2 tables UNrelated ou plus):

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

Solution pour cela: les tableaux doivent être liés.

Merci. chagbert

J’ai résolu le même problème en changeant cela de faux à vrai. à la fin je suis allé dans la firebase database et ai changé mon champ de bit pour permettre le null, puis ai rafraîchi mon xsd, et ai rafraîchi mes wsdl et référence.cs et maintenant tout va bien.

 this.columnAttachPDFToEmailFlag.AllowDBNull = true; 

La mienne a commencé à fonctionner lorsque j’ai défini AllowDBNull sur True dans un champ de date d’une table de données du fichier xsd.

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

Cela donne directement l’erreur

Si vous utilisez le concepteur de jeu de données Visual Studio pour obtenir la table de données et qu’il génère une erreur «Impossible d’activer les contraintes». J’ai rencontré le même problème, essayez de prévisualiser les données du concepteur de jeu de données lui-même et faites-le correspondre avec la table dans votre firebase database.

La meilleure façon de résoudre ce problème consiste à supprimer l’adaptateur de table et à en créer un à la place.

* Voie secondaire: *


Si vous n’avez pas besoin de [id] comme clé primaire,

Supprimer son atsortingbut de clé primaire:

sur votre DataSet> TableAdapter> cliquez avec le bouton droit sur la colonne [id]> sélectionnez Supprimer la clé …

Le problème sera résolu.

J’ai également eu ce problème et il a été résolu après avoir modifié le * .xsd pour refléter la taille révisée de la colonne modifiée dans le serveur SQL sous-jacent.

Pour corriger cette erreur, j’ai enlevé l’adaptateur de table troublant du concepteur de jeu de données, puis j’ai enregistré le jeu de données, puis j’ai fait glisser une nouvelle copie de l’adaptateur de table à partir de l’explorateur de serveur.

J’ai résolu ce problème en ouvrant le fichier .xsd avec un lecteur XML et en supprimant une contrainte placée sur l’une de mes vues. Pour quelque raison que ce soit, lorsque j’ai ajouté la vue aux données, cela a ajouté une contrainte de clé primaire à l’une des colonnes quand il n’y en aurait pas dû.

L’autre moyen consiste à ouvrir le fichier .xsd normalement, à regarder la table / vue à l’origine du problème et à supprimer toutes les clés (colonne de clic droit, sélectionnez la delete key ) qui ne doivent pas être présentes.

Je veux juste append une autre raison possible de l’exception à celles énumérées ci-dessus (en particulier pour les personnes qui aiment définir le schéma de dataset manuellement):

lorsque dans votre jeu de données vous avez deux tables et qu’il existe une relation ( DataSet.Reletions.Add() ) définie entre le champ de la première table ( chfield ) et le champ de la deuxième table ( pfield ), une contrainte implicite est ajoutée à ce champ être unique, même s’il n’est pas explicitement spécifié comme tel dans votre définition, ni unique ni primaire.

Par conséquent, si vous avez des lignes avec des valeurs répétitives dans ce champ parent ( pfield ), vous obtiendrez également cette exception.

Dans mon cas, cette erreur a été provoquée par une taille de colonne de chaîne. Ce qui était étrange, c’est que lorsque j’ai exécuté exactement la même requête dans un outil différent, les valeurs répétées et les valeurs nulles n’existaient pas.

Ensuite, j’ai découvert que la taille d’une colonne de taille était de 50, donc lorsque j’ai appelé la méthode de remplissage, la valeur a été coupée en lançant cette exception.
Je clique sur la colonne et mets dans les propriétés la taille à 200 et l’erreur a disparu.

J’espère que cette aide

J’ai résolu ce problème en faisant le “subselect” comme ça:

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

Quand faites-le sur mysql, toutes les propriétés de collunms (unique, non nul …) seront effacées.