0


即使UpdateNames存储过程只接受一个名为@First的参数,我们仍然可以定义名为Last的附加参数,并且更新仍然会成功:

    <asp:SqlDataSource ... UpdateCommand="UpdateNames"
        UpdateCommandType="StoredProcedure">
        <UpdateParameters>
            <asp:Parameter Name="First" Type="String" />
            <asp:Parameter Name="Last" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>


但是在处理 ObjectDataSource 控件时,ObjectDataSource 中定义的参数个数必须与UpdateNames()方法中定义的参数个数完全匹配。因此,如果UpdateNames()只接受一个名为First的参数,以下将导致异常

     <asp:ObjectDataSource ... UpdateMethod="UpdateNames">
        <UpdateParameters>
            <asp:Parameter Name="First" Type="String" />
            <asp:Parameter Name="Last" Type="String" />
        </UpdateParameters>
    </asp:ObjectDataSource>


A) 为什么 ObjectDataSource 的匹配算法不如 SqlDataSource 的匹配算法灵活,从而忽略任何额外的参数?


谢谢

4

3 回答 3

2

ObjectDataSource 以一种灵活性换取另一种灵活性。

您的函数参数与列出的参数完全匹配是正确的,但这是有充分理由的。

ObjectDataSource 允许您定义多个函数来处理不同的参数,因此如果您想支持可以采用名字或名字和姓氏的 UpdateNames() 方法,您只需定义这两个函数并按照您认为合适的方式处理它们。

using System.ComponentModel;

[DataObject]
public class MyODS
{
    [DataObjectMethod(DataObjectMethodType.Update)]
    public void UpdateNames(string First)
    {
        UpdateNames(First, null)
    }

    [DataObjectMethod(DataObjectMethodType.Update)]
    public void UpdateNames(string First, string Last)
    {
        //Do the update
    }
}
于 2009-06-02T21:03:53.653 回答
1

根据两者的经验,一个完整的猜测:

SQL 版本将只通过数组一个 SQL 脚本来执行存储过程,并在执行过程中附加变量。

ObjectDataSource 使用反射来查找与传递的参数匹配的更新方法。因此,如果在采用提供的参数的对象上不存在匹配的方法,它就会失败。

于 2009-06-02T21:07:43.817 回答
1

你可以把它想象成你的 SqlDataSource 被“翻译”成 sql,这是完全有效的 sql:

DECLARE @First varchar(50)
DECLARE @Last varchar(50)
SELECT @First = 'some value', @Last = 'some other value'

SELECT * FROM [MyTable] WHERE FirstName= @First

另一方面,您可以将 ObjectDataSource 视为使用反射函数(如PropertyInfo.GetValue()和)转换为调用PropertyInfo.SetValue()。如果您使用不存在的对象或字段调用其中一个,您将收到异常。

于 2009-06-02T21:08:03.347 回答