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 :

Transcription d'une requete SQL


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut Transcription d'une requete SQL
    Bonjour,
    J'ai un problème de transcription SQL.
    Je suis sous visual studio c# express et mes bases de données sont sous ORACLE.

    Voici ma requete que je n'arrive pas à transcrire.
    Faire UPDATE de la table <visu> de la colone DATE avec pour valeur une "date_nouvelle" à condition que "date_nouvelle" soit la nouvelle "date" entrée par l'utilisateur dans un datagridview et qui provient de la table <tab>.

    Merci

    EDIT : Si mon explication n'est pas assez clair voici le synoptique :

    Table <tab>
    15/04/07 ===l'utilisateur veut le changé en 18/07/07===
    16/04/07
    ...

    Donc <tab> devient :
    18/07/07
    16/04/07
    ...

    <Visu> contient
    15/04/07
    15/04/07
    16/04/07
    ...

    Donc étant donnée que <tab> est modifier, je voudrai que <visu> devienne
    18/07/07
    18/07/07
    16/04/07
    ...
    Voila.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Les requêtes pour Oracle se font en SQL :
    UPDATE nom_de_la_table SET nom_du_champ_a_modifier = nouvelle_valeur [, ...] WHERE nom_du_champ_a_comparer = ancienne_valeur [AND ...]

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Merci de ta réponsz Astartee mais je le savais.
    En fait mon problème (car j'ai reussi à comprendre un peu mieu le mecanisme) est le suivant :
    j'ai dans un dataset, une table "date" et une table "visu". La table "date" contient les valeurs de la requete : select date from <matable> group by date. Et la table "visu" les valeurs de la requete : select * from <matable>.
    J'affiche dans un datagridview la table "date".
    Je souhaite des que je change la valeur dans le datagridview la date, quel soit changé au niveau de la table "visu".

    Au final la table "visu" et ses modifications, sont renvoyés à la base de donnée ORACLE.

    PROBLEME :
    Je ne sais pas comment faire pour extraire la date initialement rentré dans la table "date" pour quel devienne la variable date_ancienne.
    Cela me servira à faire la condition si date_ancienne correspond à la date dans "visu" la remplacé par la date actuelle.

    merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Je me doutais un peu que ça ne devait pas être ça, mais j'ai soigneusement répondu à ta "question"
    J'ai un problème de transcription SQL. Voici ma requete que je n'arrive pas à transcrire.


    Dans les DataRow d'une DataTable sont stockés les valeurs du champ avant modification tant qu'on n'a pas effectué d'AcceptChanges (ou de Update avec un DataAdapter), on les récupère avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    leDataRowConcerné[nom_de_la_colonne, DataRowVersion.Original]
    ou
    leDataRowConcerné[index_de_la_colonne, DataRowVersion.Original]

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Merci de ta réponse Astartee... Mais cela ne fonctionne pas
    voici mon code, peux tu me dire ou je me suis trompé?

    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
     
                string sql = "Select * From <MaTable>";
                DataRow rowdate;
                rowdate = tab_date.NewRow();
     
                try
                {
                    OracleDataAdapter OracleDA_visu = new OracleDataAdapter(sql, connexion);
                    connexion.Open();
     
                    string Stringcmd = "Update <MaTable> SET DATE = :@NewDATE WHERE DATE= :@OldDATE";
                    OracleCommand UpdateDate = new OracleCommand(Stringcmd, connexion);
                    UpdateDate.CommandType = CommandType.Text;
                    UpdateDate.Parameters.Add("@NewDATE", OracleDbType.Date, rowdate["DATE", DataRowVersion.Current], ParameterDirection.Input);
                    UpdateDate.Parameters.Add("@OldDATE", OracleDbType.Date, rowdate["DATE",DataRowVersion.Original], ParameterDirection.Input);
                    UpdateDate.ExecuteNonQuery();
                    tab_date.AcceptChanges();
     
                    OracleCommandBuilder commandBuilder = new OracleCommandBuilder(OracleDA_visu);
                    OracleDA_visu.UpdateCommand = commandBuilder.GetUpdateCommand();
     
                    OracleDA_visu.Update(tab_visu);
                    tab_visu.AcceptChanges();
                    OracleDA_visu.Dispose();
    }
    Erreur rencontrée : Pas de valeur Original ( ou pas de valeur current )


    NOTA : j'utilise un dataGridView. Le problème vient peut etre de la.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Tant que le DataRow n'est pas ajouté dans la table, les valeurs "current" et "original" ne sont pas accessibles. Seule la valeur "proposed" est accessible ; il s'agit d'ailleurs de la valeur par défaut de la colonne tant qu'on ne modifie pas la valeur du champ dans cette ligne.


    Ton code me perturbe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DataRow rowdate;
    rowdate = tab_date.NewRow();
    Là, une nouvelle ligne est créée, qui n'appartient pas encore à la table mais qui possède le bon nombre de colonnes etc... Elle est prête à être remplie (pour l'instant elle contient les valeurs par défaut définies pour chaque colonne, c'est-à-dire DbNull.Value si aucune valeur par défaut n'a été re-définie après la création de la colonne) et ajoutée à la table par l'instruction tab_date.Rows.Add(rowdate).
    => pourquoi appeler la commande d'Update sur cette ligne ? pour faire un test ? ça ne marche pas parce que la ligne n'appartient pas à la table, et d'ailleurs elle est "vide" en quelque sorte - mieux vaut prendre une ligne qui appartient déjà à la table et a bien été modifiée (sinon la valeur "original" n'existera pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tab_date.AcceptChanges();
    [...]
    OracleDA_visu.Update(tab_visu);
    tab_visu.AcceptChanges();
    Après l'instruction AcceptChanges(), les modifications effectuées dans la table sont acceptées (comme le dit si bien le nom de la fonction...) ce qui signifie que les modifications deviennent définitives : les lignes modifiées ne sont plus considérées comme modifiées, toutes les lignes sont "unmodified", les anciennes valeurs stockées dans la valeur "original" sont oubliées, les lignes supprimées le sont définitivement, etc.
    Donc il est complètement inutile d'appeler Update après AcceptChanges : il ne se passera rien. De plus il est encore inutile d'appeler AcceptChanges après Update, car une fois les modifications envoyées à la base de données les modifications dans la DataTable sont elles aussi acceptées définitivement : même effet qu'un AcceptChanges, mais après avoir envoyé les modifications à la base de données. (sauf en cas d'erreur, mais dans ce cas il n'est pas souhaitable de faire "comme si" tout s'était bien passé en appelant AcceptChanges !)

    Si le but est de définir une commande d'Update sur mesure, pourquoi ne pas la définir complètement (il ne faudra peut-être pas modifier uniquement la date) et la mettre dans le DataAdapter en tant que UpdateCommand ? Dans ce cas, on peut laisser tomber le CommandBuilder, et effectuer toutes les opérations d'un coup en un appel de Update.
    Quelle est la particularité du champ "date" ? Pourquoi as-tu voulu lui réserver un traitement spécial, avec une commande UpdateDate définie "à part" ?

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Merci d'avoir annalysé mon code
    Désolé pour le manque d'information fourni. Voici ce que j'ai fait.

    Donc tout d'abord, cette parti du code se trouve dans une méthode appelé "MAJ".

    J'ai fait une DataTable <date> et une DataTable <visu> qui sont deux extraction de la même table de la BDD.
    Elles se chargent avec la methode DataAdapter.Fill(<table>);

    Par la suite, je souhait faire la mise à jours de la table <date> vers la base de donnée, puis faire la mise à jour des données de la table<visu> vers la base de donnée.

    Mais j'ai d'un coté dans un datagridview1 la table <date> avec les données (puisque DataSource = <date>) et dans un autre datagridview2 la table <visu> avec les données (puisque DataSource = <visu>). Cette "MAJ" est déclanché lorque j'appuie sur un bouton. Mais elle est commune pour les 2 donc il y a 2 AccepteChanges.

    Mais je souhaite mettre la priorité sur la mise à jour de la date (elle ne peut etre que modifier dans le datagridview1). Puis la prise en compte des modification du datagridview2.

    Explication code :

    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
     
     string sql = "Select * From <MaTable>"; // sert pour la connection
                DataRow rowdate;   // création datarow
                rowdate = tab_date.NewRow(); // affectation datarow avec les donnés avec <date>.
     
     
                OracleDataAdapter OracleDA_visu = new OracleDataAdapter(sql, connexion);  
                try
                {  connexion.Open();
     
    //ligne de commande pour la mise à jour de la date
    string Stringcmd = "Update <table> SET DATE= :@NewDATE WHERE DATE= :@OldDATE";
     
     
    //déclaration de la commande
                        OracleCommand UpdateDate = new OracleCommand(Stringcmd, connexion);
                        UpdateDate.CommandType = CommandType.Text;
                        UpdateDate.Parameters.Add("@NewDATE", OracleDbType.Date, rowdate["DATE_EFFET", DataRowVersion.Current], ParameterDirection.Input);
                        UpdateDate.Parameters.Add("@OldDATE", OracleDbType.Date, rowdate["DATE", DataRowVersion.Original], ParameterDirection.Input);
                        UpdateDate.ExecuteNonQuery(); //execution de la commande
     
     
    //nouvelle commande pour la table <visu>
                    OracleCommandBuilder commandBuilder = new OracleCommandBuilder(OracleDA_visu);
                    OracleDA_visu.UpdateCommand = commandBuilder.GetUpdateCommand();
     
     
                    OracleDA_visu.Update(tab_visu); // mise à jour de la table <visu>
     
    //accept les changement de la table <visu>
                    tab_visu.AcceptChanges();
    //accept les changement de la table <date>
                    tab_date.AcceptChanges();
                    OracleDA_visu.Dispose();
     
                    MessageBox.Show("Mise à jour effectué");
                }
    ...}

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    oups, désolée pour la partie sur les AcceptChanges, j'avions pas vu qu'il s'agissait de deux tables différentes
    hum... sauf qu'il reste inutile de faire un AcceptChanges sur tab_visu après avoir exécuté Update sur tab_visu

    Et puis la première commande d'update (UpdateDate) est toujours aussi inutile : elle s'applique à une ligne nouvelle qui ne correspond à rien...
    Ce qu'il faudrait si tu veux modifier les dates pour toutes les lignes modifiées , c'est créer un DataAdapter pour la table <date> avec comme UpdateCommand la commande UpdateDate paramétrée correctement (sans donner de valeur aux paramètres mais en indiquant les colonnes de la DataTable à prendre en compte - s'inspirer de la commande générée par le CommandBuilder pour comprendre comment ça marche) et utiliser la méthode Update.

    Deux DataTable, associée chacune à un DataGridView pour pouvoir les modifier, contenant toutes deux les mêmes données, mais la première ne sert qu'à modifier la date, et la deuxième à modifier le reste...
    Pour quoi dupliquer ainsi les données ? Quel est le sens de cette "priorité" accordée à la modification de la date ? (structure de la base d'origine ?)
    Comment le champ date de la table <visu> est-il relié à celui de la table <date> ? Parce que modifier les données de la base sans modifier le champ date de la table <visu> risque de perturber l'exécution de la mise à jour OracleDA_visu.Update(tab_visu)...

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Il n'y a pas de différence entre la table <date> et la table <visu>
    En fait les dates qui se trouvent dans la table <date> sont en fait l'extraction de la BD des dates mais groupés. La requete sql est du type select date from.... Group by...

    Et dans la table <visu> nous avons l'extraction de la BD. La requete est du type select * from...
    Voila la différence.

    Je souhaiterai que dès que l'on change la date, toute les dates identiques soient modifiées.

    Autre information, je ne sais pas alors comment "personnalisé" la requete UPDATE.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Je souhaiterai que dès que l'on change la date, toute les dates identiques soient modifiées.
    Proposition : utiliser une seule table, et utiliser l'événement RowChanged.
    Dès qu'un rang est ajouté/modifié, l'événement RowChanged se déclenche (après modification, donc on peut récupérer les valeurs Original et Current, en cas de modification, du DataRow). S'il s'agit d'une modification (Action = Change) et que c'est la date qui a été modifiée (comparer les valeurs), transmettre cette valeur à toutes les lignes qui ont la même date originale (ou actuelle quand les lignes testées n'ont jamais été modifiées...). Pour cela, sélectionner les lignes qui correspondent à ce critère, et effectuer la modification.
    Alors toutes les lignes dont la date originale était la même seront bien modifiées...

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Ou se trouve l'événement RowChange?

    Plus exactement comment l'édité? Car je ne le trouve pas dans les événements du datagridview.

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    C'est un événement de la DataTable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    maDataTable.RowChanged += new DataRowChangeEventHandler(OnRowChanged);
     
    void OnRowChanged(object sender, DataRowChangeEventArgs e)
    {
        // le traitement que je veux
    }

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    mais je sais pas ou inseré le nouvelle événement pour quel soit pris en compte. Dans la fonction MAJ je ne peux pas puisqu'elle dépend d'un bouton.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    eeeeeeuh

    Alors, la ligne "maDataTable.RowChanged += etc" est à insérer par exemple au moment où la DataTable est définie. Ainsi, dès qu'une modification sera faite dans les lignes de la table, par exemple lors du Fill ou lors de la modification d'un des DataRow de la table y compris à travers le DataViewGrid, la fonction OnRowChanged sera appelée...

    Ou alors on peut le faire "maDataTable.RowChanged += monDataRowChangeEventHandler" juste avant d'associer la table au DataViewGrid et "maDataTable.RowChanged -= monDataRowChangeEventHandler" juste après refermé le formulaire, de sorte que la fonction OnRowChanged ne soit jamais appelée que pendant l'édition de la table via le DataGridView.

    Enfin c'est toi qui vois, ça dépend de ton projet et de ce que tu veux faire exactement

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    D'apres ce que tu me dis, je pense pas que je puisse l'intégré dans mon projet.
    Donc voici le main de ma form.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            public page_modification_creation_date_effet()
            {
                InitializeComponent();
                displayTableDate();
                buttonSave.Enabled = false;
                buttonModifier.Enabled = false;
            }
    j'ai la definition des tableaux en temps que variable public.

    Dans displayTableDate(); j'affecte la table <date> en temps que Datasource pour le datagridview1 la requete qui groupe et selectionne seulement les date. Et en meme temps j'affecte en temps la table <visu> en temps que Datasource pour le datagridview2 la requete qui selectionne tous.

    Puis j'ai une fonction MAJ qui modifie les valeurs de la table. D'une part toute les valeurs autres que la date par le datagridview2 et de l'autre part je souhaite modifier toute les dates identiques à celle du datagriedview1 qui seraient modifier.
    Donc je sais pas comment faire.

    Je ne créé pas de nouveau formulaire, et je ne peux pas le faire au moment de l'affectation de la

  16. #16
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Merci Astartee
    mais comme tu l'avais dit j'affecté mal ma ROW avec ma table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    rowdate = tab_date.Rows[0]; //Affectation avec l'index
    string Stringcmd = "Update <MaTable> SET DATE = :NewDate WHERE DATE = :OldDate";
                        OracleCommand UpdateDate = new OracleCommand(Stringcmd, connexion);
                        UpdateDate.CommandType = CommandType.Text;
                        UpdateDate.Parameters.Add("NewDate", OracleDbType.Date, DateTime.Parse(rowdate["DATE", DataRowVersion.Current].ToString()), ParameterDirection.Input);
                        UpdateDate.Parameters.Add("OldDate", OracleDbType.Date, DateTime.Parse(rowdate["DATE", DataRowVersion.Original].ToString()), ParameterDirection.Input);
                        connexion.Open();
                        UpdateDate.ExecuteNonQuery();
                        tab_date.AcceptChanges();

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

Discussions similaires

  1. pb d'execution d'une requete sql
    Par pit9.76 dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/06/2004, 12h03
  2. Réponses: 2
    Dernier message: 03/05/2004, 12h13
  3. date d'une requete sql
    Par innosang dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/04/2004, 09h27
  4. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51
  5. Une requete SQL unpeux difficile !!
    Par nil dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/03/2004, 12h32

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