我有一个启用了编辑的网格视图(CustomerDetails)。当我单击编辑按钮并更新其中一个5/6字段时(我将所有字段更改为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有没有人能告诉我哪里出错了?
谢谢
发布于 2012-10-24 18:23:53
简单的答案:将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的方法不需要原始值,因此删除这个属性是很重要的。当data Web控件尝试调用ObjectDataSource的更新()或删除()方法时,如果将OldValuesParameterFormatString属性保留为默认值({0})以外的任何值,将导致错误,因为ObjectDataSource将尝试同时传入指定的UpdateParameters或DeleteParameters以及原始值参数。
如果在这一点上还不是很清楚,不要担心,我们将在未来的教程中研究该属性及其实用程序。目前,只需确保从声明性语法中完全删除此属性声明,或者将值设置为默认值({0})。
注意:如果只是从“设计”视图的“属性”窗口中清除OldValuesParameterFormatString属性值,则该属性仍将存在于声明性语法中,但会被设置为空字符串。不幸的是,这仍然会导致上面讨论的相同问题。因此,请从声明性语法中完全移除该属性,或者从“属性”窗口中将该值设置为默认值{0}。
但是,它也与SqlDataSource.ConflictDetection Property有关
如上所述,只有当ConflictDetection设置为CompareAllValues时,才应该将附加参数添加到更新方法调用中(原始值的参数的确切名称取决于OldValuesParameterFormatString属性)。
默认情况下,ConflictDetection属性设置为OverwriteChanges,,这意味着数据源控件将覆盖在数据源控件第一次从数据行中读取数据到更新数据行这段时间内对数据行所做的任何更改。主键用于定位要更新或删除的数据行,但不执行其他数据比较。但是,如果数据源控件配置为使用CompareAllValues选项,则该控件将在更新和删除方法的oldValues集合中传递原始数据,以便只有当这些值与数据存储区中的当前值匹配时,才能编写更新或删除数据的逻辑。匹配值表示数据自读取以来未更改。
所以这对我来说还不是很清楚...看起来,如果ConflictDetection属性默认设置为OverwriteChanges,则不应向UpdateMethod添加额外的*original_{0}*参数!
https://stackoverflow.com/questions/12847942
复制相似问题