1

編集が有効になっているグリッドビュー (CustomerDetails) があります。編集ボタンをクリックして 5/6 フィールドの 1 つを更新すると (すべてのフィールドを templatefield に変更し、edittemplate を編集可能にしたくないフィールドのラベルに設定します)、エラーが発生します:

「ObjectDataSource 'ObjectDataSource1' は、パラメーターを持つ非ジェネリック メソッド 'UpdateCustomerAddressZip' を見つけることができませんでした: CustomerID、CustomerAddressOne、CustomerAddressTwo、CustomerZip、original_CustomerID」

オブジェクトのデータソース コードは次のとおりです。

    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" InsertMethod="InsertCustomer"
        OldValuesParameterFormatString="original_{0}" SelectMethod="CustomerDetails" UpdateMethod="UpdateCustomerAddressZip"
        TypeName="Enterprise.CustomerEntityLayer">
        <InsertParameters>
            <asp:Parameter Name="CustomerID" Type="Int32" />
            <asp:Parameter Name="CustomerAddressOne" Type="String" />
            <asp:Parameter Name="CustomerAddressTwo" Type="String" />
            <asp:Parameter Name="CustomerZip" Type="String" />
        </InsertParameters>
        <UpdateParameters>
        <asp:Parameter Name="CustomerID" Type="Int32" />
        <asp:Parameter Name="CustomerAddressOne" Type="String" />
        <asp:Parameter Name="CustomerZip" Type="String" />
        </UpdateParameters>
        <SelectParameters>
            <asp:ControlParameter ControlID="Gridview1" DbType="Int32" Name="CustomerID" PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:ObjectDataSource>

エンティティレイヤーでの私の方法は次のとおりです。

Public Function UpdateCustomerAddressZip(ByVal CustomerID As Integer, ByVal CustomerAddressOne As String, ByVal CustomerZip As Integer)
                Dim dt As New CustomerDataTable
                Dim C_row As CustomerRow = dt.NewCustomerRow

                    C_row.CustomerID = CustomerID
                    C_row.CustomerAddressOne = CustomerAddressOne
                    C_row.CustomerZip = CustomerZip

                Adapter.UpdateCustAddZip(CustomerID, CustomerAddressOne, CustomerZip)
            End Function

SQLが

UPDATE Customer
SET CustomerAddressOne = @CustomerAddressOne,
CustomerZip = @CustomerZip
WHERE CustomerID=@CustomerID

誰がどこが間違っているのかアドバイスできますか?

ありがとう

4

1 に答える 1

2

簡単な答え: OldValuesParameterFormatString="original_{0}"OldValuesParameterFormatString="{0}"に変更します

エラーからわかるように:

「ObjectDataSource 'ObjectDataSource1' は、パラメーターを持つ非ジェネリック メソッド 'UpdateCustomerAddressZip' を見つけることができませんでした: CustomerID、CustomerAddressOne、CustomerAddressTwo、CustomerZip、original_CustomerID」

追加のパラメーターがあります: original_CustomerID

データベースで実行している更新が他の誰かの変更と競合しないようにするために、オプティミスティック コンカレンシーを実装する場合があります。

Scott Mitchell によるこのチュートリアルで美しく説明されています。便宜上、ここで関連部分を報告します。

ウィザードを使用して ObjectDataSource を構成することによる副作用の 1 つは、Visual Studio が OldValuesParameterFormatString プロパティを original_{0} に設定することです。このプロパティ値は、編集中のデータの元の値を含めるために使用され、次の 2 つのシナリオで役立ちます。

  • レコードを編集するときに、ユーザーが主キーの値を変更できる場合。この場合、新しい主キー値と元の主キー値の両方を指定して、元の主キー値を持つレコードを見つけ、それに応じて値を更新できるようにする必要があります。

  • オプティミスティック コンカレンシーを使用する場合。オプティミスティック コンカレンシーは、2 人の同時ユーザーが互いの変更を上書きしないようにするための手法であり、今後のチュートリアルのトピックです。

OldValuesParameterFormatString プロパティは、基になるオブジェクトの元の値に対する update メソッドと delete メソッドの入力パラメーターの名前を示します。このプロパティとその目的については、オプティミスティック コンカレンシーを調べるときに詳しく説明します。ただし、BLL のメソッドは元の値を想定していないため、このプロパティを削除することが重要であるため、ここで取り上げます。OldValuesParameterFormatString プロパティをデフォルト ({0}) 以外に設定したままにしておくと、データ Web コントロールが ObjectDataSource の Update() または Delete() メソッドを呼び出そうとしたときにエラーが発生します。指定された DeleteParameters と元の値のパラメーター。

この時点でこれが非常に明確でない場合でも、心配する必要はありません。このプロパティとその有用性については、今後のチュートリアルで説明します。とりあえず、このプロパティ宣言を宣言構文から完全に削除するか、値をデフォルト値 ({0}) に設定してください。

注: デザイン ビューの [プロパティ] ウィンドウから OldValuesParameterFormatString プロパティ値を単純にクリアすると、プロパティは宣言構文に残りますが、空の文字列に設定されます。残念ながら、これでも上記と同じ問題が発生します。したがって、宣言構文からプロパティを完全に削除するか、[プロパティ] ウィンドウから値をデフォルトの {0} に設定してください。

しかし、それはSqlDataSource.ConflictDetection プロパティにも関連しています

そこに記載されているように、 ConflictDetectionがCompareAllValuesに設定されている場合にのみ、追加のパラメーターを Update メソッドの呼び出しに追加する必要があります (元の値のパラメーターの正確な名前は、OldValuesParameterFormatString プロパティによって異なります)。

デフォルトでは、ConflictDetectionプロパティはOverwriteChangesに設定されています。これは、データ ソース コントロールが最初に行からデータを読み取ってから行が更新されるまでの間にデータ行に加えられた変更を、データ ソース コントロールが上書きすることを意味します。主キーは、更新または削除されるデータ行を見つけるために使用されますが、データのその他の比較は実行されません。ただし、CompareAllValues オプションを使用するようにデータ ソース コントロールが構成されている場合、コントロールは Update メソッドと Delete メソッドの oldValues コレクションで元のデータを渡すため、これらの値が現在の値と一致する場合にのみ、データを更新または削除するロジックを記述できます。データストレージで。一致する値は、データが読み取られてから変更されていないことを示します。

したがって、これは私には完全には明らかではありません... デフォルトで ConflictDetection プロパティが OverwriteChanges に設定されている場合、*original_{0}* パラメータを UpdateMethod に追加する必要はないようです!

于 2012-10-24T10:23:52.523 に答える