MySqlDataReader: DataTable.De remplissage(lecteur) throws ConstraintException
J'ai deux tables orders
et orderdetails
tableau de commande (PK = id, index UNIQUE sur orderno)
|id|orderno|
| 1|1000 |
| 2|1001 |
table orderdetails (PK = id)
|id|orderid|item|qty|
| 1| 1|ABC | 3|
| 2| 1|XYZ | 4|
Maintenant, je veux interroger les données avec:
SELECT o.orderno, od.item, od.qty
FROM orders o
INNER JOIN orderdetails od SUR l'o.orderno = od.afin
qui retourne:
|orderno|item|qty|
|1000 |ABC | 3|
|1000 |XYZ | 4|
Cependant Si j'utilise le code suivant pour charger le résultat dans une DataTable il échoue:
var connectionString = "Server=localhost;Database=orders;Uid=root;";
var commandText = "SELECT o.orderno, od.item, od.qty" + Environment.NewLine +
"FROM orders o" + Environment.NewLine +
"INNER JOIN orderdetails od ON o.orderno = od.order";
var reader = MySqlHelper.ExecuteReader(connectionString, commandText);
var table = new DataTable("OrdersQuery");
table.Fill(reader); //throws ConstraintException
Le problème, c'est que
table.Constraints[0]
est un UniqueConstraints
sur le orderno colonne. Probablement parce que
reader.GetSchemaTable()
a un IsUnique=true
entrée pour orderno (ce qui est vrai dans la table de base, mais pas vrai pour la requête de jointure).
Encore pire, ça ne l'aide pas:
table.BeginLoadData(); //msdn docs claim that this should disable constraints
table.Load(reader);
table.EndLoadData();
Toutes les idées de comment résoudre ce problème?
StackTrace:
System.Data.ConstraintException Was Unhandled.
Message=Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
Source=System.Data
StackTrace:
bei System.Data.DataTable.EnableConstraints()
bei System.Data.DataTable.set_EnforceConstraints(Boolean value)
bei System.Data.DataTable.EndLoadData()
bei System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
bei System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
bei System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
bei System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
bei System.Data.DataTable.Load(IDataReader reader)
OriginalL'auteur Jürgen Steinblock | 2011-09-28
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème mais j'ai reçu il fixe à l'aide de la solution de contournement de ce post: http://bugs.mysql.com/bug.php?id=65065 (en bas):
OriginalL'auteur Chen
Je viens de comprendre, que
ne crée pas de contrainte, si j'ai déjà ajouté les colonnes.
Donc, je fixe à l'aide d'un joli petit méthode d'extension:
Utilisation:
OriginalL'auteur Jürgen Steinblock
Il est simple sale comment le résoudre - surround colonne dans la requête avec l'unique contrainte avec la fonction concat:
OriginalL'auteur MAM
J'ai eu la même erreur aujourd'hui et que vous souhaitez partager.Mon problème était une colonne avec un LONGTEXT type. Si je comprend LONGTEXT colonne dans ma requête et essayé de charger dataset sans préciser les noms de colonne exception a été levée. Basé sur SchlaWiener du code que j'ai réécrit le code comme suit et tout va bien maintenant.
OriginalL'auteur burki
MySQL permet à plusieurs valeurs null dans les index uniques. Cela provoque ConstraintException remplir. Comment résoudre: trouver cette contrainte dans la table.Les contraintes de la liste et supprimez ou désactivez toutes les contraintes.
table.Load()
méthode crée une Contrainte sur Orderno car le lecteur.GetSchemaTable() aIsUnique
= true pour la Orderno colonne, ce qui est mauvais pour une requête de Jointure.Essayez d'effacer les contraintes sur FillError événement.
J'ai pensé à ça aussi. Mais si j'utilise la surcharge qui accepte un FillError délégué, il n'a pas d'incendie. Ne peux pas dire pourquoi, parce que c'est ce que je devrais attendre.
OriginalL'auteur Devart
J'ai eu un problème similaire avec les requêtes, lors du chargement de la Datatable () avec MYSQL Reader d'erreur générés par le NON-NULL, UNIQUE ou de CLÉ ÉTRANGÈRE.
À la fin, je l'ai résolu en changeant la base de données MySQL Connector.NET version.
https://dev.mysql.com/downloads/connector/net/
OriginalL'auteur Jean Paul Beard