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 :

Mise à jour de 2 tables où clé primaire Table1 est clé externe de Table2


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 117
    Par défaut Mise à jour de 2 tables où clé primaire Table1 est clé externe de Table2
    Bonjour,
    Voici mon problème: je dois mettre à jour 2 tables dont la clé primaire de la première est clé externe de la seconde. J'utilise le code suivant :

    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
    OracleConnection connexion = new OracleConnection(OraDb);
    connexion.Open();
     
    OracleCommand command = new OracleCommand();
    command.Connection = connexion;
     
    command.CommandText = "SELECT USER, SYSDATE, MATABLE.ID, MATABLE.DAT_USRMAJ FROM MATABLE WHERE ROWNUM = 1";
    command.CommandType = CommandType.Text;
     
    OracleDataAdapter adapter = new OracleDataAdapter();
    adapter.SelectCommand = command;
     
    OracleCommandBuilder builder = new OracleCommandBuilder(adapter);
     
    DataSet dataset = new DataSet();
    adapter.Fill(dataset, "TABLE");
     
    DataTable Dt = dataset.Tables["TABLE"];
     
    // Début de transaction
    OracleTransaction transaction = connexion.BeginTransaction(IsolationLevel.ReadCommitted);
    // Assign transaction object for a pending local transaction
    command.Transaction = transaction;
     
    // 1er enregistrement retourné
    DataRow row = Dt.Rows[0];
     
    // On récupère SYSDATE
    string MaDate =  row["SYSDATE"];
     
    // Création d'un nouveau row
    row = Dt.DataSet.Tables["TABLE"].NewRow();
     
    row["ID"] = MaCleTable1;
    row["COD_USRMAJ"] = MaDate;
     
    // on met à jour 
    adapter.Update(rec.dataset, "TABLE");
    adapter.Fill(rec.dataset);
     
    // puis on fait pareil avec la 2ème table :
    [......]
    row = Dt.DataSet.Tables["TABLE"].NewRow();
     
    row["ID"] = MaCleTable2;
    row["COD_USRMAJ"] = MaDate;
    row["IDTAB1"] = MaCleTable1;
     
    // on met à jour 
    adapter.Update(rec.dataset, "TABLE");
    adapter.Fill(rec.dataset);
     
    transaction.Commit()
    Et là çà plante sur le "adapter.Update" car il me dit violation de contrainte sur "row["IDTAB1"] = MaCleTable1" comme s'il semblait ne pas avoir enregistré les infos de la 1ère table.

    J'ai raté quelque chose ?
    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur E&D
    Inscrit en
    Février 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur E&D

    Informations forums :
    Inscription : Février 2010
    Messages : 48
    Par défaut
    Bonjour,

    Pourquoi ne te servirais tu pas plutot d'update - set ??
    Ce serais plus clair dans ton code, et il n'y aurait pas d'erreur de clé primaire

    EDIT : met un commit juste avant de faire les traitements pour la deuxième table

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 117
    Par défaut
    je ne comprend pas quand tu dis
    plutot d'update - set ??
    Peux tu me donner un exemple? merci

    Quand tu dis
    EDIT : met un commit juste avant de faire les traitements pour la deuxième table
    en fait, je ne veux pas justement car si problème sur 2ème table, la première ne doit pas être enregistré

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 117
    Par défaut
    De plus, j'ai le même problème si j'enlève :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Début de transaction
    OracleTransaction transaction = connexion.BeginTransaction(IsolationLevel.ReadCommitted);
    // Assign transaction object for a pending local transaction
    command.Transaction = transaction;
    [.....]
    transaction.Commit();
    cela ne vient donc à priori pas de la transaction ...

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur E&D
    Inscrit en
    Février 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur E&D

    Informations forums :
    Inscription : Février 2010
    Messages : 48
    Par défaut
    Et bien la avec ton code, personellement je ne comprends pas trop ce que tu met à jour, d'ailleurs es tu sur que ton code fait une mise à jour et ne rajoute pas un enregistrement ?
    As tu tester juste la 1ere requete pour savoir si elle fonctionnait correctement ?

    Si tu utilises une requete sql de mise à jour, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string sql = "UPDATE maTable SET nomChamp = valeur, nomChamp2 = valeur2 WHERE id=1";
    // Ensuite utiliser la fonction ExecuteNonQuery();
    c'est à mon sens beaucoup plus simple de se repérer et de voir ou on a fait une erreur car tu enveloppe ta requete dans un try catch et en debug tu sais tout de suite d'ou vient ton erreur.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur E&D
    Inscrit en
    Février 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur E&D

    Informations forums :
    Inscription : Février 2010
    Messages : 48
    Par défaut
    Je te conseille d'englober ça dans un try { } catch { } déja, tu sauras peut etre plus précisemment d'ou vient l'erreur.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 117
    Par défaut
    j'ai mis un try justement, et quand il veut mettre à jour Table2, il me dit pb de contrainte car il ne connait pas la clé de table1

    Sinon, je pourrais utiliser le update et executenonquery
    mais je souhaite utiliser les "OracleDataAdapter", "DataSet" et "OracleCommandBuilder"

Discussions similaires

  1. Mise à jour d'une table
    Par smotte76 dans le forum Access
    Réponses: 2
    Dernier message: 31/10/2005, 18h13
  2. Mise à jour d'une table
    Par bath dans le forum Oracle
    Réponses: 5
    Dernier message: 19/10/2005, 12h01
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. Réponses: 5
    Dernier message: 06/01/2005, 12h07
  5. mise à jour d'une table d'interbase sous delphi
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2004, 13h09

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