Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ObjectDataSource更新_Sql_Gridview_Objectdatasource_Templatefield - Fatal编程技术网

Sql ObjectDataSource更新

Sql ObjectDataSource更新,sql,gridview,objectdatasource,templatefield,Sql,Gridview,Objectdatasource,Templatefield,我有一个启用了编辑功能的gridview(CustomerDetails)。当我单击编辑按钮并更新其中一个5/6字段(我将所有字段更改为templatefield,然后将edittemplate设置为我不想编辑的字段的标签)时,我收到一个错误: ObjectDataSource“ObjectDataSource1”找不到具有以下参数的非泛型方法“UpdateCustomerAddressZip”:CustomerID、CustomerAddressOne、CustomerAddressS2、Cu

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

ObjectDataSource“ObjectDataSource1”找不到具有以下参数的非泛型方法“UpdateCustomerAddressZip”:CustomerID、CustomerAddressOne、CustomerAddressS2、CustomerZip、original\u 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>
在SQL为

UPDATE Customer
SET CustomerAddressOne = @CustomerAddressOne,
CustomerZip = @CustomerZip
WHERE CustomerID=@CustomerID
有人能告诉我哪里出了问题吗

谢谢

简单回答: 更改OldValuesParameterFormatString=“原始”OldValuesParameterFormatString=“{0}”

从错误中可以看出:

“ObjectDataSource'ObjectDataSource1'找不到非泛型 方法“UpdateCustomerAddressZip”,其参数为CustomerID, CustomerAddressOne、CustomerAddressS2、CustomerZip、, “原始用户ID”

还有一个附加参数:original\u CustomerID

如果您想要实现乐观并发性,就需要这样做,以确保您在数据库上执行的更新不会与其他更改冲突

斯科特·米切尔很好地解释了这一点。 为方便起见,我在此报告相关部分:

使用向导配置ObjectDataSource的一个副作用 Visual Studio是否设置了OldValuesParameterFormatString属性 到原始{0}。此属性值用于包含原始属性 正在编辑的数据的值,在两种情况下非常有用:

  • 如果在编辑记录时,用户能够更改主键 价值在这种情况下,新主键值和原始主键值 必须提供主键值,以便 可以找到原始主键值并更新其值 因此

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

OldValuesParameterFormatString属性指示 在基础对象的更新和删除方法中输入参数 对于原始值。我们将讨论此属性及其用途 当我们探索乐观并发性时,将更详细地介绍。我带来了 然而,到现在为止,因为我们的BLL方法并不期望原始的 值,因此删除此属性非常重要。 将OldValuesParameterFormatString属性设置为任意值 除了默认值({0})之外,当数据站点 控件尝试调用ObjectDataSource的Update()或Delete() 方法,因为ObjectDataSource将尝试同时传入 指定的UpdateParameters或DeleteParameters以及原始参数 值参数

如果现在还不清楚,别担心,我们会 在以后的教程中检查此属性及其实用程序目前, 只需确定是否完全删除此属性声明 或将该值设置为默认值 ({0})。

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

但是,它也与

如上所述,只有当ConflictDetection设置为CompareAllValues时,才应将其他参数添加到更新方法调用中(原始值的参数的确切名称取决于OldValuesParameterFormatString属性)

默认情况下,ConflictDetection属性设置为OverwriteChanges, 这意味着数据源控件将覆盖对所做的任何更改 数据源控件首次读取数据之间的数据行 从行和更新行的时间开始。主键是 用于定位将被更新或删除的数据行,但不是 执行数据的其他比较。如果数据源控件 配置为使用CompareAllValues选项,但是 在更新的oldValues集合中传递原始数据 和Delete方法,以便您可以编写更新或删除的逻辑 仅当这些值与数据中当前的值匹配时才使用数据 存储匹配值表示数据没有更改 从它被阅读的时候起

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

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