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 :

SQlexception sur TableAdapter.Update


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Par défaut SQlexception sur TableAdapter.Update
    Bonjour,

    je dois faire une facture avec les lignes associées (détail facture).

    par le clic sur un premier bouton, on obtient le détail facture, que je mets dans des row typés puis j ajoute ces rows au dataset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    detailRow.code_prestation = codepresta;
                            detailRow.lib_prestation = _libellePrestation;
                            detailRow.montant_ht = Convert.ToDecimal(tarifimport.redevance_import(Convert.ToDouble(ultraGrid1.ActiveRow.Cells["Poids colis"].Value), false, false, false));
                            detailRow.montant_tva = 0;
                            detailRow.taux_tva = 0;
                            detailRow.montant_ttc = detailRow.montant_ht;
                            detailRow.qte_facturee = 1;
                            detailRow.poids_facture = Convert.ToDouble(ultraGrid1.ActiveRow.Cells["Poids colis"].Value);
                            detailRow.valeur_declaree = Convert.ToDouble(ultraGrid1.ActiveRow.Cells["V. déclarée"].Value); ;
                            //pour l instant pas de num facture car c pa encore validé
                            detailRow.id_facture = 0;
     
               dataSet_enlevement.detail_facture.Adddetail_factureRow(detailRow);

    Ensuite à la validation de la page, je veux changer l id facture précédemment mis a 0 pour le nouvel id facture obtenu. Mais lorsque j apelle l update sur le dataset j ai une sqlexception pour violation de contraintes sur id_facture. Je n'arrive pas à savoir quelle instruction sql a généré cette exception même avec le profiler de SQL server 2005. Est il possible de mélanger code sql et commandes c# pour la manipulation des bases de données ? Comment puis je récuperer l instruction sql en cause dans l'erreur ?

    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
     
    private void btn_valider_Click(object sender, EventArgs e)
            {
    string strRequete = "insert into facture(id_client,nom_du_client,no_document,mode_facture,montant_ht,montant_ttc,montant_tva,id_situ_facture) values(" + cbx_codeclient.SelectedValue + ",'" + nomcli + "',0,'" + modefact + "','" + mtht + "','" + mtttc + "','" + mttva + "',1); ";
                    //Execution de la requête  
                    myCommand.CommandText = strRequete;
     
                    affectedRows = myCommand.ExecuteNonQuery();
     
                    string strRequete2 = "select ident_current('facture')";
     
                    myCommand.CommandText = strRequete2;
                    affectedRows = Convert.ToInt32(myCommand.ExecuteScalar());
     
     
                    //Donner l'id facture aux lignes detail facture
                    for (int i = 0; i < ultraGrid2.Rows.Count; i++)
                    {
                        ultraGrid2.Rows[i].Cells["id_facture"].Value = affectedRows;
     
                    }
                    detailfactureBindingSource.EndEdit();
                    detail_factureTableAdapter.Update(dataSet_enlevement.detail_facture.Select(null, null, DataViewRowState.Added));
    }


    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY 'FK_detail_facture_facture'. Le conflit s'est produit dans la base de données 'madtfret', table 'dbo.facture', column 'id_facture'.
    L'instruction a été arrêtée.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par bilou972 Voir le message
    Comment puis je récuperer l instruction sql en cause dans l'erreur ?
    Tu peux utiliser l'évènement RowUpdating qui se produit juste avant l'exécution de la commande, ou RowUpdated qui se produit juste après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    detail_factureTableAdapter.RowUpdating += detail_factureTableAdapter_RowUpdating;
     
    ...
     
    private void detail_factureTableAdapter_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
    {
        Console.WriteLine(e.Command.CommandText);
        foreach (SqlParameter p in e.Command.Parameters)
        {
            Console.WriteLine("{0} = {1}", p.ParameterName, p.Value);
        }
    }

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Par défaut
    Merci ça fonctionne nikel. Juste une précision pour les futurs intéressés j'ai fait cette petite modif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    detail_factureTableAdapter.Adapter.RowUpdating += ...
    Grâce à ce bout de code j'ai pu voir quelle était la ligne effectivement insérée. Elle m'a l'air ok donc je ne vois pas ou est le problème.
    Le bout de code que j'ai envoyé hier était un peu simplifié, en réalité les commandes sql sont dans une transaction. Est il possible que l'id facture attribué par l insert puis recupéré par le ident_current ne soit pas encore réellement dans la table tant que le commit n'a pas été fait ? Et que donc par la même il ne soit pas possible d'insérer des lignes utilisant cet id ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je me demande si ce n'est pas parce que ton adapter utilise une autre connexion que ta commande précédente... dans ce cas, puisque tu n'as pas fait de commit, la 2e connexion ne "voit" pas encore la nouvelle ligne dans facture. Essaie de changer la connexion utilisée par ton adapter pour que ce soit la même

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Par défaut
    Merci. Effectivement ça me semble logique. Ne vaut il pas mieux faire les commandes sql pour l'ajout des lignes détail facture ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par bilou972 Voir le message
    Ne vaut il pas mieux faire les commandes sql pour l'ajout des lignes détail facture ?
    Je suis pas sûr de comprendre ta question... Exécuter des commandes SQL, c'est ce que fait le TableAdapter... si tu préfères le faire "à la main", à toi de voir, mais c'est plus galère

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

Discussions similaires

  1. DBConcurrencyException sur un TableAdapter update
    Par TCW78 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/11/2008, 22h23
  2. Réponses: 1
    Dernier message: 25/01/2008, 11h17
  3. Aujo-jointure [SQLServer] sur un UPDATE
    Par teuzadur dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/01/2006, 12h01
  4. [Oracle 9i] Triggers sur les updates de tables
    Par zestrellita dans le forum Oracle
    Réponses: 12
    Dernier message: 07/12/2005, 11h32
  5. svp un peu d'aide sur mon update, resumé simple en dessous
    Par hansaplast dans le forum Langage SQL
    Réponses: 11
    Dernier message: 14/11/2005, 10h14

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