为什么ObjectDataSource的匹配算法不像......那样灵活?

时间:2009-06-02 20:59:35

标签: c# .net asp.net objectdatasource sqldatasource


即使 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的匹配算法那样灵活,因此忽略了任何额外的参数?


谢谢

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:1)

完全猜测,来自两者的经验:

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

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

答案 2 :(得分: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()之类的反射函数将其转换为调用。如果您使用不存在的对象或字段调用其中一个,您将获得异常。