Mise à jour de la table de database SQL à l'aide de la grid de données WPF

Je suis nouveau à WPF et j'essaye d'avoir un DataGrid automatiquement mettre à jour une table dans une database SQL locale quand un user l'édite.

Je me sens comme si je suis proche de l'insertion, mais je n'arrive pas à comprendre la mise à jour (ou la suppression, mais je n'ai pas encore beaucoup étudié).

J'utilise un adaptateur de table pour la grid qui appelle une procédure stockée pour la command de mise à jour. Mon problème est que lorsque j'appelle la command de mise à jour pour cela dans l'événement CurrentCellChanged, il ne passe pas dans le paramètre ID pour la procédure stockée, donc la mise à jour échoue.

Voici le code approprié pour la page WPF xaml.vb:

Dim oConn As New SqlConnection(ConfigurationManager.ConnectionSsortingngs("AARP_Conn").ToSsortingng) ' construct the dataset Dim dataset As New AARPDataSet ' use a table adapter to populate the Customers table Dim adapter As New AARPDataSetTableAdapters.tblRiskTiersTableAdapter Private Sub _grdRiskTiers_CurrentCellChanged(sender As Object, e As EventArgs) Handles _grdRiskTiers.CurrentCellChanged 'this line gets error: upRiskTier expects parameter @ID, which was not supplied. adapter.Update(dataset.tblRiskTiers) End Sub Private Sub RiskTiersForm_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized adapter.Fill(dataset.tblRiskTiers) ' use the dataset as the DataContext for this Window Me.DataContext = dataset.tblRiskTiers.DefaultView End Sub 

Voici le balisage DataGrid:

 <DataGrid x:Name="_grdRiskTiers" AutoGenerateColumns="False" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="45,20,0,0" VerticalAlignment="Top" Height="199" Width="192" Grid.ColumnSpan="2"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding ID}" ></DataGridTextColumn> <DataGridTextColumn Binding="{Binding LowTierCreditScore}" Header="Low Tier Credit Score"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> 

Et voici la procédure stockée pour la mise à jour:

 CREATE PROCEDURE [dbo].[upRiskTier] @ID as int, @NewLowTierCreditScore as int AS IF EXISTS(SELECT * FROM tblRiskTiers WHERE LowTierCreditScore = @NewLowTierCreditScore) BEGIN DELETE FROM tblRiskTiers WHERE ID = @ID END ELSE BEGIN UPDATE tblRiskTiers SET LowTierCreditScore = @NewLowTierCreditScore WHERE ID = @ID END 

Comment puis-je get la command de mise à jour pour transmettre l'ID à la procédure stockée?

MISE À JOUR : le code mis à jour suivant a résolu mon problème

 Private Sub RiskTiersForm_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized adapter.Fill(dataset.tblRiskTiers) Dim command = New SqlCommand("[dbo].[upRiskTier]") command.CommandType = System.Data.CommandType.StoredProcedure command.Connection = oConn command.Parameters.Add("@ID", System.Data.SqlDbType.Int, 5, "ID") command.Parameters.Add("@NewLowTierCreditScore", System.Data.SqlDbType.Int, 5, "LowTierCreditScore") adapter.Adapter.UpdateCommand = command ' use the Customer table as the DataContext for this Window Me.DataContext = dataset.tblRiskTiers.DefaultView End Sub 

Cette erreur 'cette ligne obtient une erreur: upRiskTier attend le paramètre @ID, qui n'a pas été fourni.' mean – votre adaptateur n'est pas configuré correctement .. Il n'y a pas de relations entre la colonne et les parameters dans votre adaptateur.UpdateCommand …

Dans l'exemple suivant, montre comment définir les relations entre les colonnes dans DataTable et les parameters de command. Vérifiez votre code où vous configurez SqlDataAdapter.

  // Create the UpdateCommand. command = new SqlCommand( "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " + "WHERE CustomerID = @oldCustomerID", connection); // Add the parameters for the UpdateCommand. command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID"); command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName"); SqlParameter parameter = command.Parameters.Add( "@oldCustomerID", SqlDbType.NChar, 5, "CustomerID"); parameter.SourceVersion = DataRowVersion.Original; adapter.UpdateCommand = command; 

Dans votre cas, votre command devrait être

 command = new SqlCommand("[dbo].[upRiskTier]"); command.CommandType = CommandType.StoredProcedure; 

Plus détaillé, vous pouvez voir dans l'article sur MSDN