即使 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的匹配算法那样灵活,因此忽略了任何额外的参数?
谢谢
答案 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()
之类的反射函数将其转换为调用。如果您使用不存在的对象或字段调用其中一个,您将获得异常。