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

Windows Forms Discussion :

Alimenter une table à partir d'une autre


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut Alimenter une table à partir d'une autre
    Salut,

    Je cherche à alimenter un champs d'une table1 par une requête select effectuée sur une Table2.

    Je m'explique mieux :

    J'ai une première table qui contient un champs nomOuvrier rempli et un 2ième champs CodeOuvrier, à priori vide, mais qui va être rempli à partir d'une autre table contenant les codes relatifs à chaque nom.

    Une idée.. Ca pourrait être un trigger ? une procédure stockée?? un service windows ?? un windows Form ???
    J'ai essayé un windows form avec une requete UPDATE / SELECT imbriquée mais je m'en sors pas.

    Toute piste me sera utile.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il faudrait plus de précisions
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par amirad Voir le message
    J'ai essayé un windows form avec une requete UPDATE / SELECT imbriquée mais je m'en sors pas.
    A priori c'est la méthode la plus simple... qu'est-ce que tu as écrit comme requête ?

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Voilà la requête que j'ai utilisée :

    requete = "UPDATE TableA SET CodeA =(select CodeB from TableB where CahmpsBB ='XX')"

    Merci pour toute remarque.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Re bonjour,
    Voilà je mets toute ma méthode :

    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
     
     Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            'Etape 1 : Sélection des données depuis la 1ère table
     
            Try
                maConnexion = New OleDbConnection
                maConnexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source='C:\Documents and Settings\test.mdb'"
     
    'Affichage des données de la tableA dans un DataGridView
                 strSql = "select NomA, CodeA from TableA"
     
                maConnexion.Open()
                myCommand = New OleDbCommand(strSql, maConnexion)
                myDataAdapter = New OleDbDataAdapter(myCommand)
                myCommand.Connection = maConnexion
                myDataAdapter.Fill(myDataSet, "TableA")
                myDataTable = myDataSet.Tables("TableA")
                DataGridView1.DataSource = myDataTable
     
            Catch ex As SqlException
                MessageBox.Show(ex.Message)
            End Try
     
     
            'Etape 2 :Mise à jour du DataGridView1
     
                Try
     
               requete = "UPDATE TableA SET CodeA =(select CodeB from TableB where NomB ='XXX')"
     
                myCommand1 = New OleDbCommand(requete, maConnexion)
                myDataAdapter1 = New OleDbDataAdapter(myCommand1)
                myCommand1.Connection = maConnexion
                myDataAdapter1.Fill(myDataSet1, "TableA")
                myDataTable1 = myDataSet1.Tables("TableA")
                DataGridView1.DataSource("CodeA") = myDataTable1
                DataGridView1.Refresh()
            Catch ex As Exception
            End Try
     
        End Sub

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    j'ai regardé vite fait, mais je vois déjà 2 problèmes...
    - dans ta requête UPDATE, il n'y a pas de WHERE (il y en a un dans la sous-requête mais pas dans la requête principale), donc tu vas mettre à jour toutes les lignes de la table... tu es sûr que c'est ce que tu veux ?
    - tu utilises une requête UPDATE pour faire un Fill d'un DataTable... ça n'a absolument aucun sens ! Quand tu fais : new OleDbDataAdapter(myCommand1), tu crées un DataAdapter qui utilise myCommand1 comme SelectCommand. Or la requête en question est un Update... Fill sert à remplir une DataTable à partir de la base, en utilisant la SelectCommand, donc (comme son nom l'indique) il faut que ce soit un SELECT... Pour faire la mise à jour, on utilise UpdateCommand, InsertCommand et DeleteCommand. J'ai l'impression que tu n'as pas bien compris le principe des DataAdapters... Tu devrais jeter un oeil à ces 2 tutoriels, histoire de te "rafraichir la mémoire"
    http://dotnet.developpez.com/articles/ado1/
    http://dotnet.developpez.com/articles/ado2/
    (ça concerne SQL Server, mais le principe est exactement le même pour tous les types de BDD, il faut juste remplacer Sql* par OleDb*)

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Merci tomlev pour votre coopération,
    Oui c'est vrai, tout est mélangé dans ma tête à propos des dataser, datareader, etc..
    Je les ai utilisé pour récupérer des données, supprimer, ajouter dans la base de données avec des requêtes simples, mais dès que les choses se sont compliquées, je m'en sors plus. Je verrai du côté des tutoriels que tu m'a envoyé.

  8. #8
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Voilà mon nouveau code, cependant la mise à jour n'est pas effectuée à partir de la 2ième table, c'est juste une mise à jour statique.
    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
     
     
    Public Shared Sub main()
     
            Dim thisConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source='C:\Documents and Settings\test.mdb'")
     
            Dim requete As String = "SELECT * FROM TableA"
            Dim updateRequete As String = "UPDATE TableA SET CodeA = @CodeA" 
     
            Try
                ' Create Data Adapter
                Dim da As New OleDbDataAdapter
                da.SelectCommand = New OleDbCommand(requete, thisConnection)
     
                ' Create and fill Dataset
                Dim ds As New DataSet
                da.Fill(ds, "TableA")
     
                ' Get the Data Table
                Dim dt As DataTable = ds.Tables("TableA")
     
               'Modify CodeA
               dt.Rows(0)("CodeA") = "XXX"
     
     
                ' Update TableA
                ' 1. Create Command
                Dim UpdateCmd As New OleDbCommand(updateRequete, thisConnection)
     
                ' 2. Map Parameters
                ' 2.1 CodeA
                UpdateCmd.Parameters.Add("@CodeA", OleDbType.Char, 50, "CodeA")
     
     
                ' Update TableA
                da.UpdateCommand = UpdateCmd
                da.Update(ds, "TableA")
     
            Catch ex As OleDbException
                ' Display error
                Console.WriteLine("Error: " & ex.ToString())
            End Try
        End Sub
    Pour que cette mise à jour soit faite à partir de la tableB , j'ai modifié requeteUpdate ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim updateRequete As String = "UPDATE TableA SET CodeA = (select CodeB from TableB where NomA= 'YYY')"
    Merci pour toute éventuelle intervention.

  9. #9
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Je comprends pas trop ce que tu cherches à faire... si tu veux que CodeA soit mis à jour à partir de la TableB, à quoi sert cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt.Rows(0)("CodeA") = "XXX"

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Cette ligne était juste pour tester si tout va bien avec un update statique (par la valeur XXX).
    Elle est supprimée par suite et la nouvelle requête de mise à jour sera celle présentée ci-haut.

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    A vrai dire, à la base, si tu veux mettre à jour une table A à partir des données d'une table B, je ne vois aucun bénéfice à faire transiter les dites données par l'application cliente.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    A vrai dire, à la base, si tu veux mettre à jour une table A à partir des données d'une table B, je ne vois aucun bénéfice à faire transiter les dites données par l'application cliente.
    +1
    Dans ce cas le mode déconnecté n'apporte rien...

  13. #13
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par tomlev Voir le message
    +1
    Dans ce cas le mode déconnecté n'apporte rien...
    Dans ce cas, comment procéder alors?

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par amirad Voir le message
    Dans ce cas, comment procéder alors?

    Ben tu fais ta requête sql d'update, tu instancies un objet DbCommand, et tu l'exécutes.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  15. #15
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ben tu fais ta requête sql d'update, tu instancies un objet DbCommand, et tu l'exécutes.
    Resalut,
    Voilà ce que j'ai fait :
    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
     
    Try
                Dim Connexion As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source='C:\Documents and Settings\test.mdb'")
     
                Dim Commande As New OleDbCommand
     
                'Définition des paramètres de connexion
                Commande.Connection = Connexion
                Commande.CommandType = CommandType.Text
                Commande.CommandText = "UPDATE Table1 SET CodeA=(select CodeB from TableB where NomB ='XXX')"
     
                'Ouvre la connexion
                Connexion.Open()
                Commande.ExecuteScalar()
     
                Connexion.Close()
            Catch ex As OleDbException
                MessageBox.Show(ex.Message)
     
            End Try
    J'obtiens le message d'erreur suivant :
    L'opération doit utiliser une requête qui peut être mise à jour.

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ExecuteScalar sert à retourne une (et unique) valeur via un select par exemple
    ExecuteReader sert à retourner un tableau de valeur via un select
    pour des update insert et delete, c'est ExecuteNonQuery qu'il faut utiliser
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par amirad Voir le message
    J'obtiens le message d'erreur suivant :
    L'opération doit utiliser une requête qui peut être mise à jour.
    Utilise ExecuteNonQuery à la place de ExecuteScalar.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  18. #18
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Utilise ExecuteNonQuery à la place de ExecuteScalar.
    Bonsoir,
    J'ai testé avec ExecuteNonQuery mais j'ai toujours le même message d'erreur :

    L'opération doit utiliser une requête qui peut être mise à jour.

  19. #19
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 296
    Points : 81
    Points
    81
    Par défaut
    Bonjour,
    Voilà je vous explique mon objectif autrement puisque j'ai pas pu avancer.

    J'ai deux tables : TableA et TableB.

    TableA contient deux champs NomPays et CodePAys. (Exemple : Tunisie -- TN ; France -- FR, etc..)

    TableB contient plusieurs champs, entre autre NomPays et CodePays sauf que les CodesPays ne sont pas mentionnés.

    Donc je dois renseigner les CodePays dans TableB en se référant à TableA.

    J'ai pensé à un Update avec un Select imbriqué mais toujours bloquée.

  20. #20
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Bonjour !

    Je crois que cela a été dit avant un update ne marche pas comme ca, il faut une clause where sinon tous les champs seront mis à jour ca pourrait donner par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commande.CommandText = "UPDATE Table1 SET CodeA=002 WHERE CodeA=(select CodeB from TableB where NomB ='XXX')"
    C'est un exemple bien sur, par ailleurs un executeScalar pour un update... Bon soit. Mais ca serait mieux de mettre ca je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Commande.ExecuteNonQuery()
    Enfin je proposa ca mais mieux vaut attendre des avis d'expert =)

    ++
    ►Ne pas oublier le

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. [AC-2003] alimenter une table à partir d'une autre (deux bases données différentes)
    Par simodear dans le forum Modélisation
    Réponses: 7
    Dernier message: 24/03/2010, 10h05
  3. [Tables] Update d'une table à partir d'une autre
    Par le_niak dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/01/2008, 09h01
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. Réponses: 5
    Dernier message: 06/01/2005, 12h07

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