2010-03-22 8 views
1

Voici ma fonction:TableAdapter.Update ne fonctionne pas

private void btnSave_Click(object sender, EventArgs e) 
    { 
     wO_FlangeMillBundlesTableAdapter.Update(invClerkDataDataSet.WO_FlangeMillBundles); 
     wO_HeadMillBundlesTableAdapter.Update(invClerkDataDataSet.WO_HeadMillBundles); 
     wO_WebMillBundlesTableAdapter.Update(invClerkDataDataSet.WO_WebMillBundles); 
     int rowsaffected = wO_MillTableAdapter.Update(invClerkDataDataSet.WO_Mill); 

     MessageBox.Show(invClerkDataDataSet.WO_Mill.Rows[0]["GasReading"].ToString()); 
     MessageBox.Show(rowsaffected.ToString()); 
    } 

Vous pouvez voir la quatrième mise à jour de la fonction utilise les mêmes fonctionnalités que le reste, je viens des trucs de débogage ajouté. Les trois premières tables sont liées à DataGridViews et fonctionnent correctement. La quatrième table a ses membres liés à différentes zones de texte. Lorsque je change la valeur dans la zone de texte liée à la colonne GasReading et que je clique sur Enregistrer, la première MessageBox affiche en fait la nouvelle valeur, donc elle est correctement incluse dans l'ensemble de données. Toutefois, la ligne affectée affiche toujours 0 et la valeur dans la base de données réelle n'est pas mise à jour.

Quelqu'un peut-il voir mon problème? Je comprends que le problème doit être ailleurs dans mon code puisque les quatre méthodes de mise à jour sont les mêmes, mais je ne sais pas par où commencer.

Voici mon code de liaison:

 txtHours.DataBindings.Add("Text", invClerkDataDataSet.WO_Mill, "HoursRun"); 
     txtGasReading.DataBindings.Add("Text", invClerkDataDataSet.WO_Mill, "GasReading"); 
     txtDelayMins.DataBindings.Add("Text", invClerkDataDataSet.WO_Mill, "DelayMins"); 
     txtGapMins.DataBindings.Add("Text", invClerkDataDataSet.WO_Mill, "GapMins"); 

Je crois savoir qu'il existe des moyens plus élaborés pour lier, mais la liaison n'est pas la question. Encore une fois, les données le font à partir des zones de texte liées dans le datatable, mais elles ne le font pas à partir de là vers la base de données.

+0

Que signifie « MessageBox.Show (invClerkDataDataSet.WO_Mill.Rows [0] .RowState.ToString()); " revenir? – bic

+0

Il montre inchangé. J'ai fait du singe avec ça mais ça n'a pas marché. Quand j'ai fait "invClerkDataDataSet.WO_Mill.Rows [0] .SetModified();" et puis fait la mise à jour, il a dit que les lignes affectées = 1, mais il a remis le texte dans la zone de texte liée à la valeur d'origine automatiquement. – Wesley

Répondre

3
  1. Il est une bonne idée d'appeler wO_MillDataSource.EndEdit() avant adapter.Update(). Pour retirer tous les changements des contrôles.

  2. S'il y a des relations clés étrangères entre la 4ème table et l'une des autres, vous devrez diviser Insérer/Mettre à jour et supprimer des actions, ou utilisez un TableAdapterManager

+0

1. Je ne trouve rien de tel. 2. Il n'y a pas de relations de clé étrangère. – Wesley

+0

Ah, je l'ai trouvé, merci. J'ai dû appeler .EndEdit() sur la ligne dans le datatable. – Wesley

+1

@Wesley: Vous devriez probablement utiliser BindingSource (s) pour lier les contrôles aux tables. Rend la vie plus facile. –