2008-12-21 7 views
1

Opérations:problème étrange avec la mise à jour la base de données du dataset

Supprimer dans DataGridView choisi la ligne du dataset:

FuDataSet.FuRow row = (FuDataSet.FuRow) ((DataRowView)FuBindingSource.Current).Row; 
row.Delete(); 

Pour ajouter une nouvelle ligne que je fais:

FuDataSet.FuRow row = FuDataSet.Fus.NewFuRow(); 
row.Someting = "Some initial Content"; 
row.SomethingElse = "More Initial Content"; 
... 
FuDataSet.Fus.AddFuRow(row); 

Enregistrement des modifications de l'utilisateur dans la ligne actuelle dans l'ensemble de données:

FuDataSet.FuRow row = (FuDataSet.FuRow) (((DataRowView) FuBindingSource.Current).Row); 
row.Someting = someTextBox.text; 
... 

Enregistrer dans la base de données:

Validate(); 
FuBindingSource.EndEdit(); 
FuTableAdapter.Update(FuDataSet.Fus); <-- Exception here 

J'utilise DataGridView standard, Dataset, TableAdapter, BindingSource Scheme VS met automatiquement après la définition de la structure de base de données. Il n'y a qu'une seule table impliquée et SQL Server compact 3.5 est utilisé. Maintenant, mon problème est que je reçois une exception de simultanéité (DeletedRowInaccessibleException) chaque fois que je fais cela (en commençant par une base de données vide): Créer une nouvelle ligne, supprimer cette ligne, enregistrer dans la base de données, nouvelle ligne, enregistrer dans la base de données, supprimez cette ligne, enregistrez dans la base de données < - Exception

Je pense qu'il existe un problème de synchronisation entre la base de données et l'ensemble de données.

Si je recharge la base de données après chaque sauvegarde via FuTableAdapter.Fill (FuDataSet.Fus), le problème est résolu. Cependant, cela ne peut pas être l'intention que je pense.

J'espère que quelqu'un peut m'aider et repérer un échec dans la conception ou m'expliquer ce qui pourrait mal se passer.

Merci!

+0

Est-ce que l'exception fournit une indication sur quelle ligne son erreur? – JoshBerke

Répondre

1

Votre table comporte-t-elle une colonne d'identité à incrémentation automatique en tant que clé primaire? Si tel est le cas, il se peut que la nouvelle valeur ne soit pas mise à jour avec la nouvelle valeur après l'insertion. Par conséquent, lorsque vous venez de la supprimer, elle ne trouve pas la ligne dans la base de données. Cela pourrait expliquer pourquoi cela fonctionne une fois que vous avez appelé la méthode Fill().

Vous devrez d'une manière ou d'une autre renvoyer la clé primaire sur l'insertion afin que la table de l'ensemble de données reste synchronisée avec la base de données. Si vous utilisez une procédure de magasin pour effectuer les insertions, la clé primaire peut être renvoyée à l'aide d'un paramètre out. Vous ne savez pas quel est le meilleur moyen si vous utilisez une instruction d'insertion SQL dans la commande, mais vous devrez ensuite récupérer la clé primaire de la table de base de données et l'affecter à la ligne de la table de la base de données.

Vous ne savez pas si vous le faites après l'enregistrement, mais l'appel de FuDataSet.AcceptChanges() aidera l'ensemble de données à suivre les nouvelles modifications après la mise à jour de la base de données.

0

Ce que vous avez listé ici est correct. Lorsqu'une nouvelle ligne est créée dans la table de jeu de données, elle crée son propre ID. Lorsque vous enregistrez dans la base de données, la table de base de données crée également son propre ID, qui dans la plupart des cas sera différent de celui de l'ensemble de données. Lorsque vous avez créé l'adaptateur de table pour cette table, vous devez fournir un état sql pour créer la table de jeu de données.

Sur le bouton Options avancées, il y a une case à cocher appelée "Actualiser la table de données". Vérifiez que pour ajouter une instruction sql après l'insertion et mettez à jour pour récupérer la colonne d'identité.

Si la case à cocher est désactivée, je ne suis pas sûr de ce que vous pourriez faire d'autre que de recharger les données après chaque sauvegarde, ce qui ne sera pas optimal.

Désolé, je ne peux pas être plus utile. Bonne chance

Questions connexes