IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.NET] Comment charger un XML dans une table SQL via VB (ou C#)


Sujet :

VB.NET

  1. #1
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut [VB.NET] Comment charger un XML dans une table SQL via VB (ou C#)
    Bonjour,

    Comme le titre l'indique, je veux charger une table d'SQL Server à partir des données contenues dans un XML via un programme VB.NET ou C#.
    J'ai fait quelques recherches sur internet, mais je ne trouve pas vraiment comment faire (surtout pour la deuxième partie : le transfert à SQL ) sinon pour parser le fichier j'y suis arrivé.

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Il faudrait déjà que tu spécifies comment tu as rapatrié le XML... je suppose que c'est dans un datatable...
    Si c'est le cas, il te suffit de faire une boucle sur toutes les lignes de ton datatable et à chaque itération de faire une requête insert...

    Bref il faudrait que tu précises pour que l'on puisse mieux t'aider...

  3. #3
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Merci Sankassss,

    Avec Xpath, je récupère mes données, mais ça c'est un autre problème, je n'arrive pas à tout récuperer d'un seul coup , je veux dire les Values des Nodes. (avec une requête Xpath ".//" j'ai pas toutes les Nodes de tout les contextes) .Pour charger toutes les valeurs dans un DataTable je ne procède pas correctement apparemment et ta solution m'intéresse. m'enfin, c'est en fait cela que je cherche dans un premier temps.
    Si j'y arrive tu peux me rejoindre quelque part à la gare du Nord, et je te paierais un Durum au alentours! sinon des moulles-frittes?? c'est comme tu veux ! mais tout d'abord remplir la table par le XML

  4. #4
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    pour l'insert dans la BD comme l'a dit Sankasssss tu doit bouclé sur les données du XML et les transférer dans la BD. En fait tes deux problème sont intimement lie parceque pour récupérer les données tu est obliger de passer par XPath et ce sont les données récupère par Xpath qui serons insérer dans la BD donc tant que tu ne peut pas les récupérer en entier tu ne peut pas faire l'insert en entier sauf si tu enregistrer tout le fichier XML dans une colonne de type XML de la BD.

    @++

  5. #5
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    [EDIT] je ne connais pas XPath, j'ai fait quelque recherche mais j'ai pas le temps de continuer la, je verrai ca demain [/EDIT]
    [REEDIT]J'ai cherché sur XPath et ca ne change rien au problème, tout dépend du shéma de ton XML...
    Post nous donc un exemple de XML à parser et un bout de code de ce que tu as déjà fait qu'on puisse t'aiguiller...[/REEDIT]

    pour la lecture du fichier XML, tout dépend de ca structure, si elle le permet, le moyen le plus simple est la méthode readXML du dataset.
    Voici un tuto qui en parle : http://selkis.developpez.com/tutoriels/dotnet/Xmlpart1/
    Une fois que tu sais parcourir ton fichier XML comme un tableau il n'est plus difficile de faire une boucle pour monter la BD.

    Les questions à ce poser sont donc :
    - est-ce que le shéma du fichier XML permet de faire la chose?
    - est-ce que tu as une table qui permet d'accueillir les données dans ta BD? Si non il faudra la créé dynamiquement (pas compliquer a faire...)

    Bref montre un exemple de shéma de ton XML...

    P.S. : Tu essayes de me soudoyer avec un durum, mmmmmmm tu me tentes là mais plutôt vers gare de l'ouest (moins loin après le boulot...)
    Non je rigole c'est toujours de bon cœur que l'on aide

  6. #6
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Bonjour,

    Voici mon fichier XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    <?xml version="1.0"?>
    <ASREQUEST_CIC_ASC>
      <AS_REQUEST>
    <ASREQUEST_INFO>
        <COMPANY>ABC123</COMPANY>
        <JOB_NO>111111</JOB_NO>
        <ASC_CODE>000001</ASC_CODE>
        <PRODUCT>
          <PRODUCTSHORT>
            <MODEL_CODE>AS-111</MODEL_CODE>
            <SERIAL_NO>A000B111</SERIAL_NO>
            <PURCHASE_DATE>19840413</PURCHASE_DATE>
          </PRODUCTSHORT>
          <SYMPTOM>
            <SYMPTOM1_DESC></SYMPTOM1_DESC>
            <SYMPTOM2_DESC></SYMPTOM2_DESC>
            <SYMPTOM3_DESC></SYMPTOM3_DESC>
          </SYMPTOM>
        </PRODUCT>
        <SERVICE>
          <SERVICE_TYPE></SERVICE_TYPE>
          <SERVICE_TYPE_DESC></SERVICE_TYPE_DESC>
        </SERVICE>
        <IN_OUT_WARRANTY></IN_OUT_WARRANTY>
        <REQUEST_DATE></REQUEST_DATE>
        <REQUEST_TIME></REQUEST_TIME>
        <REPAIR_ETD_DATE></REPAIR_ETD_DATE>
        <REPAIR_ETD_TIME></REPAIR_ETD_TIME>
        <TRACKING>
          <TR_STATUS></TR_STATUS>
          <TR_STATUS_DESC></TR_STATUS_DESC>
        </TRACKING>
        <TRREASON>
          <TR_REASON></TR_REASON>
          <TR_REASON_DESC></TR_REASON_DESC>
        </TRREASON>
        <INQUIRY_TEXT></INQUIRY_TEXT>
        <REF_NO></REF_NO>
    </ASREQUEST_INFO>
    <CONSUMER_INFO>
        <BP_NO>EMPTY</BP_NO>
        <CUSTNAME>
          <TITLE></TITLE>
          <FIRST_NAME></FIRST_NAME>
          <LAST_NAME></LAST_NAME>
        </CUSTNAME>
        <PHONE>
          <TEL_NUMBER1></TEL_NUMBER1>
          <TEL_NUMBER2></TEL_NUMBER2>
          <TEL_NUMBER3></TEL_NUMBER3>
          <FAX_NUMBER></FAX_NUMBER>
          <E_MAIL></E_MAIL>
        </PHONE>
        <ADDRESS>
          <ADDRESS_NUMBER></ADDRESS_NUMBER>
          <COUNTRY></COUNTRY>
          <REGION></REGION>
          <POST_CODE></POST_CODE>
          <CITY></CITY>
          <STREET></STREET>
          <HOUSE_NUMBER></HOUSE_NUMBER>
          <ROOM_NUMBER></ROOM_NUMBER>
          <FLOOR></FLOOR>
        </ADDRESS>
    </CONSUMER_INFO>
    <DEALER_INFO>
        <BP_NO>EMPTY</BP_NO>
        <CUSTNAME>
          <TITLE></TITLE>
          <FIRST_NAME></FIRST_NAME>
          <LAST_NAME></LAST_NAME>
        </CUSTNAME>
        <PHONE>
          <TEL_NUMBER1></TEL_NUMBER1>
          <TEL_NUMBER2></TEL_NUMBER2>
          <TEL_NUMBER3></TEL_NUMBER3>
          <FAX_NUMBER></FAX_NUMBER>
          <E_MAIL></E_MAIL>
        </PHONE>
        <ADDRESS>
          <ADDRESS_NUMBER></ADDRESS_NUMBER>
          <COUNTRY></COUNTRY>
          <REGION></REGION>
          <POST_CODE></POST_CODE>
          <CITY></CITY>
          <STREET></STREET>
          <HOUSE_NUMBER></HOUSE_NUMBER>
          <ROOM_NUMBER></ROOM_NUMBER>
          <FLOOR></FLOOR>
        </ADDRESS>
    </DEALER_INFO>
      </AS_REQUEST>
      <AS_REQUEST>
    <ASREQUEST_INFO>
        <COMPANY>EFG456</COMPANY>
        <JOB_NO>222222</JOB_NO>
        <ASC_CODE>000002</ASC_CODE>
        <PRODUCT>	
          <PRODUCTSHORT>
            <MODEL_CODE>AS-222</MODEL_CODE>
            <SERIAL_NO>A000B222</SERIAL_NO>
            <PURCHASE_DATE>19840414</PURCHASE_DATE>
          </PRODUCTSHORT>
          <SYMPTOM>
            <SYMPTOM1_DESC></SYMPTOM1_DESC>
            <SYMPTOM2_DESC></SYMPTOM2_DESC>
            <SYMPTOM3_DESC></SYMPTOM3_DESC>
          </SYMPTOM>
        </PRODUCT>
        <SERVICE>
          <SERVICE_TYPE></SERVICE_TYPE>
          <SERVICE_TYPE_DESC></SERVICE_TYPE_DESC>
        </SERVICE>
        <IN_OUT_WARRANTY></IN_OUT_WARRANTY>
        <REQUEST_DATE></REQUEST_DATE>
        <REQUEST_TIME></REQUEST_TIME>
        <REPAIR_ETD_DATE></REPAIR_ETD_DATE>
        <REPAIR_ETD_TIME></REPAIR_ETD_TIME>
        <TRACKING>
          <TR_STATUS></TR_STATUS>
          <TR_STATUS_DESC></TR_STATUS_DESC>
        </TRACKING>
        <TRREASON>
          <TR_REASON></TR_REASON>
          <TR_REASON_DESC></TR_REASON_DESC>
        </TRREASON>
        <INQUIRY_TEXT></INQUIRY_TEXT>
        <REF_NO></REF_NO>
    </ASREQUEST_INFO>
    <CONSUMER_INFO>
        <BP_NO>EMPTY</BP_NO>
        <CUSTNAME>
          <TITLE></TITLE>
          <FIRST_NAME></FIRST_NAME>
          <LAST_NAME></LAST_NAME>
        </CUSTNAME>
        <PHONE>
          <TEL_NUMBER1></TEL_NUMBER1>
          <TEL_NUMBER2></TEL_NUMBER2>
          <TEL_NUMBER3></TEL_NUMBER3>
          <FAX_NUMBER></FAX_NUMBER>
          <E_MAIL></E_MAIL>
        </PHONE>
        <ADDRESS>
          <ADDRESS_NUMBER></ADDRESS_NUMBER>
          <COUNTRY></COUNTRY>
          <REGION></REGION>
          <POST_CODE></POST_CODE>
          <CITY></CITY>
          <STREET></STREET>
          <HOUSE_NUMBER></HOUSE_NUMBER>
          <ROOM_NUMBER></ROOM_NUMBER>
          <FLOOR></FLOOR>
        </ADDRESS>
    </CONSUMER_INFO>
    <DEALER_INFO>
        <BP_NO>EMPTY</BP_NO>
        <CUSTNAME>
          <TITLE></TITLE>
          <FIRST_NAME></FIRST_NAME>
          <LAST_NAME></LAST_NAME>
        </CUSTNAME>
        <PHONE>
          <TEL_NUMBER1></TEL_NUMBER1>
          <TEL_NUMBER2></TEL_NUMBER2>
          <TEL_NUMBER3></TEL_NUMBER3>
          <FAX_NUMBER></FAX_NUMBER>
          <E_MAIL></E_MAIL>
        </PHONE>
        <ADDRESS>
          <ADDRESS_NUMBER></ADDRESS_NUMBER>
          <COUNTRY></COUNTRY>
          <REGION></REGION>
          <POST_CODE></POST_CODE>
          <CITY></CITY>
          <STREET></STREET>
          <HOUSE_NUMBER></HOUSE_NUMBER>
          <ROOM_NUMBER></ROOM_NUMBER>
          <FLOOR></FLOOR>
        </ADDRESS>
    </DEALER_INFO>
      </AS_REQUEST>
    </ASREQUEST_CIC_ASC>
    Donc voilà, je veux extraire les données et les mettre dans une table SQL (ses champs correspondent à ceux du fichier XML).

    Question shèma du fichier, je ne vois pas bien c'est quoi. sinon qu'est ce que ca veut dire quand ont trouve un certain <xsd : ...> dans du code XML ?

    J'ai en fait "tout" essayer pour charger le XML et le parser, j'ai essayé la classe XPathDocument, XMLDocument, XmlTextReader, XMLReadSetting, XMLDataDocument! toutes les classes du Framework quoi !!! mais tjrs sans le résultat voulu.

    Quelque chose qui donne comme résultat (l'apparence) qui ressemble un petit peu à ce que je cherche est la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Dim xmlDatadoc As New XmlDataDocument()
            xmlDatadoc.DataSet.ReadXml("C:\test_1.xml")
            Dim ds As New DataSet("ds_test")
            ds = xmlDatadoc.DataSet
            frmXmlTest.DataGridView1.DataSource = ds.DefaultViewManager
            frmXmlTest.DataGridView1.DataMember = "ASREQUEST_INFO"
            frmXmlTest.Show()
    Le problème c'est que je dois spécifier à chaque fois le Node parent pour récupérer les infos de l'arborescente

    Merci

    @sankasssss : baah non que je veux pas de soudoyer avec un durum ! C'est de l'humouuur ! sinon si t alérgique au nord je t'ofrirais ton bon durum bien chaud au congres si c ca ta gare de l'ouest ! m'enfin, je rigole aussi (cela n'empêche pas de le faire réélement tu sais )

  7. #7
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    XSD : Xml Schema Définition.

    Un schéma XML décrit la structure d'un document XML, ainsi que diverses contraintes agissant sur les données du document. Lorsque vous spécifiez des requêtes XPath à exécuter dans le schéma, la structure du document XML retournée est déterminée par le schéma dans lequel la requête XPath est exécutée.

    Dans un schéma XSD, l'élément <xsd:schema> englobe le schéma entier ; toutes les déclarations d'éléments doivent être contenues dans l'élément <xsd:schema>. Vous pouvez décrire des attributs qui définissent l'espace de noms dans lequel le schéma réside et les espaces de noms utilisés dans le schéma comme propriétés de l'élément <xsd:schema>.
    Source : http://msdn.microsoft.com/fr-fr/library/ms171870.aspx

    En fait le code que tu a fait charge tout ton fichier XML dans le DataSet, chaque nœud créer un DataTable dans le DataSet a savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ASREQUEST_INFO></ASREQUEST_INFO> , <CONSUMER_INFO>
    </CONSUMER_INFO>...
    Hors le DGV n'affiche pas le contenu du DataSet mais le contenu d'un DataTable .

    @++

  8. #8
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Merci Lilroma,

    pour la xsd , j'ai déjà lu la définition sur msdn mais cela restait tjrs pas très claire pour moi (ce sont mes premières manipulations de XML en .NET).

  9. #9
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Citation Envoyé par tssi555 Voir le message
    Merci Lilroma,

    pour la xsd , j'ai déjà lu la définition sur msdn mais cela restait tjrs pas très claire pour moi (ce sont mes premières manipulations de XML en .NET).
    Normal n'importe qui n'ayant jamais fait XML se retrouvant subitement a traiter un fichier XML lue depuis un WebService avec une structure Bizarre donc il ne connais même pas le schéma du XML serais un peu confus comme toi.

    @++

  10. #10
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Faut que je donne le Schéma XSD de mon fichier XML ? ca sera plus facile ? je pense qu'il est fournit avec le fichier XML cité çi-dessus.

  11. #11
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    sur ce genre de donnée XML on ne sais directement le fichier dans un dataSet car il est mal formé pour celà, visualStudio te le dit directement si tu essayes en mode conception :
    Citation Envoyé par VisualStudio
    Bien que ce document XML soit correctement construit, il contient une structure impossible à afficher en mode Données.
    La même table (CUSTNAME) ne peut pas être table enfant dans deux relations imbriquées.
    Je cherche après une solution après manger...

  12. #12
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    D'après l'étude de ton fichier XML et surtout de sa structure, la seul technique est bien de parcourir le XML avec XPath.
    Je vais voir sur ce langage de requête pour voir comment l'appliquer ici...
    Mais il y a dors et déjà une question que je me pose, quelle sont les tables que tu as faites pour accueillir les données?
    Je m'explique, dans ASREQUEST_INFO tu as PRODUCT qui contient PRODUCTSHORT qui contient à sont tour les trois noeuds : MODEL_CODE, SERIAL_NO et PURCHASE_DATE.
    Or on peut imaginer que ces trois dernier noeud seront des données unique à ton ASREQUEST_INFO.
    Ce qui en va de même pour ASREQUEST_INFO RODUCT : SYMPTOM et ces champs SYMPTOM1_DESC, SYMPTOM1_DESC et SYMPTOM1_DESC.
    donc si ces données sont bien unique, donc si la structure de AS_REQUEST ne change pas.
    On pourrait imaginer ne faire qu'une seul table AS_REQUEST avec un tat d'attribut...
    tu me suis??? (je sais pas si je suis claire ^^)

  13. #13
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Salut,

    En fait pour "les tables", y'onna qu'une énorme, qui va accuillir les informations contenue dans les nodes enfants.
    En fait , on a crééer une grosse table dans SQL en partant du principe de récupèrer "le dernier" contenu de l'arbre XML pour chaque noeud parent.
    Je m'explique.
    Par exemple : dans la table, on a pas préciser de ASREQUEST_INFO ou PRODUCT en tant que tel mais les informations contenu dans les balises contenu elles mêmes dans ces soit disant "balises parents".
    Donc, pour ASREQUEST_INFO on a créer dans la table les champs suivant :
    - COMPANY
    - JOBNO

    Et pour PRODUCT :
    - Modele
    - Serial
    - Date

    Puis pour SYMPTOM :
    - Symptom1
    - Symptom2
    - Symptom3

    et ainsi de suite pour tout le fichier,
    Tu vois ?

    Sinon voiçi le schema (xsd) du fichier :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<xsd:element name="ASC_JOB_REQUEST">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element ref="JOB_REQUEST" maxOccurs="unbounded"/>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    	<xsd:element name="JOB_REQUEST">
    		<xsd:complexType>
    			<xsd:sequence>
    				<xsd:element name="COMPANY">
    					<xsd:simpleType>
    						<xsd:restriction base="xsd:string">
    							<xsd:maxLength value="4"/>
    							<xsd:pattern value="C[A-Z,0-9 {3}"/>
    						</xsd:restriction>
    					</xsd:simpleType>
    				</xsd:element>
    				<xsd:element name="JOB_TYPE">
    <xsd:simpleType>
    						<xsd:restriction base="xsd:string">
    							<xsd:enumeration  value="SRA"/>
    							<xsd:enumeration value="SHA"/>
    							<xsd:enumeration value="DSA"/>
    							<xsd:enumeration value="SRR"/>
    							<xsd:enumeration value="SHR"/>
    							<xsd:enumeration value="RKA"/>
    						</xsd:restriction>
    					</xsd:simpleType>
    				</xsd:element>
    				<xsd:element name="REQUESTER">
    					<xsd:simpleType>
    						<xsd:restriction base="xsd:string">
    							<xsd:maxLength value="10"/>
    						</xsd:restriction>
    					</xsd:simpleType>
    				</xsd:element>
    				<xsd:element name="TR_NO">
    					<xsd:simpleType>
    						<xsd:restriction base="xsd:string">
    							<xsd:maxLength value="10"/>
    						</xsd:restriction>
    					</xsd:simpleType>
    		</xsd:element>
    				<xsd:element name="JOB_NO">
    					<xsd:simpleType>
    						<xsd:restriction base="xsd:string">
    							<xsd:maxLength value="30"/>
    						</xsd:restriction>
    					</xsd:simpleType>
    				</xsd:element>
    			</xsd:sequence>
    		</xsd:complexType>
    	</xsd:element>
    </xsd:schema>

    la seul technique est bien de parcourir le XML avec XPath.
    Et l'outil SSIS ne fera pas l'affaire? il a l'air, mais je ne trouve pas le Business Intelligence Project au niveau de l'arbre C#, C++, Autres projets... quand on crée un nouveau projet .

    C'est quand même courant d'injecter les données d'un XML dans une base de données non ? personne ne s'est jamais mis face à un cas pareil ?

  14. #14
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Je doute que le shema ci-haut soit celui du fichier XML que tu a posté , ci oui ce qu'il est incomplet.

    Et l'outil SSIS ne fera pas l'affaire?
    J'en doute.

    il a l'air, mais je ne trouve pas le Business Intelligence Project au niveau de l'arbre C#, C++, Autres projets... quand on crée un nouveau projet .
    Moi non plus dans mon arborescence je n'ai pas le modèle Business Intelligence Project sinon les modèles de projet sont stocke dans documents and setting/templace si tu l'avais et que tu ne l'a plus ce que l'on a supprimer le modelé, mais y'a toujours la possibilité de créer un nouveau modèle.

    C'est quand même courant d'injecter les données d'un XML dans une base de données non ? personne ne s'est jamais mis face à un cas pareil ?
    Oui c'est courant et c'est pas la chose la plus difficile qui soit avec une BD SQL il y'a deux possibilité.

    - Soit tu boucle sur le fichier et tu récupère tes données notamment avec Xpath, données que tu peut exploiter comme tu veut soit en les affichant soit en sauvegardant dans la BD.
    Pour ce cas vue la structure de ton fichier tu est obliger de passer par plus d'une requete Xpath donc comme je l'avais proposer dans ton poste procedant, malgré la volumétrie de ta table en terme de colonne le mieux a faire c'est de prendre un stylo et du papier observer la structure de ton fichier et les données attendu par la BD et écrire un algorithme avec les différentes instructions Xpath qu'il te faut pour récupérer ces données. Tache hargneuse mais je crois que tu est obliger de le faire ainsi et des lors que tu a déja fait le script pour lire un noeud le reste ne sera que du copier coller avec quelque modification .

    - Seconde possibilité utiliser la colonne de type XML de Sql Server. Pour ce cas chaque fois que tu a un fichier XML tu le stocke directement en entier dans cette colonne. et pour la récupération des données avec une requête XQuery tu récupère la données donc tu a besoin.

    @++

  15. #15
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par tssi555
    C'est quand même courant d'injecter les données d'un XML dans une base de données non ? personne ne s'est jamais mis face à un cas pareil ?
    Si mais pour ma part les deux seul fois ou j'ai du le faire mes fichiers XML était bien fait et pouvait être directement mit dans des dataTable avec la méthode readXml mais ton cas est plus complexe mais loin d'être désespéré

    Citation Envoyé par lilroma Voir le message
    Pour ce cas vue la structure de ton fichier tu est obliger de passer par plus d'une requete Xpath donc comme je l'avais proposer dans ton poste procedant
    Je pense que c'est aussi une des meilleurs solutions...

    Citation Envoyé par lilroma Voir le message
    , malgré la volumétrie de ta table en terme de colonne le mieux a faire c'est de prendre un stylo et du papier observer la structure de ton fichier et les données attendu par la BD et écrire un algorithme avec les différentes instructions Xpath qu'il te faut pour récupérer ces données. Tache hargneuse mais je crois que tu est obliger de le faire ainsi et des lors que tu a déja fait le script pour lire un noeud le reste ne sera que du copier coller avec quelque modification .
    La tache hargneuse sera en éffet de faire la correspondance entre le nom des noeud et celui de la table...

    L'idée devrait être de faire un premier navigateur qui ce chargera d'aller itéré chaque AS_REQUEST qui correspond donc à chaque fois à une ligne de ta table.
    Dans cette itérateur, on peut imaginer un deuxième itérateur qui lui va parcourir tous les noeuds en créant la requête.
    Pour le peux que j'en ai lu sur Xpath j'ai vu qu'il y a moyen de récupérer le nom du noeud et sa valeur (logique, bien heureusement) dès lors il te suffit d'une table de correspondance pour savoir quelle noeud va dans quel champ de la BD.
    Donc on aurait une variable de type String pour le début de l'insert que l'on initialiserait avec : "Insert into maTable("
    une deuxième que l'on initialiserais avec : "values("
    et à chaque fois que l'on trouverait un noeud, on metterais la correspondant (via la table) du nom de la colonne via le nom du noeud suivie d'une virgule et dans la deuxième chaine on concatènerais des ? pour la requête paramétrée et enfin on ajouterait le paramètre (création et assignation, d'ailleurs à ce propos il faudrait aussi une table de correspondance pour le type de paramètre suivant le nom du noeud...)
    quand tu arrives à la fin du parcours de tout les noeuds et avec de passer à l'autre ligne de ta BD tu concatènes les deux string pour créé ta requete que tu mets dans ta commande, puis tu l'executes...
    Le cycle recommencera pour toutes les lignes...
    Bref le code peut être très simple en faire ce sera deux itération l'une dans l'autre, l'itéraition des éléments AS_REQUEST suivie de l'itération de ces noeud, le tout avec deux tables de correspondance, une nom de noeud vs nom de colonne et l'autre nom de noeud vs type de données
    J'espère que je suis claire, si tu as un doute, dis le moi


    EDIT :
    J'oublie toujours que je suis dans un cas particulier mais qu'en générale dans les requête paramétrées c'est des @ avec un nom qu'on doit mettre comme paramètre pas comme moi ou des ? suffise
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "insert into maTable values(@param1, @param2)"
    équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "insert into maTable values(?, ?)"
    il suffit d'adapter à ton cas...

  16. #16
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    Bonjour,

    je me mords encore les doigts pour inserer les données du fichier XML dans la table de base de données, je pensais faire une petite avancée en chargeant le Xml dans un dataset , puis parcourir ce dernier en inserant les valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
            Dim command As SqlCommand
            Dim adpter As New SqlDataAdapter
            Dim ds_xml As New DataSet
            Dim xmlFile As XmlReader
            Dim sql As String
            Dim JOB_NO As Integer
            Dim MODEL_CODE As String
            Dim SERIAL_NO As String
     
            xmlFile = XmlReader.Create("c:\test_1.xml", New XmlReaderSettings())
            ds_xml.ReadXml(xmlFile)
            Dim i As Integer
     
            For i = 0 To ds_xml.Tables(0).Rows.Count - 1
                JOB_NO = Convert.ToInt32(ds_xml.Tables(0).Rows(i).Item("JOB_NO"))
                MODEL_CODE = Convert.ToString(ds_xml.Tables(0).Rows(i).Item("MODEL_CODE"))
                SERIAL_NO = Convert.ToString(ds_xml.Tables(0).Rows(i).Item("SERIAL_NO"))
                sql = "INSERT INTO t_importXml VALUES(" & JOB_NO & ",'" & MODEL_CODE & "','" & SERIAL_NO & "')"
                command = New SqlCommand(sql, cnx)
                adpter.InsertCommand = command
                adpter.InsertCommand.ExecuteNonQuery()
            Next
    Mais j'ai l'erreur suivante :

    La colonne 'JOB_NO' n'appartient pas à la table AS_REQUEST.
    Je fais l'insertion que des trois champs seulement pour le test.

    qq1 a une idée ?

  17. #17
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Pour éviter de tel erreur a la place des noms des colonnes utilise plutôt les index de colonne.

    @++

  18. #18
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut
    C'est la premiere solution que j'ai fait (avec les index) , et toujours j'ai l'erreur : impossible de trouver la colonne 1 !
    Donc, pour être plus précis, et spécifier que je veux pour tel champ je veux telle valeur, j'ai procéder ainsi .

  19. #19
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Comme dit dans les post précédent :
    Citation Envoyé par Sankasssss
    Citation Envoyé par tssi555
    C'est quand même courant d'injecter les données d'un XML dans une base de données non ? personne ne s'est jamais mis face à un cas pareil ?
    Si mais pour ma part les deux seul fois ou j'ai du le faire mes fichiers XML était bien fait et pouvait être directement mit dans des dataTable avec la méthode readXml mais ton cas est plus complexe mais loin d'être désespéré

    Citation Envoyé par lilroma Voir le message
    Pour ce cas vue la structure de ton fichier tu est obliger de passer par plus d'une requete Xpath donc comme je l'avais proposer dans ton poste procedant
    Je pense que c'est aussi une des meilleurs solutions...
    Car si tu mets ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Dim dt As New DataSet
            dt.ReadXml("c:\XMLFile1.xml")
            DataGrid1.DataSource = dt
    tu peux voir dans la datagrid view (voir le fichier joint) que le fichier XML n'est pas chargé correctement, ils créent plusieurs tables et fait des lien entre elles mais malheureusement toutes les données ne figure pas dans la table car il a du mal a charger ton dataset qui n'est pas formater pour ca :
    Citation Envoyé par Sankasssss Voir le message
    sur ce genre de donnée XML on ne sais directement le fichier dans un dataSet car il est mal formé pour celà, visualStudio te le dit directement si tu essayes en mode conception :
    Citation Envoyé par VisualStudio
    Bien que ce document XML soit correctement construit, il contient une structure impossible à afficher en mode Données.
    La même table (CUSTNAME) ne peut pas être table enfant dans deux relations imbriquées.
    Je cherche après une solution après manger...
    Donc il te faudra passer par une autre solution que readXml, comme XPath...

    EDIT :
    Voici un exemple de fichier XML correctement formaté pour readXML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     <lstSite>  
          <SITE> 
                <URL>http://www.peuw.net/index.xml</URL> 
                <NOM>peuw.net</NOM> 
          </SITE> 
          <SITE> 
                <URL>http://www.poxx.net/index.xml</URL> 
                <NOM>poxx - Science Fair</NOM> 
          </SITE>
    </lstSite>
    il contient deux lignes et deux colonnes URL et NOM
    Images attachées Images attachées  

  20. #20
    Membre actif Avatar de tssi555
    Analyse système
    Inscrit en
    Juillet 2008
    Messages
    594
    Détails du profil
    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2008
    Messages : 594
    Points : 295
    Points
    295
    Par défaut Enfin !
    @Lilroma :
    - Soit tu boucle sur le fichier et tu récupère tes données notamment avec Xpath...

    - Seconde possibilité utiliser la colonne de type XML de Sql Server. Pour ce cas chaque fois que tu a un fichier XML tu le stocke directement en entier dans cette colonne. et pour la récupération des données avec une requête XQuery tu récupère la données donc tu a besoin.
    Je ne vois pas du tout l'utilité de Xpath quand on est en Framework 3.5 ! Xpath ou Xquery dans mon cas est une réelle perte de temps.
    J'ai essayé d'ércire un algorithme à la mains avec des boucles et ci et là, c'est l'horeur...
    En Framework 3.5, on peut simplement utiliser une requête Linq to Xml, pour interroger tout noeud désiré dans tout le fichier Xml brut ! sans avoir recour ni au schèma ni au vielle méthode qui datent l'âge de pierre.

    M'enfin, le principe, c'est qu'avec Linq j'envoie une requête Select, et avec la classe Xdocument, on peut récupérer les nœuds, les descendants, les attributs , tout quoi! après, je charge le tout dans une gridview, une fois que les données là, je parcours manuellement la grille et j'insere dans la base de données avec sqlcommand. je me suis pris la tête pour rien.

    Merci sankasssss et lilroma pour vos propositions

    Dès que j'ai le temps, je prévois d'écrire un tutoriel.pdf sur ce genre de manipulation.


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. inserer un document xml dans une table sql
    Par wafabrj dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/05/2012, 12h20
  2. [Débutant] [VB.NET] envoi de la date dans une requete SQL via ADO.NET
    Par yassine-art dans le forum ADO.NET
    Réponses: 2
    Dernier message: 28/04/2012, 13h08
  3. Réponses: 0
    Dernier message: 17/11/2011, 08h44
  4. Réponses: 5
    Dernier message: 24/11/2010, 14h54
  5. Charger Fichiers XML dans une table avec SQL*LOADER
    Par devdev2003 dans le forum SQL
    Réponses: 2
    Dernier message: 14/01/2008, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo