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 Presentation Foundation Discussion :

[WPF][ADO.NET] TableAdapterManager.UpdateAll vers Table Access?


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut [WPF][ADO.NET] TableAdapterManager.UpdateAll vers Table Access?
    Bonjour

    J'essaie de trouver le moyen de mettre à jour les modifications effectuées par l'utilisateur de mon interface WPF(à la fermeture) vers ma table Access (qui sert également à remplir le Dataset à l'ouverture de l'interface).

    En WinForms, j'écrivait juste:
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub MainWindow_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If Me.DataSet.HasChanges AndAlso Not DataSet.HasErrors Then
                'Appliquer les changements dans la base de données
                Me.TableAdapterManager.UpdateAll(Me.DataSet)
            End If
        End Sub

    En WPF, non seulement VB2010Express ne trouve pas le Dataset, mais il ne trouve pas le TableAdapterManager non plus. En cherchant les différences entre WinForms et WPF, j'ai découvert qu'en WPF, les classes ADO.NET sont bel et bien créees automatiquement comme en WinForms(dans Dataset.Designer.vb).En revanche, aucune classe n'est instanciée en un objet "utilisable clé en main" comme en WinForms (pas de fichier Form1.Designer.vb)...
    J'ai réussi à instancier un objet Dataset dans Window1.xaml.vb et refaire tous mes Bindings, mais ca plante toujours sur la ligne du TableAdapterManager.UpdateAll() même si je l'ai instancié...
    L'exception System.ApplicationException n'a pas été gérée par le code utilisateur
    Message=TableAdapterManager ne contient pas d'informations de connexion. Définissez chaque propriété TableAdapterManager TableAdapter à une instance valide de TableAdapter.
    Source=FFXIMDCwpf2
    StackTrace:
    à FFXIMDCwpf2.DataSetTableAdapters.TableAdapterManager.UpdateAll(DataSet dataSet) dans C:\Users\Raphaël\Desktop\FFXIMDC VB.NET\FFXIMDCwpf\FFXIMDCwpf2\FFXIMDCwpf2\DataSet.Designer.vb:ligne 79030
    à FFXIMDCwpf2.MainWindow.MainWindow_Closing(Object sender, CancelEventArgs e) dans C:\Users\Raphaël\Desktop\FFXIMDC VB.NET\FFXIMDCwpf\FFXIMDCwpf2\FFXIMDCwpf2\MainWindow.xaml.vb:ligne 78
    à System.Windows.Window.OnClosing(CancelEventArgs e)
    à System.Windows.Window.WmClose()
    InnerException:
    Dois-je retaper 20 déclarations de TableAdapter pour chacune de mes 20 tables Access + une Sub ForEach TableAdapterManager.Add(TableAdapter(i)) ? Quelqu'un aurait-il une idée comment gérer une mise à jour hiérarchique(je crois ca s'appelle comme ca ?) en WPF+ADO.Net ?

    Mon code actuel (Window1.xaml.vb) :
    Code vb.net : 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    Imports System.Data
    Imports System.Collections.ObjectModel
    Imports System.ComponentModel
     
    Class MainWindow
        ' Instanciation of the DataSet + all TableAdapters
        Dim DataSet As New FFXIMDCwpf2.DataSet
        Dim TAM As FFXIMDCwpf2.DataSetTableAdapters.TableAdapterManager
     
        ' Creation of BindingCollectionViews (supporting INotifyCollectionChanged et CustomFilter interfaces) which will serve as ItemsSource to Comboboxs.
        ' Notice: since can't directly GetDefaultView(Datatable) to build those BindingCollectionViews,
        ' have to initialize each BindingCollectionView beforehand with its own DataView, so each view can be filtered independently.
        Dim MainJobBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.JobsList)), BindingListCollectionView)
        Dim SubJobBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.JobsList)), BindingListCollectionView)
        Dim MainWeapon1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Weapon)), BindingListCollectionView)
        Dim SubWeapon1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Weapon)), BindingListCollectionView)
        Dim MainWeapon2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Weapon)), BindingListCollectionView)
        Dim SubWeapon2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Weapon)), BindingListCollectionView)
        Dim RangedWeaponBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ranged)), BindingListCollectionView)
        Dim Ammo1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ammo)), BindingListCollectionView)
        Dim Ammo2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ammo)), BindingListCollectionView)
        Dim HeadBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Head)), BindingListCollectionView)
        Dim NeckBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Neck)), BindingListCollectionView)
        Dim LeftEarTP1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ear)), BindingListCollectionView)
        Dim LeftEarTP2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ear)), BindingListCollectionView)
        Dim RightEarTP1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ear)), BindingListCollectionView)
        Dim RightEarTP2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ear)), BindingListCollectionView)
        Dim BodyBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Body)), BindingListCollectionView)
        Dim HandsBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Hands)), BindingListCollectionView)
        Dim LeftRingTP1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ring)), BindingListCollectionView)
        Dim LeftRingTP2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ring)), BindingListCollectionView)
        Dim RightRingTP1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ring)), BindingListCollectionView)
        Dim RightRingTP2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Ring)), BindingListCollectionView)
        Dim BackBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Back)), BindingListCollectionView)
        Dim WaistBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Waist)), BindingListCollectionView)
        Dim LegsBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Legs)), BindingListCollectionView)
        Dim FeetBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Feet)), BindingListCollectionView)
        Dim WS1BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.WStable)), BindingListCollectionView)
        Dim WS2BindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.WStable)), BindingListCollectionView)
        Dim JABindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.JobAbilities)), BindingListCollectionView)
        Dim MobsFamiliesBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.MobData)), BindingListCollectionView)
        Dim MobsBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.Enemies)), BindingListCollectionView)
        Dim BLUspellsBindingList As BindingListCollectionView = CType(CollectionViewSource.GetDefaultView(New DataView(DataSet.BLUspells)), BindingListCollectionView)
        Dim AreasBindingList As New ObservableCollection(Of String)
     
        'Variable to avoid intempestive calls to the Filtering Procedure(not show here) after loading of the window.
        Private IsReady As Boolean = False
     
        Private Sub MainWindow_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
            'Apply changes into the Access Databases
            TAM.UpdateAll(DataSet)
        End Sub
     
        Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles MyBase.Loaded
            'Load data into JobsList.
            TAM.JobsListTableAdapter.Fill(DataSet.JobsList)
            'Load data into table Food.
            TAM.FoodTableAdapter.Fill(DataSet.Food)
            'Load data into table Buffs.
            TAM.BuffsTableAdapter.Fill(DataSet.Buffs)
            'Load data into table Weapon.
            TAM.WeaponTableAdapter.Fill(DataSet.Weapon)
            'Load data into table Ranged.
            TAM.RangedTableAdapter.Fill(DataSet.Ranged)
            'Load data into table Ammo.
            TAM.AmmoTableAdapter.Fill(DataSet.Ammo)
            'Load data into table Head.
            TAM.HeadTableAdapter.Fill(DataSet.Head)
            'Load data into table Neck.
            TAM.NeckTableAdapter.Fill(DataSet.Neck)
            'Load data into table Ear.
            TAM.EarTableAdapter.Fill(DataSet.Ear)
            'Load data into table Body.
            TAM.BodyTableAdapter.Fill(DataSet.Body)
            'Load data into table Hands.
            TAM.HandsTableAdapter.Fill(DataSet.Hands)
            'Load data into table Ring.
            TAM.RingTableAdapter.Fill(DataSet.Ring)
            'Load data into table Back.
            TAM.BackTableAdapter.Fill(DataSet.Back)
            'Load data into table Waist.
            TAM.WaistTableAdapter.Fill(DataSet.Waist)
            'Load data into table Legs.
            TAM.LegsTableAdapter.Fill(DataSet.Legs)
            'Load data into table Feet.
            TAM.FeetTableAdapter.Fill(DataSet.Feet)
            'Load data into table WeaponSkills.
            TAM.WStableTableAdapter.Fill(DataSet.WStable)
            'Load data into table JobAilities.
            TAM.JobAbilitiesTableAdapter.Fill(DataSet.JobAbilities)
            'Load data into table Monsters Families/Races.
            TAM.MobDataTableAdapter.Fill(DataSet.MobData)
            'Load data into table Monsters.
            TAM.EnemiesTableAdapter.Fill(DataSet.Enemies)
            'Load data into table Skills.
            TAM.SkillsTableAdapter.Fill(DataSet.Skills)
            'Load data into table Stat and Skill Grades.
            TAM.Job_StatSkill_GradesTableAdapter.Fill(DataSet.Job_StatSkill_Grades)
            'Load data into table Skill caps by level.
            TAM.Skill_CapsTableAdapter.Fill(DataSet.Skill_Caps)
            'Load data into table BLU Spells.
            TAM.BLUspellsTableAdapter.Fill(DataSet.BLUspells)
            'Load data into table Areas.
            TAM.AreasTableAdapter.Fill(DataSet.Areas)
     
            ' Build of "Description" Column for each equipment DataTables.
            ' Each field of this column contains a String concatenating all non-null DataRowCell,
            ' and will be used as dynamic content for a ToolTip on each ComboBoxItems and SelectedItems.
            BuildDescriptors()
     
            'Sets DataContexts for all ComboBoxs on the interface.
            MainJob.DataContext = MainJobBindingList
            SubJob.DataContext = SubJobBindingList
            MainJob.SelectedValue = "BLM"
            SubJob.SelectedValue = ""
            Food1.DataContext = DataSet.Food
            Food2.DataContext = DataSet.Food
            Buffs1.DataContext = DataSet.Buffs
            Buffs2.DataContext = DataSet.Buffs
            MainWeapon1.DataContext = MainWeapon1BindingList
            SubWeapon1.DataContext = SubWeapon1BindingList
            MainWeapon2.DataContext = MainWeapon2BindingList
            SubWeapon2.DataContext = SubWeapon2BindingList
            RangedWeapon1.DataContext = RangedWeaponBindingList
            RangedWeapon2.DataContext = RangedWeaponBindingList
            AmmoTP1.DataContext = Ammo1BindingList
            AmmoTP2.DataContext = Ammo2BindingList
            HeadTP1.DataContext = HeadBindingList
            HeadTP2.DataContext = HeadBindingList
            NeckTP1.DataContext = NeckBindingList
            NeckTP2.DataContext = NeckBindingList
            LeftEarTP1.DataContext = LeftEarTP1BindingList
            LeftEarTP2.DataContext = LeftEarTP2BindingList
            RightEarTP1.DataContext = RightEarTP1BindingList
            RightEarTP2.DataContext = RightEarTP2BindingList
            BodyTP1.DataContext = BodyBindingList
            BodyTP2.DataContext = BodyBindingList
            HandsTP1.DataContext = HandsBindingList
            HandsTP2.DataContext = HandsBindingList
            LeftRingTP1.DataContext = LeftRingTP1BindingList
            LeftRingTP2.DataContext = LeftRingTP2BindingList
            RightRingTP1.DataContext = RightRingTP1BindingList
            RightRingTP2.DataContext = RightRingTP2BindingList
            BackTP1.DataContext = BackBindingList
            BackTP2.DataContext = BackBindingList
            WaistTP1.DataContext = WaistBindingList
            WaistTP2.DataContext = WaistBindingList
            LegsTP1.DataContext = LegsBindingList
            LegsTP2.DataContext = LegsBindingList
            FeetTP1.DataContext = FeetBindingList
            FeetTP2.DataContext = FeetBindingList
            WS1.DataContext = WS1BindingList
            WS2.DataContext = WS2BindingList
            JAs1.DataContext = JABindingList
            JAs2.DataContext = JABindingList
     
            IsReady = True
        End Sub

    Côté XAML, c'est bien simple: toutes mes Combos éditables sont bindées par ItemsSource="{Binding}" via un Style générique en ressource.

    Je suis open aux suggestions d'ADO directement en XAML si c'est possible aussi ? (histoire d'alléger le code de Class Window1)

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Il y a quelquechose que je ne comprends pas:

    Toutes les classes pour DataTables et TableAdapters existent dans le fichier Designer.vb, ok mais...
    En tant que Classes, ce ne sont pas des objets instanciés, et par conséquent il devrait etre impossible pour l'application de faire une transaction quelconque avec ma table Access. Et en effet, je ne trouve AUCUN objet tableadapter ou dataTable...
    Et c'est là que je ne comprends pas: sans objet instancié, comment mon appli a t elle pu charger mes données à l'ouverture sans probleme ?

    Du coup, la même question se pose en sens inverse: pourquoi pour enregistrer des modifs, l'appli refuse de faire comme a l' "aller" ? Par cette question je fait surtout référence à l'objet Connection mentionné dans le message d'erreur, qui existe par une string dans mes Settings de Projet, mais là encore aucun objet Connection instancié.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Bon... N'ayant pas réussi à trouver les objets d'origine qui ont servi à charger les données de mes tables Access, j'ai tout retapé "à la main"...

    càd dans le code behind (Class Window1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Dim DataSet As New MonProjet.DataSet
        Dim TAM As New MonProjet.DataSetTableAdapters.TableAdapterManager
        Dim JobsListTableAdapter As New MonProjet.DataSetTableAdapters.JobsListTableAdapter
    etc... pour chacune de vos tables
    ...puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles MyBase.Loaded
            'Load data into JobsList.
            JobsListTableAdapter.Fill(DataSet.JobsList)
            TAM.JobsListTableAdapter = JobsListTableAdapter
            'Load data into table Food.
            FoodTableAdapter.Fill(DataSet.Food)
            TAM.FoodTableAdapter = FoodTableAdapter
            etc... pour chacune de vos tables
    ...et pour finir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub MainWindow_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
            'Build a new "reduced" DataSet containing only the changes made, then Apply changes into the Access Databases
            If DataSet.HasChanges AndAlso Not DataSet.HasErrors Then
                Dim ReducedDataSet As New DataSet
                ReducedDataSet = DataSet.GetChanges()
                TAM.UpdateAll(ReducedDataSet)
            End If
        End Sub
    et les modifs sont enregistrées dans votre table.

    PS: j'ai aussi mis la propriété "Copier dans le repertoire de sortie" à "Copier si plus récent". Cette propriété s'obtient en sélectionnant Propriétés de votre table access dans l'Explorateur de solutions.

    Le topic n'est pas vraiment résolu pour autant ce que j'ai fait c'est du gros bricolage "sale". Si quelqu'un a une idée plus propre, ne pas hésiter.

  4. #4
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 899
    Points : 1 064
    Points
    1 064
    Par défaut
    Je procède de cette manière en C# avec un Dataset Typé, nommé dataSetDBWpf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    // Create the table adapters of the tables
    clientsTableAdapter = new DataSetDBWpfTableAdapters.ClientsTableAdapter();
    commandesTableAdapter = new DataSetDBWpfTableAdapters.CommandesTableAdapter();
    ...
     // Initialize the table adapter manager of the dataset
    tableAdapterManager = new DataSetDBWpfTableAdapters.TableAdapterManager();
    tableAdapterManager.ClientsTableAdapter = clientsTableAdapter;
    tableAdapterManager.CommandesTableAdapter = commandesTableAdapter;
    ...
    .

Discussions similaires

  1. [ADO.net] Client lourd vers un client leger
    Par miya dans le forum Accès aux données
    Réponses: 9
    Dernier message: 13/12/2006, 14h14
  2. [ADO.NET] remplaire datagrid "depuis table relation multiple"
    Par hoda dans le forum Accès aux données
    Réponses: 3
    Dernier message: 05/12/2006, 08h49
  3. [C#/ADO.NET] Comment Updater une table via Datagrid ?
    Par Pierre_45 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 06/07/2006, 11h40
  4. [ADO.Net][OleDb] Pourquoi ma requête access ne fonctionne pas?
    Par Bapt.ice dans le forum Accès aux données
    Réponses: 6
    Dernier message: 05/05/2006, 17h19
  5. [ADO.NET] Installation appli utilisant base access
    Par Didier69 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 27/09/2004, 11h50

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