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

C# Discussion :

[Dataset - ADO.net] NonQuery repasse en Scalar à chaque mise à jour


Sujet :

C#

  1. #1
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut [Dataset - ADO.net] NonQuery repasse en Scalar à chaque mise à jour
    Salut à tous !

    Ce petit message, car je suis en train de me demander si je n'ai pas omis quelque chose dans le paramétrage de mon DataSet (BaseDossier.xsd). J'aimerais votre avis & vos conseils, car, malgré mes recherches, je ne vois pas quel est mon erreur.

    Avant tout, sachez que mon DataSet est interfacé avec un base de données SQL Server possédant une table « Dossier » ayant pour identifiant la colonne « id », définie sur « Auto_Increment ».

    Le problème se pose dans mon TableAdapter nommé « Dossier », qui possède une méthode nommée « CreateDossier() » dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Insert Into Dossier (nom, createur, datecreation)
    Values (@name, @creator, @creationDate);
    Select Scope_Identity(); // Retourne l'identifiant nouvellement inséré.
    Pour qu'elle me retourne bien l'identifiant du dossier nouvellement créée, je choisi le mode d'exécution « Scalar() », ce qui marche bien.

    Cependant, à chaque modification sur mon TableAdapter (même si elle ne concerne pas ma méthode « CreateDossier() »), le mode d'exécution repasse silencieusement en « NonQuery() ». Celà ne génère aucune erreur de compilation, mais au lieu de me retourner ce que j’attends, elle me retourne tout le temps « 1 » (le nombre de lignes affectées par mon enregistrement)...

    Au final, dans mon code, celà peut me conduire à de graves erreurs d'incohérence de données.

    • Auriez-vous une idée pour savoir comment résoudre ce discret mais génant problème ?

    Voici un topic sur StackOverflow d'un individu signalant le même problème, mais sans réponse probantes.

  2. #2
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Regarde les propriétés de ton DataTableAdapter, et change la propriété ExecuteMode, par défaut c'est positionné sur NonQuery, tu mets Scalar.

  3. #3
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    Je ne comprend pas très bien d'où vient l'erreur, surtout que c'est exactement l'exemple issu de le MSDN pour ExecuteScalar.

    Peut-être un overflow ou problème de conversion du résultat car scope_identity te renvoie un numeric(38,0). Ce que je peux te conseiller, c'est de caster ton Scope_Identity en int pour faire comme dans l'exemple de la MSDN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Insert Into Dossier (nom, createur, datecreation)
    Values (@name, @creator, @creationDate);
    SELECT CAST(scope_identity() AS int);
    Bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  4. #4
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Si tu t'ensors pas, abonne toi à l'événement RowUpdate de ton Adapter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    monAdapter.RowUpdated += monAdapter_RowUpdated;
     
            void monAdapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
            {
                if (e.StatementType == StatementType.Insert && e.Status == UpdateStatus.Continue)
                {
                    var maCommande = new OleDbCommand("SELECT SCOPE_IDENTITY()");
                    maCommande.Connection = maConnection;
                    e.Row["Id"] = Int32.Parse(maCommande.ExecuteScalar());
                    e.Row.AcceptChanges();
                }
            }

  5. #5
    Nouveau membre du Club Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Points : 39
    Points
    39
    Par défaut
    Hello & merci pour vos réponses !

    Donc pas de souci, ça marche bien.

    Par contre, j'ai un problème lorsque je change quelque chose dans mon DataTable (par exemple, j'ajoute un nouveau champ, ou alors je modifie une méthode) : le mode d'exécution repasse silencieusement en « NonQuery() ».

    Alors je remet « Scalar() », mais dès que je refait une mini-modif sur mon DataTable : ça repasse inéluctablement en « NonQuery() ».

    C'est un peu embêtant, parce que je me fais avoir sans arrêts, et du coup, à diagnostiquer comme bug, c'est pas évident.

Discussions similaires

  1. WPF dataset ado.net
    Par casa_sniper dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 08/12/2011, 16h38
  2. Réponses: 0
    Dernier message: 15/10/2011, 09h20
  3. Réponses: 0
    Dernier message: 15/10/2011, 09h13
  4. Réponses: 4
    Dernier message: 27/06/2007, 11h16
  5. Réponses: 13
    Dernier message: 27/11/2006, 11h17

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