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

Accès aux données Discussion :

[VB.NET] [ADO.NET] Adapter, TableMapping et DataSet xsd


Sujet :

Accès aux données

  1. #1
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut [VB.NET] [ADO.NET] Adapter, TableMapping et DataSet xsd
    Bonjour,

    Voilà j'ai un dataset fortement typé généré avec Visual Studio .NET.

    Ce dataset à les mêmes noms de champ que la table que j'ai dans ma base de données (dataset créé par drag & drop de la table). Chaque champs (à part la clé primaire) a allow dbnull à true.

    Je crée ma requette select en fonction de mon dataset typé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'On crée la requette selectcommand
            Me.Adapter.SelectCommand.CommandText ="SELECT "
            For Each column In DataVehicules.Columns
                Me.Adapter.SelectCommand.CommandText += column.ColumnName & ","
            Next column
            Adapter.SelectCommand.CommandText = Adapter.SelectCommand.CommandText.Substring(0, Adapter.SelectCommand.CommandText.Length - 1)
            Adapter.SelectCommand.CommandText += " FROM " & DataVehicules.TableName
    J'ai un code dans le même style pour la création de la requette update
    Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adapter.Fill(DataVehicules)
    Mon dataset se remplit sans aucuns soucis.

    quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim j As Integer = Adapter.Update(DataVehicules)
    J est bien égal à 1 quand je modifie un row de ma dataTable.

    Le problème : J = 1 mais aucunne mise à jours n'est éffectuée sur ma base de données...

    Pensant que ça pourrait provenir d'un problème de tablemapping je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adapter.MissMappingAction = MissingMappingAction.Error
    Pour lever une exception en cas de pb de tablemapping.

    Et là, je lève une exception sur le fill et sur le update :
    Message "TableMapping manquant quand TableMapping.DataSetTable='VEHICULE'." String
    J'ai beau éssayer de faire le mapping en code en modifiant la création de mon selectcommand :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each column In Me.Columns
                Me.Adapter.SelectCommand.CommandText += column.ColumnName & ","
                Me.Adapter.TableMappings.Add(column.ColumnName, column.ColumnName)
            Next column
    Toujours la même exception qui est levée.

    J'ai aussi éssayé de spécifier le dataset et le nom de ma datatable lors du fill : toujours le même problème....

    Donc là je sèche un peu si quelqu'un a une idée sur la cause de ce problème de mapping, je l'en remercie d'avance

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    hum je sais pas si je ferais confiance a ce "tablemapping"

    intercepte l'updatecommand, copie-la teste la directement dans ta base de donnee, peut-etre qu'une vicieuse erreur s'y est glissee...

  3. #3
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    fait, mon updatecommand semble bonne, la preuve adapter.update(datatable) me retourne bien 1 !!!

    mais dans la base rien n'est mis à jours

    un rapport avec les exceptions levées par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Adapter.MissMappingAction = MissingMappingAction.Error
    si je l'active ? Si oui alors pourquoi ça lève une exception dans le fill ?


    Je tourne en rond et je vois pas d'issue là

  4. #4
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Lors du fill tu as forcément une Erreur de Mapping puisque tu ne le fait pas (le mapping)

    Pout ton Update c'est ton paramètre qui doit être foireux. Du genre tu dois te manger dans le SourceVersion

  5. #5
    Membre habitué

    Inscrit en
    Octobre 2002
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 139
    Points : 177
    Points
    177
    Par défaut
    salut,

    j'utilise presque la même mtéhode que toi pour faire mes mises à jour de bd.
    la différence, une fois que j'ai défini ma requête de selection j'utilise commandbuilder pour générer les autre requêtes.
    et a mon adpater je lui associe un objet sqltransaction. et une fois que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monadapter.update(la_table_qui_va_bien)
    je fais j'ouvre la trasaction avant avant le adapter.update.

    krest

  6. #6
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Citation Envoyé par bidou
    Lors du fill tu as forcément une Erreur de Mapping puisque tu ne le fait pas (le mapping)
    Mais s'il arrivait pas à mapper, il remplirait pas le DS

    Pout ton Update c'est ton paramètre qui doit être foireux. Du genre tu dois te manger dans le SourceVersion
    je met DataRowVersion.Original en source version...

    J'utilise un composant tier d'access aux données ça vient peut-être de là

  7. #7
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Citation Envoyé par neo.51
    Mais s'il arrivait pas à mapper, il remplirait pas le DS
    si tu met MissingMappingAction à Error, tu lui dit de ne pas faire le mappage tout seul. Donc soit tu fait le mappage par le code et tu lui met à error, soit tu ne le fait pas et tu laisse Passthrough

    Citation Envoyé par neo.51
    je met DataRowVersion.Original en source version...
    Et il avoue en plus.

    Si tu met original en SourceVersion, tu fais une requête ou tu lui demande de remplacer la valeur originale par la valeur originale. C'est original.
    Il faut mettre Current.

  8. #8
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut


    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconupdatingdatabasewithdataadapterdataset.asp

    C'était pas trés clair

    ça m'apprendra à pas passer par ton cours ADO.NET

    Bon maintenant je lève une exception :
    Message "Violation de l'accès concurrentiel*: UpdateCommand a affecté 0 enregistrement." String
    j'y suis presque

    J'ai catché ma DBConcurrencyException la rows qui est sensé posé problème semble ok au niveau des valeurs...


    Bon je vais me replonger dans la doc, au moins si je lève une exception ça me donne une direction pour chercher

  9. #9
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Attention, le paramètre que tu passe dans le Where doit être lui en sourceversion originale

  10. #10
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Citation Envoyé par bidou
    Attention, le paramètre que tu passe dans le Where doit être lui en sourceversion originale
    oui ça c'est fait, j'ai compris

    mais ça vient pas de là l'exception

  11. #11
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    ca doit venir d'un truc comme ca car ton exception viens du fait qu'il n'arrive pas à identifier l'enregistrement d'origine

  12. #12
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    bon la row que j'ai catché est bien remplie, mon param qui sert de clé primaire est bien en DataRowVersion.Original

    et je lève toujour l'exception
    Message "Violation de l'accès concurrentiel : UpdateCommand a affecté 0 enregistrement." String
    Je cherche toujour, si quelqu'un a une piste là dessus

  13. #13
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    fais voir ton code d'update

  14. #14
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Adapter.UpdateCommand.CommandText = Adapter.UpdateCommand.CommandText.Substring(0, Adapter.UpdateCommand.CommandText.Length - 1)
                Adapter.UpdateCommand.CommandText += " WHERE CLEVEHICULE=?"
                Gparam = New GParameter(db, "CLEVEHICULE")
                Gparam.Inner.SourceColumn = "CLEVEHICULE"
                Gparam.DbType = DbType.Int32
                Gparam.Inner.SourceVersion = DataRowVersion.Original
                .Parameters.Add(Gparam.Inner)
    Mon Gparam est un paraméter un peu bizzare, car en fait j'utilise un assembly qui permet de faire abstration du SGBD, quand je fais Gparam.inner j'accède au parameters encapsulé. J'ai vérifié avec un espion et le débugger, le parameter Gparam est bien formé pour CLEVEHICULE et tous les autres sont bien formés aussi. Le "@" devant le parameter name est ajouté automatiquement.

    En testant sur une base access, Gparam.inner a comme valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    System.Data.OleDb.OleDbParameter
    dbType : int32
    direction : Input
    IsNullable : False
    OleDBType : integer
    ParameterName : "@CLEVEHICULE"
    Precision : 0
    scale : 0
    size : 0
    sourceColumn : "CLEVEHICULE"
    sourceVersion : Original
    Value : 1{Integer}
    alors je précise :
    La colonne CLEVEHICULE de ma datatable est bien de type integer, non null, avec une cle primaire dessus.

    Value : 1 correspond bien à l'ID de la row que je veux updater, donc avant de lever l'exception le parameters prend bien la bonne valeur.

    S'il manque des explications n'hésitez pas à demander

  15. #15
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut
    bon en fait j'avais une ligne de code foireuse qui me générait un params de plus


    pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] ADO.NET: update d'une dataset dans une base
    Par Alexj51 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2006, 15h48
  2. [ADO.NET][C#] Comment recupérer contraintes dans Dataset ?
    Par irnbru dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/02/2006, 00h53
  3. [ADO.NET][VB.NET]Comment mettre à jour BDD avec DataSet?
    Par fuhraih dans le forum Accès aux données
    Réponses: 1
    Dernier message: 17/01/2006, 16h35
  4. [ADO.Net][VB.NET/C#]Comment importer .xls dans DataSet ?
    Par smedini dans le forum Accès aux données
    Réponses: 2
    Dernier message: 10/01/2006, 15h59
  5. [ADO.NET] MAJ BDD à partir d'un DataSet d'un DataGrid
    Par bart64 dans le forum Accès aux données
    Réponses: 15
    Dernier message: 20/12/2005, 18h16

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