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 :

parametrer un TableAdapter


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    consultant BTP
    Inscrit en
    Février 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant BTP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 51
    Par défaut parametrer un TableAdapter
    Bonjour,
    Apres plusieurs recherches je deviens completement fou pour trouver une solution.

    J'a une base de donnée acess en reseau (repartie) que je souhaite mettre a jour via un windows form. (étant sous visual basic express 2010)
    Je crée une connection mon tableadater je fait glisser mon dataset sur mon form pour créer mes sources et mon databindingnavigator je lance le tout je peux ajouter des nouvelle lignes en supprimer en modifier et en enregistrer, pourtant dans certain un message d'erreur apparait :

    petit code du controle enregistrer
    -------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Data_PrixBindingNavigatorSaveItem_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Data_PrixBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.Data_PrixBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.Base_de_données1DataSet)    End Sub
    -------------------


    Violation de l'accès concurrentiel : DeleteCommand a affecté 0 des enregistrements 1 attendus.
    ou bien
    Violation de l'accès concurrentiel : UpdateCommand a affecté 0 des enregistrements 1 attendus.
    Dans ma base la première colonne est definie en tant que clé primaire et autoincrémentation de 1.

    J'ai essayer de parametre les requetes du tabladapter moi meme mais pour certaine colonne et dans les requetes Update Delete Isert quan je veux remplacer le ? par @prix pour la colonne prix un message me dis : Erreur de type de données dans l'expression.

    Je n'arrive plus a trouver mon erreur

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,
    Montre nous le contenu de :
    - Me.TableAdapterManager.SelectCommand.Text,
    - Me.TableAdapterManager.UpdateCommand.Text,
    - Me.TableAdapterManager.InsertCommand.Text,
    - Me.TableAdapterManager.DeleteCommand.Text.

    Pour access, les X paramètres des commandes paramétrées remplacent les X "?" de la commande.

    Pour l'InsertCommand, il ne faut pas ajouter le champs autoincrement dans la lmiste des champs , mais le récupérer après l'insert. Le code ci-dessous est en C#, mais facilie à traduire en Vb.net.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string MonChampAutoIncrement = "ID" ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string MyBasicInsertCommand = ... // Commande insert sans champ ID 
    Me.TableAdapterManager.InsertCommand = MyBasicInsertCommand+ " " + MonChampAutoIncrement + " = SCOPEIDENTITY()" ;
    Me.TableAdapterManager.MissingSchemaAction = MissingSchemaAction.AddWithKey;

  3. #3
    Membre averti
    Homme Profil pro
    consultant BTP
    Inscrit en
    Février 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant BTP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 51
    Par défaut
    bonjour,
    Voila pour les différentes commandes :
    Select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT      Data_Prix.* FROM         Data_Prix
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT      ID, code_UP, Désignation, .....(autre colonnes) FROM         Data_Prix
    Avec la clé primaire sur ID autoincrement sur true, autoincrementseed à 1, autoincrementstep à 1, unique sur true.

    Pour la commande delete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM Data_Prix WHERE     (ID = ?)
    Pour la commande Update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE    Data_Prix
    SET              Code_UP = ?, Nom_UP = ?, Code_article = ?,  Désignation = ?, Fournisseur = ?, [Livraison_extérieur] = ?,   Statut = ?, Secteur = ?, Observation = ?, date_MAJ = ?, Prix = ?  ......
    WHERE     (ID = ?)
    Pour la commande insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO Data_Prix
                          (Code_UP, Nom_UP, Code_article,  Désignation, Fournisseur, [Livraison_extérieur],  Statut, Secteur, Observation, 
                          date_MAJ, Prix)
    VALUES     (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    je fait la prog en VB et non C++
    merci pour l'aide

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Hello

    La gestion des clés primaire auto-incrémentée avec ADO.NET et les dataset peut vite devenir un cauchemard.

    En effet lorsque tu crée ton enregistrement en local, ton logiciel va créer une clé primaire "temporaire".

    Lors de l'update, la base de donnée va créer sa propre clé primaire temporaire et il n'y a aucune garantie de correspondance avec la clé temporaire.

    Si l'enregistrement en local continue son petit bout de chemin dans ton code (modifié à nouveau), alors lors du prochain update, le table adapter va essayer de retrouver l'enregistrement avec la clé "temporaire" sur la base de donnée, ne pas trouver de correspondance et lancer une exception d'accès concurentiel.

    Voici plusieurs solutions pour éviter ce problème (plus ou moins moche niveau qualité de code et simple).

    1. Ne pas utiliser de clé auto-incrémentée sur la base de donnée, juste la clé primaire et géré l'incrémentation dans ton application. Bien entendu il est possible, probable, que l'insert échoue car l'incrément généré par le programme est peut être déjà pris par un autre nouveau enregistrement (il faut donc gérer ce cas).

    2. Considérer qu'un dataset ne doit plus être utilisé après un update (l'update intervenant idéalement à la fermeture du formulaire). Ainsi on évite le problème des clés temporaires vu que à priori une fois la validité de cette dernière échue on a charge la clé final si besoin. Il est alors impossible d'ajouter des enfants à un nouvel enregistrement tant qu'il n'a pas été updated. (Ce qui peut poser problème selon le formulaire...)

    3. Définir l'évenement des tableadapters concernés "RowUpdated" afin d'ajouter un bout de code qui va remplacer la clé temporaire par la clé définitive générée par la base de donnée pour les nouveaux enregistrements. Tu trouveras ci dessous un exemple (pour SQL compact par contre) probablement perfectible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Private IdentityQuery As New System.Data.SqlServerCe.SqlCeCommand("SELECT @@IDENTITY", Nothing)
     
            Private Sub m_adapter_RowUpdated(ByVal sender As Object, ByVal e As System.Data.SqlServerCe.SqlCeRowUpdatedEventArgs) Handles _adapter.RowUpdated
                If e.StatementType = StatementType.Insert AndAlso _
                   e.Status = UpdateStatus.Continue Then
                    IdentityQuery.Connection = e.Command.Connection
                    e.Row("ID") = IdentityQuery.ExecuteScalar
                End If
            End Sub

  5. #5
    Membre averti
    Homme Profil pro
    consultant BTP
    Inscrit en
    Février 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant BTP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 51
    Par défaut
    En gros je valide l'instruction UpdateAll quand je veux quitter mon application si je veux aller au plus simple.
    Ca a quelque chose de bancal, mais ça peux le faire.
    Et est ce que parametrer le datatableadapter sans clé primimaire ne serait pas mieux ??? et ainsi parametrer moi meme les requetes.

  6. #6
    Membre averti
    Homme Profil pro
    consultant BTP
    Inscrit en
    Février 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant BTP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 51
    Par défaut
    Il est vrai que étant debutant sur la plate form VB le casse tête et reel pour comprendre tous les rouages.
    A l'origine le programme a été créé sous excel et les données été stockées sur un feuillet qui servait de base de données mais cela offrait un configuration peu stable surtout en cas de plusieurs utilisateur ainsi qu'une lenteur àcharger et excecuter des test sur 3000 lignes. D'ou ma volonter actuel de transformer tout ça sous un windowsform ainsi qu'une gestion de la base de donnée (en mode repartie stocké sur le reseau).
    Pour l'instant j'ai exécuté un tuto trouvé sur un autre site et commence a transformer mon programme excel sous VB mais pas si facile que ça ....
    Merci pour les info en tout cas

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Faut être conscient d'une chose.

    Dans le top 10 des tâches les plus lentes d'une application, il y a, entre autre, l'execution de requêtes sur une base de donnée.

    Sachant ce point, on arrive facilement à la conclusion que de charger les données à l'ouverture du formulaire et de sauvegarder les données à la fermeture de celui ci est un bon début pour garder une application réactive.

    Les updates intérmédiaires sont souvent une rustine apportée pour réduire la nuisance des accès concurentiels. Malheureusement du moment que l'application et multi-utilisateurs, cette gestion n'est pas optionnelle.

  8. #8
    Membre averti
    Homme Profil pro
    consultant BTP
    Inscrit en
    Février 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : consultant BTP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 51
    Par défaut
    Bon au final en dehor d'utiliser le bouton save du bindingnavigator juste avant de fermer mon application je n'ai pas d'autre solution.
    Et pour les ? que je ne peux pas remplacer c'est normal ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2008, 20h29
  2. parametrer le remplissage d'un tableadapter
    Par tikismoke dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/03/2007, 20h06
  3. TableAdapter requete avec parametre multiple.
    Par isambert dans le forum Accès aux données
    Réponses: 1
    Dernier message: 13/01/2007, 00h11
  4. [VB.Net 2.0] Comment passer en paramètre un TableAdapter ?
    Par Thierryx dans le forum Accès aux données
    Réponses: 1
    Dernier message: 25/08/2006, 15h27
  5. transmision de tableau en parametre
    Par Horus dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/05/2002, 11h15

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