1

我有一个启用编辑的 gridview (CustomerDetails)。当我单击编辑按钮并更新 5/6 字段之一(我将所有字段更改为模板字段,然后将编辑模板设置为我不想编辑的字段的标签)时,我收到一个错误:

“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 的一个副作用是 Visual Studio 将 OldValuesParameterFormatString 属性设置为 original_{0}。此属性值用于包含正在编辑的数据的原始值,在两种情况下很有用:

  • 如果在编辑记录时,用户能够更改主键值。在这种情况下,必须同时提供新的主键值和原始主键值,以便找到具有原始主键值的记录并相应更新其值。

  • 使用乐观并发时。乐观并发是一种确保两个同时用户不会覆盖彼此的更改的技术,并且是未来教程的主题。

OldValuesParameterFormatString 属性指示基础对象的原始值的更新和删除方法中的输入参数的名称。当我们探索乐观并发时,我们将更详细地讨论这个属性及其用途。然而,我现在提出它,因为我们 BLL 的方法不期望原始值,因此删除这个属性很重要。当数据 Web 控件尝试调用 ObjectDataSource 的 Update() 或 Delete() 方法时,将 OldValuesParameterFormatString 属性设置为默认值 ({0}) 以外的任何值都会导致错误,因为 ObjectDataSource 将尝试同时传入 UpdateParameters 或DeleteParameters 指定以及原始值参数。

如果此时还不是很清楚,请不要担心,我们将在以后的教程中检查此属性及其实用性。现在,只需确保从声明性语法中完全删除此属性声明或将值设置为默认值 ({0})。

注意:如果您只是简单地从设计视图的属性窗口中清除 OldValuesParameterFormatString 属性值,该属性将仍然存在于声明性语法中,但被设置为空字符串。不幸的是,这仍然会导致上面讨论的相同问题。因此,要么从声明性语法中完全删除该属性,要么从“属性”窗口将值设置为默认值 {0}。

但是,它也与SqlDataSource.ConflictDetection 属性有关

如前所述,仅当ConflictDetection设置为CompareAllValues时,应将附加参数添加到 Update Method 调用中(并且原始值的参数的确切名称取决于 OldValuesParameterFormatString 属性。)

默认情况下,ConflictDetection属性设置为OverwriteChanges,这意味着数据源控件将覆盖在数据源控件第一次从行中读取数据到更新行之间对数据行所做的任何更改。主键用于定位将要更新或删除的数据行,但不执行其他数据比较。但是,如果将数据源控件配置为使用 CompareAllValues 选项,则该控件将传递 Update 和 Delete 方法的 oldValues 集合中的原始数据,以便您可以编写逻辑以仅当这些值与当前值匹配时才更新或删除数据在数据存储中。匹配值表明数据自读取后未发生变化。

所以这对我来说并不完全清楚......似乎如果默认情况下 ConflictDetection 属性设置为 OverwriteChanges,则不应向 UpdateMethod 添加额外的 *original_{0}* 参数!

于 2012-10-24T10:23:52.523 回答