2017-06-05 25 views
1

私はWPFが新しく、ユーザーが編集するときにローカルSQLデータベース内のテーブルを自動的に更新しようとしています。WPFデータグリッドを使用してSQLデータベーステーブルを更新する

私はインサートがうまく動作しているように私は近くにいるように感じますが、アップデート(または削除がわかりませんが、まだそれほど目を向けていません)を理解することはできません。

私は、更新コマンドのストアドプロシージャを呼び出すグリッドにテーブルアダプタを使用しています。私の問題は、CurrentCellChangedイベントでupdateコマンドを呼び出すと、ストアドプロシージャのIDパラメータで渡されていないため、更新が失敗するということです。ここで

は、WPFのxaml.vbページ用の背後に関連するコードです:ここでは

Dim oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("AARP_Conn").ToString) 
' 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 

は、データグリッドマークアップです:

<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> 

そして、ここでは、更新のためのストアドプロシージャです

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 

IDでストアドプロシージャに渡す更新コマンドを取得するにはどうすればよいですか?

UPDATEは、次の更新されたコードは、私の問題解決

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 

答えて

2

このエラー 'この行は取得エラー:。upRiskTierが供給されなかったパラメータ@IDを、期待し'あなたのアダプターが正しく構成されていません。アダプターの列とパラメーターの間に関係はありません.UpdateCommand ...

次の例では、DataTableとコマンドパラメーターの列間の関係を設定する方法を示します。 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; 

- あなたのコマンドは

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

より詳細なあなたは、私はすでににパラメータを設定していて、これは働いていた、なぜ私は本当に理解していないMSDN

+0

上の記事で見ることができなければなりません私のデータセットの列は既にそのように動作していましたが、このようなコードでupdateコマンドを作成すると修正されました。 – rgorr

関連する問題