2010-08-19 5 views
2

J'ai un formulaire Windows avec un certain nombre de champs liés aux données relatifs à un client. En outre, j'ai un DataGridView montrant les commandes pour le client actuellement affiché. Pour ce faire, utilisez les contrôles Visual Studio au moment de la conception (par exemple, un DataSet de projet, BindingSources TableAdapters et un TableAdapterManager.)Les modifications de DataSet ne sont pas conservées dans la base de données

Lors du chargement du formulaire pour éditer un client existant, il est rempli à l'aide d'une méthode FillByID (personnalisée) sur l'objet ClientsTableAdapter. filtrez le DataSet sur le client unique, ce qui charge les détails dans les champs du client et remplit correctement les commandes DataGridView

Toutes les modifications apportées aux commandes d'un client (dans DataGridView) sont conservées dans la base de données lors de la sauvegarde Cependant, aucun des champs de détail du client ne sont modifiables et montrent les détails corrects lors du chargement, mais aucune des modifications effectuées n'est sauvegardée lorsque le formulaire est fermé.J'ai essayé deux façons différentes de les conserver maintenant, la première étant en ligne avec l'économie de commande:

this.Validate(); 
this.clientordersBindingSource.EndEdit(); 
this.clientsBindingSource.EndEdit(); 
this.clientordersTableAdapter.Update(projectDataSet.clientorders); 
this.clientsTableAdapter.Update(projectDataSet.clients); 

... et la seconde en utilisant le multiple table example sur MSDN. Malheureusement, aucune de ces méthodes ne fonctionne en ce qui concerne les détails du client - bien que les modifications apportées aux commandes clients soient persistantes dans les deux cas.

Mes clients table a la structure suivante:

refnumber, title, forename, surname, gender, dob, contactnumber 

Le clientsTableAdapter a les cordes CommandText suivantes pour le DeleteCommand, InsertCommand, SelectCommand et UpdateCommand respectivement:

DELETE FROM clients WHERE (refnumber = @Original_refnumber) 
INSERT INTO clients (refnumber, title, forename, surname, gender, dob, contactnumber) VALUES (@refnumber, @title, @forename, @surname, @gender, @dob, @contactnumber) 
SELECT refnumber, title, forename, surname, gender, dob, contactnumber FROM clients 
UPDATE clients SET refnumber = @refnumber, title = @title, forename = @forename, surname = @surname, gender = @gender, dob = @dob, contactnumber = @contactnumber WHERE (refnumber = @Original_refnumber) 

Lors de l'enregistrement, si j'ajoute une variable pour capturer le résultat de cette ligne:

var res = this.clientsTableAdapter.Update(projectDataSet.clients); 
  • projectDataSet.clients.Count == 1
  • projectDataSet.clients.Rows[0].ItemArray montre les champs modifiés.
  • projectDataSet.clients.Rows[0].RowState == Unchanged
  • res == 0

S'il vous plaît quelqu'un peut-il offrir des conseils? Cela m'a rendu fou pendant des jours!


MISE À JOUR

Je recréés la forme à partir de zéro en utilisant le concepteur Visual Studio, puis copié collé & tout le code de la forme originale. Cela fonctionne maintenant. Je suppose que quelque chose devait être faux dans le fichier Designer.cs avec l'un des champs datasources/dataabinding.

Merci pour les conseils de débogage utiles, ewall et Ladislav Mrnka.

+0

Jetez un oeil à myTableAdapter.UpdateCmd.CommandText et postez-le ici si nécessaire. –

+0

TableAdapter.Update() renvoie un nombre entier avec le nombre de lignes qui ont été changées ... s'il renvoie 0 alors peut-être que votre EndEdit() n'est pas appliqué sur l'élément correct (c'est-à-dire actif dans l'édition). – ewall

+0

@ewall: Cela semble être le cas; J'ai plusieurs TableAdapters et BindingSources pour une vue maître-détail sur le formulaire. Comment définir la source actuellement active pour une modification? – Rezzie

Répondre

1

Qu'est-ce que vous économisez aussi pour une source de données? Ensuite, assurez-vous que vos tableurs disposent de commandes de mise à jour, d'insertion et de suppression valides. J'ai eu des problèmes où ils ne sont pas remplis même si le sorcier a dit qu'il l'avait fait.

+0

Il enregistre dans une base de données SQLite en utilisant le composant System.Data.SQLite. Tous les TableAdapters ont des commandes valides. – Rezzie

+0

Avez-vous le fichier dans le cadre de votre projet? Si oui, est-il configuré pour copier dans le répertoire de sortie? Je crois que j'ai rencontré un problème similaire avec Access. Le problème était que lorsque j'ai redémarré l'application, il soufflait mes changements parce qu'il continuait à copier une version propre de la base de données sur celle que j'avais modifiée. Juste une pensée. – Wade73

+0

Oui, la base de données est OK car les modifications apportées aux autres tables sont enregistrées correctement. Seule la table des clients ne sauvegarde pas: / – Rezzie

Questions connexes