Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Multi Table dans un dataset avec la méthode Fill.

1 réponse
Avatar
Dev Pérégrin
Bonjour tout le monde,
Une petite réflexion sur les DataSet avec plusieurs tables, je pense que je
ne sais pas faire. J'ai créé un schéma xsd à partir d'une connexion sur un
serveur. Le problème est que quand je déclenche grâce à un DataAdaptater la
méthose Fill, une erreur :

"Informations supplémentaires : Impossible d'activer les contraintes. Une ou
plusieurs lignes contiennent des valeurs qui violent les contraintes de type
non null, unique ou de clé externe."

Voici pour vous aider le schema Order.xsd (suivi du code source et de la
procedure).

<?xml version="1.0" encoding="utf-8" ?>

<xs:schema id="Order" targetNamespace="http://tempuri.org/Order.xsd"
elementFormDefault="qualified"

attributeFormDefault="qualified" xmlns="http://tempuri.org/Order.xsd"
xmlns:mstns="http://tempuri.org/Order.xsd"

xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xs:element name="Order" msdata:IsDataSet="true">

<xs:complexType>

<xs:choice maxOccurs="unbounded">

<xs:element name="ORDER">

<xs:complexType>

<xs:sequence>

<xs:element name="idORDER" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />

<xs:element name="numORDER" type="xs:string" />

<xs:element name="datCre" type="xs:dateTime" minOccurs="0" />

<xs:element name="nom" type="xs:string" minOccurs="0" />

<xs:element name="prenom" type="xs:string" minOccurs="0" />

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="DOCUMENT">

<xs:complexType>

<xs:sequence>

<xs:element name="idDOCUMENT" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />

<xs:element name="idORDER" type="xs:int" />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:choice>

</xs:complexType>

<xs:unique name="OrderKey1" msdata:PrimaryKey="true">

<xs:selector xpath=".//mstns:ORDER" />

<xs:field xpath="mstns:idORDER" />

</xs:unique>

<xs:unique name="OrderKey2" msdata:PrimaryKey="true">

<xs:selector xpath=".//mstns:DOCUMENT" />

<xs:field xpath="mstns:idDOCUMENT" />

</xs:unique>

<xs:keyref name="ORDERDOCUMENT" refer="OrderKey1"
msdata:ConstraintOnly="true" msdata:UpdateRule="None">

<xs:selector xpath=".//mstns:DOCUMENT" />

<xs:field xpath="mstns:idORDER" />

</xs:keyref>

</xs:element>

</xs:schema>


Le code source :
Order dtsOrder = new Order();

_sqldtOrder.Fill(dtsOrder,"ORDER");

et la procédure de la BD:

CREATE Procedure GETORDER AS

SELECT ORDER.idORDER,
ORDER.numORDER,
ORDER.datCre,
ORDER.nom,
ORDER.prenom,
DOCUMENT.idDOCUMENT,
DOCUMENT.idORDER
FROM ORDER INNER JOIN DOCUMENT ON ORDER.idORDER = DOCUMENT.idORDER
-------------------------------------------------

GO






Merci de vos réponses...

1 réponse

Avatar
Pierre [SELF-INFORMATIQUE]
Bonjour,

Ce type d'erreur est effectivement générée lorsqu'au moment de remplir les
tables d'un DataSet, les contraintes de clé étrangères ne sont pas
respectées :

On peut observer 2 Pistes :
1°) Vérifier que les données chargées respectes ces contraintes dans la
source de données (apparemment c'est le cas), il faut faire attention
aux lignes enfants avec les colonnes de clé étrangère vide : ces colonnes
doivent être <null> et non " ".

2°) Si tu est sûr de tes données sources alors il faut :
- soit charger les tables en respectant l'ordre des contraintes.
- soit désactiver le contrôle des contraintes avant chargement
(propriété "EnforceConstraints" du dataset à false) et les réactiver après
chargement (... à true) de toutes les tables.

De toute façon cette 2ème solution ne fonctionnera que si les
contraintes d'intégrité des données chargées sont respectées.

@+



"Dev Pérégrin" a écrit dans le
message de news:
Bonjour tout le monde,
Une petite réflexion sur les DataSet avec plusieurs tables, je pense que


je
ne sais pas faire. J'ai créé un schéma xsd à partir d'une connexion sur un
serveur. Le problème est que quand je déclenche grâce à un DataAdaptater


la
méthose Fill, une erreur :

"Informations supplémentaires : Impossible d'activer les contraintes. Une


ou
plusieurs lignes contiennent des valeurs qui violent les contraintes de


type
non null, unique ou de clé externe."

Voici pour vous aider le schema Order.xsd (suivi du code source et de la
procedure).

<?xml version="1.0" encoding="utf-8" ?>

<xs:schema id="Order" targetNamespace="http://tempuri.org/Order.xsd"
elementFormDefault="qualified"

attributeFormDefault="qualified" xmlns="http://tempuri.org/Order.xsd"
xmlns:mstns="http://tempuri.org/Order.xsd"

xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

<xs:element name="Order" msdata:IsDataSet="true">

<xs:complexType>

<xs:choice maxOccurs="unbounded">

<xs:element name="ORDER">

<xs:complexType>

<xs:sequence>

<xs:element name="idORDER" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />

<xs:element name="numORDER" type="xs:string" />

<xs:element name="datCre" type="xs:dateTime" minOccurs="0" />

<xs:element name="nom" type="xs:string" minOccurs="0" />

<xs:element name="prenom" type="xs:string" minOccurs="0" />

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="DOCUMENT">

<xs:complexType>

<xs:sequence>

<xs:element name="idDOCUMENT" msdata:ReadOnly="true"
msdata:AutoIncrement="true" type="xs:int" />

<xs:element name="idORDER" type="xs:int" />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:choice>

</xs:complexType>

<xs:unique name="OrderKey1" msdata:PrimaryKey="true">

<xs:selector xpath=".//mstns:ORDER" />

<xs:field xpath="mstns:idORDER" />

</xs:unique>

<xs:unique name="OrderKey2" msdata:PrimaryKey="true">

<xs:selector xpath=".//mstns:DOCUMENT" />

<xs:field xpath="mstns:idDOCUMENT" />

</xs:unique>

<xs:keyref name="ORDERDOCUMENT" refer="OrderKey1"
msdata:ConstraintOnly="true" msdata:UpdateRule="None">

<xs:selector xpath=".//mstns:DOCUMENT" />

<xs:field xpath="mstns:idORDER" />

</xs:keyref>

</xs:element>

</xs:schema>


Le code source :
Order dtsOrder = new Order();

_sqldtOrder.Fill(dtsOrder,"ORDER");

et la procédure de la BD:

CREATE Procedure GETORDER AS

SELECT ORDER.idORDER,
ORDER.numORDER,
ORDER.datCre,
ORDER.nom,
ORDER.prenom,
DOCUMENT.idDOCUMENT,
DOCUMENT.idORDER
FROM ORDER INNER JOIN DOCUMENT ON ORDER.idORDER = DOCUMENT.idORDER
-------------------------------------------------

GO






Merci de vos réponses...