Je reçois l'erreur suivante d'une application Web VB NET écrite dans VS 2003, sur le framework 1.1. L'application Web s'exécute sur Windows Server 2000, IIS 5 et lit à partir d'une base de données SQL Server 2000 exécutée sur la même machine.Problème de contraintes mystérieuses avec SQL Server 2000
System.Data.ConstraintException: Echec de l'activation des contraintes. Un ou plusieurs lignes contiennent des valeurs non conformes aux contraintes non nulles, uniques ou à clé étrangère . à System.Data.DataSet.FailedEnableConstraints() à System.Data.DataSet.EnableConstraints() à System.Data.DataSet.set_EnforceConstraints (valeur booléenne ) à System.Data.DataTable.EndLoadData()
dataSet
à System.Data.Common.DbDataAdapter.FillFromReader (Object données, String srcTable, IDataReader datareader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, objet parentChapterValue) à System.Data.Common.DbDataAdapter.Fill (DataSet dataSet, String s rcTable, IDataReader datareader, Int32 startRecord, Int32 maxRecords) à System.Data.Common.DbDataAdapter.FillFromCommand (Object données, Int32 startRecord, Int32 maxRecords, String srcTable, commande IDbCommand, le comportement CommandBehavior ) au système .Data.Common.DbDataAdapter.Fill (DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, commande IDbCommand, le comportement CommandBehavior System.Data.Common.DbDataAdapter.Fill) à (jeu de données)
Le problème apparaît lorsque l'application Web est soumise à une charge élevée. Le système fonctionne correctement lorsque le volume est faible, mais lorsque le nombre de demandes devient élevé, le système commence à rejeter les demandes entrantes avec le message d'exception ci-dessus. Une fois que le problème apparaît, très peu de demandes parviennent à le faire et sont traitées normalement, environ 2 fois sur 30. La grande majorité des demandes échouent, jusqu'à ce qu'un redémarrage de SQL Server ou qu'une réinitialisation IIS soit effectuée. Le système commence alors à traiter les demandes normalement et, après un certain temps, il commence à émettre la même erreur.
L'erreur se produit lorsqu'un adaptateur de données exécute la méthode Fill() par rapport à une instruction SELECT pour remplir un ensemble de données fortement typé. Il semble que l'ensemble de données n'aime pas les données qui lui sont données et rejette cette exception. Cette erreur se produit sur diverses instructions SELECT, agissant sur des tables différentes.
J'ai régénéré l'ensemble de données et vérifié les contraintes pertinentes, ainsi que la table à partir de laquelle les données sont lues. La définition de l'ensemble de données et les données du tableau sont correctes.
Il est vrai que le matériel en cours d'exécution à la fois l'application Web et SQL Server 2000 est sérieusement dépassée, compte tenu du nombre de demandes entrantes qu'il reçoit actuellement. La quantité de RAM consommée par SQL Server est allouée dynamiquement et, aux heures de pointe, SQL Server peut consommer jusqu'à 2,8 Go sur un total de 3,5 Go sur le serveur. Au début, je soupçonnais une sorte de corruption d'index ou de base de données, mais après l'exécution de DBCC CHECKDB, aucune erreur n'a été détectée dans la base de données. Retour au début |Alors maintenant, je me demande si cette erreur est le résultat des limitations matérielles du système. Est-il possible que SQL Server gâche d'une manière ou d'une autre les données qu'il est censé transmettre à l'ensemble de données, entraînant une violation de contrainte due, disons, à une différence de type/longueur de données?
J'ai essayé d'accéder aux messages RowError des lignes de données dans les tables de jeux de données récupérées mais j'ai continué à obtenir des chaînes vides. Je sais que HasErrors = true pour les datatables en question. Je n'ai pas défini EnableConstraints = false et je ne veux pas le faire.
Merci d'avance.
Ray